junos-conf-routing-instances

Junos routing-instances configuration module

  • Version: 2019-01-01

    junos-conf-routing-instances@2019-01-01


    
      module junos-conf-routing-instances {
    
        yang-version 1;
    
        namespace
          "http://yang.juniper.net/junos/conf/routing-instances";
    
        prefix jc-routing-instances;
    
        import junos-common-ddl-extensions {
          prefix junos;
          revision-date "2019-01-01";
        }
        import junos-common-types {
          prefix jt;
          revision-date "2019-01-01";
        }
        import junos-conf-root {
          prefix jc;
          revision-date "2019-01-01";
        }
    
        organization "Juniper Networks, Inc.";
    
        contact "yang-support@juniper.net";
    
        description
          "Junos routing-instances configuration module";
    
        revision "2019-01-01" {
          description "Junos: 21.3R1.9";
        }
    
    
        augment /jc:configuration {
          uses routing-instances-group;
        }
    
        augment /jc:configuration/jc:groups {
          uses routing-instances-group;
        }
    
        grouping routing-instances-group {
          container routing-instances {
            description
              "Routing instance configuration";
            uses apply-advanced;
    
            list instance {
              key "name";
              uses juniper-routing-instance;
            }  // list instance
          }  // container routing-instances
        }  // grouping routing-instances-group
    
        grouping apply-advanced {
          description
            "Apply advanced configuration logic";
          leaf-list apply-groups {
            type string;
            ordered-by user;
            description
              "Groups from which to inherit configuration data";
          }
    
          leaf-list apply-groups-except {
            type string;
            ordered-by user;
            description
              "Don't inherit configuration data from these groups";
          }
    
          list apply-macro {
            key "name";
            ordered-by user;
            description
              "Macro and parameters for commit script expansion";
            uses apply-macro-type;
          }  // list apply-macro
        }  // grouping apply-advanced
    
        grouping apply-macro-type {
          description
            "Macro data for commit-script expansion";
          leaf name {
            type string;
            description
              "Name of the macro to be expanded";
          }
    
          list data {
            key "name";
            uses macro-data-type;
          }  // list data
        }  // grouping apply-macro-type
    
        grouping juniper-routing-instance {
          description "Routing instance";
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          leaf instance-type {
            type enumeration {
              enum "virtual-switch" {
                value 0;
                description
                  "Virtual switch routing instance";
              }
              enum "layer2-control" {
                value 1;
                description
                  "Layer 2 control protocols";
              }
              enum "mac-vrf" {
                junos:must "((".. bridge-domains" || ".. vlans"))";
                junos:must-message "bridge-domains must be configured for mac-vrf instance";
                junos:must "(".. service-type")";
                junos:must-message "service-type must be configured for mac-vrf instance";
                junos:must "("routing-instances ${instance} protocols evpn")";
                junos:must-message "Protocol EVPN must be configured in the mac-vrf instance";
                value 2;
                description
                  "MAC-VRF routing instance";
              }
              enum "forwarding" {
                value 3;
                description
                  "Forwarding instance";
              }
              enum "no-forwarding" {
                value 4;
                description
                  "Nonforwarding instance";
              }
              enum "l2vpn" {
                value 5;
                description
                  "Layer 2 VPN routing instance";
              }
              enum "vpls" {
                value 6;
                description
                  "VPLS routing instance";
              }
              enum "virtual-router" {
                value 7;
                description
                  "Virtual routing instance";
              }
              enum "l2backhaul-vpn" {
                junos:must "(".. instance-role")";
                junos:must-message "'instance-role' statement must be configured for l2backhaul-vpn instance";
                junos:must "(".. no-local-switching")";
                junos:must-message "'no-local-switching' statement must be configured for l2backhaul-vpn instance";
                junos:must "(".. vlan-model")";
                junos:must-message "'vlan-model' statement must be configured for l2backhaul-vpn instance";
                value 8;
                description
                  "L2Backhaul/L2Wholesale routing instance";
              }
              enum "mpls-internet-multicast" {
                junos:must "(("protocols pim" || ".. provider-tunnel inter-region"))";
                junos:must-message "Protocol PIM must be configured in the master instance";
                value 9;
                description
                  "Internet Multicast over MPLS routing instance";
              }
              enum "evpn" {
                junos:must "("routing-instances ${instance} protocols evpn")";
                junos:must-message "Protocol EVPN must be configured in the evpn instance";
                value 10;
                description
                  "EVPN routing instance";
              }
              enum "mpls-forwarding" {
                value 11;
                description
                  "Routing instance provides a MPLS forwarding-context";
              }
              enum "evpn-vpws" {
                junos:must "("routing-instances ${instance} protocols evpn")";
                junos:must-message "Protocol EVPN must be configured in the evpn-vpws instance";
                value 12;
                description
                  "EVPN VPWS routing instance";
              }
              enum "vrf" {
                value 13;
                description
                  "Virtual routing forwarding instance";
              }
            }
            description
              "Type of routing instance";
          }
    
          container l2vpn-id {
            description
              "Layer-2 vpn-id for this instance";
            uses apply-advanced;
    
            leaf community {
              junos:must "(!(".. .. protocols vpls neighbor"))";
              junos:must-message "Does not support FEC129 LDP-VPLS and BGP-VPLS/FEC128-LDP-VPLS under the default mesh-group";
              junos:must "(!(".. .. protocols vpls vpls-id"))";
              junos:must-message "Does not support FEC129 LDP-VPLS and BGP-VPLS/FEC128-LDP-VPLS under the default mesh-group";
              junos:must "(!(".. .. protocols vpls site"))";
              junos:must-message "Does not support FEC129 LDP-VPLS and BGP-VPLS/FEC128-LDP-VPLS under the same instance";
              junos:must "(!(".. .. protocols vpls site-range"))";
              junos:must-message "site-range is not supported for FEC129 LDP VPLS";
              junos:must "(!(".. .. protocols vpls mac-flush"))";
              junos:must-message "mac-flush is not supported for FEC129 LDP VPLS";
              junos:must "(!(".. .. protocols vpls label-block-size"))";
              junos:must-message "label-block-size is not supported for FEC129 LDP VPLS";
              junos:must "(!(".. .. protocols vpls connectivity-type"))";
              junos:must-message "connectivity-type is not supported for FEC129 LDP VPLS";
              junos:must "(!(".. .. protocols vpls community"))";
              junos:must-message "community is not supported for FEC129 LDP VPLS";
              junos:must "(!(".. .. provider-tunnel"))";
              junos:must-message "provider-tunnel is not supported for FEC129 LDP VPLS/VPWS";
              type string {
                junos:posix-pattern "^(l2vpn-id)+:[0-9.]+:[0-9]+$";
                junos:pattern-message "Use format 'l2vpn-id:x:y' where 'x' is 2 byte AS number, or an IP address and 'y' is a number. e.g. l2vpn-id:1:100, l2vpn-id:1.2.3.4:100";
              }
              description
                "L2VPN ID community for FEC129 VPLS/VPWS with BGP auto-discovery";
            }
          }  // container l2vpn-id
    
          container routing-options {
            description
              "Protocol-independent routing option configuration";
            uses juniper-routing-options;
          }  // container routing-options
    
          container egress-protection {
            description
              "Egress instance protection";
            uses apply-advanced;
    
            leaf protector {
              junos:must "(any "protocols mpls egress-protection context-identifier <*> protector")";
              junos:must-message "context-identifier must be type protector";
              type empty;
              description
                "Enable Edge Protector functionality for this VPN";
            }
    
            container context-identifier {
              description "Context identifier";
              uses apply-advanced;
    
              leaf context-id {
                junos:must "("protocols mpls egress-protection context-identifier $$ primary")";
                junos:must-message "context-identifier must be type primary";
                junos:must "("protocols mpls egress-protection context-identifier $$")";
                junos:must-message "same context-identifier must be defined in protocols mpls egress-protection";
                type jt:ipv4addr;
                description "IP address";
              }
            }  // container context-identifier
          }  // container egress-protection
    
          container protocols {
            junos:must "((!(". pim") || (".. instance-type" && !(".. instance-type no-forwarding"))))";
            junos:must-message "pim configuration is not allowed for 'instance-type no-forwarding'";
            description
              "Routing protocol configuration";
            uses apply-advanced;
    
            container bfd {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "bfd configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "bfd configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "bfd configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "bfd configuration is not allowed for 'instance-type virtual-switch'";
              presence "enable bfd";
              uses juniper-ri-protocols-bfd;
            }  // container bfd
    
            container igmp-snooping {
              junos:must "((".. .. instance-type vpls" || (".. .. instance-type evpn" || (".. .. instance-type mac-vrf" || ".. .. instance-type virtual-switch"))))";
              junos:must-message "igmp-snooping configuration is allowed only for 'instance-type vpls/virtual-switch/evpn/mac-vrf'";
              junos:must "(!(".. pim-snooping"))";
              junos:must-message "igmp-snooping configuration do not co-exist with pim-snooping";
              junos:must "((".. .. instance-type vpls" || (".. .. instance-type evpn" || (".. .. instance-type mac-vrf" || (".. .. instance-type virtual-switch " && !(".. vpls"))))))";
              junos:must-message "igmp-snooping configuration is allowed only for 'instance-type vpls/evpn/mac-vrf or instance-type virtual-switch without vpls'";
              presence "enable igmp-snooping";
              description
                "IGMP snooping configuration";
              uses juniper-ri-protocols-igmp-snooping;
            }  // container igmp-snooping
    
            container mld-snooping {
              junos:must "((".. .. instance-type vpls" || (".. .. instance-type evpn" || ".. .. instance-type virtual-switch")))";
              junos:must-message "mld-snooping configuration is allowed only for 'instance-type vpls/virtual-switch/evpn'";
              junos:must "((".. .. instance-type vpls" || (".. .. instance-type evpn" || (".. .. instance-type mac-vrf" || (".. .. instance-type virtual-switch " && !(".. vpls"))))))";
              junos:must-message "mld-snooping configuration is allowed only for 'instance-type vpls/evpn/mac-vrf or instance-type virtual-switch without vpls'";
              presence "enable mld-snooping";
              description
                "MLD snooping configuration";
              uses juniper-ri-protocols-mld-snooping;
            }  // container mld-snooping
    
            container amt {
              junos:must "(!(".. .. instance-type no-forwarding"))";
              junos:must-message "amt configuration is not allowed for 'instance-type no-forwarding'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "amt configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "amt configuration is not allowed for 'instance-type virtual-switch'";
              description
                "AMT relay configuration";
              uses juniper-protocols-amt;
            }  // container amt
    
            container bgp {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "bgp configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "bgp configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "bgp configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "bgp configuration is not allowed for 'instance-type virtual-switch'";
              description "BGP options";
              uses juniper-protocols-bgp;
            }  // container bgp
    
            container esis {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "esis configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "esis configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "esis configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "esis configuration is not allowed for 'instance-type virtual-switch'";
              description "ES-IS configuration";
              uses juniper-protocols-esis;
            }  // container esis
    
            container evpn {
              junos:must "(!((".. .. instance-type virtual-switch" && ".. vpls")))";
              junos:must-message "This configuration is not allowed for instance-type virtual-switch with 'protocols vpls' enabled";
              junos:must "(!(".. l2vpn"))";
              junos:must-message "This configuration is not allowed with 'protocols l2vpn'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "This configuration is not allowed for 'instance-type layer2-control'";
              presence "enable evpn";
              description "EVPN configuration";
              uses juniper-protocols-l2vpn;
            }  // container evpn
    
            container router-discovery {
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "This configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "This configuration is not allowed for 'instance-type virtual-switch'";
              description
                "ICMP router discovery options";
              uses juniper-protocols-router-discovery;
            }  // container router-discovery
    
            container isis {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "isis configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "isis configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "isis configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "isis configuration is not allowed for 'instance-type virtual-switch'";
              description "IS-IS configuration";
              uses juniper-protocols-isis;
            }  // container isis
    
            container l2vpn {
              junos:must "(!(".. evpn"))";
              junos:must-message "This configuration is not allowed with 'protocols evpn'";
              junos:must "(!(".. vpls"))";
              junos:must-message "This configuration is not allowed with 'protocols vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "This configuration is not allowed for 'instance-type layer2-control'";
              description
                "Layer 2 VPN configuration";
              uses juniper-protocols-l2vpn;
            }  // container l2vpn
    
            container vpls {
              junos:must "(!(".. .. instance-type mac-vrf"))";
              junos:must-message "This configuration is not allowed for instance-type mac-vrf";
              junos:must "(!((".. .. instance-type virtual-switch" && ".. evpn")))";
              junos:must-message "This configuration is not allowed for instance-type virtual-switch with 'protocols evpn' enabled";
              junos:must "(!(".. l2vpn"))";
              junos:must-message "This configuration is not allowed with 'protocols l2vpn'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "This configuration is not allowed for 'instance-type layer2-control'";
              presence "enable vpls";
              description "VPLS configuration";
              uses juniper-protocols-l2vpn;
            }  // container vpls
    
            container ldp {
              junos:must "((!(".. ldp p2mp") || (".. ldp p2mp" && !(".. .. instance-type virtual-router"))))";
              junos:must-message "p2mp under ldp is not allowed for 'instance-type virtual-router'";
              junos:must "((!(".. ldp p2mp") || (".. ldp p2mp" && !(".. .. instance-type vrf"))))";
              junos:must-message "p2mp under ldp is not allowed for 'instance-type vrf'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "ldp configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "ldp configuration is not allowed for 'instance-type virtual-switch'";
              description "LDP configuration";
              uses juniper-protocols-ldp;
            }  // container ldp
    
            container mpls {
              junos:must "(!(".. .. instance-type evpn"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type evpn'";
              junos:must "(!(".. .. instance-type mpls-internet-multicast"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type mpls-internet-multicast'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type atmvpn"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type atmvpn'";
              junos:must "(!(".. .. instance-type l2backhaul-vpn"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type l2backhaul-vpn'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type virtual-switch'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type no-forwarding"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type no-forwarding'";
              junos:must "(!(".. .. instance-type forwarding"))";
              junos:must-message "mpls configuration is not allowed for 'instance-type forwarding'";
              description "MPLS configuration";
              uses juniper-protocols-mpls;
            }  // container mpls
    
            container msdp {
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "msdp configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "msdp configuration is not allowed for 'instance-type virtual-switch'";
              description "MSDP configuration";
              uses juniper-protocols-msdp;
            }  // container msdp
    
            container mvpn {
              junos:must "((!("system processes routing bgp rib-sharding") || (!(".. .. protocols bgp group") || (!(".. .. routing-options auto-export") || "system processes routing bgp rib-sharding no-l3vpn"))))";
              junos:must-message "Auto-export of BGP learned routes will not work with sharding MVPN context";
              junos:must "((".. pim" || (".. .. instance-type mpls-internet-multicast" || (".. .. provider-tunnel inter-as" || ".. .. provider-tunnel inter-region"))))";
              junos:must-message "MVPN configuration requires PIM configuration in the VRF or MPLS internet multicast instance";
              junos:must "((!("routing-options nonstop-routing") || (".. .. route-distinguisher" || (".. pim mvpn" || ".. .. instance-type mpls-internet-multicast"))))";
              junos:must-message "Nonstop routing and auto-rd mvpn instance may not be configured together";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "mvpn configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "mvpn configuration is not allowed for 'instance-type virtual-switch'";
              presence "enable mvpn";
              description
                "BGP-MVPN configuration";
              uses juniper-protocols-mvpn;
            }  // container mvpn
    
            container ospf {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type virtual-switch'";
              description "OSPF configuration";
              uses juniper-protocols-ospf;
            }  // container ospf
    
            container ospf3 {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "ospf configuration is not allowed for 'instance-type virtual-switch'";
              description "OSPF3 configuration";
              uses juniper-protocols-ospf3;
            }  // container ospf3
    
            container pim {
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "pim configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "pim configuration is not allowed for 'instance-type virtual-switch'";
              description "PIM configuration";
              uses juniper-protocols-pim;
            }  // container pim
    
            container ripng {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "ripng configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "ripng configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "ripng configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "ripng configuration is not allowed for 'instance-type virtual-switch'";
              description "RIPng options";
              uses juniper-protocols-ripng;
            }  // container ripng
    
            container rip {
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "rip configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "rip configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "rip configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "rip configuration is not allowed for 'instance-type virtual-switch'";
              description "RIP options";
              uses juniper-protocols-rip;
            }  // container rip
    
            container rsvp {
              junos:must "(!(".. .. instance-type evpn"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type evpn'";
              junos:must "(!(".. .. instance-type mpls-internet-multicast"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type mpls-internet-multicast'";
              junos:must "(!(".. .. instance-type layer2-control"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type layer2-control'";
              junos:must "(!(".. .. instance-type atmvpn"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type atmvpn'";
              junos:must "(!(".. .. instance-type l2backhaul-vpn"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type l2backhaul-vpn'";
              junos:must "(!(".. .. instance-type virtual-switch"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type virtual-switch'";
              junos:must "(!(".. .. instance-type vpls"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type vpls'";
              junos:must "(!(".. .. instance-type l2vpn"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type l2vpn'";
              junos:must "(!(".. .. instance-type no-forwarding"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type no-forwarding'";
              junos:must "(!(".. .. instance-type forwarding"))";
              junos:must-message "rsvp configuration is not allowed for 'instance-type forwarding'";
              description "RSVP configuration";
              uses juniper-protocols-rsvp;
            }  // container rsvp
    
            container pim-snooping {
              junos:must "(!(".. .. routing-interface"))";
              junos:must-message "routing-interface can not be configured when pim-snooping is configured";
              junos:must "(!(".. igmp-snooping"))";
              junos:must-message "pim-snooping configuration can not coexist with igmp-snooping";
              junos:must "(".. .. instance-type vpls")";
              junos:must-message "pim-snooping configuration is allowed only for 'instance-type vpls'";
              presence "enable pim-snooping";
              description
                "PIM snooping configuration";
              uses juniper-protocols-pim-snooping;
            }  // container pim-snooping
    
            container rstp {
              junos:must "((".. .. instance-type layer2-control" || ".. .. instance-type virtual-switch"))";
              junos:must-message "STP protocols allowed only in layer2-control or virtual-switch instance";
              description "RSTP configuration";
              uses juniper-protocols-stp;
            }  // container rstp
    
            container mstp {
              junos:must "((".. .. instance-type layer2-control" || ".. .. instance-type virtual-switch"))";
              junos:must-message "STP protocols allowed only in layer2-control or virtual-switch instance";
              description "MSTP configuration";
              uses juniper-protocols-mstp;
            }  // container mstp
    
            container vstp {
              junos:must "((".. vstp disable" || (!(".. mstp") || ".. mstp disable")))";
              junos:must-message "MSTP is enabled in the same routing instance, VSTP not allowed";
              junos:must "((".. .. instance-type layer2-control" || ".. .. instance-type virtual-switch"))";
              junos:must-message "STP protocols allowed only in layer2-control or virtual-switch instance";
              description "VSTP configuration";
              uses juniper-protocols-vstp;
            }  // container vstp
    
            container mvrp {
              junos:must "((!(".. vstp") || ".. vstp disable"))";
              junos:must-message "vstp enabled, mvrp is not supported";
              junos:must "(((".. mstp" && !(".. mstp disable")) || (".. rstp" && !(".. rstp disable"))))";
              junos:must-message "rstp/mstp is not enabled, mvrp is not allowed";
              junos:must "(".. .. instance-type virtual-switch")";
              junos:must-message "mvrp is allowed only in virtual-switch instance";
              description "MVRP configuration";
              uses juniper-protocols-mvrp;
            }  // container mvrp
          }  // container protocols
    
          leaf description {
            type string {
              junos:posix-pattern "^.{1,255}$";
              junos:pattern-message "Must be a string of 255 characters or less";
            }
            description
              "Text description of routing instance";
          }
    
          leaf vlan-model {
            type enumeration {
              enum "one-to-one" {
                value 0;
                description
                  "Customer VLAN model (1:1)";
              }
            }
            description
              "Subscriber vlan-model in L2Wholesale framework";
          }
    
          container vtep-source-interface {
            description
              "Source layer-3 IFL for VXLAN";
            leaf interface-name {
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be defined";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
            }
    
            choice family {
              container inet {
                presence "enable inet";
                description "IPv4 source";
                uses apply-advanced;
              }  // container inet
              container inet6 {
                junos:must "((!("routing-instances ${instance} protocols evpn") || "routing-instances ${instance} protocols evpn encapsulation vxlan"))";
                junos:must-message "encapsulation vxlan must be enabled for IPv6 underlay";
                presence "enable inet6";
                description "IPv6 source";
                uses apply-advanced;
              }  // container inet6
            }  // choice family
          }  // container vtep-source-interface
    
          container vtep-remote-interface {
            description "Remote VTEP interface";
            uses apply-advanced;
    
            list remote-ip {
              key "name";
              ordered-by user;
              description
                "Remote VTEP IP address";
              leaf name {
                type jt:ipv4addr;
                description "IP address";
              }
    
              uses apply-advanced;
    
              leaf dynamic-profile {
                junos:must "("dynamic-profiles $$")";
                junos:must-message "Dynamic profile must be defined";
                type string;
                description
                  "Define associate dynamic profile";
              }
            }  // list remote-ip
    
            container default {
              description
                "To all remote vtep interface";
              uses apply-advanced;
    
              leaf dynamic-profile {
                junos:must "("dynamic-profiles $$")";
                junos:must-message "Dynamic profile must be defined";
                type string;
                description
                  "Define associate dynamic profile";
              }
            }  // container default
          }  // container vtep-remote-interface
    
          leaf-list remote-vtep-list {
            type jt:ipaddr;
            max-elements 1024;
            description
              "Configure static remote VXLAN tunnel endpoints";
          }
    
          leaf-list remote-vtep-v6-list {
            type jt:ipv6addr;
            max-elements 1024;
            description
              "Configurate static ipv6 remote VXLAN tunnel endpoints";
          }
    
          leaf instance-role {
            type enumeration {
              enum "access" {
                value 0;
                description
                  "Role of Access/Aggregation router";
              }
              enum "nni" {
                value 1;
                description
                  "Role of Provider network interfacing router";
              }
            }
            description
              "Primary role of L2Backhaul-vpn router";
          }
    
          choice vlan_choice {
            leaf vlan-id {
              junos:must "(!(".. instance-type mac-vrf"))";
              junos:must-message "'vlan-id' must be configured within bridge-domains for 'instance-type mac-vrf'";
              junos:must "((".. instance-type vpls" || ".. instance-type evpn"))";
              junos:must-message "'vlan-id' statement can be included only for a VPLS or EVPN";
              type string;
              description
                "IEEE 802.1q VLAN identifier for bridging domain";
            }
            container vlan-tags {
              junos:must "(".. instance-type vpls")";
              junos:must-message "'vlan-tags' statement can be included only for VPLS instance";
              presence "enable vlan-tags";
              description
                "IEEE 802.1q VLAN tags for bridging domain";
              leaf outer {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
    
              leaf inner {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
            }  // container vlan-tags
          }  // choice vlan_choice
    
          container system {
            description "System parameters";
            uses apply-advanced;
    
            container services {
              description "System services";
              uses apply-advanced;
    
              container dhcp-local-server {
                description
                  "Dynamic Host Configuration Protocol server configuration";
                uses jdhcp-local-server-type;
              }  // container dhcp-local-server
    
              container dhcp-proxy-client {
                description
                  "Dynamic Host Configuration Protocol Proxy client configuration";
                uses jdhcp-proxy-client-type;
              }  // container dhcp-proxy-client
    
              container static-subscribers {
                description
                  "Static Subscriber Client configuration";
                uses jsscd-static-subscribers-type;
              }  // container static-subscribers
    
              container remote-device-management {
                description
                  "Remote device management configuration";
                uses apply-advanced;
    
                list service-device {
                  key "name";
                  description
                    "Service device configuraiton";
                  uses service-device-object;
                }  // list service-device
              }  // container remote-device-management
    
              container tcp-forwarding {
                description
                  "TCP forwarding configuration";
                uses apply-advanced;
    
                list listening-port {
                  key "port-number listening-address";
                  ordered-by user;
                  description
                    "TCP listener configuration";
                  leaf port-number {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "8000 .. 8063";
                      }
                    }
                    description "Listening port";
                  }
    
                  leaf listening-address {
                    type jt:ipv4addr;
                    description
                      "Listening address";
                  }
    
                  uses apply-advanced;
    
                  leaf forwarding-address {
                    type jt:ipv4addr;
                    description
                      "Forwarding address";
                  }
    
                  leaf forwarding-port {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Forwarding port";
                  }
    
                  leaf max-connections {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 16";
                      }
                    }
                    description
                      "Maxmimum allowed connections";
                  }
    
                  list allowed-source {
                    key "name";
                    ordered-by user;
                    description
                      "Allowed source prefix";
                    leaf name {
                      type jt:ipv4prefix;
                      description
                        "Source prefix";
                    }
    
                    uses apply-advanced;
                  }  // list allowed-source
                }  // list listening-port
              }  // container tcp-forwarding
            }  // container services
          }  // container system
    
          container access {
            description
              "Network access configuration";
            uses apply-advanced;
    
            container address-assignment {
              description
                "Address assignment configuration";
              uses address-assignment-type;
            }  // container address-assignment
    
            container address-protection {
              presence
                "enable address-protection";
              description
                "Initiate Duplicate Address Protection";
              uses apply-advanced;
    
              leaf reassign-on-match {
                type empty;
                description
                  "Disconnect owning session and reassign to this session";
              }
            }  // container address-protection
          }  // container access
    
          container access-profile {
            description
              "Access profile for this instance";
            leaf access-profile-name {
              junos:must "("access profile $$")";
              junos:must-message "Access-profile must be defined in the [edit access profile] hierarchy";
              type string;
              description "Profile name";
            }
          }  // container access-profile
    
          leaf routing-interface {
            junos:must "(!("interfaces $$-IFL family mpls"))";
            junos:must-message "routing-interface with family mpls cannot be added to VPLS instance";
            junos:must "(!(".. instance-type virtual-switch"))";
            junos:must-message "routing-interface must be configured within bridge-domains for 'instance-type virtual-switch'";
            junos:must "(!("routing-instances ${instance} service-type vlan-bundle"))";
            junos:must-message "routing-interface not valid for vlan-bundle service type";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "routing-interface cannot be configured under routing-instance with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "((".. vlan-id" || ".. vlan-tags"))";
            junos:must-message "routing-interface can be configured only under routing-instance with 'vlan-id' or 'vlan-tags'";
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Routing interface name for this routing-instance";
          }
    
          container vxlan {
            junos:must "((". ovsdb-managed" || (". multicast-group" || (". multicast-v6-group" || (". ingress-node-replication" || ("routing-instances ${instance} switch-options ovsdb-managed" || "routing-instances ${instance} protocols evpn encapsulation vxlan"))))))";
            junos:must-message "multicast-group or multicast-v6-group or ovsdb-managed or ingress-node-replication or protocols evpn encapsulation vxlan should be enabled. ingress-node-replication must be configured when remote-vtep-list is configured";
            junos:must "((". ovsdb-managed" || ("routing-instances ${instance} switch-options ovsdb-managed" || (". multicast-group" || (". multicast-v6-group" || ("routing-instances ${instance} remote-vtep-list" || ("routing-instances ${instance} remote-vtep-v6-list" || "routing-instances ${instance} protocols evpn encapsulation vxlan")))))))";
            junos:must-message "One of multicast-group or multicast-v6-group or ovsdb-managed or protocols evpn encapsulation vxlan or remote-vtep-list or remote-vtep-v6-list should be enabled";
            junos:must "((".. vlan-id" || (".. instance-type vpls" || (".. instance-type evpn" && ".. vxlan decapsulate-accept-inner-vlan"))))";
            junos:must-message "decapsulate-accept-inner-vlan must be configured when vlan-id is not present for evpn vxlan";
            junos:must "((".. vlan-id" || (".. instance-type vpls" || (".. instance-type evpn" && ".. vxlan encapsulate-inner-vlan"))))";
            junos:must-message "encapsulate-inner-vlan must be configured when vlan-id is not present for evpn vxlan";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "vxlan does not support bridge domain with 'vlan-id all' or  'vlan-id inner-all'";
            junos:must "(!(".. instance-type mac-vrf"))";
            junos:must-message "vxlan must be configured within bridge-domains for 'instance-type mac-vrf'";
            junos:must "(!(".. instance-type virtual-switch"))";
            junos:must-message "vxlan must be configured within bridge-domains for 'instance-type virtual-switch'";
            junos:must "((".. instance-type vpls" || ".. instance-type evpn"))";
            junos:must-message "vxlan in routing-instance is valid only for instance-type vpls or evpn";
            junos:must "("routing-instances ${instance} vtep-source-interface")";
            junos:must-message "vtep-source-interface is required for VXLAN configuration";
            description "VXLAN options";
            uses apply-advanced;
    
            leaf ovsdb-managed {
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || ".. multicast-group")))";
              junos:must-message "ovsdb-managed not valid with remote-vtep-list or multicast-group";
              type empty;
              description
                "Managed remotely via VXLAN OVSDB Controller";
            }
    
            leaf vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 16777214";
                }
              }
              description "VXLAN identifier";
            }
    
            leaf translation-vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777214";
                }
              }
              description
                "Translated VXLAN identifier";
            }
    
            leaf multicast-group {
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. ovsdb-managed" || (".. multicast-v6-group" || "routing-instances ${instance} switch-options ovsdb-managed")))))";
              junos:must-message "multicast-group not valid with remote-vtep-list or ovsdb-managed or multicast-v6-group";
              type jt:ipv4addr;
              description
                "Multicast group registered for VXLAN segment";
            }
    
            leaf multicast-v6-group {
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. ovsdb-managed" || (".. multicast-group" || "routing-instances ${instance} switch-options ovsdb-managed")))))";
              junos:must-message "multicast-v6-group not valid with remote-vtep-list or ovsdb-managed or multicast-group";
              type jt:ipv6addr;
              description
                "Multicast IPv6 group registered for VXLAN segment";
            }
    
            leaf encapsulate-inner-vlan {
              junos:must "(!(".. .. vlan-id none"))";
              junos:must-message "encapsulate inner vlan not valid with vlan-id none ";
              type empty;
              description
                "Retain inner VLAN in the packet";
            }
    
            leaf decapsulate-accept-inner-vlan {
              junos:must "(!(".. .. vlan-id none"))";
              junos:must-message "accept inner vlan not valid with vlan-id none";
              type empty;
              description
                "Accept VXLAN packets with inner VLAN";
            }
    
            leaf unreachable-vtep-aging-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "300 .. 1800";
                }
              }
              units "seconds";
              description
                "Unreachable VXLAN tunnel endpoint removal timer";
            }
    
            leaf ingress-node-replication {
              junos:must "(!(".. .. .. .. protocols evpn assisted-replication"))";
              junos:must-message "ingress-node-replication cannot be configured with assisted-replication";
              junos:must "((".. ovsdb-managed" || (".. .. .. .. switch-options ovsdb-managed" || ("routing-instances ${instance} remote-vtep-list" || ("routing-instances ${instance} remote-vtep-v6-list" || "routing-instances ${instance} protocols evpn encapsulation vxlan")))))";
              junos:must-message "Valid for ovsdb-managed instance or with remote-vtep-list or remote-vtep-v6-list or evpn vxlan";
              type empty;
              description
                "Enable ingress node replication";
            }
          }  // container vxlan
    
          leaf l3-interface {
            junos:must "(!("interfaces $$-IFL family mpls"))";
            junos:must-message "l3-interface with family mpls cannot be added to VPLS instance";
            junos:must "(!(".. instance-type virtual-switch"))";
            junos:must-message "l3-interface must be configured within bridge-domains for 'instance-type virtual-switch'";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "l3-interface cannot be configured under routing-instance with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "((".. vlan-id" || ".. vlan-tags"))";
            junos:must-message "l3-interface can be configured only under routing-instance with 'vlan-id' or 'vlan-tags'";
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "L3 interface name for this routing-instance";
          }
    
          leaf no-local-switching {
            junos:must "((".. instance-type vpls" || ((".. instance-type evpn" && ".. protocols vpls") || ".. instance-type l2backhaul-vpn")))";
            junos:must-message "'no-local-switching' statement can be configured only for VPLS instances";
            type empty;
            description
              "Disable local switching within CE-facing interfaces";
          }
    
          leaf no-normalization {
            type empty;
            description
              "Disable vlan id normalization for interfaces";
          }
    
          leaf qualified-bum-pruning-mode {
            junos:must "((".. instance-type vpls" || (".. instance-type evpn" && ".. protocols vpls")))";
            junos:must-message "'bum-pruning-mode' statement can be configured only for VPLS instances!";
            type empty;
            description
              "Enable BUM pruning for VPLS instance";
          }
    
          leaf no-irb-layer-2-copy {
            junos:must "((".. routing-interface" || ".. l3-interface"))";
            junos:must-message "routing-interface/l3-interface must be configured for this feature";
            type empty;
            description
              "Disable transmission of layer-2 copy of packets of irb routing-interface";
          }
    
          leaf connector-id-advertise {
            type empty;
            description
              "Advertise connector-id attribute";
          }
    
          container forwarding-options {
            description
              "Forwarding options configuration";
            uses juniper-forwarding-options;
          }  // container forwarding-options
    
          container bridge-domains {
            junos:must "((".. instance-type virtual-switch" || ".. instance-type mac-vrf"))";
            junos:must-message "'bridge-domains' configuration can only be used for 'instance-type virtual-switch' or 'instance-type mac-vrf'";
            description
              "Bridge domain configuration";
            uses apply-advanced;
    
            list domain {
              key "name";
              uses juniper-bridge-domains;
            }  // list domain
          }  // container bridge-domains
    
          container switch-options {
            junos:must "(".. instance-type virtual-switch")";
            junos:must-message "This configuration is allowed for only 'instance-type virtual-switch'";
            description
              "L2 options for routing-instance of type virtual-switch";
            uses juniper-routing-instance-switch-options;
          }  // container switch-options
    
          container pbb-options {
            junos:must "(!(".. protocols evpn"))";
            junos:must-message "pbb-options are not supported with protocol evpn";
            junos:must "(!(".. protocols vpls"))";
            junos:must-message "PBB is not supported with protocol vpls";
            junos:must "(".. instance-type virtual-switch")";
            junos:must-message "This configuration is allowed for only 'instance-type virtual-switch'";
            description
              "Provider backbone bridging options for routing-instance";
            uses juniper-routing-instance-pbb-options;
          }  // container pbb-options
    
          list service-groups {
            junos:must "(!(".. protocols vpls"))";
            junos:must-message "PBB is not supported with protocol vpls";
            junos:must "(".. instance-type virtual-switch")";
            junos:must-message "This configuration is allowed for only 'instance-type virtual-switch'";
            key "name";
            description
              "Service group configuration for routing-instance";
            uses juniper-routing-instance-service-groups;
          }  // list service-groups
    
          leaf layer3-domain-identifier {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "2 .. 8192";
              }
            }
            description
              "Layer3 domain identifier";
          }
    
          leaf l2-domain-id-for-l3 {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "2 .. 4095";
              }
            }
            description
              "Layer2 domain identifier for L3";
          }
    
          container forwarding-instance {
            junos:must "(".. instance-type mac-vrf")";
            junos:must-message "Forwarding instance id is applicable only for mac-vrf instances";
            description
              "Forwarding instance parameters for a mac-vrf instance";
            leaf identifier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 99";
                }
              }
              description
                "Forwarding instance identifier";
            }
          }  // container forwarding-instance
    
          leaf service-type {
            junos:must "(".. instance-type mac-vrf")";
            junos:must-message "service-type config is allowed for instance type mac-vrf only";
            type enumeration {
              enum "vlan-based" {
                value 0;
                description
                  "Instance service type vlan-based";
              }
              enum "vlan-bundle" {
                value 1;
                description
                  "Instance service type vlan-bundle";
              }
              enum "vlan-aware" {
                value 2;
                description
                  "Instance service type vlan-aware";
              }
            }
            description "Sevice type";
          }
    
          list interface {
            key "name";
            description
              "Interface name for this routing instance";
            leaf name {
              junos:must "((!("interfaces $$-IFL etree-ac-role") || ".. .. protocols evpn evpn-etree"))";
              junos:must-message "etree must be enabled under routing-instance";
              junos:must "(!(("interfaces $$-IFL family bridge interface-mode" && ".. .. instance-type evpn")))";
              junos:must-message "access/trunk interfaces are not allowed in evpn instance";
              junos:must "((!(("interfaces $$-IFL vlan-id-list" || "interfaces $$-IFL vlan-tags inner-list")) || !((".. .. vlan-id" || ".. .. vlan-tags"))))";
              junos:must-message "interface with vlan-id-list/inner-list cannot be added to routing-instance with a vlan-id/vlan-tags configured";
              junos:must "((!(("interfaces $$-IFL family bridge interface-mode" || "interfaces $$-IFL family ethernet-switching")) || (".. .. instance-type virtual-switch" || ".. .. instance-type mac-vrf")))";
              junos:must-message "Interface with 'interface-mode' is allowed only in a virtual-switch or mac-vrf instance";
              junos:must "((!(".. .. instance-type virtual-switch") || ("interfaces $$-IFL family bridge interface-mode" || "interfaces $$-IFL family ethernet-switching")))";
              junos:must-message "Only interface with 'interface-mode' is allowed in a virtual-switch";
              junos:must "(!(".. .. .. routing-instances bridge-domains interfaces $$"))";
              junos:must-message "The interface cannot be defined both at routing-instance and bridge-domain level";
              junos:must "((!("interfaces $$-IFL vlan-id-range") || (".. .. instance-type vpls" || ".. .. instance-type evpn")))";
              junos:must-message "vlan-id-range is specified for this logical interface; the routing instance must be of type vpls or evpn";
              junos:must "(((".. .. vlan-id all" && "interfaces $$-IFL input-vlan-map pop") || (".. .. vlan-id inner-all" || (!((".. .. vlan-id" || ".. .. vlan-tags")) || (!(("interfaces $$-IFL input-vlan-map" || "interfaces $$-IFL output-vlan-map")) || (".. .. no-normalization" || ".. .. bridge-options no-normalization"))))))";
              junos:must-message "interface with input/output vlan-maps cannot be added to a routing-instance with a vlan-id/vlan-tags configured";
              junos:must "((!("interfaces $$-IFL vlan-tags inner-range") || ((".. .. vlan-id all" || ".. .. vlan-id inner-all") || (".. .. no-normalization" || ".. .. bridge-options no-normalization"))))";
              junos:must-message "vlan-tags inner-range is specified for this logical interface; 'vlan-id all' or 'vlan-id inner-all' should also be enabled";
              type string;
            }
    
            uses apply-advanced;
    
            choice mode {
              leaf any {
                type empty;
                description
                  "Interface used for both unicast and multicast traffic";
              }
              leaf unicast {
                type empty;
                description
                  "Interface used for unicast traffic only";
              }
              leaf multicast {
                type empty;
                description
                  "Interface used for multicast traffic only";
              }
            }  // choice mode
    
            leaf primary {
              junos:must "(!(".. unicast"))";
              junos:must-message "'primary' option can not be configured for unicast interface";
              junos:must "((".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast"))";
              junos:must-message "'primary' option can only be configured for instance-type 'vrf' or 'mpls-internet-multicast'";
              type empty;
              description
                "Preferred multicast vt interface for the routing-instance";
            }
    
            leaf protect-interface {
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be part of this routing instance";
              junos:must "(!("interfaces ${inter_name} esi"))";
              junos:must-message "ESI can not be configured for protect interface";
              junos:must "("routing-instances ${instance} protocols evpn")";
              junos:must-message "Protocol EVPN must be configured in the evpn instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Name of protect interface";
            }
          }  // list interface
    
          container route-distinguisher {
            description
              "Route distinguisher for this instance";
            leaf rd-type {
              type string {
                junos:posix-pattern "^[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100";
              }
              description
                "Number in (16 bit:32 bit) or (32 bit 'L':16 bit) or (IP address:16 bit) format";
            }
          }  // container route-distinguisher
    
          leaf-list vrf-import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy for VRF instance RIBs";
          }
    
          leaf-list vrf-export {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Export policy for VRF instance RIBs";
          }
    
          container vrf-target {
            description
              "VRF target community configuration";
            uses apply-advanced;
    
            leaf community {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use in import and export";
            }
    
            leaf import {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use when filtering on import";
            }
    
            leaf export {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use when marking routes on export";
            }
    
            leaf auto {
              junos:must "((".. .. instance-type evpn" || (".. .. instance-type virtual-switch" || ".. .. instance-type mac-vrf")))";
              junos:must-message "vrf-target auto is meant only for evpn or virtual-switch instance or mac-vrf";
              type empty;
              description
                "Auto derive import and export target community from BGP AS & L2";
            }
          }  // container vrf-target
    
          leaf no-vrf-advertise {
            type empty;
            description
              "Don't advertise this instance to remote PEs";
          }
    
          leaf non-forwarding-vrf {
            junos:must "(".. provider-tunnel inter-as")";
            junos:must-message "Inter-AS segmented p-tunnel configuration is required";
            type empty;
            description
              "Don't create VRF forwarding table for local or transit routes belonging to this VPN";
          }
    
          container vrf-advertise-selective {
            junos:must "(!(".. no-vrf-advertise"))";
            junos:must-message "Selective vrf advertise cannot be used with no-vrf-advertise knob";
            presence
              "enable vrf-advertise-selective";
            description
              "Override no-vrf-advertise knob for the specified address family";
            uses apply-advanced;
    
            container family {
              description
                "Protocol family to be selectively advertised";
              uses apply-advanced;
    
              leaf inet-mvpn {
                type empty;
                description
                  "IPv4 MVPN Address Family";
              }
    
              leaf inet6-mvpn {
                type empty;
                description
                  "IPv6 MVPN Address Family";
              }
            }  // container family
          }  // container vrf-advertise-selective
    
          container vrf-table-label {
            presence "enable vrf-table-label";
            description
              "Advertise a single VPN label for all routes in the VRF";
            leaf static {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "16 .. 1048575";
                }
              }
              description
                "Specify label value to be used";
            }
    
            leaf source-class-usage {
              type empty;
              description
                "Enable source class usage";
            }
          }  // container vrf-table-label
    
          choice vrf-propagate-ttl-or-no-vrf-propagate-ttl {
            leaf no-vrf-propagate-ttl {
              type empty;
              description
                "Disable TTL propagation from IP to MPLS (on push) and MPLS to IP (on pop)";
            }
            leaf vrf-propagate-ttl {
              type empty;
              description
                "Enable TTL propagation from IP to MPLS (on push) and MPLS to IP (on pop)";
            }
          }  // choice vrf-propagate-ttl-or-no-vrf-propagate-ttl
    
          container provider-tunnel {
            junos:must "(!((". inter-as" && ". selective")))";
            junos:must-message "Selective p-tunnel configuration not allowed on ASBR";
            junos:must "(!((" .. non-forwarding-vrf" && (". rsvp-te" || (". pim-asm" || (". pim-ssm" || ". ldp-p2mp"))))))";
            junos:must-message "Inclusive p-tunnel configuration not allowed on ASBR with non-forwarding-vrf";
            junos:must "((!(".. non-forwarding-vrf") || ". inter-as"))";
            junos:must-message "Non-forwarding VRF can only be configured with Inter-AS segmented p-tunnels";
            description
              "Provider tunnel configuration";
            uses apply-advanced;
    
            container external-controller {
              junos:must "((".. .. protocols mvpn" && (".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast")))";
              junos:must-message "External point-to-multipoint LSP provider can be configured only for MVPN instances";
              description
                "External point-to-multipoint LSP provider for flooding";
              uses apply-advanced;
    
              choice external-provider {
                leaf pccd {
                  type empty;
                  description
                    "Use PCCD for external point-to-multipoint LSP computation entity";
                }
              }  // choice external-provider
            }  // container external-controller
    
            choice tunnel-type {
              container rsvp-te {
                junos:must "(!(((".. .. instance-type evpn" || ".. .. instance-type virtual-switch") && ".. .. protocols evpn encapsulation vxlan")))";
                junos:must-message "P2MP Provider Tunnels are not allowed for VxLAN encapsulation";
                junos:must "(!(((".. .. instance-type evpn" || ".. .. instance-type virtual-switch") && ".. .. protocols evpn pbb-evpn-core")))";
                junos:must-message "P2MP Provider Tunnels are not allowed for PBB-EVPN";
                junos:must "((".. .. instance-type evpn" || (".. .. instance-type virtual-switch" || (".. .. instance-type vpls" || (".. .. protocols mvpn" && (".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast"))))))";
                junos:must-message "Point-to-multipoint LSPs can be configured only for EVPN, VPLS or MVPN instances";
                junos:must "("protocols rsvp")";
                junos:must-message "RSVP must be configured in the master instance";
                description
                  "RSVP-TE point-to-multipoint LSP for flooding";
                uses apply-advanced;
    
                choice static-or-dynamic {
                  leaf static-lsp {
                    junos:must "(!((".. .. .. instance-type evpn" || ".. .. .. instance-type virtual-switch")))";
                    junos:must-message "Static LSPs are not allowed for EVPN instances";
                    junos:must "((any "protocols mpls label-switched-path <*> p2mp $$" || ".. .. .. instance-type vpls"))";
                    junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                    type string {
                      junos:posix-pattern "^.{1,32}$";
                      junos:pattern-message "Must be a string of 32 characters or less";
                    }
                    description
                      "Name of point-to-multipoint LSP";
                  }
                  container label-switched-path-template {
                    description
                      "Template for dynamic point-to-multipoint LSP parameters";
                    uses apply-advanced;
    
                    choice dynamic-template {
                      leaf template-name {
                        junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                        junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-multipoint LSP template";
                      }
                      leaf default-template {
                        type empty;
                        description
                          "Use default parameters";
                      }
                    }  // choice dynamic-template
                  }  // container label-switched-path-template
                }  // choice static-or-dynamic
              }  // container rsvp-te
              container ldp-p2mp {
                junos:must "("protocols ldp p2mp")";
                junos:must-message "LDP P2MP must be configured in the master instance";
                junos:must "((".. .. instance-type evpn" || (".. .. instance-type virtual-switch" || (".. .. protocols mvpn" && (".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast")))))";
                junos:must-message "LDP P2MP LSPs can be configured only for EVPN or MVPN instances";
                junos:must "(!(((".. .. instance-type evpn" || ".. .. instance-type virtual-switch") && ".. .. protocols evpn encapsulation vxlan")))";
                junos:must-message "P2MP Provider Tunnels are not allowed for VxLAN encapsulation";
                junos:must "(!(((".. .. instance-type evpn" || ".. .. instance-type virtual-switch") && ".. .. protocols evpn pbb-evpn-core")))";
                junos:must-message "P2MP Provider Tunnels are not allowed for PBB-EVPN";
                presence "enable ldp-p2mp";
                description
                  "LDP point-to-multipoint LSP for flooding";
              }  // container ldp-p2mp
              container ingress-replication {
                junos:must "(((".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast") && ".. .. protocols mvpn"))";
                junos:must-message "Ingress Replication can be configured only for MVPN instances";
                junos:must "(!(".. .. protocols mvpn sender-based-rpf"))";
                junos:must-message "This release does not support Sender based RPF for inclusive ingress replication provider tunnels";
                description
                  "Ingress replication tunnel";
                uses apply-advanced;
    
                leaf create-new-ucast-tunnel {
                  junos:must "(".. label-switched-path label-switched-path-template")";
                  junos:must-message "label-switched-path-template must be defined";
                  type empty;
                  description
                    "Create new unicast tunnel for ingress replication";
                }
    
                container label-switched-path {
                  presence
                    "enable label-switched-path";
                  description
                    "Point-to-point LSP unicast tunnel";
                  uses apply-advanced;
    
                  container label-switched-path-template {
                    junos:must "(".. .. create-new-ucast-tunnel")";
                    junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                    description
                      "Template for dynamic point-to-point LSP parameters";
                    uses apply-advanced;
    
                    choice dynamic-template {
                      leaf template-name {
                        junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                        junos:must-message "Referenced point-to-point LSP template does not exist";
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-point LSP template";
                      }
                      leaf default-template {
                        type empty;
                        description
                          "Use default parameters";
                      }
                    }  // choice dynamic-template
                  }  // container label-switched-path-template
                }  // container label-switched-path
              }  // container ingress-replication
              container pim-asm {
                junos:must "(!(".. .. protocols mvpn sender-based-rpf"))";
                junos:must-message "this release does not support sender based RPF for PIM-SM provider tunnels";
                junos:must "(!("protocols pim mpls-internet-multicast"))";
                junos:must-message "mpls-internet-multicast must not be configured";
                junos:must "("protocols pim")";
                junos:must-message "PIM-SM must be configured in the master instance";
                junos:must "(".. .. instance-type vrf")";
                junos:must-message "PIM-SM must be configured only for vrf instances";
                description
                  "PIM-SM provider tunnel";
                uses apply-advanced;
    
                leaf group-address {
                  type jt:ipv4addr;
                  description
                    "PIM-SM provider tunnel group address";
                }
    
                container family {
                  presence "enable family";
                  status deprecated;
                  description
                    "PIM-SM provider tunnel address family";
                  uses apply-advanced;
    
                  container inet {
                    presence "enable inet";
                    description
                      "IPv4 PIM-SM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SM provider tunnel group address for IPV4";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container inet
    
                  container inet6 {
                    presence "enable inet6";
                    description
                      "IPv6 PIM-SM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SM provider tunnel group address for IPV6";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container inet6
                }  // container family
              }  // container pim-asm
              container pim-ssm {
                junos:must "(!(".. .. protocols mvpn sender-based-rpf"))";
                junos:must-message "This release does not support sender based RPF for PIM-SSM provider tunnels";
                junos:must "(!("protocols pim mpls-internet-multicast"))";
                junos:must-message "mpls-internet-multicast must not be configured";
                junos:must "("protocols pim")";
                junos:must-message "PIM-SSM must be configured in the master instance";
                junos:must "(".. .. protocols mvpn")";
                junos:must-message "PIM-SSM provider tunnel can be configured only for multicast VPN instances";
                junos:must "(".. .. instance-type vrf")";
                junos:must-message "PIM-SM must be configured only for vrf instances";
                description
                  "PIM-SSM provider tunnel";
                uses apply-advanced;
    
                leaf group-address {
                  type jt:ipv4addr;
                  description
                    "PIM-SSM provider tunnel group address";
                }
    
                container family {
                  presence "enable family";
                  status deprecated;
                  description
                    "PIM-SSM provider tunnel address family";
                  uses apply-advanced;
    
                  container inet {
                    presence "enable inet";
                    description
                      "IPv4 PIM-SSM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SSM provider tunnel group address for IPV4";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container inet
    
                  container inet6 {
                    presence "enable inet6";
                    description
                      "IPv6 PIM-SSM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SSM provider tunnel group address for IPV6";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container inet6
                }  // container family
              }  // container pim-ssm
            }  // choice tunnel-type
    
            container inter-as {
              junos:must "(".. .. non-forwarding-vrf")";
              junos:must-message "Inter-as segmented tunnels can only be configured for non-forwarding-vrfs";
              junos:must "(!(".. .. protocols mvpn sender-based-rpf"))";
              junos:must-message "This release does not support sender based RPF for inter-as provider tunnels";
              junos:must "(".. .. instance-type vrf")";
              junos:must-message "Inter-as segmented tunnels can only be configured for VRF instances";
              junos:must "(".. .. protocols mvpn")";
              junos:must-message "Inter-as segmented tunnels can only be configured for MVPN instances";
              description
                "Inter-AS segmented tunnels";
              uses apply-advanced;
    
              choice tunnel-type {
                container ingress-replication {
                  junos:must "(". label-switched-path label-switched-path-template")";
                  junos:must-message "label-switched-path template must be configured for Inter-AS segmented tunnel";
                  description
                    "Ingress replication tunnel";
                  uses apply-advanced;
    
                  leaf create-new-ucast-tunnel {
                    junos:must "(".. label-switched-path label-switched-path-template")";
                    junos:must-message "label-switched-path-template must be defined";
                    type empty;
                    description
                      "Create new unicast tunnel for ingress replication";
                  }
    
                  container label-switched-path {
                    presence
                      "enable label-switched-path";
                    description
                      "Point-to-point LSP unicast tunnel";
                    uses apply-advanced;
    
                    container label-switched-path-template {
                      junos:must "(".. .. create-new-ucast-tunnel")";
                      junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                      description
                        "Template for dynamic point-to-point LSP parameters";
                      uses apply-advanced;
    
                      choice dynamic-template {
                        leaf template-name {
                          junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                          junos:must-message "Referenced point-to-point LSP template does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-point LSP template";
                        }
                        leaf default-template {
                          type empty;
                          description
                            "Use default parameters";
                        }
                      }  // choice dynamic-template
                    }  // container label-switched-path-template
                  }  // container label-switched-path
                }  // container ingress-replication
                container rsvp-te {
                  junos:must "("protocols rsvp")";
                  junos:must-message "RSVP must be configured in the master instance";
                  description
                    "RSVP-TE point-to-multipoint LSP for flooding";
                  uses apply-advanced;
    
                  choice static-or-dynamic {
                    container label-switched-path-template {
                      description
                        "Template for dynamic point-to-multipoint LSP parameters";
                      uses apply-advanced;
    
                      choice dynamic-template {
                        leaf template-name {
                          junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                          junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-multipoint LSP template";
                        }
                        leaf default-template {
                          type empty;
                          description
                            "Use default parameters";
                        }
                      }  // choice dynamic-template
                    }  // container label-switched-path-template
                  }  // choice static-or-dynamic
                }  // container rsvp-te
                container ldp-p2mp {
                  junos:must "("protocols ldp p2mp")";
                  junos:must-message "LDP P2MP must be configured in the master instance";
                  presence "enable ldp-p2mp";
                  description
                    "LDP point-to-multipoint LSP for flooding";
                }  // container ldp-p2mp
              }  // choice tunnel-type
    
              container inter-region-segmented {
                junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
                junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
                description
                  "Inter-Region Segmented LSP triggered by threshold rate and/or fan-out";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 1000000";
                    }
                  }
                  units "kilobits";
                  description
                    "Data threshold rate to trigger segmentation";
                }
    
                leaf fan-out {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 10000";
                    }
                  }
                  description
                    "Number of remote Leaf-AD routes";
                }
              }  // container inter-region-segmented
            }  // container inter-as
    
            container inter-region {
              junos:must "((".. .. instance-type vrf" || ".. .. instance-type mpls-internet-multicast"))";
              junos:must-message "Inter-region segmented tunnels can only be configured for VRF or Internet-multicast instances";
              junos:must "(!((".. selective" || (".. pim-ssm" || (".. pim-asm" || (".. rsvp-te" || (".. ldp-p2mp" || (".. ingress-replication" || ".. inter-as"))))))))";
              junos:must-message "Inter-region on RBR can not be allowed with other tunnel options";
              description
                "Inter-region segmented tunnels";
              uses apply-advanced;
    
              choice segmented-or-not {
                leaf template {
                  junos:must "("protocols mvpn inter-region-template template $$")";
                  junos:must-message "Referenced template doesn't exist";
                  type string;
                  description
                    "Use inter-region segmentation template";
                }
                leaf no-inter-region-segmentation {
                  type empty;
                  description
                    "Do not participate in inter-region segmentation";
                }
              }  // choice segmented-or-not
            }  // container inter-region
    
            container inter-region-segmented {
              junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
              junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
              description
                "Inter-Region Segmented LSP triggered by fan-out factor only";
              uses apply-advanced;
    
              leaf fan-out {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10000";
                  }
                }
                description
                  "Number of remote Leaf-AD routes";
              }
            }  // container inter-region-segmented
    
            container selective {
              junos:must "(".. .. protocols mvpn")";
              junos:must-message "Selective tunnels can only be configured for MVPN instances";
              description "Selective tunnels";
              uses apply-advanced;
    
              leaf tunnel-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 30000";
                  }
                }
                description
                  "Maximum number of selective tunnels";
              }
    
              leaf leaf-tunnel-limit-inet {
                junos:must "(".. .. .. protocols mvpn mvpn-mode rpt-spt")";
                junos:must-message "Selective leaf tunnel limit can only be configured for MVPN rpt-spt mode";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 15000";
                  }
                }
                description
                  "Maximum number of selective leaf tunnels for v4";
              }
    
              leaf leaf-tunnel-limit-inet6 {
                junos:must "(".. .. .. protocols mvpn mvpn-mode rpt-spt")";
                junos:must-message "Selective leaf tunnel limit can only be configured for MVPN rpt-spt mode";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 15000";
                  }
                }
                description
                  "Maximum number of selective leaf tunnels for v6";
              }
    
              container wildcard-group-inet {
                description
                  "IPv4 wilcard group matching any group address";
                uses apply-advanced;
    
                container wildcard-source {
                  junos:must "(".. .. .. .. protocols mvpn mvpn-mode rpt-spt")";
                  junos:must-message "MVPN instance needs to be in rpt-spt mode while configuring wildcard-source for selective provider tunnels";
                  presence
                    "enable wildcard-source";
                  description
                    "Use Selective-Tunnel for wildcard-source (*,G) joins";
                  uses apply-advanced;
    
                  leaf threshold-rate {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1000000";
                      }
                    }
                    units "kilobits";
                    description
                      "Data threshold to create new tunnel";
                  }
    
                  choice tunnel-type {
                    container ingress-replication {
                      junos:must "(((".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. .. protocols mvpn"))";
                      junos:must-message "Ingress Replication can be configured only for MVPN instances. Sender based RPF is not supported for ingress-replication provider-tunnels";
                      description
                        "Ingress replication tunnel";
                      uses apply-advanced;
    
                      leaf create-new-ucast-tunnel {
                        junos:must "(".. label-switched-path label-switched-path-template")";
                        junos:must-message "label-switched-path-template must be defined";
                        type empty;
                        description
                          "Create new unicast tunnel for ingress replication";
                      }
    
                      container label-switched-path {
                        presence
                          "enable label-switched-path";
                        description
                          "Point-to-point LSP unicast tunnel";
                        uses apply-advanced;
    
                        container label-switched-path-template {
                          junos:must "(".. .. create-new-ucast-tunnel")";
                          junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                          description
                            "Template for dynamic point-to-point LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                              junos:must-message "Referenced point-to-point LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-point LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // container label-switched-path
                    }  // container ingress-replication
                    container rsvp-te {
                      junos:must "("protocols rsvp")";
                      junos:must-message "RSVP must be configured in the master instance";
                      description
                        "RSVP-TE point-to-multipoint LSP for flooding";
                      uses apply-advanced;
    
                      choice static-or-dynamic {
                        leaf static-lsp {
                          junos:must "(!(".. .. .. .. .. rsvp-te static-lsp $$"))";
                          junos:must-message "Referenced point-to-multipoint static LSP configured for inclusive tunnel";
                          junos:must "(any "protocols mpls label-switched-path <*> p2mp $$")";
                          junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-multipoint LSP";
                        }
                        container label-switched-path-template {
                          description
                            "Template for dynamic point-to-multipoint LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                              junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-multipoint LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // choice static-or-dynamic
                    }  // container rsvp-te
                    container ldp-p2mp {
                      junos:must "("protocols ldp p2mp")";
                      junos:must-message "LDP P2MP must be configured in the master instance";
                      junos:must "((".. .. .. .. .. protocols mvpn" && (".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast")))";
                      junos:must-message "LDP P2MP LSPs can be configured only for MVPN instances";
                      presence "enable ldp-p2mp";
                      description
                        "LDP point-to-multipoint LSP for flooding";
                    }  // container ldp-p2mp
                    container pim-ssm {
                      junos:must "(!(".. .. .. .. .. protocols mvpn sender-based-rpf"))";
                      junos:must-message "This release does not support sender based RPF for PIM-SSM provider-tunnel";
                      junos:must "(".. .. .. .. .. protocols mvpn")";
                      junos:must-message "";
                      junos:must "(".. .. .. .. .. instance-type vrf")";
                      junos:must-message "PIM-SSM can be configured only for vrf instances";
                      junos:must "("protocols pim")";
                      junos:must-message "PIM-SSM must be configured in the master instance";
                      description
                        "PIM-SSM provider tunnel";
                      uses apply-advanced;
    
                      leaf group-range {
                        type jt:ipv4prefix;
                        description
                          "PIM-SSM provider tunnel group range";
                      }
                    }  // container pim-ssm
                  }  // choice tunnel-type
    
                  container inter-region-segmented {
                    junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
                    junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
                    description
                      "Inter-Region Segmented LSP triggered by fan-out factor only";
                    uses apply-advanced;
    
                    leaf fan-out {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 10000";
                        }
                      }
                      description
                        "Number of remote Leaf-AD routes";
                    }
                  }  // container inter-region-segmented
                }  // container wildcard-source
              }  // container wildcard-group-inet
    
              container wildcard-group-inet6 {
                description
                  "IPv6 wilcard group matching any group address";
                uses apply-advanced;
    
                container wildcard-source {
                  junos:must "(".. .. .. .. protocols mvpn mvpn-mode rpt-spt")";
                  junos:must-message "MVPN instance needs to be in rpt-spt mode while configuring wildcard-source for selective provider tunnels";
                  presence
                    "enable wildcard-source";
                  description
                    "Use Selective-Tunnel for wildcard-source (*,G) joins";
                  uses apply-advanced;
    
                  leaf threshold-rate {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1000000";
                      }
                    }
                    units "kilobits";
                    description
                      "Data threshold to create new tunnel";
                  }
    
                  choice tunnel-type {
                    container ingress-replication {
                      junos:must "(((".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. .. protocols mvpn"))";
                      junos:must-message "Ingress Replication can be configured only for MVPN instances";
                      description
                        "Ingress replication tunnel";
                      uses apply-advanced;
    
                      leaf create-new-ucast-tunnel {
                        junos:must "(".. label-switched-path label-switched-path-template")";
                        junos:must-message "label-switched-path-template must be defined";
                        type empty;
                        description
                          "Create new unicast tunnel for ingress replication";
                      }
    
                      container label-switched-path {
                        presence
                          "enable label-switched-path";
                        description
                          "Point-to-point LSP unicast tunnel";
                        uses apply-advanced;
    
                        container label-switched-path-template {
                          junos:must "(".. .. create-new-ucast-tunnel")";
                          junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                          description
                            "Template for dynamic point-to-point LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                              junos:must-message "Referenced point-to-point LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-point LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // container label-switched-path
                    }  // container ingress-replication
                    container rsvp-te {
                      junos:must "("protocols rsvp")";
                      junos:must-message "RSVP must be configured in the master instance";
                      description
                        "RSVP-TE point-to-multipoint LSP for flooding";
                      uses apply-advanced;
    
                      choice static-or-dynamic {
                        leaf static-lsp {
                          junos:must "(!(".. .. .. .. .. rsvp-te static-lsp $$"))";
                          junos:must-message "Referenced point-to-multipoint static LSP configured for inclusive tunnel";
                          junos:must "(any "protocols mpls label-switched-path <*> p2mp $$")";
                          junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-multipoint LSP";
                        }
                        container label-switched-path-template {
                          description
                            "Template for dynamic point-to-multipoint LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                              junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-multipoint LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // choice static-or-dynamic
                    }  // container rsvp-te
                    container ldp-p2mp {
                      junos:must "("protocols ldp p2mp")";
                      junos:must-message "LDP P2MP must be configured in the master instance";
                      junos:must "((".. .. .. .. .. protocols mvpn" && (".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast")))";
                      junos:must-message "LDP P2MP LSPs can be configured only for MVPN instances";
                      presence "enable ldp-p2mp";
                      description
                        "LDP point-to-multipoint LSP for flooding";
                    }  // container ldp-p2mp
                    container pim-ssm {
                      junos:must "(!(".. .. .. .. .. protocols mvpn sender-based-rpf"))";
                      junos:must-message "This release does not support sender based RPF for PIM-SSM provider-tunnel";
                      junos:must "(".. .. .. .. .. protocols mvpn")";
                      junos:must-message "";
                      junos:must "(".. .. .. .. .. instance-type vrf")";
                      junos:must-message "PIM-SSM can be configured only for vrf instances";
                      junos:must "("protocols pim")";
                      junos:must-message "PIM-SSM must be configured in the master instance";
                      description
                        "PIM-SSM provider tunnel";
                      uses apply-advanced;
    
                      leaf group-range {
                        type jt:ipv4prefix;
                        description
                          "PIM-SSM provider tunnel group range";
                      }
                    }  // container pim-ssm
                  }  // choice tunnel-type
    
                  container inter-region-segmented {
                    junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
                    junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
                    description
                      "Inter-Region Segmented LSP triggered by fan-out factor only";
                    uses apply-advanced;
    
                    leaf fan-out {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 10000";
                        }
                      }
                      description
                        "Number of remote Leaf-AD routes";
                    }
                  }  // container inter-region-segmented
                }  // container wildcard-source
              }  // container wildcard-group-inet6
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP prefix of multicast group";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP prefix of group";
                }
    
                uses apply-advanced;
    
                container wildcard-source {
                  junos:must "(".. .. .. .. protocols mvpn mvpn-mode rpt-spt")";
                  junos:must-message "MVPN instance needs to be in rpt-spt mode while configuring wildcard-source for selective provider tunnels";
                  presence
                    "enable wildcard-source";
                  description
                    "Use Selective-Tunnel for wildcard-source (*,G) joins";
                  uses apply-advanced;
    
                  leaf threshold-rate {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1000000";
                      }
                    }
                    units "kilobits";
                    description
                      "Data threshold to create new tunnel";
                  }
    
                  choice tunnel-type {
                    container ingress-replication {
                      junos:must "(((".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. .. protocols mvpn"))";
                      junos:must-message "Ingress Replication can be configured only for MVPN instances.";
                      description
                        "Ingress replication tunnel";
                      uses apply-advanced;
    
                      leaf create-new-ucast-tunnel {
                        junos:must "(".. label-switched-path label-switched-path-template")";
                        junos:must-message "label-switched-path-template must be defined";
                        type empty;
                        description
                          "Create new unicast tunnel for ingress replication";
                      }
    
                      container label-switched-path {
                        presence
                          "enable label-switched-path";
                        description
                          "Point-to-point LSP unicast tunnel";
                        uses apply-advanced;
    
                        container label-switched-path-template {
                          junos:must "(".. .. create-new-ucast-tunnel")";
                          junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                          description
                            "Template for dynamic point-to-point LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                              junos:must-message "Referenced point-to-point LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-point LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // container label-switched-path
                    }  // container ingress-replication
                    container rsvp-te {
                      junos:must "("protocols rsvp")";
                      junos:must-message "RSVP must be configured in the master instance";
                      description
                        "RSVP-TE point-to-multipoint LSP for flooding";
                      uses apply-advanced;
    
                      choice static-or-dynamic {
                        leaf static-lsp {
                          junos:must "(!(".. .. .. .. .. rsvp-te static-lsp $$"))";
                          junos:must-message "Referenced point-to-multipoint static LSP configured for inclusive tunnel";
                          junos:must "(any "protocols mpls label-switched-path <*> p2mp $$")";
                          junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-multipoint LSP";
                        }
                        container label-switched-path-template {
                          description
                            "Template for dynamic point-to-multipoint LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                              junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-multipoint LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // choice static-or-dynamic
                    }  // container rsvp-te
                    container ldp-p2mp {
                      junos:must "("protocols ldp p2mp")";
                      junos:must-message "LDP P2MP must be configured in the master instance";
                      junos:must "((".. .. .. .. .. protocols mvpn" && (".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast")))";
                      junos:must-message "LDP P2MP LSPs can be configured only for MVPN instances";
                      presence "enable ldp-p2mp";
                      description
                        "LDP point-to-multipoint LSP for flooding";
                    }  // container ldp-p2mp
                    container pim-ssm {
                      junos:must "(!(".. .. .. .. .. protocols mvpn sender-based-rpf"))";
                      junos:must-message "This release does not support sender based RPF for PIM-SSM provider-tunnel";
                      junos:must "(".. .. .. .. .. protocols mvpn")";
                      junos:must-message "";
                      junos:must "(".. .. .. .. .. instance-type vrf")";
                      junos:must-message "PIM-SSM can be configured only for vrf instances";
                      junos:must "("protocols pim")";
                      junos:must-message "PIM-SSM must be configured in the master instance";
                      description
                        "PIM-SSM provider tunnel";
                      uses apply-advanced;
    
                      leaf group-range {
                        type jt:ipv4prefix;
                        description
                          "PIM-SSM provider tunnel group range";
                      }
                    }  // container pim-ssm
                  }  // choice tunnel-type
    
                  container inter-region-segmented {
                    junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
                    junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
                    description
                      "Inter-Region Segmented LSP triggered by threshold rate and/or fan-out";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 1000000";
                        }
                      }
                      units "kilobits";
                      description
                        "Data threshold rate to trigger segmentation";
                    }
    
                    leaf fan-out {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 10000";
                        }
                      }
                      description
                        "Number of remote Leaf-AD routes";
                    }
                  }  // container inter-region-segmented
                }  // container wildcard-source
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP prefix of one or more multicast sources";
                  leaf name {
                    type jt:ipprefix;
                    description
                      "IP prefix of source";
                  }
    
                  uses apply-advanced;
    
                  choice tunnel-type {
                    container ingress-replication {
                      junos:must "(((".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. .. protocols mvpn"))";
                      junos:must-message "Ingress Replication can be configured only for MVPN instances";
                      description
                        "Ingress replication tunnel";
                      uses apply-advanced;
    
                      leaf create-new-ucast-tunnel {
                        junos:must "(".. label-switched-path label-switched-path-template")";
                        junos:must-message "label-switched-path-template must be defined";
                        type empty;
                        description
                          "Create new unicast tunnel for ingress replication";
                      }
    
                      container label-switched-path {
                        presence
                          "enable label-switched-path";
                        description
                          "Point-to-point LSP unicast tunnel";
                        uses apply-advanced;
    
                        container label-switched-path-template {
                          junos:must "(".. .. create-new-ucast-tunnel")";
                          junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                          description
                            "Template for dynamic point-to-point LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                              junos:must-message "Referenced point-to-point LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-point LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // container label-switched-path
                    }  // container ingress-replication
                    container rsvp-te {
                      junos:must "("protocols rsvp")";
                      junos:must-message "RSVP must be configured in the master instance";
                      description
                        "RSVP-TE point-to-multipoint LSP for flooding";
                      uses apply-advanced;
    
                      choice static-or-dynamic {
                        leaf static-lsp {
                          junos:must "(!(".. .. .. .. .. rsvp-te static-lsp $$"))";
                          junos:must-message "Referenced point-to-multipoint static LSP configured for inclusive tunnel";
                          junos:must "(any "protocols mpls label-switched-path <*> p2mp $$")";
                          junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                          type string {
                            junos:posix-pattern "^.{1,32}$";
                            junos:pattern-message "Must be a string of 32 characters or less";
                          }
                          description
                            "Name of point-to-multipoint LSP";
                        }
                        container label-switched-path-template {
                          description
                            "Template for dynamic point-to-multipoint LSP parameters";
                          uses apply-advanced;
    
                          choice dynamic-template {
                            leaf template-name {
                              junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                              junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                              type string {
                                junos:posix-pattern "^.{1,32}$";
                                junos:pattern-message "Must be a string of 32 characters or less";
                              }
                              description
                                "Name of point-to-multipoint LSP template";
                            }
                            leaf default-template {
                              type empty;
                              description
                                "Use default parameters";
                            }
                          }  // choice dynamic-template
                        }  // container label-switched-path-template
                      }  // choice static-or-dynamic
                    }  // container rsvp-te
                    container pim-ssm {
                      junos:must "(!(".. .. .. .. .. protocols mvpn sender-based-rpf"))";
                      junos:must-message "This release does not support sender based RPF for PIM-SSM provider-tunnel";
                      junos:must "(".. .. .. .. .. protocols mvpn")";
                      junos:must-message "";
                      junos:must "(".. .. .. .. .. instance-type vrf")";
                      junos:must-message "PIM-SSM can be configured only for vrf instances";
                      junos:must "("protocols pim")";
                      junos:must-message "PIM-SSM must be configured in the master instance";
                      description
                        "PIM-SSM provider tunnel";
                      uses apply-advanced;
    
                      leaf group-range {
                        type jt:ipv4prefix;
                        description
                          "PIM-SSM provider tunnel group range";
                      }
                    }  // container pim-ssm
                    container ldp-p2mp {
                      junos:must "("protocols ldp p2mp")";
                      junos:must-message "LDP P2MP must be configured in the master instance";
                      junos:must "((".. .. .. .. .. protocols mvpn" && (".. .. .. .. .. instance-type vrf" || ".. .. .. .. .. instance-type mpls-internet-multicast")))";
                      junos:must-message "LDP P2MP LSPs can be configured only for MVPN instances";
                      presence "enable ldp-p2mp";
                      description
                        "LDP point-to-multipoint LSP for flooding";
                    }  // container ldp-p2mp
                  }  // choice tunnel-type
    
                  leaf threshold-rate {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1000000";
                      }
                    }
                    units "kilobits";
                    description
                      "Data threshold to create new tunnel";
                  }
    
                  container inter-region-segmented {
                    junos:must "(!((".. pim-ssm" || ".. pim-asm")))";
                    junos:must-message "Inter-region-segmented cannot be set for PIM tunnel";
                    description
                      "Inter-Region Segmented LSP triggered by threshold rate and/or fan-out";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 1000000";
                        }
                      }
                      units "kilobits";
                      description
                        "Data threshold rate to trigger segmentation";
                    }
    
                    leaf fan-out {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 10000";
                        }
                      }
                      description
                        "Number of remote Leaf-AD routes";
                    }
                  }  // container inter-region-segmented
                }  // list source
              }  // list group
            }  // container selective
    
            container mdt {
              junos:must "(".. .. protocols pim mvpn")";
              junos:must-message "Data MDT tunnels can only be configured for PIM MVPN instances";
              status deprecated;
              description
                "Data MDT tunnels for PIM MVPN";
              uses apply-advanced;
    
              container threshold {
                description
                  "Threshold for creation of multicast tunnels";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP prefix of multicast group";
                  leaf name {
                    type jt:ipprefix;
                    description
                      "IP prefix of group";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP prefix of one or more multicast sources ";
                    leaf name {
                      type jt:ipprefix;
                      description
                        "IP prefix of source";
                    }
    
                    uses apply-advanced;
    
                    leaf rate {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "10 .. 1000000";
                        }
                      }
                      units "kilobits";
                      description
                        "Data threshold to create new tunnel";
                    }
                  }  // list source
                }  // list group
              }  // container threshold
    
              leaf data-mdt-reuse {
                type empty;
                description
                  "Allow multiple customer streams to be transmitted over one data tunnel ";
              }
    
              leaf tunnel-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 8192";
                  }
                }
                description
                  "Maximum multicast data tunnels";
              }
    
              leaf group-range {
                type jt:ipprefix;
                description
                  "Group address range for multicast data tunnels";
              }
            }  // container mdt
    
            container family {
              presence "enable family";
              uses apply-advanced;
    
              container inet {
                junos:must "(!((" .. .. .. non-forwarding-vrf" && (". rsvp-te" || (". pim-asm" || (". pim-ssm" || ". ldp-p2mp"))))))";
                junos:must-message "Inclusive p-tunnel configuration not allowed on ASBR with non-forwarding-vrf";
                presence "enable inet";
                uses apply-advanced;
    
                choice tunnel-type {
                  container rsvp-te {
                    junos:must "((".. .. .. .. instance-type vpls" || (".. .. .. .. protocols mvpn" && (".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast"))))";
                    junos:must-message "Point-to-multipoint LSPs can be configured only for VPLS or MVPN instances";
                    junos:must "("protocols rsvp")";
                    junos:must-message "RSVP must be configured in the master instance";
                    description
                      "RSVP-TE point-to-multipoint LSP for flooding";
                    uses apply-advanced;
    
                    choice static-or-dynamic {
                      leaf static-lsp {
                        junos:must "((any "protocols mpls label-switched-path <*> p2mp $$" || ".. .. .. instance-type vpls"))";
                        junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-multipoint LSP";
                      }
                      container label-switched-path-template {
                        description
                          "Template for dynamic point-to-multipoint LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                            junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-multipoint LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // choice static-or-dynamic
                  }  // container rsvp-te
                  container ldp-p2mp {
                    junos:must "("protocols ldp p2mp")";
                    junos:must-message "LDP P2MP must be configured in the master instance";
                    junos:must "((".. .. .. .. protocols mvpn" && (".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast")))";
                    junos:must-message "LDP P2MP LSPs can be configured only for valid MVPN instances";
                    presence "enable ldp-p2mp";
                    description
                      "LDP point-to-multipoint LSP for flooding";
                  }  // container ldp-p2mp
                  container ingress-replication {
                    junos:must "(((".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. protocols mvpn"))";
                    junos:must-message "Ingress Replication can be configured only for MVPN instances";
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "This release does not support Sender based RPF for inclusive ingress replication provider tunnels";
                    description
                      "Ingress replication tunnel";
                    uses apply-advanced;
    
                    leaf create-new-ucast-tunnel {
                      junos:must "(".. label-switched-path label-switched-path-template")";
                      junos:must-message "label-switched-path-template must be defined";
                      type empty;
                      description
                        "Create new unicast tunnel for ingress replication";
                    }
    
                    container label-switched-path {
                      presence
                        "enable label-switched-path";
                      description
                        "Point-to-point LSP unicast tunnel";
                      uses apply-advanced;
    
                      container label-switched-path-template {
                        junos:must "(".. .. create-new-ucast-tunnel")";
                        junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                        description
                          "Template for dynamic point-to-point LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                            junos:must-message "Referenced point-to-point LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-point LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // container label-switched-path
                  }  // container ingress-replication
                  container pim-asm {
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "this release does not support sender based RPF for PIM-SM provider tunnels";
                    junos:must "(!("protocols pim mpls-internet-multicast"))";
                    junos:must-message "mpls-internet-multicast must not be configured";
                    junos:must "("protocols pim")";
                    junos:must-message "PIM-SM must be configured in the master instance";
                    junos:must "(".. .. .. .. instance-type vrf")";
                    junos:must-message "PIM-SM must be configured only for vrf instances";
                    description
                      "PIM-SM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SM provider tunnel group address";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container pim-asm
                  container pim-ssm {
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "this release does not support sender based RPF for PIM-SSM provider tunnels";
                    junos:must "(!("protocols pim mpls-internet-multicast"))";
                    junos:must-message "mpls-internet-multicast must not be configured";
                    junos:must "("protocols pim")";
                    junos:must-message "PIM-SSM must be configured in the master instance";
                    junos:must "(".. .. .. .. protocols mvpn")";
                    junos:must-message "PIM-SSM provider tunnel can be configured only for multicast VPN instances";
                    junos:must "(".. .. .. .. instance-type vrf")";
                    junos:must-message "PIM-SM must be configured only for vrf instances";
                    description
                      "PIM-SSM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SSM provider tunnel group address";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container pim-ssm
                }  // choice tunnel-type
    
                container mdt {
                  junos:must "(".. .. .. .. protocols pim mvpn")";
                  junos:must-message "Data MDT tunnels can only be configured for PIM
    MVPN instances";
                  description
                    "IPv4 Data MDT tunnels for PIM MVPN";
                  uses apply-advanced;
    
                  container threshold {
                    description
                      "Threshold for creation of multicast tunnels";
                    uses apply-advanced;
    
                    list group {
                      key "name";
                      ordered-by user;
                      description
                        "IP prefix of multicast group";
                      leaf name {
                        type jt:ipprefix;
                        description
                          "IP prefix of group";
                      }
    
                      uses apply-advanced;
    
                      list source {
                        key "name";
                        ordered-by user;
                        description
                          "IP prefix of one or more multicast sources ";
                        leaf name {
                          type jt:ipprefix;
                          description
                            "IP prefix of source";
                        }
    
                        uses apply-advanced;
    
                        leaf rate {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "10 .. 1000000";
                            }
                          }
                          units "kilobits";
                          description
                            "Data threshold to create new tunnel";
                        }
                      }  // list source
                    }  // list group
                  }  // container threshold
    
                  leaf data-mdt-reuse {
                    type empty;
                    description
                      "Allow multiple customer streams to be transmitted over one data tunnel ";
                  }
    
                  leaf tunnel-limit {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 8192";
                      }
                    }
                    description
                      "Maximum multicast data tunnels";
                  }
    
                  leaf group-range {
                    type jt:ipprefix;
                    description
                      "Group address range for multicast data tunnels";
                  }
                }  // container mdt
              }  // container inet
    
              container inet6 {
                junos:must "(!((" .. .. .. non-forwarding-vrf" && (". rsvp-te" || (". pim-asm" || (". pim-ssm" || ". ldp-p2mp"))))))";
                junos:must-message "Inclusive p-tunnel configuration not allowed on ASBR with non-forwarding-vrf";
                presence "enable inet6";
                uses apply-advanced;
    
                choice tunnel-type {
                  container rsvp-te {
                    junos:must "((".. .. .. .. instance-type vpls" || (".. .. .. .. protocols mvpn" && (".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast"))))";
                    junos:must-message "Point-to-multipoint LSPs can be configured only for VPLS or MVPN instances";
                    junos:must "("protocols rsvp")";
                    junos:must-message "RSVP must be configured in the master instance";
                    description
                      "RSVP-TE point-to-multipoint LSP for flooding";
                    uses apply-advanced;
    
                    choice static-or-dynamic {
                      leaf static-lsp {
                        junos:must "((any "protocols mpls label-switched-path <*> p2mp $$" || ".. .. .. instance-type vpls"))";
                        junos:must-message "Referenced point-to-multipoint static LSP does not exist";
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-multipoint LSP";
                      }
                      container label-switched-path-template {
                        description
                          "Template for dynamic point-to-multipoint LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                            junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-multipoint LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // choice static-or-dynamic
                  }  // container rsvp-te
                  container ldp-p2mp {
                    junos:must "("protocols ldp p2mp")";
                    junos:must-message "LDP P2MP must be configured in the master instance";
                    junos:must "((".. .. .. .. protocols mvpn" && (".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast")))";
                    junos:must-message "LDP P2MP LSPs can be configured only for valid MVPN instances";
                    presence "enable ldp-p2mp";
                    description
                      "LDP point-to-multipoint LSP for flooding";
                  }  // container ldp-p2mp
                  container ingress-replication {
                    junos:must "(((".. .. .. .. instance-type vrf" || ".. .. .. .. instance-type mpls-internet-multicast") && ".. .. .. .. protocols mvpn"))";
                    junos:must-message "Ingress Replication can be configured only for MVPN instances";
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "This release does not support Sender based RPF for inclusive ingress replication provider tunnels";
                    description
                      "Ingress replication tunnel";
                    uses apply-advanced;
    
                    leaf create-new-ucast-tunnel {
                      junos:must "(".. label-switched-path label-switched-path-template")";
                      junos:must-message "label-switched-path-template must be defined";
                      type empty;
                      description
                        "Create new unicast tunnel for ingress replication";
                    }
    
                    container label-switched-path {
                      presence
                        "enable label-switched-path";
                      description
                        "Point-to-point LSP unicast tunnel";
                      uses apply-advanced;
    
                      container label-switched-path-template {
                        junos:must "(".. .. create-new-ucast-tunnel")";
                        junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                        description
                          "Template for dynamic point-to-point LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                            junos:must-message "Referenced point-to-point LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-point LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // container label-switched-path
                  }  // container ingress-replication
                  container pim-asm {
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "this release does not support sender based RPF for PIM-SM provider tunnels";
                    junos:must "(!("protocols pim mpls-internet-multicast"))";
                    junos:must-message "mpls-internet-multicast must not be configured";
                    junos:must "("protocols pim")";
                    junos:must-message "PIM-SM must be configured in the master instance";
                    junos:must "(".. .. .. .. instance-type vrf")";
                    junos:must-message "PIM-SM must be configured only for vrf instances";
                    description
                      "PIM-SM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SM provider tunnel group address";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container pim-asm
                  container pim-ssm {
                    junos:must "(!(".. .. .. .. protocols mvpn sender-based-rpf"))";
                    junos:must-message "this release does not support sender based RPF for PIM-SSM provider tunnels";
                    junos:must "(!("protocols pim mpls-internet-multicast"))";
                    junos:must-message "mpls-internet-multicast must not be configured";
                    junos:must "("protocols pim")";
                    junos:must-message "PIM-SSM must be configured in the master instance";
                    junos:must "(".. .. .. .. protocols mvpn")";
                    junos:must-message "PIM-SSM provider tunnel can be configured only for multicast VPN instances";
                    junos:must "(".. .. .. .. instance-type vrf")";
                    junos:must-message "PIM-SM must be configured only for vrf instances";
                    description
                      "PIM-SSM provider tunnel";
                    uses apply-advanced;
    
                    leaf group-address {
                      type jt:ipv4addr;
                      description
                        "PIM-SSM provider tunnel group address";
                    }
    
                    leaf tunnel-source {
                      type jt:ipv4addr;
                      description
                        "Source address for the provider space mGRE tunnel";
                    }
                  }  // container pim-ssm
                }  // choice tunnel-type
    
                container mdt {
                  junos:must "(".. .. .. .. protocols pim mvpn")";
                  junos:must-message "Data MDT tunnels can only be configured for PIM
    MVPN instances";
                  description
                    "IPv6 Data MDT tunnels for PIM MVPN";
                  uses apply-advanced;
    
                  container threshold {
                    description
                      "Threshold for creation of multicast tunnels";
                    uses apply-advanced;
    
                    list group {
                      key "name";
                      ordered-by user;
                      description
                        "IP prefix of multicast group";
                      leaf name {
                        type jt:ipprefix;
                        description
                          "IP prefix of group";
                      }
    
                      uses apply-advanced;
    
                      list source {
                        key "name";
                        ordered-by user;
                        description
                          "IP prefix of one or more multicast sources ";
                        leaf name {
                          type jt:ipprefix;
                          description
                            "IP prefix of source";
                        }
    
                        uses apply-advanced;
    
                        leaf rate {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "10 .. 1000000";
                            }
                          }
                          units "kilobits";
                          description
                            "Data threshold to create new tunnel";
                        }
                      }  // list source
                    }  // list group
                  }  // container threshold
    
                  leaf data-mdt-reuse {
                    type empty;
                    description
                      "Allow multiple customer streams to be transmitted over one data tunnel ";
                  }
    
                  leaf tunnel-limit {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 8192";
                      }
                    }
                    description
                      "Maximum multicast data tunnels";
                  }
    
                  leaf group-range {
                    type jt:ipprefix;
                    description
                      "Group address range for multicast data tunnels";
                  }
                }  // container mdt
              }  // container inet6
            }  // container family
          }  // container provider-tunnel
    
          container multicast-snooping-options {
            junos:must "((".. instance-type vpls" || (".. instance-type evpn" || (".. instance-type virtual-switch " || ".. instance-type mac-vrf "))))";
            junos:must-message "multicast-snooping-options configuration is allowed only for 'instance-type vpls/evpn or instance-type virtual-switch/mac-vrf'";
            description
              "Multicast snooping option configuration";
            uses juniper-multicast-snooping-options;
          }  // container multicast-snooping-options
    
          container igmp-snooping-options {
            junos:must "((".. instance-type vpls" || (".. instance-type virtual-switch" || (".. instance-type evpn" && ".. protocols vpls"))))";
            junos:must-message "igmp-snooping-options configuration is allowed only for 'instance-type vpls/virtual-switch'";
            description
              "IGMP snooping option configuration";
            uses juniper-igmp-snooping-options;
          }  // container igmp-snooping-options
    
          container mld-snooping-options {
            junos:must "((".. instance-type vpls" || (".. instance-type virtual-switch" || (".. instance-type evpn" && ".. protocols vpls"))))";
            junos:must-message "mld-snooping-options configuration is allowed only for 'instance-type vpls or instance-type virtual-switch'";
            description
              "MLD snooping option configuration";
            uses juniper-mld-snooping-options;
          }  // container mld-snooping-options
    
          container vlans {
            junos:must "((".. instance-type virtual-switch" || ".. instance-type mac-vrf"))";
            junos:must-message "'vlans' configuration can only be used for 'instance-type virtual-switch' or 'instance-type mac-vrf'";
            junos:must "(!("bridge-domains"))";
            junos:must-message "VLANs cannot be configured when BDs are configured";
            description "VLAN configuration";
            uses apply-advanced;
    
            list vlan {
              key "name";
              description "Virtual LAN";
              uses vlan-types;
            }  // list vlan
          }  // container vlans
        }  // grouping juniper-routing-instance
    
        grouping address-assignment-type {
          description
            "Address assignment configuration";
          uses apply-advanced;
    
          container neighbor-discovery-router-advertisement {
            description
              "Designated NDRA pool for this instance";
            leaf ndra-name {
              junos:must "(".. .. pool $$  family inet6")";
              junos:must-message "designated NDRA pool must be configured and family inet6 must be set";
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                length "1 .. 63";
              }
              description
                "Designated NDRA pool name";
            }
          }  // container neighbor-discovery-router-advertisement
    
          leaf high-utilization {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "2 .. 99";
              }
            }
            description
              "Generate an SNMP trap when address pool use surpasses this percentage";
          }
    
          leaf abated-utilization {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 98";
              }
            }
            description
              "Generate an SNMP clear trap when address pool use falls below this percentage";
          }
    
          leaf high-utilization-v6 {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "2 .. 99";
              }
            }
            description
              "Generate an SNMP trap when address pool use surpasses this percentage";
          }
    
          leaf abated-utilization-v6 {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 98";
              }
            }
            description
              "Generate an SNMP clear trap when address pool use falls below this percentage";
          }
    
          list dynamic-pool {
            key "name";
            ordered-by user;
            description "Dynamic address pool";
            leaf name {
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                length "1 .. 63";
              }
              description
                "Dynamic address pool name";
            }
    
            uses apply-advanced;
    
            container family {
              presence "enable family";
              description "Address family";
              uses apply-advanced;
    
              container inet6 {
                description "IPv6";
                uses apply-advanced;
    
                leaf delegated-prefix-length {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 64";
                    }
                  }
                  description
                    "Delegated IPv6 network prefix length";
                }
    
                leaf from-interface {
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Get prefix from interface name";
                }
    
                list range {
                  key "name";
                  ordered-by user;
                  description
                    "IPv6 address range";
                  leaf name {
                    type string {
                      junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                      junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                      length "1 .. 63";
                    }
                    description "Range name";
                  }
    
                  uses apply-advanced;
    
                  leaf masked-low {
                    junos:must "(".. masked-high")";
                    junos:must-message "range upper bound must be defined";
                    type jt:ipv6prefix-mandatory;
                    description
                      "Lower limit of ipv6 address range";
                  }
    
                  leaf masked-high {
                    junos:must "(".. masked-low")";
                    junos:must-message "range lower bound must be defined";
                    type jt:ipv6prefix-mandatory;
                    description
                      "Upper limit of ipv6 address range";
                  }
    
                  leaf prefix-length {
                    junos:must "(!(any ".. .. range <*> masked-low"))";
                    junos:must-message "'prefix-length' cannot be configured with 'masked-low' in one dynamic pool";
                    junos:must "(unique ".. .. range <*> prefix-length")";
                    junos:must-message "'prefix-length' cannot be configured for multiple ranges in one dynamic pool";
                    junos:must "(!(".. masked-low"))";
                    junos:must-message "prefix-length cannot be configured with 'masked-low'";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 64";
                      }
                    }
                    description
                      "IPv6 delegated prefix length";
                  }
                }  // list range
    
                container dhcp-attributes {
                  description
                    "DHCP options and match criteria";
                  uses dynamic-dhcp-attribute-type;
                }  // container dhcp-attributes
              }  // container inet6
            }  // container family
          }  // list dynamic-pool
    
          list pool {
            key "name";
            ordered-by user;
            description "Address pool";
            leaf name {
              junos:must "(!(".. link $$"))";
              junos:must-message "Link cannot be self referential";
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                length "1 .. 63";
              }
              description "Address pool name";
            }
    
            uses apply-advanced;
    
            leaf active-drain {
              type empty;
              description
                "Notify client of pool active drain mode";
            }
    
            leaf hold-down {
              type empty;
              description
                "Place pool in passive drain mode";
            }
    
            leaf link {
              junos:must "(".. .. pool $$")";
              junos:must-message "Link must be to a valid pool name";
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                length "1 .. 63";
              }
              description
                "Address pool link name";
            }
    
            container family {
              presence "enable family";
              description "Address family";
              choice family_type {
                container inet {
                  presence "enable inet";
                  description "IPv4";
                  uses apply-advanced;
    
                  leaf network {
                    type jt:ipv4prefix;
                    description
                      "Network address";
                  }
    
                  list range {
                    key "name";
                    ordered-by user;
                    description "Address range";
                    leaf name {
                      type string {
                        junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                        junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                        length "1 .. 63";
                      }
                      description "Range name";
                    }
    
                    uses apply-advanced;
    
                    leaf low {
                      type jt:ipv4addr;
                      description
                        "Lower limit of address range";
                    }
    
                    leaf high {
                      type jt:ipv4addr;
                      description
                        "Upper limit of address range";
                    }
                  }  // list range
    
                  container dhcp-attributes {
                    description
                      "DHCP options and match criteria";
                    uses dhcp-attribute-type;
                  }  // container dhcp-attributes
    
                  container xauth-attributes {
                    description
                      "Configure xauth attributes";
                    uses apply-advanced;
    
                    leaf primary-dns {
                      type jt:ipv4prefix;
                      description
                        "Specify the primary-dns IP address";
                    }
    
                    leaf secondary-dns {
                      type jt:ipv4prefix;
                      description
                        "Specify the secondary-dns IP address";
                    }
    
                    leaf primary-wins {
                      type jt:ipv4prefix;
                      description
                        "Specify the primary-wins IP address";
                    }
    
                    leaf secondary-wins {
                      type jt:ipv4prefix;
                      description
                        "Specify the secondary-wins IP address";
                    }
                  }  // container xauth-attributes
    
                  list host {
                    key "name";
                    ordered-by user;
                    description
                      "Hostname for static reservations";
                    leaf name {
                      junos:must "((".. hardware-address" || ".. user-name"))";
                      junos:must-message "either host's hardware address or identifier must be set";
                      type string {
                        length "1 .. 256";
                      }
                      description "Hostname";
                    }
    
                    uses apply-advanced;
    
                    leaf hardware-address {
                      type jt:mac-addr;
                      description
                        "Hardware address";
                    }
    
                    leaf ip-address {
                      type jt:ipv4addr;
                      description
                        "Reserved address";
                    }
    
                    choice host-identifier-type {
                      leaf user-name {
                        type empty;
                        description
                          "Set subscriber user name as host identifier";
                      }
                    }  // choice host-identifier-type
                  }  // list host
    
                  list excluded-address {
                    key "name";
                    max-elements 20;
                    ordered-by user;
                    description
                      "Excluded Addresses";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "Excluded address";
                    }
    
                    uses apply-advanced;
                  }  // list excluded-address
    
                  list excluded-range {
                    key "name";
                    max-elements 20;
                    ordered-by user;
                    description
                      "Excluded address range";
                    leaf name {
                      type string {
                        junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                        junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                        length "1 .. 63";
                      }
                      description "Range name";
                    }
    
                    uses apply-advanced;
    
                    leaf low {
                      type jt:ipv4addr;
                      description
                        "Lower limit of excluded address range";
                    }
    
                    leaf high {
                      type jt:ipv4addr;
                      description
                        "Upper limit of excluded address range";
                    }
                  }  // list excluded-range
                }  // container inet
                container inet6 {
                  presence "enable inet6";
                  description "IPv6";
                  uses apply-advanced;
    
                  leaf prefix {
                    type jt:ipv6prefix-mandatory;
                    description
                      "IPv6 network prefix";
                  }
    
                  list range {
                    key "name";
                    ordered-by user;
                    description
                      "IPv6 address range";
                    leaf name {
                      type string {
                        junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                        junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                        length "1 .. 63";
                      }
                      description "Range name";
                    }
    
                    uses apply-advanced;
    
                    leaf low {
                      junos:must "(".. high")";
                      junos:must-message "range upper bound must be defined";
                      type jt:ipv6prefix-mandatory;
                      description
                        "Lower limit of ipv6 address range";
                    }
    
                    leaf high {
                      junos:must "(".. low")";
                      junos:must-message "range lower bound must be defined";
                      type jt:ipv6prefix-mandatory;
                      description
                        "Upper limit of ipv6 address range";
                    }
    
                    leaf prefix-length {
                      junos:must "(!(".. low"))";
                      junos:must-message "range lower bound may not be defined";
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 128";
                        }
                      }
                      description
                        "IPv6 delegated prefix length";
                    }
                  }  // list range
    
                  container dhcp-attributes {
                    description
                      "DHCP options and match criteria";
                    uses dhcp-attribute-type;
                  }  // container dhcp-attributes
    
                  container xauth-attributes {
                    description
                      "Configure xauth ipv6 attributes";
                    uses apply-advanced;
    
                    leaf primary-dns-ipv6 {
                      type jt:ipv6addr;
                      description
                        "Specify the primary-dns IPv6 address";
                    }
    
                    leaf secondary-dns-ipv6 {
                      type jt:ipv6addr;
                      description
                        "Specify the secondary-dns IPv6 address";
                    }
                  }  // container xauth-attributes
    
                  list host {
                    key "name";
                    ordered-by user;
                    description
                      "Hostname for static reservations";
                    leaf name {
                      junos:must "((".. hardware-address" || ".. user-name"))";
                      junos:must-message "either host's hardware address or identifier must be set";
                      type string {
                        length "1 .. 256";
                      }
                      description "Hostname";
                    }
    
                    uses apply-advanced;
    
                    leaf hardware-address {
                      type jt:mac-addr;
                      description
                        "Hardware address";
                    }
    
                    leaf ip-address {
                      type jt:ipv6addr;
                      description
                        "Reserved address";
                    }
    
                    choice host-identifier-type {
                      leaf user-name {
                        type empty;
                        description
                          "Set subscriber user name as host identifier";
                      }
                    }  // choice host-identifier-type
                  }  // list host
    
                  list excluded-address {
                    key "name";
                    max-elements 20;
                    ordered-by user;
                    description
                      "Excluded Addresses";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "Excluded address";
                    }
    
                    uses apply-advanced;
                  }  // list excluded-address
    
                  list excluded-range {
                    key "name";
                    max-elements 20;
                    ordered-by user;
                    description
                      "Excluded address range";
                    leaf name {
                      type string {
                        junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]{0,62}$";
                        junos:pattern-message "Must be a string beginning with a number or letter and consisting of no more than 63 total letters, numbers, dashes and underscores.";
                        length "1 .. 63";
                      }
                      description "Range name";
                    }
    
                    uses apply-advanced;
    
                    leaf low {
                      type jt:ipv6addr;
                      description
                        "Lower limit of excluded address range";
                    }
    
                    leaf high {
                      type jt:ipv6addr;
                      description
                        "Upper limit of excluded address range";
                    }
                  }  // list excluded-range
                }  // container inet6
              }  // choice family_type
            }  // container family
          }  // list pool
    
          list domain-profile {
            key "name";
            ordered-by user;
            description "Address domain profile";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Pool domain profile name";
            }
    
            uses apply-advanced;
    
            container family {
              description
                "Network family to which this configuration belongs";
              uses apply-advanced;
    
              container inet {
                description
                  "The IPv4 internet family";
                uses apply-advanced;
    
                leaf preferred-prefix-length {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "8 .. 30";
                    }
                  }
                  description
                    "Preferred prefix length";
                }
    
                leaf source-partition-qualifier {
                  type string {
                    length "1 .. 63";
                  }
                  description
                    "Prefix source qualifier appended to location for partition name";
                }
    
                container excluded-address {
                  description
                    "Excluded addresses from allocation";
                  leaf-list last-octet {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint8 {
                        range "0 .. 255";
                      }
                    }
                    ordered-by user;
                    description
                      "Last octet of the excluded address";
                  }
                }  // container excluded-address
    
                leaf install-discard-routes {
                  type empty;
                  description
                    "Install discard route domain pool prefix";
                }
    
                leaf dhcp-router-host-part {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 8";
                    }
                  }
                  description
                    "DHCP host address component to be excluded and passed to DHCP";
                }
    
                leaf protocol-attributes {
                  junos:must "("access protocol-attributes $$")";
                  junos:must-message "referenced protocol-attributes must be defined";
                  type string {
                    length "1 .. 63";
                  }
                  description
                    "Access protocol-attributes name";
                }
              }  // container inet
            }  // container family
          }  // list domain-profile
    
          list address-pools {
            key "name";
            max-elements 10000;
            ordered-by user;
            description
              "Address pools for subscribers";
            uses sm-ippool-pool;
          }  // list address-pools
        }  // grouping address-assignment-type
    
        grouping dhcp-attribute-type {
          uses apply-advanced;
    
          container option-match {
            description "Match";
            uses apply-advanced;
    
            container option-82 {
              uses apply-advanced;
    
              list circuit-id {
                key "name";
                ordered-by user;
                description
                  "Circuit ID portion of the option 82";
                leaf name {
                  type string;
                }
    
                leaf range {
                  type string;
                  description "Range name";
                }
              }  // list circuit-id
    
              list remote-id {
                key "name";
                ordered-by user;
                description
                  "Remote ID portion of the option 82";
                leaf name {
                  type string;
                }
    
                leaf range {
                  type string;
                  description "Range name";
                }
              }  // list remote-id
            }  // container option-82
          }  // container option-match
    
          leaf maximum-lease-time {
            type string;
            units "seconds";
            description
              "Maximum lease time advertised to clients";
          }
    
          leaf next-server {
            type jt:ipv4addr;
            description
              "Next server that clients need to contact";
          }
    
          leaf server-identifier {
            type jt:ipv4addr;
            description
              "Server Identifier - IP address value";
          }
    
          leaf grace-period {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            units "seconds";
            description
              "Grace period for leases";
          }
    
          leaf domain-name {
            type string {
              junos:posix-pattern "^[[:alnum:]._-]+$";
              junos:pattern-message "Must be a string of letters, numbers, dashes or underscores";
            }
            description
              "Domain name advertised to clients";
          }
    
          list name-server {
            key "name";
            ordered-by user;
            description
              "Domain name servers available to the client";
            leaf name {
              type jt:ipv4addr;
              description
                "DNS server's IPv4 address";
            }
    
            uses apply-advanced;
          }  // list name-server
    
          list wins-server {
            key "name";
            ordered-by user;
            description "WINS name servers";
            leaf name {
              type jt:ipv4addr;
              description
                "WINS server's IPv4 address";
            }
    
            uses apply-advanced;
          }  // list wins-server
    
          list router {
            key "name";
            ordered-by user;
            description
              "Routers advertised to clients";
            leaf name {
              type jt:ipv4addr;
              description
                "Router's IPv4 address";
            }
    
            uses apply-advanced;
          }  // list router
    
          leaf boot-file {
            type string;
            description
              "Boot filename advertised to clients";
          }
    
          leaf boot-server {
            type string {
              junos:posix-pattern "^[[:alnum:]._-]+$";
              junos:pattern-message "Must be a string of letters, numbers, dashes or underscores";
            }
            description
              "Boot server advertised to clients";
          }
    
          leaf tftp-server {
            type jt:ipv4addr;
            description
              "TFTP server IP address advertised to clients";
          }
    
          container sip-server {
            description "SIP servers to clients";
            uses apply-advanced;
    
            list name {
              key "name";
              ordered-by user;
              description
                "SIP server domain name available to clients";
              leaf name {
                junos:must "(!(any ".. .. address <*>"))";
                junos:must-message "Cannot configure sip-server by both name and address";
                type string;
                description "SIP server name";
              }
    
              uses apply-advanced;
            }  // list name
    
            list ip-address {
              key "name";
              ordered-by user;
              description
                "SIP servers list of IPv4 addresses available to the client";
              leaf name {
                type jt:ipv4addr;
                description
                  "SIP server's IPv4 address";
              }
    
              uses apply-advanced;
            }  // list ip-address
          }  // container sip-server
    
          leaf netbios-node-type {
            type enumeration {
              enum "b-node" {
                value 0;
                description "Broadcast node";
              }
              enum "p-node" {
                value 1;
                description "Peer-to-peer node";
              }
              enum "m-node" {
                value 2;
                description "Mixed Node";
              }
              enum "h-node" {
                value 3;
                description "Hybrid node";
              }
            }
            description
              "Type of NETBIOS node advertised to clients";
          }
    
          leaf sip-server-domain-name {
            type string {
              junos:posix-pattern "^[[:alnum:]._-]+$";
              junos:pattern-message "Must be a string of letters, numbers, dashes or underscores";
            }
            description
              "SIP server domain name available to clients";
          }
    
          list sip-server-address {
            key "name";
            ordered-by user;
            description
              "SIP Servers list of IPv6 addresses available to the client";
            leaf name {
              type jt:ipv6addr;
              description
                "SIP Server's IPv6 address";
            }
    
            uses apply-advanced;
          }  // list sip-server-address
    
          list dns-server {
            key "name";
            ordered-by user;
            description
              "Domain name servers available to the client";
            leaf name {
              type jt:ipv6addr;
              description
                "DNS server's IPv6 address";
            }
    
            uses apply-advanced;
          }  // list dns-server
    
          leaf propagate-settings {
            type string;
            description
              "Interface name for propagating TCP/IP Settings to pool";
          }
    
          leaf-list propagate-ppp-settings {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            max-elements 8;
            ordered-by user;
            description
              "PPP interface name for propagating DNS/WINS settings";
          }
    
          list option {
            key "name";
            ordered-by user;
            description "DHCP option";
            leaf name {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "DHCP option identifier code";
            }
    
            choice option-type-choice {
              leaf flag {
                type enumeration {
                  enum "true" {
                    value 0;
                    description "True value";
                  }
                  enum "false" {
                    value 1;
                    description "False value";
                  }
                  enum "on" {
                    value 2;
                    description "On value";
                  }
                  enum "off" {
                    value 3;
                    description "Off value";
                  }
                }
                description "Boolean flag value";
              }
              leaf byte {
                type union {
                  type uint8;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Unsigned 8-bit value";
              }
              leaf short {
                type union {
                  type int16;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Signed 16-bit numeric value";
              }
              leaf unsigned-short {
                type union {
                  type uint16;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Unsigned 16-bit numeric value";
              }
              leaf integer {
                type union {
                  type int32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Signed 32-bit numeric value";
              }
              leaf unsigned-integer {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Unsigned 32-bit numeric value";
              }
              leaf hex-string {
                type string {
                  junos:posix-pattern "^[[:xdigit:]]+$";
                  junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                  length "1 .. 510";
                }
                description "Hexadecimal string";
              }
              leaf string {
                type string {
                  length "1 .. 254";
                }
                description
                  "Character string value";
              }
              leaf ip-address {
                type jt:ipv4addr;
                description "IP address value";
              }
              leaf ipv6-address {
                type jt:ipv6addr;
                description "IPV6 address value";
              }
              container array {
                presence "enable array";
                description "Array of values";
                uses apply-advanced;
    
                choice option-type-array-choice {
                  leaf-list flag {
                    type enumeration {
                      enum "true" {
                        value 0;
                        description "True value";
                      }
                      enum "false" {
                        value 1;
                        description
                          "False value";
                      }
                      enum "on" {
                        value 2;
                        description "On value";
                      }
                      enum "off" {
                        value 3;
                        description "Off value";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of boolean flag values";
                  }
                  leaf-list byte {
                    type union {
                      type uint8;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of unsigned 8-bit values";
                  }
                  leaf-list short {
                    type union {
                      type int16;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of signed 16-bit numeric values";
                  }
                  leaf-list unsigned-short {
                    type union {
                      type uint16;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of 16-bit numeric values";
                  }
                  leaf-list integer {
                    type union {
                      type int32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of signed 32-bit numeric values";
                  }
                  leaf-list unsigned-integer {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Array of unsigned 32-bit numeric values";
                  }
                  leaf-list hex-string {
                    type string {
                      length "1 .. 510";
                    }
                    ordered-by user;
                    description
                      "Hexadecimal string";
                  }
                  leaf-list string {
                    type string {
                      length "1 .. 254";
                    }
                    ordered-by user;
                    description
                      "Array of character string values";
                  }
                  leaf-list ip-address {
                    type jt:ipv4addr;
                    ordered-by user;
                    description
                      "Array of IP address values";
                  }
                  leaf-list ipv6-address {
                    type jt:ipv6addr;
                    ordered-by user;
                    description
                      "Array of IPv6 address values";
                  }
                }  // choice option-type-array-choice
              }  // container array
            }  // choice option-type-choice
          }  // list option
    
          leaf valid-lifetime {
            junos:must "(!(".. maximum-lease-time"))";
            junos:must-message "'valid-lifetime' statement cannot be included along with 'maximum-lease-time'";
            type string;
            units "seconds";
            description
              "Valid lifetime advertised to clients";
          }
    
          leaf preferred-lifetime {
            junos:must "(!(".. maximum-lease-time"))";
            junos:must-message "'preferred-lifetime' statement cannot be included along with 'maximum-lease-time'";
            type string;
            units "seconds";
            description
              "Preferred lifetime advertised to clients";
          }
    
          leaf t1-percentage {
            junos:must "(!(".. t2-rebinding-time"))";
            junos:must-message "T1 must be configured in seconds to match T2";
            junos:must "(!(".. t1-renewal-time"))";
            junos:must-message "T1 time in seconds already configured";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 100";
              }
            }
            units "percent";
            description
              "T1 time as percentage of preferred lifetime or max lease";
          }
    
          leaf t2-percentage {
            junos:must "(!(".. t1-renewal-time"))";
            junos:must-message "T2 must be configured in seconds to match T1";
            junos:must "(!(".. t2-rebinding-time"))";
            junos:must-message "T2 time in seconds already configured";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 100";
              }
            }
            units "percent";
            description
              "T2 time as percentage of preferred lifetime or max lease";
          }
    
          leaf exclude-prefix-len {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 128";
              }
            }
            description
              "Length of IPv6 prefix to be excluded from delegated prefix";
          }
    
          leaf t1-renewal-time {
            junos:must "(!(".. t2-percentage"))";
            junos:must-message "T1 must be configured as percentage to match T2";
            junos:must "(!(".. t1-percentage"))";
            junos:must-message "T1 time as percentage already configured";
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            units "seconds";
            description "T1 renewal time";
          }
    
          leaf t2-rebinding-time {
            junos:must "(!(".. t1-percentage"))";
            junos:must-message "T2 must be configured as percentage to match T1";
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            units "seconds";
            description "T2 rebinding time";
          }
        }  // grouping dhcp-attribute-type
    
        grouping dynamic-dhcp-attribute-type {
          uses apply-advanced;
    
          leaf maximum-lease-time {
            type string;
            units "seconds";
            description
              "Maximum lease time advertised to clients";
          }
    
          leaf valid-lifetime {
            type string;
            units "seconds";
            description "Preferred lifetime";
          }
    
          leaf preferred-lifetime {
            type string;
            units "seconds";
            description "Preferred lifetime";
          }
    
          list dns-server {
            key "name";
            ordered-by user;
            description
              "Domain name servers available to the client";
            leaf name {
              type jt:ipv6addr;
              description
                "DNS server's IPv6 address";
            }
    
            uses apply-advanced;
          }  // list dns-server
    
          leaf t1-percentage {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 100";
              }
            }
            units "percent";
            description
              "T1 time as percentage of preferred lifetime advertised to clients";
          }
    
          leaf t2-percentage {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 100";
              }
            }
            units "percent";
            description
              "T2 time as percentage of preferred lifetime advertised to clients";
          }
        }  // grouping dynamic-dhcp-attribute-type
    
        grouping jdhcp-local-server-type {
          uses apply-advanced;
    
          container traceoptions {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "Incompatible with 'forwarding-options helpers bootp'";
            junos:must "(!("system services dhcp"))";
            junos:must-message "Incompatible with 'set system services dhcp'";
            status deprecated;
            description
              "DHCP local server trace options";
            uses jdhcp-traceoptions-type;
          }  // container traceoptions
    
          container interface-traceoptions {
            status deprecated;
            description
              "DHCP local server interface trace options";
            uses jdhcp-interface-traceoptions-type;
          }  // container interface-traceoptions
    
          container dhcpv6 {
            description "DHCPv6 configuration";
            uses dhcpv6-local-server-type;
          }  // container dhcpv6
    
          list pool-match-order {
            key "name";
            ordered-by user;
            description
              "Define order of attribute matching for pool selection";
            leaf name {
              type enumeration {
                enum "external-authority" {
                  value 0;
                  description
                    "External authority handles address selection";
                }
                enum "ip-address-first" {
                  value 1;
                  description
                    "IP address used first to select a pool";
                }
                enum "option-82" {
                  value 2;
                  description
                    "Option 82 used in matching of pool";
                }
                enum "option-82-strict" {
                  value 3;
                  description
                    "Option 82 used in strict matching of pool";
                }
              }
              description "Match type";
            }
    
            uses apply-advanced;
          }  // list pool-match-order
    
          leaf duplicate-clients-on-interface {
            type empty;
            status deprecated;
            description
              "Allow duplicate clients on different interfaces in a subnet";
          }
    
          container duplicate-clients-in-subnet {
            junos:must "(!(".. duplicate-clients-on-interface"))";
            junos:must-message "Cannot specify duplicate-clients-in-subnet with duplicate-clients-on-interface";
            description
              "Allow duplicate clients in a subnet";
            uses jdhcp-duplicate-clients-in-subnet-type;
          }  // container duplicate-clients-in-subnet
    
          container forward-snooped-clients {
            junos:must "((!(".. forward-only") && (!(".. forward-only-replies") && !(any ".. group <*> forward-only"))))";
            junos:must-message "forward-only and forward-only-replies cannot be configured when forward-snooped-clients is configured";
            description
              "Forward snooped (unicast) packets";
            choice interface-type {
              leaf configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured interfaces";
              }
              leaf non-configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on non-configured interfaces";
              }
              leaf all-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured and non-configured interfaces";
              }
            }  // choice interface-type
          }  // container forward-snooped-clients
    
          container authentication {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'authentication' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description "DHCP authentication";
            uses authentication-type;
          }  // container authentication
    
          container liveness-detection {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'liveness-detection' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-type;
          }  // container liveness-detection
    
          container reconfigure {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'reconfigure' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            presence "enable reconfigure";
            description
              "DHCP reconfigure processing";
            uses reconfigure-type;
          }  // container reconfigure
    
          container overrides {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'overrides' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            presence "enable overrides";
            description
              "DHCP override processing";
            uses override-local-server-type;
          }  // container overrides
    
          container dynamic-profile {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'dynamic-profile' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'access-profile' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container route-suppression {
            junos:must "(!(".. liveness-detection method layer2-liveness-detection"))";
            junos:must-message "Cannot specify route-suppression with liveness-detection method layer2-liveness-detection";
            junos:must "(!(".. overrides no-arp"))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            description
              "Suppress access-internal and/or destination route addition";
            uses dhcp-route-suppression-type;
          }  // container route-suppression
    
          list group {
            junos:must "(!("system services dhcp"))";
            junos:must-message "Incompatible with the dhcp server configured under 'system services dhcp'";
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'group' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            key "name";
            ordered-by user;
            description
              "Define a DHCP local server group";
            uses dhcp-local-server-group;
          }  // list group
    
          list dual-stack-group {
            key "name";
            description
              "Define a DHCP dual stack group";
            uses dhcp-local-server-dual-stack-group;
          }  // list dual-stack-group
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              choice violation-action-choice {
                leaf strict {
                  type empty;
                  description
                    "Reject discover and renew";
                }
                leaf override-lease {
                  type empty;
                  description
                    "Override assigned lease time with threshold";
                }
              }  // choice violation-action-choice
            }  // container violation-action
          }  // container lease-time-validation
    
          choice requested-ip-check {
            leaf requested-ip-network-match {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 31";
                }
              }
              default "8";
              description
                "Subnet to match server's address for active and giaddr for passive clients";
            }
            leaf requested-ip-interface-match {
              type empty;
              description
                "Use incoming-interface's subnet to check";
            }
          }  // choice requested-ip-check
    
          leaf no-snoop {
            junos:must "(!("legacy-snooping"))";
            junos:must-message "'no-snoop' statement cannot be included along with 'legacy-snooping' statement";
            type empty;
            description
              "Do not snoop DHCP packets";
          }
    
          container persistent-storage {
            description
              "Trigger to enable flat file storage";
            leaf automatic {
              type empty;
              description
                "Trigger automatically";
            }
          }  // container persistent-storage
    
          container allow-leasequery {
            presence "enable allow-leasequery";
            description "Allow DHCP leasequery";
            uses server-leasequery-type;
          }  // container allow-leasequery
    
          container remote-id-mismatch {
            junos:must "(!(".. reauthenticate"))";
            junos:must-message "'remote-id-mismatch' statement cannot be included with 'reauthenticate'";
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container reauthenticate {
            junos:must "(!(".. remote-id-mismatch"))";
            junos:must-message "'reauthenticate' statement cannot be included with 'remote-id-mismatch'";
            junos:must "((".. authentication" || ".. .. authentication"))";
            junos:must-message "'authentication' statement must be included with 'reauthenticate'";
            description
              "DHCP client reauthenticate processing";
            leaf lease-renewal {
              type empty;
              description
                "Reauthenticate on each renew, rebind, DISCOVER or SOLICIT";
            }
    
            leaf remote-id-mismatch {
              type empty;
              description
                "Reauthenticate on remote-id mismatch for renew, rebind and re-negotiation";
            }
          }  // container reauthenticate
    
          container allow-bulk-leasequery {
            presence
              "enable allow-bulk-leasequery";
            description
              "Allow DHCP bulk leasequery";
            uses server-bulk-leasequery-type;
          }  // container allow-bulk-leasequery
    
          container allow-active-leasequery {
            presence
              "enable allow-active-leasequery";
            description
              "Allow DHCP active leasequery";
            uses server-active-leasequery-type;
          }  // container allow-active-leasequery
        }  // grouping jdhcp-local-server-type
    
        grouping authentication-type {
          description "DHCP authentication";
          uses apply-advanced;
    
          leaf password {
            type string {
              length "1 .. 64";
            }
            description
              "Username password to use";
          }
    
          container username-include {
            description "Add username options";
            uses apply-advanced;
    
            leaf delimiter {
              type string {
                length "1";
              }
              description
                "Change delimiter/separator character";
            }
    
            leaf domain-name {
              type string {
                length "1 .. 64";
              }
              description "Add domain name";
            }
    
            leaf user-prefix {
              type string {
                length "1 .. 64";
              }
              description
                "Add user defined prefix";
            }
    
            leaf mac-address {
              type empty;
              description "Include MAC address";
            }
    
            container option-82 {
              presence "enable option-82";
              description "Include option 82";
              leaf circuit-id {
                type empty;
                description
                  "Include option 82 circuit-id (sub option 1)";
              }
    
              leaf remote-id {
                type empty;
                description
                  "Include option 82 remote-id (sub option 2)";
              }
            }  // container option-82
    
            leaf logical-system-name {
              type empty;
              description
                "Include logical system name";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Include routing instance name";
            }
    
            container client-id {
              presence "enable client-id";
              description "Include client ID";
              leaf exclude-headers {
                type empty;
                description
                  "Exclude all the headers";
              }
    
              leaf use-automatic-ascii-hex-encoding {
                type empty;
                description
                  "Use automatic ascii hex username encoding";
              }
            }  // container client-id
    
            leaf option-60 {
              type empty;
              description "Include option 60";
            }
    
            leaf circuit-type {
              type empty;
              description "Include circuit type";
            }
    
            leaf interface-name {
              type empty;
              description
                "Include interface name";
            }
    
            leaf interface-description {
              type enumeration {
                enum "device" {
                  value 0;
                  description
                    "Add the device interface description";
                }
                enum "logical" {
                  value 1;
                  description
                    "Add the logical interface description";
                }
              }
              description
                "Include interface description";
            }
    
            leaf vlan-tags {
              type empty;
              description
                "Include the vlan tag(s)";
            }
          }  // container username-include
        }  // grouping authentication-type
    
        grouping dhcp-liveness-detection-type {
          description
            "DHCP client liveness detection processing";
          uses apply-advanced;
    
          container failure-action {
            description
              "Liveness detection failure action options";
            uses dhcp-liveness-detection-failure-action-type;
          }  // container failure-action
    
          container method {
            description
              "Liveness detection method options";
            uses apply-advanced;
    
            choice method-choice {
              container bfd {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses dhcp-bfd-liveness-detection-type;
              }  // container bfd
              container layer2-liveness-detection {
                junos:must "((!(".. .. route-suppression") && (!(".. .. .. route-suppression") && !(".. .. .. .. route-suppression"))))";
                junos:must-message "Method not allowed with route-suppression enabled";
                description
                  "Address resolution options";
                uses dhcp-arp-nud-liveness-detection-type;
              }  // container layer2-liveness-detection
            }  // choice method-choice
          }  // container method
        }  // grouping dhcp-liveness-detection-type
    
        grouping dhcp-arp-nud-liveness-detection-type {
          description
            "Address Resolution detection options";
          uses apply-advanced;
    
          leaf transmit-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "300 .. 1800";
              }
            }
            units "seconds";
            default "300";
            description
              "Transmit interval for address resolution";
          }
    
          leaf max-consecutive-retries {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "3 .. 6";
              }
            }
            default "3";
            description "Retry attempts";
          }
        }  // grouping dhcp-arp-nud-liveness-detection-type
    
        grouping dhcp-bfd-liveness-detection-type {
          description
            "Bidirectional Forwarding Detection (BFD) options";
          uses apply-advanced;
    
          leaf version {
            type enumeration {
              enum "0" {
                value 0;
                description
                  "BFD version 0 (deprecated)";
              }
              enum "1" {
                value 1;
                description "BFD version 1";
              }
              enum "automatic" {
                value 2;
                description
                  "Choose BFD version automatically";
              }
            }
            default "automatic";
            description
              "BFD protocol version number";
          }
    
          leaf minimum-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "30000 .. 255000";
              }
            }
            units "milliseconds";
            description
              "Minimum transmit and receive interval";
          }
    
          leaf minimum-transmit-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "30000 .. 255000";
              }
            }
            units "milliseconds";
            status deprecated;
            description
              "Minimum transmit interval";
          }
    
          leaf minimum-receive-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "30000 .. 255000";
              }
            }
            units "milliseconds";
            description
              "Minimum receive interval";
          }
    
          leaf multiplier {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 255";
              }
            }
            default "3";
            description
              "Detection time multiplier";
          }
    
          choice adaptation-choice {
            leaf no-adaptation {
              type empty;
              description "Disable adaptation";
            }
          }  // choice adaptation-choice
    
          container transmit-interval {
            description
              "Transmit-interval options";
            uses apply-advanced;
    
            leaf minimum-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30000 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum transmit interval";
            }
    
            leaf threshold {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              units "milliseconds";
              description
                "High transmit interval triggering a trap";
            }
          }  // container transmit-interval
    
          container detection-time {
            description "Detection-time options";
            uses apply-advanced;
    
            leaf threshold {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              units "milliseconds";
              description
                "High detection-time triggering a trap";
            }
          }  // container detection-time
    
          leaf session-mode {
            type enumeration {
              enum "automatic" {
                value 0;
                description
                  "Choose session-mode automatically";
              }
              enum "single-hop" {
                value 1;
                description "Use single-hop";
              }
              enum "multihop" {
                value 2;
                description "Use multihop";
              }
            }
            default "automatic";
            description
              "BFD single-hop or multihop session-mode";
          }
    
          leaf holddown-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 255000";
              }
            }
            units "milliseconds";
            default "0";
            description
              "Time to hold the session-UP notification to the client";
          }
        }  // grouping dhcp-bfd-liveness-detection-type
    
        grouping dhcp-liveness-detection-failure-action-type {
          description
            "Liveness detection failure action options";
          uses apply-advanced;
    
          choice failure-action-type {
            leaf clear-binding {
              type empty;
              description
                "Clear the client binding";
            }
            leaf clear-binding-if-interface-up {
              type empty;
              description
                "Clear the client binding only if the incoming interface is up";
            }
            leaf log-only {
              type empty;
              description
                "Maintain the client binding and log the failure event";
            }
          }  // choice failure-action-type
        }  // grouping dhcp-liveness-detection-failure-action-type
    
        grouping dhcp-local-server-dual-stack-group {
          description "DHCP dual stack groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Dual stack group name";
          }
    
          uses apply-advanced;
    
          container authentication {
            description "DHCP authentication";
            uses dual-stack-authentication-type;
          }  // container authentication
    
          leaf access-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to be used for jdhcpd";
          }
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf on-demand-address-allocation {
            type empty;
            description
              "Allocate addresses on demand";
          }
    
          container classification-key {
            junos:must "(".. dynamic-profile")";
            junos:must-message "dynamic profile configuration in dual-stack-group is must for configuring classification-type";
            description
              "Classification key for identifying dual stack household";
            uses classification-types;
          }  // container classification-key
    
          leaf dual-stack-interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of client allowed on an interface";
          }
    
          container protocol-master {
            description
              "Select family as protocol master";
            uses jdhcp-dual-stack-protocol-mstr-type;
          }  // container protocol-master
    
          container liveness-detection {
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-dualstack-type;
          }  // container liveness-detection
    
          container reauthenticate {
            junos:must "(".. on-demand-address-allocation")";
            junos:must-message "'on-demand-address-allocation' statement must be included with 'reauthenticate'";
            junos:must "(".. authentication")";
            junos:must-message "'authentication' statement must be included with 'reauthenticate'";
            description
              "DHCP client reauthenticate processing";
            leaf lease-renewal {
              type empty;
              description
                "Reauthenticate on each renew, rebind, DISCOVER or SOLICIT";
            }
    
            leaf remote-id-mismatch {
              type empty;
              description
                "Reauthenticate on remote-id mismatch for renew, rebind and re-negotiation";
            }
          }  // container reauthenticate
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
        }  // grouping dhcp-local-server-dual-stack-group
    
        grouping classification-types {
          description
            "Different mechanisms to identify a single household";
          uses apply-advanced;
    
          leaf mac-address {
            type empty;
            description "MAC address of client";
          }
    
          leaf circuit-id {
            type empty;
            description "Circuit-id as key";
          }
    
          leaf remote-id {
            type empty;
            description "Remote-id as key";
          }
        }  // grouping classification-types
    
        grouping dhcp-liveness-detection-dualstack-type {
          description
            "DHCP client liveness detection processing";
          uses apply-advanced;
    
          container failure-action {
            description
              "Liveness detection failure action options";
            uses dhcp-liveness-detection-failure-action-type;
          }  // container failure-action
    
          container method {
            description
              "Liveness detection method options";
            uses apply-advanced;
    
            choice method-choice {
              container layer2-liveness-detection {
                junos:must "((!(".. .. route-suppression") && (!(".. .. .. route-suppression") && !(".. .. .. .. route-suppression"))))";
                junos:must-message "Method not allowed with route-suppression enabled";
                description
                  "Address resolution options";
                uses dhcp-arp-nud-liveness-detection-type;
              }  // container layer2-liveness-detection
            }  // choice method-choice
          }  // container method
        }  // grouping dhcp-liveness-detection-dualstack-type
    
        grouping dhcp-local-server-group {
          description "DHCP groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container authentication {
            description "DHCP authentication";
            uses authentication-type;
          }  // container authentication
    
          container liveness-detection {
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-type;
          }  // container liveness-detection
    
          container reconfigure {
            presence "enable reconfigure";
            description
              "DHCP reconfigure processing";
            uses reconfigure-type;
          }  // container reconfigure
    
          container overrides {
            presence "enable overrides";
            description
              "DHCP override processing";
            uses override-local-server-type;
          }  // container overrides
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container route-suppression {
            junos:must "(!(".. liveness-detection method layer2-liveness-detection"))";
            junos:must-message "Cannot specify route-suppression with liveness-detection method layer2-liveness-detection";
            junos:must "((!(".. overrides no-arp") && !(".. .. overrides no-arp")))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            description
              "Suppress access-internal and/or destination route addition";
            uses dhcp-route-suppression-type;
          }  // container route-suppression
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf upto {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface up to";
            }
    
            leaf exclude {
              type empty;
              description
                "Exclude this interface range";
            }
    
            leaf trace {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify tracing with exclude";
              type empty;
              description
                "Enable tracing for this interface";
            }
    
            container overrides {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "DHCP override processing";
              uses override-local-server-type;
            }  // container overrides
    
            container dynamic-profile {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "Dynamic profile to use";
              uses dynamic-profile-type;
            }  // container dynamic-profile
    
            leaf service-profile {
              type string {
                length "1 .. 128";
              }
              description
                "Dynamic profile to use for default service activation";
            }
    
            leaf access-profile {
              junos:must "("access profile $$")";
              junos:must-message "Matching access profile must be defined";
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              type string {
                length "1 .. 128";
              }
              description
                "Access profile to use for AAA services";
            }
    
            container short-cycle-protection {
              description
                "Short cycle lockout configuration";
              leaf lockout-min-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
    
              leaf lockout-max-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
            }  // container short-cycle-protection
          }  // list interface
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              choice violation-action-choice {
                leaf strict {
                  type empty;
                  description
                    "Reject discover and renew";
                }
                leaf override-lease {
                  type empty;
                  description
                    "Override assigned lease time with threshold";
                }
              }  // choice violation-action-choice
            }  // container violation-action
          }  // container lease-time-validation
    
          container remote-id-mismatch {
            junos:must "(!(".. reauthenticate"))";
            junos:must-message "'remote-id-mismatch' statement cannot be included with 'reauthenticate'";
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container reauthenticate {
            junos:must "(!(".. remote-id-mismatch"))";
            junos:must-message "'reauthenticate' statement cannot be included with 'remote-id-mismatch'";
            junos:must "((".. authentication" || ".. .. authentication"))";
            junos:must-message "'authentication' statement must be included with 'reauthenticate'";
            description
              "DHCP client reauthenticate processing";
            leaf lease-renewal {
              type empty;
              description
                "Reauthenticate on each renew, rebind, DISCOVER or SOLICIT";
            }
    
            leaf remote-id-mismatch {
              type empty;
              description
                "Reauthenticate on remote-id mismatch for renew, rebind and re-negotiation";
            }
          }  // container reauthenticate
        }  // grouping dhcp-local-server-group
    
        grouping dhcp-remote-id-mismatch-type {
          description
            "DHCP client remote-id-mismatch processing";
          uses apply-advanced;
    
          leaf disconnect {
            type empty;
            description
              "Disconnect session on remote-id mismatch";
          }
        }  // grouping dhcp-remote-id-mismatch-type
    
        grouping dhcp-route-suppression-type {
          uses apply-advanced;
    
          choice dhcp-route-suppression-choice {
            leaf access-internal {
              type empty;
              description
                "Suppress access-internal and destination route addition";
            }
            leaf destination {
              type empty;
              description
                "Suppress destination route addition";
            }
          }  // choice dhcp-route-suppression-choice
        }  // grouping dhcp-route-suppression-type
    
        grouping dhcpv6-local-server-type {
          uses apply-advanced;
    
          container authentication {
            description "DHCPv6 authentication";
            uses dhcpv6-authentication-type;
          }  // container authentication
    
          container liveness-detection {
            description
              "DHCPv6 client liveness detection processing";
            uses dhcpv6-liveness-detection-type;
          }  // container liveness-detection
    
          container reconfigure {
            presence "enable reconfigure";
            description
              "DHCPv6 reconfigure processing";
            uses dhcpv6-reconfigure-type;
          }  // container reconfigure
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          container forward-snooped-clients {
            junos:must "((!(".. forward-only") && (!(".. forward-only-replies") && !(any ".. group <*> forward-only"))))";
            junos:must-message "forward-only and forward-only-replies cannot be configured when forward-snooped-clients is configured";
            description
              "Forward snooped (unicast) packets";
            choice interface-type {
              leaf configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured interfaces";
              }
              leaf non-configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on non-configured interfaces";
              }
              leaf all-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured and non-configured interfaces";
              }
            }  // choice interface-type
          }  // container forward-snooped-clients
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container overrides {
            presence "enable overrides";
            description
              "DHCPv6 override processing";
            uses dhcpv6-override-local-server-type;
          }  // container overrides
    
          container route-suppression {
            description
              "Suppress access-internal and/or access route addition";
            uses dhcpv6-route-suppression-type;
          }  // container route-suppression
    
          list group {
            key "name";
            ordered-by user;
            description
              "Define a DHCPv6 local server group";
            uses dhcpv6-local-server-group;
          }  // list group
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              choice violation-action-choice {
                leaf strict {
                  type empty;
                  description
                    "Reject solicit and renew";
                }
                leaf override-lease {
                  type empty;
                  description
                    "Override assigned lease time with threshold";
                }
              }  // choice violation-action-choice
            }  // container violation-action
          }  // container lease-time-validation
    
          choice requested-ip-check {
            leaf requested-ip-network-match {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 127";
                }
              }
              default "16";
              description
                "Subnet to match server's address for active and link-address for passive clients";
            }
            leaf requested-ip-interface-match {
              type empty;
              description
                "Use incoming-interface's subnet to check";
            }
          }  // choice requested-ip-check
    
          leaf no-snoop {
            junos:must "(!("legacy-snooping"))";
            junos:must-message "'no-snoop' statement cannot be included along with 'legacy-snooping' statement";
            type empty;
            description
              "Do not snoop DHCPV6 packets";
          }
    
          container persistent-storage {
            description
              "Trigger to enable flat file storage";
            leaf automatic {
              type empty;
              description
                "Trigger automatically";
            }
          }  // container persistent-storage
    
          container server-duid-type {
            description
              "Define the DUID type to be used as the Server ID. Type supported is DUID-LL";
            uses duid-type;
          }  // container server-duid-type
    
          container remote-id-mismatch {
            junos:must "(!(".. reauthenticate"))";
            junos:must-message "'remote-id-mismatch' statement cannot be included with 'reauthenticate'";
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container reauthenticate {
            junos:must "(!(".. remote-id-mismatch"))";
            junos:must-message "'reauthenticate' statement cannot be included with 'remote-id-mismatch'";
            junos:must "((".. authentication" || ".. .. authentication"))";
            junos:must-message "'authentication' statement must be included with 'reauthenticate'";
            description
              "DHCP client reauthenticate processing";
            leaf lease-renewal {
              type empty;
              description
                "Reauthenticate on each renew, rebind, DISCOVER or SOLICIT";
            }
    
            leaf remote-id-mismatch {
              type empty;
              description
                "Reauthenticate on remote-id mismatch for renew, rebind and re-negotiation";
            }
          }  // container reauthenticate
    
          container allow-leasequery {
            presence "enable allow-leasequery";
            description
              "Allow DHCPv6 leasequery";
            uses server-leasequery-type;
          }  // container allow-leasequery
    
          container allow-bulk-leasequery {
            presence
              "enable allow-bulk-leasequery";
            description
              "Allow DHCPv6 bulk leasequery";
            uses server-bulk-leasequery-type;
          }  // container allow-bulk-leasequery
    
          container allow-active-leasequery {
            presence
              "enable allow-active-leasequery";
            description
              "Allow DHCPv6 active leasequery";
            uses server-active-leasequery-type;
          }  // container allow-active-leasequery
    
          container duplicate-clients {
            description
              "Allow duplicate clients";
            uses dhcpv6-duplicate-clients-type;
          }  // container duplicate-clients
    
          container dynamic-server {
            description
              "DHCPv6 dynamic server configuration";
            uses dhcpv6-dynamic-server-type;
          }  // container dynamic-server
        }  // grouping dhcpv6-local-server-type
    
        grouping dhcpv6-authentication-type {
          description "DHCPv6 authentication";
          uses apply-advanced;
    
          leaf password {
            type string {
              length "1 .. 64";
            }
            description
              "Username password to use";
          }
    
          container username-include {
            description "Add username options";
            uses apply-advanced;
    
            leaf delimiter {
              type string {
                length "1";
              }
              description
                "Change delimiter/separator character";
            }
    
            leaf domain-name {
              type string {
                length "1 .. 64";
              }
              description "Add domain name";
            }
    
            leaf user-prefix {
              type string {
                length "1 .. 64";
              }
              description
                "Add user defined prefix";
            }
    
            leaf mac-address {
              type empty;
              description "Include MAC address";
            }
    
            container client-id {
              presence "enable client-id";
              description "Include client ID";
              leaf exclude-headers {
                type empty;
                description
                  "Exclude all the headers";
              }
    
              leaf use-automatic-ascii-hex-encoding {
                type empty;
                description
                  "Use automatic ascii hex username encoding";
              }
            }  // container client-id
    
            container relay-agent-remote-id {
              presence
                "enable relay-agent-remote-id";
              description
                "Include the relay agent remote ID";
              uses apply-advanced;
    
              choice relay-agent-remote-id-choice {
                leaf enterprise-id {
                  type empty;
                  status deprecated;
                  description
                    "Only use enterprise-id portion of option-37";
                }
                leaf remote-id {
                  type empty;
                  status deprecated;
                  description
                    "Only use remote-id portion of option-37";
                }
              }  // choice relay-agent-remote-id-choice
            }  // container relay-agent-remote-id
    
            leaf logical-system-name {
              type empty;
              description
                "Include logical system name";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Include routing instance name";
            }
    
            leaf relay-agent-subscriber-id {
              type empty;
              description
                "Include the relay agent subscriber ID";
            }
    
            leaf relay-agent-interface-id {
              type empty;
              description
                "Include the relay agent interface ID";
            }
    
            leaf circuit-type {
              type empty;
              description "Include circuit type";
            }
    
            leaf interface-name {
              type empty;
              description
                "Include interface name";
            }
    
            leaf interface-description {
              type enumeration {
                enum "device" {
                  value 0;
                  description
                    "Add the device interface description";
                }
                enum "logical" {
                  value 1;
                  description
                    "Add the logical interface description";
                }
              }
              description
                "Include interface description";
            }
    
            leaf vlan-tags {
              type empty;
              description
                "Include the vlan tag(s)";
            }
          }  // container username-include
        }  // grouping dhcpv6-authentication-type
    
        grouping dhcpv6-duplicate-clients-type {
          description "Allow duplicate clients";
          choice distinguish-with {
            leaf incoming-interface {
              type empty;
              description
                "Allow duplicate clients on different underlying interfaces";
            }
          }  // choice distinguish-with
        }  // grouping dhcpv6-duplicate-clients-type
    
        grouping dhcpv6-dynamic-server-type {
          uses apply-advanced;
    
          container overrides {
            presence "enable overrides";
            description
              "DHCPv6 override processing";
            uses dhcpv6-override-dynamic-server-type;
          }  // container overrides
    
          list group {
            key "name";
            ordered-by user;
            description
              "Define a DHCPv6 dynamic server group";
            uses dhcpv6-dynamic-server-group;
          }  // list group
        }  // grouping dhcpv6-dynamic-server-type
    
        grouping dhcpv6-dynamic-server-group {
          description
            "DHCP dynamic server groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          leaf neighbor-discovery-router-advertisement {
            type string {
              length "1 .. 64";
            }
            description
              "Designated NDRA pool for this group";
          }
    
          container overrides {
            presence "enable overrides";
            description
              "DHCP override processing";
            uses dhcpv6-override-dynamic-server-type;
          }  // container overrides
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              junos:must "(!(any "system services dhcp-local-server dhcpv6 group <*> interface $$"))";
              junos:must-message "DHCP dynamic server and dhcp local server cannot be started on the same interface";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container overrides {
              description
                "DHCP override processing";
              uses dhcpv6-override-dynamic-server-type;
            }  // container overrides
          }  // list interface
        }  // grouping dhcpv6-dynamic-server-group
    
        grouping dhcpv6-liveness-detection-type {
          description
            "DHCPv6 client liveness detection processing";
          uses apply-advanced;
    
          container failure-action {
            description
              "Liveness detection failure action options";
            uses dhcp-liveness-detection-failure-action-type;
          }  // container failure-action
    
          container method {
            description
              "Liveness detection method options";
            uses apply-advanced;
    
            choice method-choice {
              container bfd {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses dhcp-bfd-liveness-detection-type;
              }  // container bfd
              container layer2-liveness-detection {
                description
                  "Neighbor discovery options";
                uses dhcp-arp-nud-liveness-detection-type;
              }  // container layer2-liveness-detection
            }  // choice method-choice
          }  // container method
        }  // grouping dhcpv6-liveness-detection-type
    
        grouping dhcpv6-local-server-group {
          description "DHCP groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container authentication {
            description "DHCP authentication";
            uses dhcpv6-authentication-type;
          }  // container authentication
    
          container liveness-detection {
            description
              "DHCPv6 client liveness detection processing";
            uses dhcpv6-liveness-detection-type;
          }  // container liveness-detection
    
          container reconfigure {
            presence "enable reconfigure";
            description
              "DHCPv6 reconfigure processing";
            uses dhcpv6-reconfigure-type;
          }  // container reconfigure
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container overrides {
            presence "enable overrides";
            description
              "DHCP override processing";
            uses dhcpv6-override-local-server-type;
          }  // container overrides
    
          container route-suppression {
            description
              "Suppress access-internal and/or access route addition";
            uses dhcpv6-route-suppression-type;
          }  // container route-suppression
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf upto {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface up to";
            }
    
            leaf exclude {
              type empty;
              description
                "Exclude this interface range";
            }
    
            leaf trace {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify tracing with exclude";
              type empty;
              description
                "Enable tracing for this interface";
            }
    
            container overrides {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "DHCP override processing";
              uses dhcpv6-override-local-server-type;
            }  // container overrides
    
            container dynamic-profile {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "Dynamic profile to use";
              uses dynamic-profile-type;
            }  // container dynamic-profile
    
            leaf service-profile {
              type string {
                length "1 .. 128";
              }
              description
                "Dynamic profile to use for default service activation";
            }
    
            leaf access-profile {
              junos:must "("access profile $$")";
              junos:must-message "Matching access profile must be defined";
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              type string {
                length "1 .. 128";
              }
              description
                "Access profile to use for AAA services";
            }
    
            container short-cycle-protection {
              description
                "Short cycle lockout configuration";
              leaf lockout-min-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
    
              leaf lockout-max-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
            }  // container short-cycle-protection
          }  // list interface
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              choice violation-action-choice {
                leaf strict {
                  type empty;
                  description
                    "Reject solicit and renew";
                }
                leaf override-lease {
                  type empty;
                  description
                    "Override assigned lease time with threshold";
                }
              }  // choice violation-action-choice
            }  // container violation-action
          }  // container lease-time-validation
    
          container remote-id-mismatch {
            junos:must "(!(".. reauthenticate"))";
            junos:must-message "'remote-id-mismatch' statement cannot be included with 'reauthenticate'";
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container reauthenticate {
            junos:must "(!(".. remote-id-mismatch"))";
            junos:must-message "'reauthenticate' statement cannot be included with 'remote-id-mismatch'";
            junos:must "((".. authentication" || ".. .. authentication"))";
            junos:must-message "'authentication' statement must be included with 'reauthenticate'";
            description
              "DHCP client reauthenticate processing";
            leaf lease-renewal {
              type empty;
              description
                "Reauthenticate on each renew, rebind, DISCOVER or SOLICIT";
            }
    
            leaf remote-id-mismatch {
              type empty;
              description
                "Reauthenticate on remote-id mismatch for renew, rebind and re-negotiation";
            }
          }  // container reauthenticate
        }  // grouping dhcpv6-local-server-group
    
        grouping dhcpv6-override-dynamic-server-type {
          description "DHCP override processing";
          uses apply-advanced;
    
          leaf interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of clients allowed on an interface";
          }
    
          leaf rapid-commit {
            type empty;
            description
              "Enable rapid commit processing";
          }
    
          container process-inform {
            presence "enable process-inform";
            description
              "Process INFORMATION request PDUs";
            uses apply-advanced;
    
            leaf pool {
              type string {
                length "1 .. 64";
              }
              description
                "Pool name for family inet6";
            }
          }  // container process-inform
    
          leaf delegated-pool {
            type string {
              length "1 .. 64";
            }
            description
              "Delegated pool name for inet6";
          }
    
          leaf ia-na-pool {
            type string {
              length "1 .. 64";
            }
            description
              "IA_NA pool name for inet6";
          }
        }  // grouping dhcpv6-override-dynamic-server-type
    
        grouping dhcpv6-override-local-server-type {
          description "DHCP override processing";
          uses apply-advanced;
    
          leaf interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of clients allowed on an interface";
          }
    
          leaf rapid-commit {
            type empty;
            description
              "Enable rapid commit processing";
          }
    
          container client-negotiation-match {
            description
              "Use secondary match criteria for SOLICIT PDU";
            choice match-with {
              leaf incoming-interface {
                type empty;
                description
                  "Use incoming interface";
              }
            }  // choice match-with
          }  // container client-negotiation-match
    
          container process-inform {
            presence "enable process-inform";
            description
              "Process INFORMATION request PDUs";
            uses apply-advanced;
    
            leaf pool {
              type string {
                length "1 .. 64";
              }
              description
                "Pool name for family inet6";
            }
          }  // container process-inform
    
          container delay-advertise {
            presence "enable delay-advertise";
            description
              "Filter options for dhcp-server";
            uses dhcpv6-filter-option;
          }  // container delay-advertise
    
          leaf delegated-pool {
            type string {
              length "1 .. 64";
            }
            description
              "Delegated pool name for inet6";
          }
    
          leaf multi-address-embedded-option-response {
            type empty;
            description
              "If the client requests multiple addresses place the options in each address";
          }
    
          leaf always-process-option-request-option {
            type empty;
            description
              "Always process option even after address allocation failure";
          }
    
          leaf delete-binding-on-renegotiation {
            type empty;
            description
              "Delete binding on renegotiation";
          }
    
          leaf top-level-status-code {
            type empty;
            description
              "A top level status code option rather than encapsulated in IA for NoAddrsAvail in Advertise PDUs";
          }
    
          leaf always-add-option-dns-server {
            type empty;
            description
              "Add option-23, DNS recursive name server in Advertise and Reply";
          }
    
          leaf asymmetric-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced lease time for the client. In seconds";
          }
    
          leaf asymmetric-prefix-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced prefix lease time for the client. In seconds";
          }
    
          leaf protocol-attributes {
            type string {
              length "1 .. 64";
            }
            description
              "DHCPv6 attributes to use as defined under access protocol-attributes";
          }
    
          leaf dual-stack {
            type string {
              length "1 .. 64";
            }
            description
              "Dual stack group to use";
          }
        }  // grouping dhcpv6-override-local-server-type
    
        grouping dhcpv6-filter-option {
          description
            "Generic DHCPv6 filter processing";
          uses apply-advanced;
    
          leaf delay-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 30";
              }
            }
            units "seconds";
            default "3";
            description
              "Time delay between solicit and advertise";
          }
    
          container based-on {
            description "Option number";
            uses apply-advanced;
    
            container option-18 {
              presence "enable option-18";
              description "Option 18";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-18
    
            container option-37 {
              presence "enable option-37";
              description "Option 37";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-37
    
            container option-15 {
              presence "enable option-15";
              description "Option 15";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-15
    
            container option-16 {
              presence "enable option-16";
              description "Option 16";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-16
          }  // container based-on
        }  // grouping dhcpv6-filter-option
    
        grouping dhcpv6-reconfigure-type {
          description
            "DHCPv6 reconfigure processing";
          uses apply-advanced;
    
          leaf strict {
            type empty;
            description
              "Only allow packets containing Reconfigure Accept Option";
          }
    
          leaf clear-on-abort {
            type empty;
            description
              "Delete client on reconfiguration abort";
          }
    
          leaf attempts {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            description
              "Number of reconfigure attempts before aborting";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            description
              "Initial timeout value for retry";
          }
    
          leaf token {
            type string {
              length "1 .. 244";
            }
            description "Reconfigure token";
          }
    
          container trigger {
            description
              "DHCP reconfigure trigger";
            uses reconfigure-trigger-type;
          }  // container trigger
    
          leaf support-option-pd-exclude {
            type empty;
            description
              "Request prefix exclude option in reconfigure message";
          }
        }  // grouping dhcpv6-reconfigure-type
    
        grouping dhcpv6-route-suppression-type {
          description
            "Suppress access-internal and/or access route addition";
          leaf access {
            type empty;
            description
              "Suppress access route addition";
          }
    
          leaf access-internal {
            type empty;
            description
              "Suppress access-internal route addition";
          }
        }  // grouping dhcpv6-route-suppression-type
    
        grouping dual-stack-authentication-type {
          description
            "DHCP dual stack authentication";
          uses apply-advanced;
    
          leaf password {
            type string {
              length "1 .. 64";
            }
            description
              "Username password to use";
          }
    
          container username-include {
            description "Add username options";
            uses apply-advanced;
    
            leaf delimiter {
              type string {
                length "1";
              }
              description
                "Change delimiter/separator character";
            }
    
            leaf domain-name {
              type string {
                length "1 .. 64";
              }
              description "Add domain name";
            }
    
            leaf user-prefix {
              type string {
                length "1 .. 64";
              }
              description
                "Add user defined prefix";
            }
    
            leaf mac-address {
              type empty;
              description "Include MAC address";
            }
    
            container client-id {
              presence "enable client-id";
              description "Include client ID";
              leaf exclude-headers {
                type empty;
                description
                  "Exclude all the headers";
              }
    
              leaf use-automatic-ascii-hex-encoding {
                type empty;
                description
                  "Use automatic ascii hex username encoding";
              }
            }  // container client-id
    
            leaf relay-agent-remote-id {
              type empty;
              description
                "Include the relay agent remote ID";
            }
    
            leaf logical-system-name {
              type empty;
              description
                "Include logical system name";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Include routing instance name";
            }
    
            leaf relay-agent-interface-id {
              type empty;
              description
                "Include the relay agent interface ID";
            }
    
            leaf interface-name {
              type empty;
              description
                "Include interface name";
            }
    
            leaf interface-description {
              type enumeration {
                enum "device" {
                  value 0;
                  description
                    "Add the device interface description";
                }
                enum "logical" {
                  value 1;
                  description
                    "Add the logical interface description";
                }
              }
              description
                "Include interface description";
            }
    
            leaf circuit-type {
              type empty;
              description "Include circuit type";
            }
    
            leaf vlan-tags {
              type empty;
              description
                "Include the vlan tag(s)";
            }
          }  // container username-include
        }  // grouping dual-stack-authentication-type
    
        grouping duid-type {
          uses apply-advanced;
    
          leaf duid_ll {
            type empty;
            description
              "Link Layer Address based DUID ";
          }
        }  // grouping duid-type
    
        grouping dynamic-profile-type {
          description "Dynamic profile to use";
          uses apply-advanced;
    
          leaf dynamic-profile {
            junos:must "("dynamic-profiles $$")";
            junos:must-message "Dynamic profile must be defined";
            type string {
              length "1 .. 80";
            }
            description "Dynamic profile to use";
          }
    
          choice dynamic-profile-type-choice {
            leaf use-primary {
              junos:must "("dynamic-profiles $$")";
              junos:must-message "Dynamic profile must be defined";
              type string {
                length "1 .. 80";
              }
              description
                "Dynamic profile to use on the primary interface";
            }
            container aggregate-clients {
              presence
                "enable aggregate-clients";
              description
                "Aggregate client profiles";
              uses apply-advanced;
    
              choice aggregate-type {
                leaf merge {
                  type empty;
                  description
                    "Merge the client dynamic profiles";
                }
                leaf replace {
                  type empty;
                  description
                    "Replace client dynamic profiles";
                }
              }  // choice aggregate-type
            }  // container aggregate-clients
          }  // choice dynamic-profile-type-choice
        }  // grouping dynamic-profile-type
    
        grouping jdhcp-dual-stack-protocol-mstr-type {
          description
            "Select family as protocol master";
          choice addr-fam {
            leaf inet {
              type empty;
              description
                "INET family has protocol master behavior";
            }
            leaf inet6 {
              type empty;
              description
                "INET6 family has protocol master behavior";
            }
          }  // choice addr-fam
        }  // grouping jdhcp-dual-stack-protocol-mstr-type
    
        grouping jdhcp-duplicate-clients-in-subnet-type {
          description
            "Allow duplicate clients in a subnet";
          choice distinguish-with {
            leaf incoming-interface {
              type empty;
              description
                "Allow duplicate clients on different interfaces in a subnet";
            }
            leaf option-82 {
              type empty;
              description
                "Allow duplicate clients using different option-82 options in a subnet";
            }
          }  // choice distinguish-with
        }  // grouping jdhcp-duplicate-clients-in-subnet-type
    
        grouping jdhcp-interface-traceoptions-type {
          description
            "Interface trace options for DHCP";
          uses apply-advanced;
    
          leaf no-remote-trace {
            junos:must "("system tracing")";
            junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
            type empty;
            description "Disable remote tracing";
          }
    
          container file {
            description "Trace file information";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "3";
              description
                "Maximum number of trace files";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
    
            leaf match {
              type jt:regular-expression;
              description
                "Regular expression for lines to be logged";
            }
          }  // container file
    
          list flag {
            key "name";
            ordered-by user;
            description
              "Interface trace categories";
            leaf name {
              type enumeration {
                enum "state" {
                  value 0;
                  description
                    "State-transition operations";
                }
                enum "packet" {
                  value 1;
                  description
                    "Packet-decoding operations";
                }
                enum "flow" {
                  value 2;
                  description
                    "Flow-decoding operations";
                }
                enum "packet-option" {
                  value 3;
                  description
                    "DHCP option-decoding operations";
                }
                enum "dhcpv6-state" {
                  value 4;
                  description
                    "State-transition operations for dhcpv6";
                }
                enum "dhcpv6-packet" {
                  value 5;
                  description
                    "Packet-decoding operations for dhcpv6";
                }
                enum "dhcpv6-packet-option" {
                  value 6;
                  description
                    "DHCP option-decoding operations for dhcpv6";
                }
                enum "all" {
                  value 7;
                  description "All operations";
                }
              }
            }
          }  // list flag
        }  // grouping jdhcp-interface-traceoptions-type
    
        grouping jdhcp-proxy-client-type {
          uses apply-advanced;
    
          list dhcpv4-profiles {
            key "name";
            ordered-by user;
            description
              "DHCPv4 proxy client profile configuration";
            uses dhcpv4-profile;
          }  // list dhcpv4-profiles
    
          list dhcpv6-profiles {
            key "name";
            ordered-by user;
            description
              "DHCPv6 proxy client profile configuration";
            uses dhcpv6-profile;
          }  // list dhcpv6-profiles
    
          container traceoptions {
            description
              "DHCP proxy-client trace options";
            uses jdhcp-traceoptions-type;
          }  // container traceoptions
        }  // grouping jdhcp-proxy-client-type
    
        grouping dhcpv4-profile {
          description
            "DHCPv4 proxy client configuration";
          leaf name {
            type string {
              length "1 .. 63";
            }
            description
              "DHCP proxy client profile name";
          }
    
          uses apply-advanced;
    
          leaf pool-name {
            type string {
              length "1 .. 63";
            }
            description
              "This pool name will be sent to sever in subnet-name-suboption(3) of subnet allocation option(220). It is optional. It shall be sent only if configured.";
          }
    
          leaf lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "60 .. 1000";
              }
            }
            description
              "Default least time requested in seconds. If DHCP client does not get the lease time from DHCP server, it will use this default lease time as the lease time. By default, the value of lease-time is zero";
          }
    
          leaf retransmission-attempt {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "0 .. 1000";
              }
            }
            default "4";
            description
              "Number of attempts to retransmit the DHCP client protocol message";
          }
    
          leaf retransmission-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "4 .. 64";
              }
            }
            default "4";
            description
              "Number of seconds between successive retransmissions of DHCP client protocols messages";
          }
    
          leaf dead-server-retry-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "300 .. 3600";
              }
            }
            default "300";
            description
              "Number of seconds before reconnecting to a server which was marked as down in previous attempts";
          }
    
          leaf dhcp-server-selection-algorithm {
            type enumeration {
              enum "highest-priority-server" {
                value 0;
                description
                  "System will try the highest priority server first";
              }
              enum "round-robin" {
                value 1;
                description
                  "System will use round-robin method to select the server";
              }
            }
            default "round-robin";
            description
              "DHCP server selection algorithm to be used";
          }
    
          leaf dead-server-successive-retry-attempt {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "5 .. 1000";
              }
            }
            default "10";
            description
              "Number of successive retry attempts before declaring an unresponsive server as dead";
          }
    
          leaf bind-interface {
            junos:must "("interfaces $$-IFL family inet address")";
            junos:must-message "Family inet address should be configured on this interface";
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Primary IPv4 address of bind-interface is source of DHCP packets";
          }
    
          list servers {
            key "name";
            max-elements 5;
            ordered-by user;
            description "DHCP server";
            leaf name {
              type jt:ipv4addr;
              description
                "DHCP server IPv4 address";
            }
    
            uses apply-advanced;
    
            leaf priority {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 5";
                }
              }
              default "3";
              description "Server priority";
            }
          }  // list servers
        }  // grouping dhcpv4-profile
    
        grouping dhcpv6-profile {
          description
            "DHCPv6 proxy client configuration";
          leaf name {
            type string {
              length "1 .. 63";
            }
            description
              "DHCP proxy client profile name";
          }
    
          uses apply-advanced;
    
          leaf pool-name {
            type string {
              length "1 .. 63";
            }
            description
              "This pool name will be sent to sever in subnet-name-suboption(3) of subnet allocation option(220). It is optional. It shall be sent only if configured.";
          }
    
          leaf lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "60 .. 1000";
              }
            }
            description
              "Default least time requested in seconds. If DHCP client does not get the lease time from DHCP server, it will use this default lease time as the lease time. By default, the value of lease-time is zero";
          }
    
          leaf retransmission-attempt {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "0 .. 1000";
              }
            }
            default "4";
            description
              "Number of attempts to retransmit the DHCP client protocol message";
          }
    
          leaf retransmission-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "4 .. 64";
              }
            }
            default "4";
            description
              "Number of seconds between successive retransmissions of DHCP client protocols messages";
          }
    
          leaf bind-interface {
            junos:must "("interfaces $$-IFL family inet6 address")";
            junos:must-message "Family inet6 address should be configured on this interface";
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Source interface of DHCP control packets";
          }
        }  // grouping dhcpv6-profile
    
        grouping jdhcp-traceoptions-type {
          description "Trace options for DHCP";
          uses apply-advanced;
    
          leaf no-remote-trace {
            junos:must "("system tracing")";
            junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
            type empty;
            description "Disable remote tracing";
          }
    
          container file {
            description "Trace file information";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "3";
              description
                "Maximum number of trace files";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
    
            leaf match {
              type jt:regular-expression;
              description
                "Regular expression for lines to be logged";
            }
          }  // container file
    
          list flag {
            key "name";
            ordered-by user;
            description
              "DHCP operations to include in debugging trace";
            leaf name {
              type enumeration {
                enum "state" {
                  value 0;
                  description
                    "State-transition operations";
                }
                enum "packet" {
                  value 1;
                  description
                    "Packet-decoding operations";
                }
                enum "flow" {
                  value 2;
                  description
                    "Flow-decoding operations";
                }
                enum "packet-option" {
                  value 3;
                  description
                    "DHCP option-decoding operations";
                }
                enum "dhcpv6-state" {
                  value 4;
                  description
                    "State-transition operations for dhcpv6";
                }
                enum "dhcpv6-packet" {
                  value 5;
                  description
                    "Packet-decoding operations for dhcpv6";
                }
                enum "dhcpv6-packet-option" {
                  value 6;
                  description
                    "DHCP option-decoding operations for dhcpv6";
                }
                enum "all" {
                  value 7;
                  description "All operations";
                }
                enum "database" {
                  value 8;
                  description
                    "Database operations";
                }
                enum "persistent" {
                  value 9;
                  description
                    "Persitent file operations";
                }
                enum "lockout-db" {
                  value 10;
                  description
                    "Lockout database operations";
                }
                enum "interface" {
                  value 11;
                  description
                    "Interface operations";
                }
                enum "rtsock" {
                  value 12;
                  description
                    "Routing socket operations";
                }
                enum "flow-notify" {
                  value 13;
                  description
                    "Flow notification operations";
                }
                enum "io" {
                  value 14;
                  description "I/O operations";
                }
                enum "ha" {
                  value 15;
                  description
                    "High Availability-related operations";
                }
                enum "ui" {
                  value 16;
                  description
                    "User Interface operations";
                }
                enum "general" {
                  value 17;
                  description
                    "Miscellaneous operations";
                }
                enum "fwd" {
                  value 18;
                  description
                    "Firewall process operations";
                }
                enum "rpd" {
                  value 19;
                  description
                    "Routing Protocol process operations";
                }
                enum "auth" {
                  value 20;
                  description
                    "Authentication operations";
                }
                enum "profile" {
                  value 21;
                  description
                    "Profile operations";
                }
                enum "session-db" {
                  value 22;
                  description
                    "Session database operations";
                }
                enum "performance" {
                  value 23;
                  description
                    "Performance measurement operations";
                }
                enum "statistics" {
                  value 24;
                  description
                    "Baseline statistics operations";
                }
                enum "dhcpv6-io" {
                  value 25;
                  description
                    "I/O operations for dhcpv6";
                }
                enum "dhcpv6-rpd" {
                  value 26;
                  description
                    "Routing Protocol process operations for dhcpv6";
                }
                enum "dhcpv6-session-db" {
                  value 27;
                  description
                    "Session database operations for dhcpv6";
                }
                enum "dhcpv6-general" {
                  value 28;
                  description
                    "Miscellaneous operations for dhcpv6";
                }
                enum "liveness-detection" {
                  value 29;
                  description
                    "Liveness detection operations";
                }
                enum "security-persistence" {
                  value 30;
                  description
                    "Liveness detection operations";
                }
                enum "mclag" {
                  value 31;
                  description "Multichassis LAG";
                }
                enum "ra-guard" {
                  value 32;
                  description
                    "DHCP RA guard option for dhcpv6";
                }
              }
            }
          }  // list flag
        }  // grouping jdhcp-traceoptions-type
    
        grouping jsscd-static-subscribers-type {
          uses apply-advanced;
    
          container access-profile {
            description
              "Access profile reference";
            uses jsscd-access-profile-type;
          }  // container access-profile
    
          container dynamic-profile {
            description
              "Dynamic profile reference";
            uses jsscd-dynamic-profile-type;
          }  // container dynamic-profile
    
          container service-profile {
            description
              "Dynamic profile to use for default service activation";
            uses jsscd-service-profile-type;
          }  // container service-profile
    
          container authentication {
            description
              "Static Subscriber Client authentication";
            uses jsscd-authentication-type;
          }  // container authentication
    
          list group {
            key "name";
            ordered-by user;
            description
              "Static Subscriber Client group configuration";
            uses jsscd-group-type;
          }  // list group
    
          leaf auto-login {
            type empty;
            description
              "Auto login the operator logged-out static subscribers";
          }
    
          leaf baseline-stats {
            type empty;
            description
              "Baseline the statistics for static subscribers";
          }
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              junos:must "((".. subscriber-ip-address" || ".. subscriber-ipv6-address"))";
              junos:must-message "subscriber ip or ipv6 address must be configured";
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container subscriber-ip-address {
              description
                "Assigned IP address to report externally";
              uses apply-advanced;
    
              leaf address {
                type jt:ipv4addr;
                description "IPv4 address";
              }
            }  // container subscriber-ip-address
    
            container subscriber-ipv6-address {
              description
                "Assigned IPv6 address to report externally";
              uses apply-advanced;
    
              leaf address {
                type jt:ipv6prefix;
                description
                  "IPv6 Address or Prefix";
              }
            }  // container subscriber-ipv6-address
          }  // list interface
        }  // grouping jsscd-static-subscribers-type
    
        grouping jsscd-access-profile-type {
          description
            "Access profile for static subscribers";
          uses apply-advanced;
    
          leaf access-profile-name {
            junos:must "("access profile $$")";
            junos:must-message "referenced access profile must be defined";
            type string;
            description "Profile name";
          }
        }  // grouping jsscd-access-profile-type
    
        grouping jsscd-authentication-type {
          description
            "Static Subscriber Client authentication";
          uses apply-advanced;
    
          leaf password {
            type jt:unreadable;
            description
              "Username password to use";
          }
    
          container username-include {
            description "Add username options";
            uses apply-advanced;
    
            leaf delimiter {
              type string {
                length "1";
              }
              description
                "Change delimiter/separator character";
            }
    
            leaf domain-name {
              type string {
                length "1 .. 64";
              }
              description "Add domain name";
            }
    
            leaf user-prefix {
              type string {
                length "1 .. 64";
              }
              description
                "Add user defined prefix";
            }
    
            leaf interface {
              type empty;
              description
                "Include interface name";
            }
    
            leaf logical-system-name {
              type empty;
              description
                "Include logical system name";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Include routing instance name";
            }
    
            leaf vlan-tags {
              type empty;
              description "Include vlan tag(s)";
            }
          }  // container username-include
        }  // grouping jsscd-authentication-type
    
        grouping jsscd-dynamic-profile-type {
          description "Dynamic profile to use";
          uses apply-advanced;
    
          leaf dynamic-profile-name {
            junos:must "("dynamic-profiles $$")";
            junos:must-message "Dynamic profile must be defined";
            type string {
              length "1 .. 80";
            }
            description "Dynamic profile to use";
          }
    
          container aggregate-clients {
            presence "enable aggregate-clients";
            description
              "Aggregate client profiles";
            uses apply-advanced;
    
            choice aggregate-type {
              leaf merge {
                type empty;
                description
                  "Merge the client dynamic profiles";
              }
              leaf replace {
                type empty;
                description
                  "Replace client dynamic profiles";
              }
            }  // choice aggregate-type
          }  // container aggregate-clients
        }  // grouping jsscd-dynamic-profile-type
    
        grouping jsscd-group-type {
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container service-profile {
            description
              "Dynamic profile to use for default service activation";
            uses jsscd-service-profile-type;
          }  // container service-profile
    
          container access-profile {
            description
              "Access profile reference";
            uses jsscd-access-profile-type;
          }  // container access-profile
    
          container dynamic-profile {
            description
              "Dynamic profile reference";
            uses jsscd-dynamic-profile-type;
          }  // container dynamic-profile
    
          container authentication {
            description
              "Static Subscriber Client authentication";
            uses jsscd-authentication-type;
          }  // container authentication
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            leaf upto {
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface up to";
            }
    
            leaf exclude {
              type empty;
              description
                "Exclude this interface range";
            }
          }  // list interface
    
          leaf auto-login {
            type empty;
            description
              "Auto login the operator logged-out static subscribers";
          }
        }  // grouping jsscd-group-type
    
        grouping jsscd-service-profile-type {
          description
            "Service profile for static subscribers";
          uses apply-advanced;
    
          leaf service-profile-name {
            junos:must "("dynamic-profiles $$")";
            junos:must-message "referenced service profile must be defined";
            type string {
              length "1 .. 80";
            }
            description "Service profile name";
          }
        }  // grouping jsscd-service-profile-type
    
        grouping juniper-bridge-domains {
          description "Bridge domains";
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(.{129,})|(.*[+].*))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less";
            }
            description "Bridge domain name";
          }
    
          uses apply-advanced;
    
          leaf description {
            type string {
              junos:posix-pattern "^.{1,255}$";
              junos:pattern-message "Must be a string of 255 characters or less";
            }
            description
              "Text description of bridge domain";
          }
    
          leaf domain-type {
            type enumeration {
              enum "bridge" {
                value 0;
                description
                  "Forwarding instance";
              }
            }
            description "Type of bridge domain";
          }
    
          choice vlan_choice {
            leaf vlan-id {
              type string;
              description
                "IEEE 802.1q VLAN identifier for bridging domain";
            }
            container vlan-tags {
              presence "enable vlan-tags";
              description
                "IEEE 802.1q VLAN tags for bridging domain";
              leaf outer {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
    
              leaf inner {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
            }  // container vlan-tags
            leaf-list vlan-id-list {
              junos:must "(!(" .. .. .. pbb-options"))";
              junos:must-message "vlan-id-list is not supported for i-comp routing-instance";
              junos:must "((!(".. isolated-vlan") && !(".. community-vlans")))";
              junos:must-message "PVLAN related configuration cannot be specified with vlan-id-list";
              junos:must "(!(" .. vxlan"))";
              junos:must-message "vxlan can not be specified under vlan-id-list";
              junos:must "(!(" .. multicast-snooping-options"))";
              junos:must-message "multicast-snooping-options can not be specified under vlan-id-list";
              junos:must "(!(" .. protocols"))";
              junos:must-message "protocols can not be specified under vlan-id-list";
              junos:must "(!(" .. no-local-switching"))";
              junos:must-message "no-local-switching can not be specified under vlan-id-list";
              junos:must "(!(" .. domain-type"))";
              junos:must-message "domain-type can not be specified  under vlan-id-list";
              junos:must "(!(".. interface"))";
              junos:must-message "interface can not be specified under vlan-id-list";
              junos:must "(!(any ".. bridge-options interface <*> static-mac"))";
              junos:must-message "static mac can not be specified under vlan-id-list";
              type jt:vlan-range;
              description
                "Create bridge-domain for each of the vlan-id specified in the vlan-id-list";
            }
          }  // choice vlan_choice
    
          leaf-list isid-list {
            junos:must "(".. vlan-id")";
            junos:must-message "isid-list can be configured only under container with 'vlan-id'";
            junos:must "(!(" .. .. .. pbb-options"))";
            junos:must-message "isid-list and pbb-options can not co-exist for same routing-instance";
            junos:must "(!(" .. vxlan"))";
            junos:must-message "vxlan can not be specified under isid-list";
            junos:must "(!(".. vlan-id inner-all"))";
            junos:must-message "vlan-id inner-all can not be specified with isid-list";
            junos:must "(!(" .. vlan-id none"))";
            junos:must-message "vlan-id none  can not be specified with isid-list";
            junos:must "(!(" .. vlan-id all"))";
            junos:must-message "vlan-id all  can not be specified with isid-list";
            type string;
            ordered-by user;
            description
              "Create bridge-domain for isid (Valid isid:256..16777214)";
          }
    
          leaf vlan-id-scope-local {
            junos:must "(".. .. .. protocols evpn")";
            junos:must-message "scope-local can be configured only when routing-instance protocol type is evpn";
            junos:must "(".. isid-list")";
            junos:must-message "scope-local can be configured only when bridge-domain has isid-list configured";
            junos:must "(".. vlan-id")";
            junos:must-message "scope-local can be configured only under container with 'vlan-id'";
            type empty;
            description
              "Enable the scope of vlan-id local to avoid transmitting vlan tagged packets";
          }
    
          leaf service-id {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Service id required if bridge-domain is of type MC-AE and vlan-id all or vlan-id none or vlan-tags";
          }
    
          leaf domain-id {
            junos:must "("routing-instances ${instance} protocols evpn")";
            junos:must-message "domain-id is allowed for EVPN instances only";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 15";
              }
            }
            description
              "Domain-id for auto derived Route Target";
          }
    
          leaf no-local-switching {
            type empty;
            description
              "Disable local switching within CE-facing interfaces";
          }
    
          leaf mcae-mac-synchronize {
            type empty;
            description
              "Enable IRB MAC synchronization in this bridge domain";
          }
    
          leaf mcae-mac-flush {
            type empty;
            description
              "Enable MCAE MAC flush in a/s mode for a bridge domain on MCAE link up";
          }
    
          leaf no-irb-layer-2-copy {
            junos:must "(".. routing-interface")";
            junos:must-message "routing-interface must be configured to configure this feature";
            type empty;
            description
              "Disable transmission of layer-2 copy of packets of irb routing-interface";
          }
    
          leaf enable-mac-move-action {
            type empty;
            description
              "Enable blocking action due to mac-move in this Bridge Domain";
          }
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface name for this bridge domain";
            leaf name {
              junos:must "(!("interfaces $$-IFL encapsulation ethernet"))";
              junos:must-message "encapsulation ethernet is not allowed on l2 interface";
              junos:must "((!("interfaces $$-IFL etree-ac-role") || "routing-instances ${instance} protocols evpn evpn-etree"))";
              junos:must-message "etree must be enabled under routing-instance";
              junos:must "((!("interfaces $$-IFL family") || "interfaces $$-IFL family bridge"))";
              junos:must-message "only family bridge can be configured on this interface";
              junos:must "((!(("interfaces $$-IFL vlan-id-list" || "interfaces $$-IFL vlan-tags inner-list")) || !((".. .. vlan-id" || ".. .. vlan-tags"))))";
              junos:must-message "interface with vlan-id-list/inner-list cannot be added to bridge-domain with a vlan-id/vlan-tags configured";
              junos:must "(!("irb"))";
              junos:must-message "IRB interface is not supported as interface in bridge-domain";
              junos:must "(!("interfaces $$-IFL family bridge interface-mode"))";
              junos:must-message "Interface with 'interface-mode' is not allowed in a bridge-domain";
              junos:must "(!(".. .. .. interfaces $$"))";
              junos:must-message "This interface is already defined at the routing-instance level";
              junos:must "(((!("interfaces $$-IFL vlan-id-range") || ".. .. vlan-id all") || (".. .. no-normalization" || ".. .. bridge-options no-normalization")))";
              junos:must-message "vlan-id-range is specified for this logical interface; 'vlan-id all' should also be enabled";
              junos:must "(((".. .. vlan-id all" && "interfaces $$-IFL input-vlan-map pop") || (".. .. vlan-id inner-all" || (!((".. .. vlan-id" || ".. .. vlan-tags")) || (!(("interfaces $$-IFL input-vlan-map" || "interfaces $$-IFL output-vlan-map")) || (".. .. no-normalization" || ".. .. bridge-options no-normalization"))))))";
              junos:must-message "interface with input/output vlan-maps cannot be added to a routing-instance with a vlan-id/vlan-tags configured";
              junos:must "((!("interfaces $$-IFL vlan-tags inner-range") || ((".. .. vlan-id all" || ".. .. vlan-id inner-all") || (".. .. no-normalization" || ".. .. bridge-options no-normalization"))))";
              junos:must-message "vlan-tags inner-range is specified for this logical interface; 'vlan-id all' or 'vlan-id inner-all' should also be enabled";
              type string;
            }
    
            uses apply-advanced;
    
            leaf protect-interface {
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be part of this routing instance";
              junos:must "(!("interfaces ${inter_name} esi"))";
              junos:must-message "ESI can not be configured for protect interface";
              junos:must "("routing-instances ${instance} protocols evpn")";
              junos:must-message "Protocol EVPN must be configured in the evpn instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Name of protect interface";
            }
          }  // list interface
    
          leaf routing-interface {
            junos:must "(!((".. .. .. protocols evpn mclag" && !(".. no-arp-suppression"))))";
            junos:must-message "no-arp-suppression needs to be configured, when evpn is configured with mclag.";
            junos:must "(!((".. mcae-mac-synchronize" && "interfaces $$-IFL mac")))";
            junos:must-message "irb-ifl mac and bridge mcae-mac-synchronize cannot coexist";
            junos:must "((!("interfaces $$-IFL virtual-gateway-esi") || "routing-instances ${instance} protocols evpn encapsulation vxlan"))";
            junos:must-message "irb-ifl with virtual-gateway-esi only for instance with encapsulation type vxlan";
            junos:must "(!(any ".. interface <ps*>"))";
            junos:must-message "IRB cannot be added to bridge-domain with PS interface";
            junos:must "((!("interfaces $$-IFL family mpls") || !(("routing-instances ${instance} instance-type virtual-switch" && ("routing-instances ${instance} protocols vpls" && "routing-instances ${instance} route-distinguisher")))))";
            junos:must-message "routing-interface with family mpls cannot be added to virtual-switch with protocol VPLS";
            junos:must "((!(".. vlan-tags") || !("interfaces $$-IFL family mpls")))";
            junos:must-message "routing-interface with family mpls cannot be added to bridge-domain with 'vlan-tags'";
            junos:must "(!("routing-instances ${instance} service-type vlan-bundle"))";
            junos:must-message "routing-interface not valid for vlan-bundle service type";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "routing-interface cannot be configured under bridge-domain with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "((".. vlan-id" || ".. vlan-tags"))";
            junos:must-message "routing-interface can be configured only under bridge-domain with 'vlan-id' or 'vlan-tags'";
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Routing interface name for this bridge-domain";
          }
    
          container forwarding-options {
            description
              "Forwarding options configuration";
            uses juniper-bridge-forwarding-options;
          }  // container forwarding-options
    
          container bridge-options {
            description
              "Bridge domain configuration";
            uses juniper-protocols-bd;
          }  // container bridge-options
    
          container protocols {
            presence "enable protocols";
            uses apply-advanced;
    
            container igmp-snooping {
              presence "enable igmp-snooping";
              description
                "IGMP snooping configuration";
              uses juniper-bd-protocols-igmp-snooping;
            }  // container igmp-snooping
    
            container mld-snooping {
              presence "enable mld-snooping";
              description
                "MLD snooping configuration";
              uses juniper-bd-protocols-mld-snooping;
            }  // container mld-snooping
          }  // container protocols
    
          container vxlan {
            junos:must "((". ovsdb-managed" || (". multicast-group" || (". multicast-v6-group" || ("routing-instances ${instance} protocols evpn encapsulation vxlan" || (". ingress-node-replication" || ".. .. .. switch-options ovsdb-managed"))))))";
            junos:must-message "multicast-group or ovsdb-managed or ingress-node-replication or protocols evpn encapsulation vxlan should be enabled";
            junos:must "((". ovsdb-managed" || (".. .. .. switch-options ovsdb-managed" || ("routing-instances ${instance} protocols evpn encapsulation vxlan" || (". multicast-group" || (". multicast-v6-group" || ("routing-instances ${instance} remote-vtep-list" || ("routing-instances ${instance} remote-vtep-v6-list" || (".. .. .. switch-options remote-vtep-v6-list" || ".. .. .. switch-options remote-vtep-list")))))))))";
            junos:must-message "One of multicast-group or ovsdb-managed or protocols evpn encapsulation vxlan or remote-vtep-list should be enabled. ingress-node-replication must be configured when remote-vtep-list is configured";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "vxlan does not support bridge domain with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "(("routing-instances ${instance} vtep-source-interface" || ".. .. .. switch-options vtep-source-interface"))";
            junos:must-message "vtep-source-interface is required for VXLAN configuration";
            description "VXLAN options";
            uses apply-advanced;
    
            leaf ovsdb-managed {
              junos:must "(!("routing-instances ${instance} protocols evpn encapsulation vxlan"))";
              junos:must-message "Not valid with protocols evpn encapsulation vxlan";
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. .. .. .. switch-options remote-vtep-list" || ".. multicast-group"))))";
              junos:must-message "ovsdb-managed not valid with remote-vtep-list or multicast-group";
              type empty;
              description
                "Bridge-domain is managed remotely via VXLAN OVSDB Controller";
            }
    
            leaf vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 16777214";
                }
              }
              description "VXLAN identifier";
            }
    
            leaf translation-vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777214";
                }
              }
              description
                "Translated VXLAN identifier";
            }
    
            leaf multicast-group {
              junos:must "(!("routing-instances ${instance} protocols evpn encapsulation vxlan"))";
              junos:must-message "Not valid with protocols evpn encapsulation vxlan";
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. .. .. .. switch-options remote-vtep-list" || (".. ovsdb-managed" || (".. .. .. .. switch-options ovsdb-managed" || ("routing-instances ${instance} switch-options ovsdb-managed" || ".. multicast-v6-group")))))))";
              junos:must-message "multicast-group not valid with remote-vtep-list or ovsdb-managed";
              type jt:ipv4addr;
              description
                "Multicast group registered for VXLAN segment";
            }
    
            leaf encapsulate-inner-vlan {
              junos:must "(!(".. .. vlan-id none"))";
              junos:must-message "encapsulate inner vlan not valid with vlan-id none";
              type empty;
              description
                "Retain inner VLAN in the packet";
            }
    
            leaf decapsulate-accept-inner-vlan {
              junos:must "(!(".. .. vlan-id none"))";
              junos:must-message "accept inner vlan not valid with vlan-id none";
              type empty;
              description
                "Accept VXLAN packets with inner VLAN";
            }
    
            leaf unreachable-vtep-aging-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "300 .. 1800";
                }
              }
              units "seconds";
              description
                "Unreachable VXLAN tunnel endpoint removal timer";
            }
    
            leaf ingress-node-replication {
              junos:must "(!(".. .. .. .. protocols evpn assisted-replication"))";
              junos:must-message "ingress-node-replication cannot be configured with assisted-replication";
              junos:must "((".. ovsdb-managed" || (".. .. .. .. switch-options ovsdb-managed" || ("routing-instances ${instance} protocols evpn encapsulation vxlan" || ("routing-instances ${instance} remote-vtep-list" || ("routing-instances ${instance} remote-vtep-v6-list" || (".. .. .. .. switch-options remote-vtep-v6-list" || ".. .. .. .. switch-options remote-vtep-list")))))))";
              junos:must-message "Valid for ovsdb-managed instance or with remote-vtep-list or remote-vtep-v6-list or evpn vxlan";
              type empty;
              description
                "Enable ingress node replication";
            }
    
            leaf-list static-remote-vtep-list {
              type jt:ipaddr;
              max-elements 1024;
              description
                "Configure bridge domain specific static remote VXLAN tunnel endpoints";
            }
          }  // container vxlan
    
          leaf isolated-vlan {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 4094";
              }
            }
            description
              "Isolated VLAN ID for private vlan bridge domain";
          }
    
          leaf-list community-vlans {
            type jt:vlan-range;
            description
              "List of Community VLANs for private vlan bridge domain";
          }
    
          container proxy-mac {
            junos:must "((".. .. .. instance-type virtual-switch" || ".. .. .. instance-type mac-vrf"))";
            junos:must-message "Applicable to instance-type evpn or mac-vrf only";
            description "Proxy MAC settings";
            uses apply-advanced;
    
            leaf irb {
              junos:must "(!(".. .. no-arp-suppression"))";
              junos:must-message "Proxy MAC is not supported with no-arp-suppression";
              junos:must "((".. .. routing-interface" && !(".. proxy-mac-address")))";
              junos:must-message "Proxy MAC in IRB mode should have routing-interface configured";
              type empty;
              description
                "Reply with virtual-gateway MAC or IRB MAC";
            }
    
            leaf proxy-mac-address {
              junos:must "(!(".. .. no-arp-suppression"))";
              junos:must-message "Proxy MAC is not supported with no-arp-suppression";
              junos:must "((!(".. .. routing-interface") && !(".. irb")))";
              junos:must-message "Proxy MAC with specified MAC should not have routing-interface configured";
              type jt:mac-unicast;
              description
                "Reply with configured MAC for all requests";
            }
          }  // container proxy-mac
    
          container multicast-snooping-options {
            description
              "Multicast snooping option configuration";
            uses juniper-multicast-snooping-options;
          }  // container multicast-snooping-options
        }  // grouping juniper-bridge-domains
    
        grouping juniper-bd-protocols-igmp-snooping {
          description "IGMP snooping options";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for IGMP Snooping";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all IGMP packets";
                  }
                  enum "query" {
                    value 1;
                    description
                      "Trace IGMP membership query messages";
                  }
                  enum "report" {
                    value 2;
                    description
                      "Trace membership report messages";
                  }
                  enum "leave" {
                    value 3;
                    description
                      "Trace leave group messages (IGMPv2 only)";
                  }
                  enum "group" {
                    value 4;
                    description
                      "Trace group operations";
                  }
                  enum "client-notification" {
                    value 5;
                    description
                      "Trace notifications";
                  }
                  enum "host-notification" {
                    value 6;
                    description
                      "Trace host notifications";
                  }
                  enum "route" {
                    value 7;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 8;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 9;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 10;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 11;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 12;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 13;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 14;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf query-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1024";
              }
            }
            units "seconds";
            default "125";
            description
              "When to send host query messages";
          }
    
          container l2-querier {
            description "Enable L2 querier mode";
            uses apply-advanced;
    
            leaf source-address {
              type jt:ipv4addr;
              description
                "Source IP address to use for L2 querier";
            }
          }  // container l2-querier
    
          leaf query-response-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "10";
            description
              "How long to wait for a host query response";
          }
    
          leaf query-last-member-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "1";
            description
              "When to send group query messages";
          }
    
          leaf robust-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "2 .. 10";
              }
            }
            default "2";
            description
              "Expected packet loss on a subnet";
          }
    
          leaf learn-pim-router {
            type empty;
            description
              "Learn PIM router interfaces from PIM hellos";
          }
    
          leaf immediate-leave {
            type empty;
            description
              "Enable immediate group leave on interfaces";
          }
    
          leaf evpn-ssm-reports-only {
            type empty;
            description
              "Accept and process only <s,g> reports of SSM groups";
          }
    
          container proxy {
            presence "enable proxy";
            description "Enable proxy mode";
            uses apply-advanced;
    
            leaf source-address {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "With qualified-learning source-address should be configured under Vlan options";
              type jt:ipv4addr;
              description
                "Source IP address to use for proxy";
            }
    
            leaf irb {
              type empty;
              description
                "Proxy IGMP reports to IRB";
            }
          }  // container proxy
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface options for IGMP";
            leaf name {
              junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
              junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
              junos:must "(!("interfaces $$-IFL vlan-id-range"))";
              junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
              junos:must "(((".. .. .. .. interface $$" || ".. .. .. .. .. .. interface $$") || (!(".. .. .. .. .. .. .. .. routing-instances") && ("interfaces $$-IFL family bridge interface-mode" && !(any "routing-instances <*> interface $$")))))";
              junos:must-message "interface options can be specified for the interfaces in the routing-instance";
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            leaf host-only-interface {
              junos:must "(!(".. multicast-router-interface"))";
              junos:must-message "interface cannot be both host-only and multicast-router";
              type empty;
              description
                "Enable interfaces to be treated as host-side interfaces";
            }
    
            leaf group-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              description
                "Maximum number of (source,group) per interface";
            }
    
            container static {
              description
                "Static group or source membership";
              uses apply-advanced;
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP multicast group address";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "IP multicast group address";
                }
    
                uses apply-advanced;
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast source address";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "Source address of IP multicast data";
                  }
    
                  uses apply-advanced;
                }  // list source
              }  // list group
            }  // container static
          }  // list interface
    
          list pseudowire-remote-address {
            junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
            junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
            key "name";
            ordered-by user;
            description
              "Pseudowire interface options for IGMP";
            leaf name {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, pseudowire-remote-address should be configured only under vlan";
              type jt:ipv4addr;
              description
                "Pseudowire endpoint address";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
          }  // list pseudowire-remote-address
    
          list vlan {
            key "name";
            ordered-by user;
            description "Vlan options";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description "VLAN name";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                type jt:ipv4addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for IGMP";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for IGMP";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
    
            list qualified-vlan {
              key "name";
              ordered-by user;
              description
                "VLAN options for qualified-learning";
              leaf name {
                junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
                junos:must-message "vlan specific configuration is allowed with qualified-learning only";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1023";
                  }
                }
                description
                  "VLAN ID of the learning-domain";
              }
    
              uses apply-advanced;
    
              leaf query-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1024";
                  }
                }
                units "seconds";
                description
                  "When to send host query messages";
              }
    
              leaf query-response-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "How long to wait for a host query response";
              }
    
              leaf query-last-member-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "When to send group query messages";
              }
    
              leaf robust-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 10";
                  }
                }
                description
                  "Expected packet loss on a subnet";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              container proxy {
                presence "enable proxy";
                description "Enable proxy mode";
                uses apply-advanced;
    
                leaf source-address {
                  type jt:ipv4addr;
                  description
                    "Source IP address to use for proxy";
                }
              }  // container proxy
    
              leaf evpn-ssm-reports-only {
                type empty;
                description
                  "Accept and process only <s,g> reports of SSM groups";
              }
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Interface options for IGMP";
                leaf name {
                  junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                  junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
    
                leaf host-only-interface {
                  junos:must "(!(".. multicast-router-interface"))";
                  junos:must-message "interface cannot be both host-only and multicast-router";
                  type empty;
                  description
                    "Enable interfaces to be treated as host-side interfaces";
                }
    
                leaf group-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum number of (source,group) per interface";
                }
    
                container static {
                  description
                    "Static group or source membership";
                  uses apply-advanced;
    
                  list group {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast group address";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "IP multicast group address";
                    }
    
                    uses apply-advanced;
    
                    list source {
                      key "name";
                      ordered-by user;
                      description
                        "IP multicast source address";
                      leaf name {
                        type jt:ipv4addr;
                        description
                          "Source address of IP multicast data";
                      }
    
                      uses apply-advanced;
                    }  // list source
                  }  // list group
                }  // container static
              }  // list interface
    
              list pseudowire-remote-address {
                junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
                junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
                key "name";
                ordered-by user;
                description
                  "Pseudowire interface options for IGMP";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Pseudowire endpoint address";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
              }  // list pseudowire-remote-address
            }  // list qualified-vlan
          }  // list vlan
        }  // grouping juniper-bd-protocols-igmp-snooping
    
        grouping juniper-bd-protocols-mld-snooping {
          description "MLD snooping options";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for MLD Snooping";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all MLD packets";
                  }
                  enum "query" {
                    value 1;
                    description
                      "Trace MLD membership query messages";
                  }
                  enum "report" {
                    value 2;
                    description
                      "Trace membership report messages";
                  }
                  enum "leave" {
                    value 3;
                    description
                      "Trace leave group messages (MLDv2 only)";
                  }
                  enum "group" {
                    value 4;
                    description
                      "Trace group operations";
                  }
                  enum "client-notification" {
                    value 5;
                    description
                      "Trace notifications";
                  }
                  enum "host-notification" {
                    value 6;
                    description
                      "Trace host notifications";
                  }
                  enum "route" {
                    value 7;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 8;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 9;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 10;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 11;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 12;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 13;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 14;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf query-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1024";
              }
            }
            units "seconds";
            default "125";
            description
              "When to send host query messages";
          }
    
          container l2-querier {
            description "Enable L2 querier mode";
            uses apply-advanced;
    
            leaf source-address {
              type jt:ipv6addr;
              description
                "Source IP address to use for L2 querier";
            }
          }  // container l2-querier
    
          leaf query-response-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "10";
            description
              "How long to wait for a host query response";
          }
    
          leaf query-last-member-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "1";
            description
              "When to send group query messages";
          }
    
          leaf robust-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "2 .. 10";
              }
            }
            default "2";
            description
              "Expected packet loss on a subnet";
          }
    
          leaf immediate-leave {
            type empty;
            description
              "Enable immediate group leave on interfaces";
          }
    
          leaf evpn-ssm-reports-only {
            type empty;
            description
              "Accept and process only <s,g> reports of SSM groups";
          }
    
          container proxy {
            presence "enable proxy";
            description "Enable proxy mode";
            uses apply-advanced;
    
            leaf source-address {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "With qualified-learning source-address should be configured under Vlan options";
              type jt:ipv6addr;
              description
                "Source IP address to use for proxy";
            }
    
            leaf irb {
              type empty;
              description
                "Proxy IGMP reports to IRB";
            }
          }  // container proxy
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface options for MLD";
            leaf name {
              junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
              junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
              junos:must "(!("interfaces $$-IFL vlan-id-range"))";
              junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
              junos:must "(((".. .. .. .. interface $$" || ".. .. .. .. .. .. interface $$") || (!(".. .. .. .. .. .. .. .. routing-instances") && ("interfaces $$-IFL family bridge interface-mode" && !(any "routing-instances <*> interface $$")))))";
              junos:must-message "interface options can be specified for the interfaces in the routing-instance";
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            leaf host-only-interface {
              junos:must "(!(".. multicast-router-interface"))";
              junos:must-message "interface cannot be both host-only and multicast-router";
              type empty;
              description
                "Enable interfaces to be treated as host-side interfaces";
            }
    
            leaf group-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              description
                "Maximum number of (source,group) per interface";
            }
    
            container static {
              description
                "Static group or source membership";
              uses apply-advanced;
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP multicast group address";
                leaf name {
                  type jt:ipv6addr;
                  description
                    "IP multicast group address";
                }
    
                uses apply-advanced;
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast source address";
                  leaf name {
                    type jt:ipv6addr;
                    description
                      "Source address of IP multicast data";
                  }
    
                  uses apply-advanced;
                }  // list source
              }  // list group
            }  // container static
          }  // list interface
    
          list pseudowire-remote-address {
            junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
            junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
            key "name";
            ordered-by user;
            description
              "Pseudowire interface options for MLD";
            leaf name {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, pseudowire-remote-address should be configured only under vlan";
              type jt:ipv4addr;
              description
                "Pseudowire endpoint address";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
          }  // list pseudowire-remote-address
    
          list vlan {
            key "name";
            ordered-by user;
            description "Vlan options";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description
                "Vlan of the bridge-domain";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                type jt:ipv6addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for MLD";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv6addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for MLD";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
    
            list qualified-vlan {
              key "name";
              ordered-by user;
              description
                "VLAN options for qualified-learning";
              leaf name {
                junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
                junos:must-message "vlan specific configuration is allowed with qualified-learning only";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1023";
                  }
                }
                description
                  "VLAN ID of the learning-domain";
              }
    
              uses apply-advanced;
    
              leaf query-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1024";
                  }
                }
                units "seconds";
                description
                  "When to send host query messages";
              }
    
              leaf query-response-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "How long to wait for a host query response";
              }
    
              leaf query-last-member-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "When to send group query messages";
              }
    
              leaf robust-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 10";
                  }
                }
                description
                  "Expected packet loss on a subnet";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              container proxy {
                presence "enable proxy";
                description "Enable proxy mode";
                uses apply-advanced;
    
                leaf source-address {
                  type jt:ipv6addr;
                  description
                    "Source IP address to use for proxy";
                }
              }  // container proxy
    
              leaf evpn-ssm-reports-only {
                type empty;
                description
                  "Accept and process only <s,g> reports of SSM groups";
              }
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Interface options for MLD";
                leaf name {
                  junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                  junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
    
                leaf host-only-interface {
                  junos:must "(!(".. multicast-router-interface"))";
                  junos:must-message "interface cannot be both host-only and multicast-router";
                  type empty;
                  description
                    "Enable interfaces to be treated as host-side interfaces";
                }
    
                leaf group-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum number of (source,group) per interface";
                }
    
                container static {
                  description
                    "Static group or source membership";
                  uses apply-advanced;
    
                  list group {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast group address";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "IP multicast group address";
                    }
    
                    uses apply-advanced;
    
                    list source {
                      key "name";
                      ordered-by user;
                      description
                        "IP multicast source address";
                      leaf name {
                        type jt:ipv6addr;
                        description
                          "Source address of IP multicast data";
                      }
    
                      uses apply-advanced;
                    }  // list source
                  }  // list group
                }  // container static
              }  // list interface
    
              list pseudowire-remote-address {
                junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
                junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
                key "name";
                ordered-by user;
                description
                  "Pseudowire interface options for MLD";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Pseudowire endpoint address";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
              }  // list pseudowire-remote-address
            }  // list qualified-vlan
          }  // list vlan
        }  // grouping juniper-bd-protocols-mld-snooping
    
        grouping juniper-bridge-forwarding-options {
          uses apply-advanced;
    
          container filter {
            description
              "Filtering for bridge forwarding table";
            uses apply-advanced;
    
            leaf input {
              type string;
              description
                "Name of input filter to apply for forwarded packets";
            }
    
            leaf output {
              type string;
              description
                "Name of output filter to apply for forwarded packets";
            }
          }  // container filter
    
          container flood {
            description
              "Filtering for bridge flood table";
            uses apply-advanced;
    
            leaf input {
              type string;
              description
                "Name of input filter to apply for bridge flood packets";
            }
          }  // container flood
    
          container dhcp-relay {
            status deprecated;
            description
              "Dynamic Host Configuration Protocol relay configuration";
            uses jdhcp-relay-type;
          }  // container dhcp-relay
    
          container dhcp-security {
            presence "enable dhcp-security";
            description
              "Dynamic ARP Inspection configuration";
            uses jdhcp-security-type;
          }  // container dhcp-security
        }  // grouping juniper-bridge-forwarding-options
    
        grouping jdhcp-relay-type {
          description
            "Dynamic Host Configuration Protocol relay configuration";
          uses apply-advanced;
    
          container traceoptions {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "Incompatible with 'forwarding-options helpers bootp'";
            junos:must "(!("system services dhcp"))";
            junos:must-message "Incompatible with 'set system services dhcp'";
            status deprecated;
            description
              "DHCP relay trace options";
            uses jdhcp-traceoptions-type;
          }  // container traceoptions
    
          container persistent-storage {
            description
              "Trigger to enable flat file storage";
            leaf automatic {
              type empty;
              description
                "Trigger automatically";
            }
          }  // container persistent-storage
    
          leaf duplicate-clients-on-interface {
            type empty;
            status deprecated;
            description
              "Allow duplicate clients on different interfaces in a subnet";
          }
    
          container duplicate-clients-in-subnet {
            junos:must "(!(".. duplicate-clients-on-interface"))";
            junos:must-message "Cannot specify duplicate-clients-in-subnet with duplicate-clients-on-interface";
            description
              "Allow duplicate clients in a subnet";
            uses jdhcp-duplicate-clients-in-subnet-type;
          }  // container duplicate-clients-in-subnet
    
          container interface-traceoptions {
            status deprecated;
            description
              "DHCP relay interface trace options";
            uses jdhcp-interface-traceoptions-type;
          }  // container interface-traceoptions
    
          container dhcpv6 {
            description "DHCPv6 configuration";
            uses dhcpv6-relay-type;
          }  // container dhcpv6
    
          leaf arp-inspection {
            type empty;
            description
              "Enable Dynamic ARP Inspection";
          }
    
          container forward-snooped-clients {
            junos:must "((!(".. forward-only") && (!(".. forward-only-replies") && !(any ".. group <*> forward-only"))))";
            junos:must-message "forward-only and forward-only-replies cannot be configured when forward-snooped-clients is configured";
            description
              "Forward snooped (unicast) packets";
            choice interface-type {
              leaf configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured interfaces";
              }
              leaf non-configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on non-configured interfaces";
              }
              leaf all-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured and non-configured interfaces";
              }
            }  // choice interface-type
          }  // container forward-snooped-clients
    
          container authentication {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'authentication' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description "DHCP authentication";
            uses authentication-type;
          }  // container authentication
    
          container liveness-detection {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'liveness-detection' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-type;
          }  // container liveness-detection
    
          container dynamic-profile {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'dynamic-profile' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'access-profile' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container overrides {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'overrides' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            presence "enable overrides";
            description
              "DHCP override processing";
            uses override-type;
          }  // container overrides
    
          container relay-option {
            junos:must "((!(".. relay-option-60") && !(any ".. group <*> relay-option-60")))";
            junos:must-message "Cannot specify relay-option-60 with relay-option";
            presence "enable relay-option";
            description "DHCP option processing";
            uses dhcp-generic-v4-option;
          }  // container relay-option
    
          container server-match {
            description
              "Server match processing";
            uses apply-advanced;
    
            container default-action {
              presence "enable default-action";
              description
                "Server match default action";
              uses server-match-action-choice;
            }  // container default-action
    
            list address {
              key "name";
              ordered-by user;
              description "Server address";
              leaf name {
                type jt:ipv4prefix;
                description
                  "Server address for matching";
              }
    
              uses apply-advanced;
    
              choice server-match-action-choice {
                leaf forward-only {
                  type empty;
                  description
                    "Forward without subscriber services when a match is made";
                }
                leaf create-relay-entry {
                  type empty;
                  description
                    "Create relay entry and allow subscriber services";
                }
              }  // choice server-match-action-choice
            }  // list address
          }  // container server-match
    
          container relay-option-60 {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'relay-option-60' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            junos:must "((!(".. relay-option") && !(any ".. group <*> relay-option")))";
            junos:must-message "Cannot specify relay-option with relay-option-60 ";
            presence "enable relay-option-60";
            status deprecated;
            description
              "DHCP option-60 processing";
            uses relay-option-60-type-top;
          }  // container relay-option-60
    
          container relay-option-82 {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'relay-option-82' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            presence "enable relay-option-82";
            description
              "DHCP option-82 processing";
            uses relay-option-82-type;
          }  // container relay-option-82
    
          container forward-only {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'forward-only' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            presence "enable forward-only";
            description
              "Forward DHCP packets without creating binding";
            uses forward-only-to-rc-type;
          }  // container forward-only
    
          leaf description {
            type string;
            description
              "Text description of servers";
          }
    
          leaf maximum-hop-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 16";
              }
            }
            description
              "Maximum number of hops per packet";
          }
    
          leaf minimum-wait-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 30000";
              }
            }
            description
              "Minimum number of seconds before requests are forwarded";
          }
    
          leaf client-response-ttl {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 255";
              }
            }
            description
              "IP time-to-live value to set in responses to client";
          }
    
          leaf source-ip-change {
            type empty;
            description
              "Use address of egress interface as source ip";
          }
    
          leaf forward-only-replies {
            type empty;
            description
              "Forward-only replies from server to appropriate logical-system:routing-instance based on options";
          }
    
          container server-group {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'server-group' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            description
              "Define a DHCP server group";
            uses server-group-type;
          }  // container server-group
    
          container active-server-group {
            description
              "Name of DHCP server group";
            uses dhcpv4-gbl-active-sg-type;
          }  // container active-server-group
    
          container route-suppression {
            junos:must "(!(".. liveness-detection method layer2-liveness-detection"))";
            junos:must-message "Cannot specify route-suppression with liveness-detection method layer2-liveness-detection";
            junos:must "(!(".. overrides no-arp"))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            description
              "Suppress access-internal and/or destination route addition";
            uses dhcp-route-suppression-type;
          }  // container route-suppression
    
          list group {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'group' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            key "name";
            ordered-by user;
            description "Define a DHCP group";
            uses dhcp-group;
          }  // list group
    
          list dual-stack-group {
            key "name";
            description
              "Define a DHCP dual stack group";
            uses dhcp-dual-stack-group;
          }  // list dual-stack-group
    
          leaf no-snoop {
            junos:must "(!("legacy-snooping"))";
            junos:must-message "'no-snoop' statement cannot be included along with 'legacy-snooping' statement";
            type empty;
            description
              "Do not snoop DHCP packets";
          }
    
          leaf server-response-time {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "0";
            description
              "Number of seconds in a period of activity between the last server response and an unaswered request";
          }
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation in seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              leaf drop {
                type empty;
                description
                  "Drop dhcpv4 offer and ack packets";
              }
            }  // container violation-action
          }  // container lease-time-validation
    
          container leasequery {
            junos:must "(".. overrides always-write-option-82")";
            junos:must-message "Must configure [overrides always-write-option-82] to overwrite circuit-id";
            junos:must "((".. relay-option-82 circuit-id" && (!(".. relay-option-82 circuit-id use-interface-description") && !(".. relay-option-82 circuit-id require-interface-description"))))";
            junos:must-message "Must configure [relay-option-82 circuit-id] without description to insert circuit-id";
            presence "enable leasequery";
            description
              "DHCP leasequery configuration";
            uses relay-leasequery-type;
          }  // container leasequery
    
          container bulk-leasequery {
            presence "enable bulk-leasequery";
            description
              "DHCP bulk leasequery configuration";
            uses relay-bulk-leasequery-v4-type;
          }  // container bulk-leasequery
    
          container active-leasequery {
            junos:must "(".. bulk-leasequery")";
            junos:must-message "Must configure bulk-leasequery";
            presence "enable active-leasequery";
            description
              "DHCPv4 active leasequery configuration";
            uses relay-active-leasequery-v4-type;
          }  // container active-leasequery
    
          container remote-id-mismatch {
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
        }  // grouping jdhcp-relay-type
    
        grouping dhcp-dual-stack-group {
          description "DHCP dual stack groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Dual stack group name";
          }
    
          uses apply-advanced;
    
          container authentication {
            description "DHCP authentication";
            uses dual-stack-authentication-type;
          }  // container authentication
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to be used for jdhcpd";
          }
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          container liveness-detection {
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-dualstack-type;
          }  // container liveness-detection
    
          container relay-agent-interface-id {
            presence
              "enable relay-agent-interface-id";
            description
              "Interface-id option processing";
            uses v6-relay-option-interface-id-type;
          }  // container relay-agent-interface-id
    
          container relay-agent-remote-id {
            presence
              "enable relay-agent-remote-id";
            description
              "Remote-id option processing";
            uses v6-relay-option-remote-id-type;
          }  // container relay-agent-remote-id
    
          container classification-key {
            junos:must "(".. dynamic-profile")";
            junos:must-message "dynamic profile configuration in dual-stack-group is must for configuring classification-type";
            description
              "Classification key for identifying dual stack household";
            uses classification-types;
          }  // container classification-key
    
          leaf dual-stack-interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of client allowed on an interface";
          }
    
          container protocol-master {
            description
              "Select family as protocol master";
            uses jdhcp-dual-stack-protocol-mstr-type;
          }  // container protocol-master
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
        }  // grouping dhcp-dual-stack-group
    
        grouping dhcp-generic-v4-option {
          description
            "Generic DHCP options processing";
          uses apply-advanced;
    
          leaf option-number {
            type enumeration {
              enum "60" {
                value 0;
                status deprecated;
                description "Option 60";
              }
              enum "77" {
                value 1;
                status deprecated;
                description "Option 77";
              }
            }
            status deprecated;
            description "Option number";
          }
    
          container equals {
            status deprecated;
            description "Generic option equals";
            uses relay-v4-option-ascii-hex;
          }  // container equals
    
          container default-action {
            status deprecated;
            description
              "Generic option default action";
            uses dhcp-v4-option-default-action;
          }  // container default-action
    
          container starts-with {
            status deprecated;
            description
              "Generic option starts with";
            uses relay-v4-option-ascii-hex;
          }  // container starts-with
    
          container option-60 {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-60  with option-number";
            presence "enable option-60";
            description
              "Add option 60 processing";
            uses dhcp-generic-v4-option-type;
          }  // container option-60
    
          container option-77 {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-77  with option-number";
            presence "enable option-77";
            description
              "Add option 77 processing";
            uses dhcp-generic-v4-option-type;
          }  // container option-77
    
          list option-order {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-order  with option-number";
            key "name";
            ordered-by user;
            description
              "Options precedence order";
            leaf name {
              type enumeration {
                enum "60" {
                  value 0;
                  description "Option 60";
                }
                enum "77" {
                  value 1;
                  description "Option 77";
                }
              }
              description "Option number";
            }
    
            uses apply-advanced;
          }  // list option-order
        }  // grouping dhcp-generic-v4-option
    
        grouping dhcp-generic-v4-option-type {
          uses apply-advanced;
    
          container equals {
            description "Generic option equals";
            uses relay-v4-option-ascii-hex;
          }  // container equals
    
          container default-action {
            description
              "Generic option default action";
            uses dhcp-v4-option-default-action;
          }  // container default-action
    
          container starts-with {
            description
              "Generic option starts with";
            uses relay-v4-option-ascii-hex;
          }  // container starts-with
        }  // grouping dhcp-generic-v4-option-type
    
        grouping dhcp-group {
          description "DHCP groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container active-server-group {
            description
              "Name of DHCP server group";
            uses dhcpv4-gp-active-sg-type;
          }  // container active-server-group
    
          container authentication {
            description "DHCP authentication";
            uses authentication-type;
          }  // container authentication
    
          container liveness-detection {
            description
              "DHCP client liveness detection processing";
            uses dhcp-liveness-detection-type;
          }  // container liveness-detection
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container overrides {
            presence "enable overrides";
            description
              "DHCP override processing";
            uses override-type;
          }  // container overrides
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container server-match {
            description
              "Server match processing";
            uses apply-advanced;
    
            container default-action {
              presence "enable default-action";
              description
                "Server match default action";
              uses server-match-action-choice;
            }  // container default-action
    
            list address {
              key "name";
              ordered-by user;
              description "Server address";
              leaf name {
                type jt:ipv4prefix;
                description
                  "Server address for matching";
              }
    
              uses apply-advanced;
    
              choice server-match-action-choice {
                leaf forward-only {
                  type empty;
                  description
                    "Forward without subscriber services when a match is made";
                }
                leaf create-relay-entry {
                  type empty;
                  description
                    "Create relay entry and allow subscriber services";
                }
              }  // choice server-match-action-choice
            }  // list address
          }  // container server-match
    
          container relay-option {
            junos:must "((!(".. relay-option-60") && !(".. .. relay-option-60")))";
            junos:must-message "Cannot specify relay-option-60 with relay-option";
            presence "enable relay-option";
            description "DHCP option processing";
            uses dhcp-generic-v4-option;
          }  // container relay-option
    
          container relay-option-60 {
            junos:must "((!(".. relay-option") && !(".. .. relay-option")))";
            junos:must-message "Cannot specify relay-option with relay-option-60";
            presence "enable relay-option-60";
            status deprecated;
            description
              "DHCP option-60 processing";
            uses relay-option-60-type-group;
          }  // container relay-option-60
    
          container relay-option-82 {
            presence "enable relay-option-82";
            description
              "DHCP option-82 processing";
            uses relay-option-82-type;
          }  // container relay-option-82
    
          container forward-only {
            presence "enable forward-only";
            description
              "Forward DHCP packets without creating binding";
            uses forward-only-to-rc-type;
          }  // container forward-only
    
          container route-suppression {
            junos:must "(!(".. liveness-detection method layer2-liveness-detection"))";
            junos:must-message "Cannot specify route-suppression with liveness-detection method layer2-liveness-detection";
            junos:must "((!(".. overrides no-arp") && !(".. .. overrides no-arp")))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            description
              "Suppress access-internal and/or destination route addition";
            uses dhcp-route-suppression-type;
          }  // container route-suppression
    
          leaf description {
            type string;
            description
              "Text description of servers";
          }
    
          leaf maximum-hop-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 16";
              }
            }
            description
              "Maximum number of hops per packet";
          }
    
          leaf minimum-wait-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 30000";
              }
            }
            description
              "Minimum number of seconds before requests are forwarded";
          }
    
          leaf client-response-ttl {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 255";
              }
            }
            description
              "IP time-to-live value to set in responses to client";
          }
    
          leaf source-ip-change {
            type empty;
            description
              "Use address of egress interface as source ip";
          }
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf upto {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface up to";
            }
    
            leaf exclude {
              type empty;
              description
                "Exclude this interface range";
            }
    
            leaf trace {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify tracing with exclude";
              type empty;
              description
                "Enable tracing for this interface";
            }
    
            container overrides {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "DHCP override processing";
              uses override-type;
            }  // container overrides
    
            container dynamic-profile {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "Dynamic profile to use";
              uses dynamic-profile-type;
            }  // container dynamic-profile
    
            leaf service-profile {
              type string {
                length "1 .. 128";
              }
              description
                "Dynamic profile to use for default service activation";
            }
    
            leaf access-profile {
              junos:must "("access profile $$")";
              junos:must-message "Matching access profile must be defined";
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              type string {
                length "1 .. 128";
              }
              description
                "Access profile to use for AAA services";
            }
    
            container short-cycle-protection {
              description
                "Short cycle lockout configuration";
              leaf lockout-min-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
    
              leaf lockout-max-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
            }  // container short-cycle-protection
          }  // list interface
    
          container remote-id-mismatch {
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation in seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              leaf drop {
                type empty;
                description
                  "Drop dhcpv4 offer and ack packets";
              }
            }  // container violation-action
          }  // container lease-time-validation
        }  // grouping dhcp-group
    
        grouping dhcp-v4-option-default-action {
          description "Default action";
          uses apply-advanced;
    
          choice server-group-choice {
            leaf relay-server-group {
              junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
              junos:must-message "Referenced group must be defined under [edit forwarding dhcp-relay server-group]";
              type string {
                length "1 .. 64";
              }
              description
                "Name of DHCP relay server group when match is made";
            }
            leaf local-server-group {
              junos:must "((".. .. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. system services dhcp-local-server group $$" || ".. .. .. .. .. system services dhcp-local-server group $$"))))";
              junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
              type string {
                length "1 .. 64";
              }
              description
                "Name of DHCP local server group when match is made";
            }
            leaf drop {
              type empty;
              description
                "Discard when a match is made";
            }
            leaf forward-only {
              type empty;
              description
                "Forward without subscriber services when a match is made";
            }
          }  // choice server-group-choice
        }  // grouping dhcp-v4-option-default-action
    
        grouping dhcpv4-gbl-active-sg-type {
          leaf active-server-group {
            junos:must "(".. .. server-group $$")";
            junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay server-group]";
            type string {
              length "1 .. 64";
            }
            description
              "Name of DHCP server group";
          }
    
          leaf allow-server-change {
            type empty;
            description
              "Accept DHCP-ACK from any server in this group";
          }
        }  // grouping dhcpv4-gbl-active-sg-type
    
        grouping dhcpv4-gp-active-sg-type {
          leaf active-server-group {
            junos:must "(".. .. .. server-group $$")";
            junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay server-group]";
            type string {
              length "1 .. 64";
            }
            description
              "Name of DHCP server group";
          }
    
          leaf allow-server-change {
            type empty;
            description
              "Accept DHCP-ACK from any server in this group";
          }
        }  // grouping dhcpv4-gp-active-sg-type
    
        grouping dhcpv6-relay-type {
          description
            "DHCPv6 relay configuration";
          uses apply-advanced;
    
          container authentication {
            description "DHCPv6 authentication";
            uses dhcpv6-authentication-type;
          }  // container authentication
    
          container persistent-storage {
            description
              "Trigger to enable flat file storage";
            leaf automatic {
              type empty;
              description
                "Trigger automatically";
            }
          }  // container persistent-storage
    
          container liveness-detection {
            description
              "DHCPv6 client liveness detection processing";
            uses dhcpv6-liveness-detection-type;
          }  // container liveness-detection
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container overrides {
            presence "enable overrides";
            description
              "DHCPv6 override processing";
            uses dhcpv6-override-relay-type;
          }  // container overrides
    
          container relay-option {
            presence "enable relay-option";
            description
              "DHCPv6 option processing";
            uses dhcp-generic-v6-option;
          }  // container relay-option
    
          leaf exclude-relay-agent-identifier {
            type empty;
            description
              "Exclude relay agent identifier from packets to server";
          }
    
          container server-match {
            description
              "Server match processing";
            uses apply-advanced;
    
            container default-action {
              description
                "Server match default action";
              uses server-match-action-choice;
            }  // container default-action
    
            container duid {
              description
                "Match duid processing";
              uses apply-advanced;
    
              container equals {
                description "Duid equals";
                uses server-match-v6-ascii-hex;
              }  // container equals
    
              container starts-with {
                description "Duid starts with";
                uses server-match-v6-ascii-hex;
              }  // container starts-with
            }  // container duid
    
            list address {
              key "name";
              ordered-by user;
              description "Server ipv6 address";
              leaf name {
                type jt:ipv6prefix;
                description
                  "Server ipv6 address for matching";
              }
    
              uses apply-advanced;
    
              choice server-match-action-choice {
                leaf forward-only {
                  type empty;
                  description
                    "Forward without subscriber services when a match is made";
                }
                leaf create-relay-entry {
                  type empty;
                  description
                    "Create relay entry and allow subscriber services";
                }
              }  // choice server-match-action-choice
            }  // list address
          }  // container server-match
    
          leaf relay-agent-option-79 {
            type empty;
            description
              "Add the client MAC address to the Relay Forward header.";
          }
    
          container vendor-specific-information {
            description
              "DHCPv6 option 17 vendor-specific processing";
            uses jdhcp-vendor-specific-type;
          }  // container vendor-specific-information
    
          container forward-only {
            presence "enable forward-only";
            description
              "Forward DHCPv6 packets without creating binding";
            uses forward-only-to-rc-type;
          }  // container forward-only
    
          leaf forward-only-replies {
            type empty;
            description
              "Forward-only replies from server to appropriate logical-system:routing-instance based on options";
          }
    
          container forward-snooped-clients {
            junos:must "((!(".. forward-only") && (!(".. forward-only-replies") && !(any ".. group <*> forward-only"))))";
            junos:must-message "forward-only and forward-only-replies cannot be configured when forward-snooped-clients is configured";
            description
              "Forward snooped (unicast) packets";
            choice interface-type {
              leaf configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured interfaces";
              }
              leaf non-configured-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on non-configured interfaces";
              }
              leaf all-interfaces {
                type empty;
                description
                  "Forward snooped (unicast) packets on configured and non-configured interfaces";
              }
            }  // choice interface-type
          }  // container forward-snooped-clients
    
          container route-suppression {
            description
              "Suppress access-internal and/or access route addition";
            uses dhcpv6-route-suppression-type;
          }  // container route-suppression
    
          list group {
            key "name";
            ordered-by user;
            description
              "Define a DHCPv6 relay group";
            uses dhcpv6-relay-group;
          }  // list group
    
          container relay-agent-interface-id {
            presence
              "enable relay-agent-interface-id";
            description
              "DHCPv6 interface-id option processing";
            uses v6-relay-option-interface-id-type;
          }  // container relay-agent-interface-id
    
          container relay-agent-remote-id {
            presence
              "enable relay-agent-remote-id";
            description
              "DHCPv6 remote-id option processing";
            uses v6-relay-option-remote-id-type;
          }  // container relay-agent-remote-id
    
          container server-group {
            description
              "Define a DHCPv6 server group";
            uses v6-server-group-type;
          }  // container server-group
    
          container active-server-group {
            description
              "Name of DHCPv6 server group";
            uses dhcpv6-gbl-active-sg-type;
          }  // container active-server-group
    
          leaf server-response-time {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "0";
            description
              "Number of seconds in a period of activity between the last server response and an unaswered request";
          }
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation in seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              leaf drop {
                type empty;
                description
                  "Drop dhcpv6 advertise and reply packets";
              }
            }  // container violation-action
          }  // container lease-time-validation
    
          leaf no-snoop {
            junos:must "(!("legacy-snooping"))";
            junos:must-message "'no-snoop' statement cannot be included along with 'legacy-snooping' statement";
            type empty;
            description
              "Do not snoop DHCPV6 packets";
          }
    
          container leasequery {
            junos:must "(".. relay-agent-interface-id")";
            junos:must-message "Must configure [relay-agent-interface-id] to insert interface-id";
            presence "enable leasequery";
            description
              "DHCPv6 leasequery configuration";
            uses relay-leasequery-type;
          }  // container leasequery
    
          container bulk-leasequery {
            junos:must "(".. relay-agent-interface-id")";
            junos:must-message "Must configure [relay-agent-interface-id] to insert interface-id";
            presence "enable bulk-leasequery";
            description
              "DHCPv6 bulk leasequery configuration";
            uses relay-bulk-leasequery-v6-type;
          }  // container bulk-leasequery
    
          container active-leasequery {
            junos:must "(".. bulk-leasequery")";
            junos:must-message "Must configure bulk-leasequery";
            presence "enable active-leasequery";
            description
              "DHCPv6 active leasequery configuration";
            uses relay-active-leasequery-v6-type;
          }  // container active-leasequery
    
          container remote-id-mismatch {
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container duplicate-clients {
            description
              "Allow duplicate clients";
            uses dhcpv6-duplicate-clients-type;
          }  // container duplicate-clients
        }  // grouping dhcpv6-relay-type
    
        grouping dhcp-generic-v6-option {
          description
            "Generic DHCPv6 options processing";
          uses apply-advanced;
    
          leaf option-number {
            type enumeration {
              enum "15" {
                value 0;
                status deprecated;
                description "Option 15";
              }
              enum "16" {
                value 1;
                status deprecated;
                description "Option 16";
              }
            }
            status deprecated;
            description "Option number";
          }
    
          container equals {
            status deprecated;
            description "Generic option equals";
            uses relay-v6-option-ascii-hex;
          }  // container equals
    
          container default-action {
            status deprecated;
            description
              "Generic option default action";
            uses dhcp-v6-option-default-action;
          }  // container default-action
    
          container starts-with {
            status deprecated;
            description
              "Generic option starts with";
            uses relay-v6-option-ascii-hex;
          }  // container starts-with
    
          container option-15 {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-15  with option-number";
            presence "enable option-15";
            description
              "Add option 15 processing";
            uses dhcp-generic-v6-option-type;
          }  // container option-15
    
          container option-16 {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-16  with option-number";
            presence "enable option-16";
            description
              "Add option 16 processing";
            uses dhcp-generic-v6-option-type;
          }  // container option-16
    
          list option-order {
            junos:must "(!("option-number"))";
            junos:must-message "Cannot specify option-order  with option-number";
            key "name";
            ordered-by user;
            description
              "Options precedence order";
            leaf name {
              type enumeration {
                enum "15" {
                  value 0;
                  description "Option 15";
                }
                enum "16" {
                  value 1;
                  description "Option 16";
                }
              }
              description "Option number";
            }
    
            uses apply-advanced;
          }  // list option-order
        }  // grouping dhcp-generic-v6-option
    
        grouping dhcp-generic-v6-option-type {
          uses apply-advanced;
    
          container equals {
            description "Generic option equals";
            uses relay-v6-option-ascii-hex;
          }  // container equals
    
          container default-action {
            description
              "Generic option default action";
            uses dhcp-v6-option-default-action;
          }  // container default-action
    
          container starts-with {
            description
              "Generic option starts with";
            uses relay-v6-option-ascii-hex;
          }  // container starts-with
        }  // grouping dhcp-generic-v6-option-type
    
        grouping dhcp-v6-option-default-action {
          description "Default action";
          uses apply-advanced;
    
          choice server-group-choice {
            leaf relay-server-group {
              junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
              junos:must-message "Referenced group must be defined under [edit forwarding options dhcp-relay dhcpv6 server-group]";
              type string {
                length "1 .. 64";
              }
              description
                "Name of DHCP relay server group when match is made";
            }
            leaf drop {
              type empty;
              description
                "Discard when a match is made";
            }
            leaf forward-only {
              type empty;
              description
                "Forward without subscriber services when a match is made";
            }
          }  // choice server-group-choice
        }  // grouping dhcp-v6-option-default-action
    
        grouping dhcpv6-gbl-active-sg-type {
          uses apply-advanced;
    
          leaf active-server-group {
            junos:must "(".. .. server-group $$")";
            junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay dhcpv6 server-group]";
            type string {
              length "1 .. 64";
            }
            description
              "Name of DHCPv6 server group";
          }
        }  // grouping dhcpv6-gbl-active-sg-type
    
        grouping dhcpv6-override-relay-type {
          description
            "DHCPv6 relay override processing";
          uses apply-advanced;
    
          choice allow-snooped-clients-choice {
            leaf allow-snooped-clients {
              type empty;
              description
                "Allow client creation from snooped PDUs";
            }
            leaf no-allow-snooped-clients {
              type empty;
              description
                "Don't allow client creation from snooped PDUs";
            }
          }  // choice allow-snooped-clients-choice
    
          leaf delay-authentication {
            type empty;
            description
              "Delay subscriber authentication in DHCP protocol processing until request packet";
          }
    
          leaf interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of clients allowed on an interface";
          }
    
          leaf dual-stack {
            type string {
              length "1 .. 64";
            }
            description
              "Dual stack group to use.";
          }
    
          leaf no-bind-on-request {
            type empty;
            description
              "Do not bind if stray DHCPv6 RENEW, REBIND is received";
          }
    
          container client-negotiation-match {
            description
              "Use secondary match criteria for SOLICIT PDU";
            choice match-with {
              leaf incoming-interface {
                type empty;
                description
                  "Use incoming interface";
              }
            }  // choice match-with
          }  // container client-negotiation-match
    
          leaf send-release-on-delete {
            type empty;
            description
              "Always send RELEASE to the server when a binding is deleted";
          }
    
          leaf always-process-option-request-option {
            type empty;
            description
              "Always process option even after address allocation failure";
          }
    
          leaf relay-source {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface for relay source";
          }
    
          leaf delete-binding-on-renegotiation {
            type empty;
            description
              "Delete binding on renegotiation";
          }
    
          leaf asymmetric-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced lease time for the client. In seconds";
          }
    
          leaf asymmetric-prefix-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced prefix lease time for the client. In seconds";
          }
        }  // grouping dhcpv6-override-relay-type
    
        grouping dhcpv6-relay-group {
          description "DHCPv6 groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container active-server-group {
            description
              "Name of DHCPv6 server group";
            uses dhcpv6-gp-active-sg-type;
          }  // container active-server-group
    
          list dual-stack-group {
            key "name";
            description
              "Define a DHCP dual stack group";
            uses dhcp-dual-stack-group;
          }  // list dual-stack-group
    
          container authentication {
            description "DHCPv6 authentication";
            uses dhcpv6-authentication-type;
          }  // container authentication
    
          container liveness-detection {
            description
              "DHCPv6 client liveness detection processing";
            uses dhcpv6-liveness-detection-type;
          }  // container liveness-detection
    
          container dynamic-profile {
            description "Dynamic profile to use";
            uses dynamic-profile-type;
          }  // container dynamic-profile
    
          leaf service-profile {
            type string {
              length "1 .. 128";
            }
            description
              "Dynamic profile to use for default service activation";
          }
    
          leaf access-profile {
            junos:must "("access profile $$")";
            junos:must-message "Matching access profile must be defined";
            type string {
              length "1 .. 128";
            }
            description
              "Access profile to use for AAA services";
          }
    
          container short-cycle-protection {
            description
              "Short cycle lockout configuration";
            leaf lockout-min-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
    
            leaf lockout-max-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 86400";
                }
              }
              description
                "Short cycle lockout time in seconds";
            }
          }  // container short-cycle-protection
    
          container overrides {
            presence "enable overrides";
            description
              "DHCPv6 override processing";
            uses dhcpv6-override-relay-type;
          }  // container overrides
    
          container relay-option {
            presence "enable relay-option";
            description
              "DHCPv6 option processing";
            uses dhcp-generic-v6-option;
          }  // container relay-option
    
          container vendor-specific-information {
            description
              "DHCPv6 option 17 vendor-specific processing";
            uses jdhcp-vendor-specific-type;
          }  // container vendor-specific-information
    
          container forward-only {
            presence "enable forward-only";
            description
              "Forward DHCPv6 packets without creating binding";
            uses forward-only-to-rc-type;
          }  // container forward-only
    
          container relay-agent-interface-id {
            presence
              "enable relay-agent-interface-id";
            description
              "DHCPv6 interface-id option processing";
            uses v6-relay-option-interface-id-type;
          }  // container relay-agent-interface-id
    
          container relay-agent-remote-id {
            presence
              "enable relay-agent-remote-id";
            description
              "DHCPv6 remote-id option processing";
            uses v6-relay-option-remote-id-type;
          }  // container relay-agent-remote-id
    
          container route-suppression {
            description
              "Suppress access-internal and/or access route addition";
            uses dhcpv6-route-suppression-type;
          }  // container route-suppression
    
          leaf relay-agent-option-79 {
            type empty;
            description
              "Add the client MAC address to the Relay Forward header.";
          }
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              junos:must "((unique "forwarding-options dhcp-relay dhcpv6 group <*> interface $$" && !(any "system services dhcp-local-server dhcpv6 group <*> interface $$")))";
              junos:must-message "Interface used in other relay or server group";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf upto {
              junos:must "(!(".. .. interface $$"))";
              junos:must-message "Range end point must not equal start";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface up to";
            }
    
            leaf exclude {
              type empty;
              description
                "Exclude this interface range";
            }
    
            leaf trace {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify tracing with exclude";
              type empty;
              description
                "Enable tracing for this interface";
            }
    
            container overrides {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              description
                "DHCPv6 override processing";
              uses dhcpv6-override-relay-type;
            }  // container overrides
    
            container dynamic-profile {
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify dynamic-profile with exclude";
              description
                "Dynamic profile to use";
              uses dynamic-profile-type;
            }  // container dynamic-profile
    
            leaf service-profile {
              type string {
                length "1 .. 128";
              }
              description
                "Dynamic profile to use for default service activation";
            }
    
            leaf access-profile {
              junos:must "("access profile $$")";
              junos:must-message "Matching access profile must be defined";
              junos:must "(!(".. exclude"))";
              junos:must-message "Cannot specify overrides with exclude";
              type string {
                length "1 .. 128";
              }
              description
                "Access profile to use for AAA services";
            }
    
            container short-cycle-protection {
              description
                "Short cycle lockout configuration";
              leaf lockout-min-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
    
              leaf lockout-max-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 86400";
                  }
                }
                description
                  "Short cycle lockout time in seconds";
              }
            }  // container short-cycle-protection
          }  // list interface
    
          container lease-time-validation {
            presence
              "enable lease-time-validation";
            description
              "Configure lease time violation validation";
            uses apply-advanced;
    
            leaf lease-time-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 2147483647";
                }
              }
              units "seconds";
              description
                "Threshold for lease time violation in seconds";
            }
    
            container violation-action {
              description
                "Lease time validation violation action";
              leaf drop {
                type empty;
                description
                  "Drop dhcpv6 advertise and reply packets";
              }
            }  // container violation-action
          }  // container lease-time-validation
    
          container remote-id-mismatch {
            presence "enable remote-id-mismatch";
            description
              "DHCP client remote-id mismatch";
            uses dhcp-remote-id-mismatch-type;
          }  // container remote-id-mismatch
    
          container server-match {
            description
              "Server match processing";
            uses apply-advanced;
    
            container default-action {
              description
                "Server match default action";
              uses server-match-action-choice;
            }  // container default-action
    
            container duid {
              description
                "Match duid processing";
              uses apply-advanced;
    
              container equals {
                description "Duid equals";
                uses server-match-v6-ascii-hex;
              }  // container equals
    
              container starts-with {
                description "Duid starts with";
                uses server-match-v6-ascii-hex;
              }  // container starts-with
            }  // container duid
    
            list address {
              key "name";
              ordered-by user;
              description "Server ipv6 address";
              leaf name {
                type jt:ipv6prefix;
                description
                  "Server ipv6 address for matching";
              }
    
              uses apply-advanced;
    
              choice server-match-action-choice {
                leaf forward-only {
                  type empty;
                  description
                    "Forward without subscriber services when a match is made";
                }
                leaf create-relay-entry {
                  type empty;
                  description
                    "Create relay entry and allow subscriber services";
                }
              }  // choice server-match-action-choice
            }  // list address
          }  // container server-match
        }  // grouping dhcpv6-relay-group
    
        grouping dhcpv6-gp-active-sg-type {
          uses apply-advanced;
    
          leaf active-server-group {
            junos:must "(".. .. .. server-group $$")";
            junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay dhcpv6 server-group]";
            type string {
              length "1 .. 64";
            }
            description
              "Name of DHCPv6 server group";
          }
        }  // grouping dhcpv6-gp-active-sg-type
    
        grouping forward-only-to-rc-type {
          description
            "Forward DHCP packets without creating binding";
          uses apply-advanced;
    
          leaf logical-system {
            type string;
            default "current";
          }
    
          leaf routing-instance {
            type string;
            default "current";
          }
        }  // grouping forward-only-to-rc-type
    
        grouping jdhcp-security-type {
          description
            "DHCP access security configuration";
          uses apply-advanced;
    
          leaf no-dhcp-snooping {
            junos:must "(!("switch-options no-arp-trap "))";
            junos:must-message "Cannot enable ARP inspection with no-arp-trap";
            type empty;
            description "Disable dhcp snooping";
          }
    
          leaf arp-inspection {
            type empty;
            description
              "Enable dynamic ARP inspection";
          }
    
          leaf ip-source-guard {
            type empty;
            description "Enable IP source guard";
          }
    
          leaf no-dhcpv6-snooping {
            type empty;
            description
              "Disable DHCPv6 snooping";
          }
    
          leaf neighbor-discovery-inspection {
            type empty;
            description
              "Enable neighbor discovery inspection";
          }
    
          leaf ipv6-source-guard {
            type empty;
            description
              "Enable IPv6 source guard";
          }
    
          leaf light-weight-dhcpv6-relay {
            type empty;
            description
              "Enable light weight dhcpv6 relay";
          }
    
          list group {
            key "name";
            ordered-by user;
            description
              "Define a DHCP security group for overriding defaults";
            uses ds-group;
          }  // list group
    
          container option-82 {
            presence "enable option-82";
            description
              "DHCP option-82 processing for snooped packets";
            uses security-option-82-type;
          }  // container option-82
    
          container dhcpv6-options {
            presence "enable dhcpv6-options";
            description
              "DHCPv6 option processing for snooped packets";
            uses security-dhcpv6-options-type;
          }  // container dhcpv6-options
        }  // grouping jdhcp-security-type
    
        grouping ds-group {
          description "DHCP security groups";
          leaf name {
            type string {
              junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              length "1 .. 64";
            }
            description "Group name";
          }
    
          uses apply-advanced;
    
          container overrides {
            presence "enable overrides";
            description
              "DHCP override processing";
            uses ds-override-type;
          }  // container overrides
    
          list interface {
            key "name";
            description "One or more interfaces";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            list static-ip {
              key "name";
              ordered-by user;
              description
                "Static IP address configuration";
              uses ip-mac-static;
            }  // list static-ip
    
            list static-ipv6 {
              key "name";
              ordered-by user;
              description
                "Static IPv6 address configuration";
              uses ipv6-mac-static;
            }  // list static-ipv6
          }  // list interface
        }  // grouping ds-group
    
        grouping ds-override-type {
          description
            "Dynamic ARP Inspection override processing";
          uses apply-advanced;
    
          leaf trusted {
            junos:must "(!(".. untrusted"))";
            junos:must-message "Trusted and untrusted cannot be configured together";
            type empty;
            description
              "Make this trusted group of interfaces";
          }
    
          leaf untrusted {
            junos:must "(!(".. trusted"))";
            junos:must-message "Trusted and untrusted cannot be configured together";
            type empty;
            description
              "Make this untrusted group of interfaces";
          }
    
          leaf no-option82 {
            type empty;
            description
              "Make this group of interfaces not to add option82";
          }
    
          leaf no-option37 {
            type empty;
            description
              "Make this group of interfaces not to add option37";
          }
    
          leaf no-option18 {
            type empty;
            description
              "Make this group of interfaces not to add option18";
          }
    
          leaf no-option16 {
            type empty;
            description
              "Make this group of interfaces not to add option16";
          }
    
          leaf no-option79 {
            type empty;
            description
              "Make this group of interfaces not to add option79";
          }
    
          leaf no-dhcpv6-options {
            type empty;
            description
              "Make this group of interfaces not to add any DHCPv6 options";
          }
        }  // grouping ds-override-type
    
        grouping ip-mac-static {
          leaf name {
            type jt:ipaddr;
            description "IP address";
          }
    
          leaf mac {
            type jt:mac-addr;
            description "MAC address";
          }
        }  // grouping ip-mac-static
    
        grouping ipv6-mac-static {
          leaf name {
            type jt:ipv6addr;
            description "IP address";
          }
    
          leaf mac {
            type jt:mac-addr;
            description "MAC address";
          }
        }  // grouping ipv6-mac-static
    
        grouping jdhcp-vendor-specific-type {
          description
            "Add vendor-specific option processing";
          uses apply-advanced;
    
          leaf host-name {
            type empty;
            description "Add router host name";
          }
    
          leaf location {
            type empty;
            description
              "Add location information expressed as interface name format";
          }
        }  // grouping jdhcp-vendor-specific-type
    
        grouping juniper-forwarding-options {
          uses apply-advanced;
    
          list storm-control-profiles {
            key "name";
            description
              "Storm control profile for this instance";
            leaf name {
              junos:must "("forwarding-options storm-control-profiles $$ all")";
              junos:must-message "Only aggregate profiles supported";
              type string {
                length "1 .. 127";
              }
              description
                "Storm control profile name";
            }
    
            uses apply-advanced;
    
            container all {
              presence "enable all";
              description "For all BUM traffic";
              uses apply-advanced;
    
              choice bandwidth {
                leaf bandwidth-percentage {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of link bandwidth";
                }
                leaf bandwidth-level {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32;
                  }
                  units "kbps";
                  description "Link bandwidth";
                }
              }  // choice bandwidth
    
              leaf burst-size {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                units "bytes";
                description "Burst size";
              }
    
              leaf no-broadcast {
                type empty;
                description
                  "Disable broadcast storm control";
              }
    
              leaf no-unknown-unicast {
                type empty;
                description
                  "Disable unknown unicast storm control";
              }
    
              choice no-multicast-choices {
                leaf no-multicast {
                  type empty;
                  description
                    "Disable multicast storm control";
                }
                leaf no-registered-multicast {
                  type empty;
                  description
                    "Disable registered multicast storm control";
                }
                leaf no-unregistered-multicast {
                  type empty;
                  description
                    "Disable unregistered multicast storm control";
                }
              }  // choice no-multicast-choices
            }  // container all
    
            leaf action-shutdown {
              type empty;
              description
                "Disable port for excessive storm control errors";
            }
          }  // list storm-control-profiles
    
          container tunnels {
            presence "enable tunnels";
            description "Tunnel port profile";
            uses apply-advanced;
    
            container udp {
              presence "enable udp";
              uses apply-advanced;
    
              container payload-port-profile {
                presence
                  "enable payload-port-profile";
                description
                  "Tunnel payload port profile udp, only 1 can exist";
                uses apply-advanced;
    
                leaf profile-name {
                  type string;
                  description
                    "Payload port profile name";
                }
    
                leaf inet {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Tunnel port profile udp inet port";
                }
    
                leaf inet6 {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Tunnel port profile udp inet6 port";
                }
    
                leaf mpls {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Tunnel port profile udp mpls port";
                }
    
                leaf iso {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Tunnel port profile udp iso port";
                }
              }  // container payload-port-profile
            }  // container udp
          }  // container tunnels
    
          choice sampling-or-packet-capture {
            container sampling {
              description
                "Statistical traffic sampling options";
              uses juniper-sampling-options;
            }  // container sampling
            container packet-capture {
              description
                "Packet capture options";
              uses juniper-packet-capture-options;
            }  // container packet-capture
          }  // choice sampling-or-packet-capture
    
          list monitoring {
            key "name";
            description
              "Configure lawful interception of traffic";
            uses juniper-monitoring-options;
          }  // list monitoring
    
          list accounting {
            key "name";
            description
              "Configure accounting of traffic";
            uses juniper-packet-accounting-options;
          }  // list accounting
    
          list analyzer {
            key "name";
            description "Analyzer options";
            uses smpl-analyzer-type;
          }  // list analyzer
    
          container port-mirroring {
            description
              "Configure port mirroring of traffic";
            uses juniper-port-mirror-options;
          }  // container port-mirroring
    
          container evpn-vxlan {
            description
              "EVPN VXLAN configurations";
            uses apply-advanced;
    
            leaf shared-tunnels {
              type empty;
              description
                "Create VTEP tunnels to EVPN PE";
            }
    
            container reroute-address {
              description
                "Reroute IP address for vxlan encapsulation";
              choice family {
                container inet {
                  presence "enable inet";
                  description
                    "IPv4 address family";
                  uses apply-advanced;
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Reroute address for IPV4 FRR";
                  }
                }  // container inet
                container inet6 {
                  presence "enable inet6";
                  description
                    "IPv6 address family";
                  uses apply-advanced;
    
                  leaf address {
                    type jt:ipv6addr;
                    description
                      "Reroute address for IPV6 FRR";
                  }
                }  // container inet6
              }  // choice family
            }  // container reroute-address
          }  // container evpn-vxlan
    
          container multicast-replication {
            description
              "Set mode of multicast replication";
            uses apply-advanced;
    
            leaf ingress {
              junos:must "("chassis network-services enhanced-ip")";
              junos:must-message "Enhanced IP must be configured for using multicast-replication features";
              type empty;
              description
                "Complete ingress replication";
            }
    
            leaf local-latency-fairness {
              junos:must "("chassis network-services enhanced-ip")";
              junos:must-message "Enhanced IP must be configured for using multicast-replication features";
              type empty;
              description
                "Complete parallel replication";
            }
    
            container evpn {
              description
                "EVPN IRB multicast related options";
              uses apply-advanced;
    
              leaf irb {
                type enumeration {
                  enum "local-only" {
                    value 0;
                    description
                      "Multicast forward in local-only mode";
                  }
                  enum "local-remote" {
                    value 1;
                    description
                      "Multicast forward in local-remote mode";
                  }
                  enum "oism" {
                    value 2;
                    description
                      "Optimized inter subnet multicast mode";
                  }
                }
              }
    
              leaf smet-nexthop-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10000 .. 40000";
                  }
                }
                description
                  "Flood traffic to all egress when count goes above limit";
              }
            }  // container evpn
          }  // container multicast-replication
    
          container load-balance {
            description
              "Configure load-balancing attributes on the forwarding path";
            uses apply-advanced;
    
            leaf ecmp-local-bias {
              type empty;
              description
                "Apply locality bias for ecmp nexthops";
            }
    
            container indexed-load-balance {
              presence
                "enable indexed-load-balance";
              description
                "Use indexed permuted next hop lists for unilist and aggregate next hops";
              uses apply-advanced;
            }  // container indexed-load-balance
    
            container per-flow {
              uses apply-advanced;
    
              leaf hash-seed {
                type empty;
                description
                  "Enable per flow seed value on packet forwarding engine";
              }
            }  // container per-flow
    
            container per-prefix {
              presence "enable per-prefix";
              uses apply-advanced;
    
              leaf hash-seed {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "0 .. 65534";
                  }
                }
                default "0";
                description
                  "Specifies per-router input value for per-prefix load-balancing hash function";
              }
            }  // container per-prefix
          }  // container load-balance
    
          container hash-key {
            description
              "Select data used in the hash key";
            uses junos_hash_key;
          }  // container hash-key
    
          container local-bias {
            presence "enable local-bias";
            description
              "Turn on local bias functionality";
            uses apply-advanced;
    
            leaf disable {
              type empty;
              description "Disable local-bias";
            }
          }  // container local-bias
    
          container enhanced-hash-key {
            description
              "Select data used in the hash key for Enhanced IP Forwarding Engines";
            uses apply-advanced;
    
            container lag-dlb {
              presence "enable lag-dlb";
              description
                "Setting dynamic load balancing options for LAG";
              uses apply-advanced;
    
              container ether-type {
                presence "enable ether-type";
                description
                  "Setting ether type for LAG DLB";
                uses apply-advanced;
    
                leaf ipv4 {
                  type empty;
                  description
                    "Ether type is ipv4";
                }
    
                leaf ipv6 {
                  type empty;
                  description
                    "Ether type is ipv6";
                }
    
                leaf mpls {
                  type empty;
                  description
                    "Ether type is mpls";
                }
              }  // container ether-type
            }  // container lag-dlb
    
            container ecmp-dlb {
              junos:must "(!(".. ecmp-resilient-hash"))";
              junos:must-message "RH and DLB cannot be configured together";
              description
                "Set load balancing options for VC-Fabric forwarding";
              uses apply-advanced;
    
              choice mode {
                leaf assigned-flow {
                  type empty;
                  description
                    "Flow-based fixed link assignment";
                }
                container flowlet {
                  presence "enable flowlet";
                  description
                    "Inactivity-based flowlet link assignment (default)";
                  uses apply-advanced;
    
                  leaf inactivity-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32;
                    }
                    default "256";
                    description
                      "Minimum inactivity interval in micro-seconds for flowlet detection";
                  }
                }  // container flowlet
                leaf per-packet {
                  type empty;
                  description
                    "Per-packet optimal spraying";
                }
              }  // choice mode
    
              container ether-type {
                presence "enable ether-type";
                description "Ether type";
                uses apply-advanced;
    
                leaf ipv4 {
                  type empty;
                  description "Set DLB for ipv4";
                }
    
                leaf ipv6 {
                  type empty;
                  description "Set DLB for ipv6";
                }
    
                leaf mpls {
                  type empty;
                  description "Set DLB for mpls";
                }
              }  // container ether-type
            }  // container ecmp-dlb
    
            container hash-mode {
              description "Hashing mode";
              uses apply-advanced;
    
              choice instance {
                leaf layer2-header {
                  type empty;
                  description
                    "Only layer2 header fields are considered for hashing";
                }
                leaf layer2-payload {
                  type empty;
                  description
                    "Only layer2 payload fields are considered for hashing";
                }
                leaf gtp-header-offset {
                  type union {
                    type uint8;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Gtp header first byte offset";
                }
              }  // choice instance
            }  // container hash-mode
    
            container hash-seed {
              presence "enable hash-seed";
              description "Hash seed";
              uses apply-advanced;
    
              leaf seed-value {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                description "Hash seed value";
              }
            }  // container hash-seed
    
            container resilient-hash-seed {
              presence
                "enable resilient-hash-seed";
              description "Resilient hash seed";
              uses apply-advanced;
    
              leaf resilient-seed-value {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                description
                  "Hash seed value for resilient ECMP and LAG";
              }
            }  // container resilient-hash-seed
    
            container mpls {
              description
                "Configure mpls fields";
              uses apply-advanced;
    
              leaf no-incoming-port {
                type empty;
                description
                  "Exclude incoming port from the hash key";
              }
    
              leaf no-incoming-device {
                type empty;
                description
                  "Exclude incoming device from the hash key";
              }
            }  // container mpls
    
            container layer2 {
              description
                "Configure layer2 fields";
              uses apply-advanced;
    
              leaf no-incoming-port {
                type empty;
                description
                  "Exclude incoming port from the hash key";
              }
    
              leaf no-incoming-device {
                type empty;
                description
                  "Exclude incoming device from the hash key";
              }
    
              leaf no-source-mac-address {
                type empty;
                description
                  "Exclude source MAC address from the hash key";
              }
    
              leaf no-destination-mac-address {
                type empty;
                description
                  "Exclude destination MAC address from the hash key";
              }
    
              leaf no-ether-type {
                type empty;
                description
                  "Exclude ether type from the hash key";
              }
    
              leaf vlan-id {
                type empty;
                description
                  "Include incoming vlan-id in hash key";
              }
            }  // container layer2
    
            container inet {
              description
                "Configure inet4 fields";
              uses apply-advanced;
    
              leaf no-incoming-port {
                type empty;
                description
                  "Exclude incoming port from the hash key";
              }
    
              leaf no-incoming-device {
                type empty;
                description
                  "Exclude incoming device from the hash key";
              }
    
              leaf no-l4-source-port {
                type empty;
                description
                  "Exclude l4 source port from the hash key";
              }
    
              leaf no-l4-destination-port {
                type empty;
                description
                  "Exclude l4 dest port from the hash key";
              }
    
              leaf no-protocol {
                type empty;
                description
                  "Exclude protocol from the hash key";
              }
    
              leaf no-ipv4-source-address {
                type empty;
                description
                  "Exclude IPv4 source address";
              }
    
              leaf no-ipv4-destination-address {
                type empty;
                description
                  "Exclude IPv4 destination address";
              }
    
              leaf vlan-id {
                type empty;
                description
                  "Include incoming vlan-id in hash key";
              }
            }  // container inet
    
            container inet6 {
              description
                "Configure inet6 fields";
              uses apply-advanced;
    
              leaf no-incoming-port {
                type empty;
                description
                  "Exclude incoming port from the hash key";
              }
    
              leaf no-incoming-device {
                type empty;
                description
                  "Exclude incoming device from the hash key";
              }
    
              leaf no-l4-source-port {
                type empty;
                description
                  "Exclude l4 source port from the hash key";
              }
    
              leaf no-l4-destination-port {
                type empty;
                description
                  "Exclude l4 dest port from the hash key";
              }
    
              leaf no-next-header {
                type empty;
                description
                  "Exclude next header from the hash key";
              }
    
              leaf no-ipv6-source-address {
                type empty;
                description
                  "Exclude IPv6 source address";
              }
    
              leaf no-ipv6-destination-address {
                type empty;
                description
                  "Exclude IPv6 destination address";
              }
    
              leaf vlan-id {
                type empty;
                description
                  "Include vlan-id in hash key";
              }
            }  // container inet6
    
            leaf no-mpls {
              type empty;
              description
                "Disable mpls in hash key";
            }
    
            container gre {
              description "Configure for GRE ";
              uses apply-advanced;
    
              leaf key {
                type empty;
                description
                  "Include key in hash key";
              }
    
              leaf protocol {
                type empty;
                description
                  "Include protocol in hash key";
              }
            }  // container gre
    
            container symmetric-hash {
              description
                "Enable symmetric hash for load-balancing";
              uses apply-advanced;
    
              leaf inet {
                type empty;
                description
                  "Enable symmetric hash on ipv4 flows";
              }
    
              leaf inet6 {
                type empty;
                description
                  "Enable symmetric hash on ipv6 flows";
              }
            }  // container symmetric-hash
    
            container services-loadbalancing {
              description
                "Select key to load balance across service PICs";
              uses apply-advanced;
    
              container family {
                description "Protocol family";
                container inet {
                  description
                    "IPv4 protocol family";
                  uses apply-advanced;
    
                  container layer-3-services {
                    description
                      "Include Layer 3 (IP) data in the hash key";
                    uses apply-advanced;
    
                    leaf source-address {
                      type empty;
                      description
                        "Include IP source address in the hash key";
                    }
    
                    leaf destination-address {
                      type empty;
                      description
                        "Include IP destination address in the hash key";
                    }
    
                    leaf incoming-interface-index {
                      type empty;
                      description
                        "Include incoming interface index in the hash key";
                    }
                  }  // container layer-3-services
                }  // container inet
    
                container inet6 {
                  description
                    "IPv6 protocol family";
                  uses apply-advanced;
    
                  container layer-3-services {
                    description
                      "Include Layer 3 (IP) data in the hash key";
                    uses apply-advanced;
    
                    leaf source-address {
                      type empty;
                      description
                        "Include IP source address in the hash key";
                    }
    
                    leaf destination-address {
                      type empty;
                      description
                        "Include IP destination address in the hash key";
                    }
    
                    leaf incoming-interface-index {
                      type empty;
                      description
                        "Include incoming interface index in the hash key";
                    }
    
                    leaf src-prefix-len {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "56 .. 127";
                        }
                      }
                      units "bits";
                      default "127";
                      description
                        "Enhanced hash key inet6 source prefix length";
                    }
                  }  // container layer-3-services
                }  // container inet6
              }  // container family
            }  // container services-loadbalancing
    
            container source-destination-only-loadbalancing {
              description
                "Configure key for source/destination-ip-only load balancing";
              uses apply-advanced;
    
              container family {
                description "Protocol family";
                container inet {
                  description
                    "IPv4 protocol family";
                  uses apply-advanced;
    
                  leaf prefix-length {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 32";
                      }
                    }
                    units "bits";
                    default "32";
                    description
                      "Source/Destination Only Load-Balancing inet prefix length";
                  }
                }  // container inet
    
                container inet6 {
                  description
                    "IPv6 protocol family";
                  uses apply-advanced;
    
                  leaf prefix-length {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 128";
                      }
                    }
                    units "bits";
                    default "128";
                    description
                      "Source/Destination Only Load-Balancing inet6 prefix length";
                  }
                }  // container inet6
              }  // container family
            }  // container source-destination-only-loadbalancing
    
            container family {
              description "Protocol family";
              container any {
                description
                  "Applicable to all protocol families";
                uses apply-advanced;
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in the hash key";
                }
    
                leaf no-tunnel-payload {
                  type empty;
                  description
                    "Omit tunnel payload in the hash key";
                }
              }  // container any
    
              container inet {
                description
                  "IPv4 protocol family";
                uses apply-advanced;
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in the hash key";
                }
    
                leaf no-destination-port {
                  type empty;
                  description
                    "Omit IP destination port in the hash key";
                }
    
                leaf no-source-port {
                  type empty;
                  description
                    "Omit IP source port in the hash key";
                }
    
                leaf type-of-service {
                  type empty;
                  description
                    "Include TOS byte in the hash key";
                }
    
                leaf gtp-tunnel-endpoint-identifier {
                  type empty;
                  description
                    "Include TEID in the hash key for GTP-U packets";
                }
    
                leaf l2tp-tunnel-session-identifier {
                  type empty;
                  description
                    "Include TID SID in the hash key for L2TP packets";
                }
    
                leaf session-id {
                  type empty;
                  description
                    "Include session ID in the enhanced hash key";
                }
              }  // container inet
    
              container inet6 {
                description
                  "IPv6 protocol family";
                uses apply-advanced;
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in the hash key";
                }
    
                leaf traffic-class {
                  type empty;
                  description
                    "Include Traffic Class byte in the hash key";
                }
    
                leaf no-destination-port {
                  type empty;
                  description
                    "Omit IP destination port in the hash key";
                }
    
                leaf no-source-port {
                  type empty;
                  description
                    "Omit IP source port in the hash key";
                }
    
                leaf gtp-tunnel-endpoint-identifier {
                  type empty;
                  description
                    "Include TEID in the hash key for GTP-U packets";
                }
    
                leaf session-id {
                  type empty;
                  description
                    "Include session ID in the enhanced hash key";
                }
    
                leaf no-flow-label {
                  type empty;
                  description
                    "Omit Flow label in the hash key";
                }
    
                leaf type-of-service {
                  type empty;
                  description
                    "Include TOS byte in the hash key";
                }
              }  // container inet6
    
              container mpls {
                description
                  "MPLS protocol family";
                uses apply-advanced;
    
                leaf label-1-exp {
                  type empty;
                  description
                    "Include EXP of first MPLS label from the hash key";
                }
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in the hash key";
                }
    
                choice pseudowire_option {
                  leaf no-ether-pseudowire {
                    type empty;
                    description
                      "Omit IP payload over ethernet PW from the hash-key";
                  }
                  container ether-pseudowire {
                    description
                      "Load-balance IP over ethernet PW";
                    leaf zero-control-word {
                      type empty;
                      description
                        "Parse zero control word in packet header";
                    }
                  }  // container ether-pseudowire
                }  // choice pseudowire_option
    
                leaf no-labels {
                  type empty;
                  description
                    "Exclude all MPLS labels from hash key";
                }
    
                leaf no-payload {
                  type empty;
                  description
                    "Omit MPLS payload data from the hash key";
                }
              }  // container mpls
    
              container multiservice {
                description
                  "Multiservice protocol (bridged/CCC/VPLS) family";
                uses apply-advanced;
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in hash key";
                }
    
                leaf outer-priority {
                  type empty;
                  description
                    "Include Outer 802.1 Priority bits in the hash key";
                }
    
                leaf no-payload {
                  type empty;
                  description
                    "Omit payload data from the hash key";
                }
    
                leaf no-mac-addresses {
                  type empty;
                  description
                    "Omit source and destination MAC addresses from the hash key";
                }
              }  // container multiservice
            }  // container family
    
            container hash-function {
              description
                "Configure hash functions";
              uses apply-advanced;
    
              choice instance {
                leaf CRC16-CCITT {
                  type empty;
                  description
                    "16-bit CRC16 using CCITT polynomial";
                }
                leaf CRC16 {
                  type empty;
                  description
                    "16-bit CRC16 calculated using the BISYNC polynomial";
                }
                leaf CRC16XOR1 {
                  type empty;
                  description
                    "Upper 8 bits BISYNC CRC16 and 8 bit XOR1";
                }
                leaf CRC16XOR2 {
                  type empty;
                  description
                    "Upper 8 bit BISYNC CRC16 and 8 bit XOR2";
                }
                leaf CRC16XOR4 {
                  type empty;
                  description
                    "Upper 8 bit BISYNC CRC16 and 8 bit XOR4";
                }
                leaf CRC16XOR8 {
                  type empty;
                  description
                    "Upper 8 bit BISYNC CRC16 and 8 bit XOR8";
                }
                leaf CRC32HI {
                  type empty;
                  description
                    "16 LSBs of computed CRC32";
                }
                leaf CRC32LO {
                  type empty;
                  description
                    "16 MSBs of computed CRC32";
                }
    
                case case_9 {
                }  // case case_9
    
                case case_10 {
                }  // case case_10
    
                case case_11 {
                }  // case case_11
    
                case case_12 {
                }  // case case_12
              }  // choice instance
            }  // container hash-function
    
            container vxlan {
              description "Vxlan traffic";
              uses apply-advanced;
    
              leaf no-inner-payload {
                type empty;
                description
                  "To enable load-balancing on Vxlan traffic based on outer IP/UDP header";
              }
            }  // container vxlan
    
            list conditional-match {
              key "name";
              ordered-by user;
              description
                "Configures a conditional match";
              leaf name {
                type string;
                description "Name identifier";
              }
    
              uses apply-advanced;
    
              container offset1 {
                presence "enable offset1";
                description "Configure offset 1";
                uses apply-advanced;
    
                leaf base-offset1 {
                  type enumeration {
                    enum "start-of-L2Header" {
                      value 0;
                      description
                        "Offset will be extracted from start of L2 header";
                    }
                    enum
                      "start-of-L3-OuterHeader" {
                      value 1;
                      description
                        "Offset will be extracted from start of outer L3 header";
                    }
                    enum
                      "start-of-L3-InnerHeader" {
                      value 2;
                      description
                        "Offset will be extracted from start of inner L3 header";
                    }
                    enum "start-of-L4-Header" {
                      value 3;
                      description
                        "Offset will be extracted from start of L4 header";
                    }
                  }
                  description
                    "Configure base-offset";
                }
    
                leaf offset1-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "0 .. 126";
                    }
                  }
                  description
                    "Offset of the data to be extracted from the base offset. Only even number";
                }
    
                leaf matchdata1 {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description
                    "Data to be matched";
                }
    
                leaf matchdata1-mask {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description "Matchdata mask";
                }
              }  // container offset1
    
              container offset2 {
                presence "enable offset2";
                description "Configure offset 2";
                uses apply-advanced;
    
                leaf base-offset2 {
                  type enumeration {
                    enum "start-of-L2Header" {
                      value 0;
                      description
                        "Offset will be extracted from start of L2 header";
                    }
                    enum
                      "start-of-L3-OuterHeader" {
                      value 1;
                      description
                        "Offset will be extracted from start of outer L3 header";
                    }
                    enum
                      "start-of-L3-InnerHeader" {
                      value 2;
                      description
                        "Offset will be extracted from start of inner L3 header";
                    }
                    enum "start-of-L4-Header" {
                      value 3;
                      description
                        "Offset will be extracted from start of L4 header";
                    }
                  }
                  description
                    "Configure base-offset";
                }
    
                leaf offset2-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "0 .. 126";
                    }
                  }
                  description
                    "Offset of the data to be extracted from the base offset. Only even number";
                }
    
                leaf matchdata2 {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description
                    "Data to be matched";
                }
    
                leaf matchdata2-mask {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description "Matchdata mask";
                }
              }  // container offset2
    
              container offset3 {
                presence "enable offset3";
                description "Configure offset 3";
                uses apply-advanced;
    
                leaf base-offset3 {
                  type enumeration {
                    enum "start-of-L2Header" {
                      value 0;
                      description
                        "Offset will be extracted from start of L2 header";
                    }
                    enum
                      "start-of-L3-OuterHeader" {
                      value 1;
                      description
                        "Offset will be extracted from start of outer L3 header";
                    }
                    enum
                      "start-of-L3-InnerHeader" {
                      value 2;
                      description
                        "Offset will be extracted from start of inner L3 header";
                    }
                    enum "start-of-L4-Header" {
                      value 3;
                      description
                        "Offset will be extracted from start of L4 header";
                    }
                  }
                  description
                    "Configure base-offset";
                }
    
                leaf offset3-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "0 .. 126";
                    }
                  }
                  description
                    "Offset of the data to be extracted from the base offset. Only even number";
                }
    
                leaf matchdata3 {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description
                    "Data to be matched";
                }
    
                leaf matchdata3-mask {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description "Matchdata mask";
                }
              }  // container offset3
    
              container offset4 {
                presence "enable offset4";
                description "Configure offset 4";
                uses apply-advanced;
    
                leaf base-offset4 {
                  type enumeration {
                    enum "start-of-L2Header" {
                      value 0;
                      description
                        "Offset will be extracted from start of L2 header";
                    }
                    enum
                      "start-of-L3-OuterHeader" {
                      value 1;
                      description
                        "Offset will be extracted from start of outer L3 header";
                    }
                    enum
                      "start-of-L3-InnerHeader" {
                      value 2;
                      description
                        "Offset will be extracted from start of inner L3 header";
                    }
                    enum "start-of-L4-Header" {
                      value 3;
                      description
                        "Offset will be extracted from start of L4 header";
                    }
                  }
                  description
                    "Configure base-offset";
                }
    
                leaf offset4-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "0 .. 126";
                    }
                  }
                  description
                    "Offset of the data to be extracted from the base offset. Only even number";
                }
    
                leaf matchdata4 {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description
                    "Data to be matched";
                }
    
                leaf matchdata4-mask {
                  type string {
                    junos:posix-pattern "^[[:xdigit:]]+$";
                    junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                    length "4";
                  }
                  description "Matchdata mask";
                }
              }  // container offset4
            }  // list conditional-match
    
            list flex-hashing {
              key "name";
              ordered-by user;
              description "Set flex hashing";
              leaf name {
                type string;
                description "Name identifier";
              }
    
              uses apply-advanced;
    
              container ethtype {
                presence "enable ethtype";
                description
                  "Configure ether-type of packet";
                uses apply-advanced;
    
                container inet {
                  description
                    "Enable flex-hashing on ipv4";
                  uses apply-advanced;
    
                  leaf interface {
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Incoming interface name. This is optional parameter";
                  }
    
                  leaf conditional-match {
                    type string;
                    description
                      "Conditional match to be matched in the packet";
                  }
    
                  container hash-offset {
                    description
                      "Configure the offsets for hashing";
                    uses apply-advanced;
    
                    container offset1 {
                      presence "enable offset1";
                      description
                        "Configure offset 1 value";
                      uses apply-advanced;
    
                      leaf base-offset1 {
                        type enumeration {
                          enum
                            "start-of-L2Header" {
                            value 0;
                            description
                              "Offset will be extracted from start of L2 header";
                          }
                          enum
                            "start-of-L3-OuterHeader" {
                            value 1;
                            description
                              "Offset will be extracted from start of outer L3 header";
                          }
                          enum
                            "start-of-L3-InnerHeader" {
                            value 2;
                            description
                              "Offset will be extracted from start of inner L3 header";
                          }
                          enum
                            "start-of-L4-Header" {
                            value 3;
                            description
                              "Offset will be extracted from start of L4 header";
                          }
                        }
                        description
                          "Configure base-offset";
                      }
    
                      leaf offset1-value {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint8 {
                            range "0 .. 126";
                          }
                        }
                        description
                          "Offset of the data to be extracted from the base offset. Only even number";
                      }
    
                      leaf offset1-mask {
                        type string {
                          junos:posix-pattern "^[[:xdigit:]]+$";
                          junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                          length "4";
                        }
                        description
                          "Mask for the hash data extracted. 2 byte mask";
                      }
    
                      container offset2 {
                        presence
                          "enable offset2";
                        description
                          "Configure offset 2 value";
                        uses apply-advanced;
    
                        leaf base-offset2 {
                          type enumeration {
                            enum
                              "start-of-L2Header" {
                              value 0;
                              description
                                "Offset will be extracted from start of L2 header";
                            }
                            enum
                              "start-of-L3-OuterHeader" {
                              value 1;
                              description
                                "Offset will be extracted from start of outer L3 header";
                            }
                            enum
                              "start-of-L3-InnerHeader" {
                              value 2;
                              description
                                "Offset will be extracted from start of inner L3 header";
                            }
                            enum
                              "start-of-L4-Header" {
                              value 3;
                              description
                                "Offset will be extracted from start of L4 header";
                            }
                          }
                          description
                            "Configure base-offset";
                        }
    
                        leaf offset2-value {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint8 {
                              range "0 .. 126";
                            }
                          }
                          description
                            "Offset of the data to be extracted from the base offset. Only even number";
                        }
    
                        leaf offset2-mask {
                          type string {
                            junos:posix-pattern "^[[:xdigit:]]+$";
                            junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                            length "4";
                          }
                          description
                            "Mask for the hash data extracted. 2 byte mask";
                        }
                      }  // container offset2
                    }  // container offset1
                  }  // container hash-offset
                }  // container inet
    
                container inet6 {
                  description
                    "Enable flex-hashing on ipv6";
                  uses apply-advanced;
    
                  leaf interface {
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Incoming interface name. This is optional parameter";
                  }
    
                  leaf conditional-match {
                    type string;
                    description
                      "Conditional match to be matched in the packet";
                  }
    
                  container hash-offset {
                    description
                      "Configure the offsets for hashing";
                    uses apply-advanced;
    
                    container offset1 {
                      presence "enable offset1";
                      description
                        "Configure offset 1 value";
                      uses apply-advanced;
    
                      leaf base-offset1 {
                        type enumeration {
                          enum
                            "start-of-L2Header" {
                            value 0;
                            description
                              "Offset will be extracted from start of L2 header";
                          }
                          enum
                            "start-of-L3-OuterHeader" {
                            value 1;
                            description
                              "Offset will be extracted from start of outer L3 header";
                          }
                          enum
                            "start-of-L3-InnerHeader" {
                            value 2;
                            description
                              "Offset will be extracted from start of inner L3 header";
                          }
                          enum
                            "start-of-L4-Header" {
                            value 3;
                            description
                              "Offset will be extracted from start of L4 header";
                          }
                        }
                        description
                          "Configure base-offset";
                      }
    
                      leaf offset1-value {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint8 {
                            range "0 .. 126";
                          }
                        }
                        description
                          "Offset of the data to be extracted from the base offset. Only even number";
                      }
    
                      leaf offset1-mask {
                        type string {
                          junos:posix-pattern "^[[:xdigit:]]+$";
                          junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                          length "4";
                        }
                        description
                          "Mask for the hash data extracted. 2 byte mask";
                      }
    
                      container offset2 {
                        presence
                          "enable offset2";
                        description
                          "Configure offset 2 value";
                        uses apply-advanced;
    
                        leaf base-offset2 {
                          type enumeration {
                            enum
                              "start-of-L2Header" {
                              value 0;
                              description
                                "Offset will be extracted from start of L2 header";
                            }
                            enum
                              "start-of-L3-OuterHeader" {
                              value 1;
                              description
                                "Offset will be extracted from start of outer L3 header";
                            }
                            enum
                              "start-of-L3-InnerHeader" {
                              value 2;
                              description
                                "Offset will be extracted from start of inner L3 header";
                            }
                            enum
                              "start-of-L4-Header" {
                              value 3;
                              description
                                "Offset will be extracted from start of L4 header";
                            }
                          }
                          description
                            "Configure base-offset";
                        }
    
                        leaf offset2-value {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint8 {
                              range "0 .. 126";
                            }
                          }
                          description
                            "Offset of the data to be extracted from the base offset. Only even number";
                        }
    
                        leaf offset2-mask {
                          type string {
                            junos:posix-pattern "^[[:xdigit:]]+$";
                            junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                            length "4";
                          }
                          description
                            "Mask for the hash data extracted. 2 byte mask";
                        }
                      }  // container offset2
                    }  // container offset1
                  }  // container hash-offset
                }  // container inet6
    
                container mpls {
                  description
                    "Configure number of MPLS labels";
                  uses apply-advanced;
    
                  leaf num-labels {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint8 {
                        range "1 .. 5";
                      }
                    }
                    description
                      "Configure number of MPLS labels";
                  }
    
                  leaf interface {
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Incoming interface name. This is optional parameter";
                  }
    
                  leaf conditional-match {
                    type string;
                    description
                      "Conditional match to be matched in the packet";
                  }
    
                  container hash-offset {
                    description
                      "Configure the offsets for hashing";
                    uses apply-advanced;
    
                    container offset1 {
                      presence "enable offset1";
                      description
                        "Configure offset 1 value";
                      uses apply-advanced;
    
                      leaf base-offset1 {
                        type enumeration {
                          enum
                            "start-of-L2Header" {
                            value 0;
                            description
                              "Offset will be extracted from start of L2 header";
                          }
                          enum
                            "start-of-L3-OuterHeader" {
                            value 1;
                            description
                              "Offset will be extracted from start of outer L3 header";
                          }
                          enum
                            "start-of-L3-InnerHeader" {
                            value 2;
                            description
                              "Offset will be extracted from start of inner L3 header";
                          }
                          enum
                            "start-of-L4-Header" {
                            value 3;
                            description
                              "Offset will be extracted from start of L4 header";
                          }
                        }
                        description
                          "Configure base-offset";
                      }
    
                      leaf offset1-value {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint8 {
                            range "0 .. 126";
                          }
                        }
                        description
                          "Offset of the data to be extracted from the base offset. Only even number";
                      }
    
                      leaf offset1-mask {
                        type string {
                          junos:posix-pattern "^[[:xdigit:]]+$";
                          junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                          length "4";
                        }
                        description
                          "Mask for the hash data extracted. 2 byte mask";
                      }
    
                      container offset2 {
                        presence
                          "enable offset2";
                        description
                          "Configure offset 2 value";
                        uses apply-advanced;
    
                        leaf base-offset2 {
                          type enumeration {
                            enum
                              "start-of-L2Header" {
                              value 0;
                              description
                                "Offset will be extracted from start of L2 header";
                            }
                            enum
                              "start-of-L3-OuterHeader" {
                              value 1;
                              description
                                "Offset will be extracted from start of outer L3 header";
                            }
                            enum
                              "start-of-L3-InnerHeader" {
                              value 2;
                              description
                                "Offset will be extracted from start of inner L3 header";
                            }
                            enum
                              "start-of-L4-Header" {
                              value 3;
                              description
                                "Offset will be extracted from start of L4 header";
                            }
                          }
                          description
                            "Configure base-offset";
                        }
    
                        leaf offset2-value {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint8 {
                              range "0 .. 126";
                            }
                          }
                          description
                            "Offset of the data to be extracted from the base offset. Only even number";
                        }
    
                        leaf offset2-mask {
                          type string {
                            junos:posix-pattern "^[[:xdigit:]]+$";
                            junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                            length "4";
                          }
                          description
                            "Mask for the hash data extracted. 2 byte mask";
                        }
                      }  // container offset2
                    }  // container offset1
                  }  // container hash-offset
                }  // container mpls
              }  // container ethtype
            }  // list flex-hashing
    
            leaf symmetric {
              type empty;
              description
                "Enable symmetric load-balancing";
            }
          }  // container enhanced-hash-key
    
          container next-hop {
            description "Next hop throttle";
            uses apply-advanced;
          }  // container next-hop
    
          container sflow {
            description "Sflow related";
            uses apply-advanced;
    
            container egress-multicast {
              description
                "Sflow for egress multicast";
              uses apply-advanced;
    
              leaf max-replication-rate {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 2000";
                  }
                }
                description
                  "To configure max replication rate (0 to 2K pps)";
              }
            }  // container egress-multicast
          }  // container sflow
    
          container multicast {
            description
              "Multicast resolve and mismatch rate";
            uses apply-advanced;
    
            leaf resolve-rate {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "100 .. 1000";
                }
              }
              units "per second";
              description
                "Multicast resolve rate";
            }
    
            leaf mismatch-rate {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "50 .. 1000";
                }
              }
              units "per second";
              description
                "Multicast interface mismatch rate";
            }
    
            container policer {
              presence "enable policer";
              uses apply-advanced;
    
              leaf bandwidth-limit {
                type string;
                units "bits per second";
                description "Bandwidth limit";
              }
    
              leaf burst-size-limit {
                type string;
                units "bytes";
                description "Burst size limit";
              }
            }  // container policer
          }  // container multicast
    
          container packet-capture-telemetry {
            description
              "Packet capture telemetry options";
            uses apply-advanced;
    
            container egress {
              description "Egress options";
              uses packet-capture-egress-intf-type;
            }  // container egress
          }  // container packet-capture-telemetry
    
          container rpf-loose-mode-discard {
            description
              "Configure rpf loose mode behavior";
            uses apply-advanced;
    
            container family {
              description "Protocol family";
              uses apply-advanced;
    
              leaf inet {
                type empty;
                description
                  "Configure rpf loose mode behavior for IPv4";
              }
    
              leaf inet6 {
                type empty;
                description
                  "Configure rpf loose mode behavior for IPv6";
              }
            }  // container family
          }  // container rpf-loose-mode-discard
    
          leaf l2circuit-control-passthrough {
            type empty;
            description
              "Configure passthrough for control protocol packets on L2 Circuit";
          }
    
          container explicit-null-cos {
            presence "enable explicit-null-cos";
            description
              "Configure to use MPLS explicit null exp for COS classification";
            uses apply-advanced;
    
            leaf inet {
              type empty;
              description "Include family inet";
            }
    
            leaf inet6 {
              type empty;
              description "Include family inet6";
            }
          }  // container explicit-null-cos
    
          container helpers {
            description
              "Port forwarding configuration";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Trace options for helper";
              uses apply-advanced;
    
              leaf no-remote-trace {
                junos:must "("system tracing")";
                junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
                type empty;
                description
                  "Disable remote tracing";
              }
    
              container file {
                description
                  "Trace file information";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "3";
                  description
                    "Maximum number of trace files";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
    
                leaf match {
                  type jt:regular-expression;
                  description
                    "Regular expression for lines to be logged";
                }
              }  // container file
    
              leaf level {
                type enumeration {
                  enum "error" {
                    value 0;
                    description
                      "Match error conditions";
                  }
                  enum "warning" {
                    value 1;
                    description
                      "Match warning messages";
                  }
                  enum "notice" {
                    value 2;
                    description
                      "Match conditions that should be handled specially";
                  }
                  enum "info" {
                    value 3;
                    description
                      "Match informational messages";
                  }
                  enum "verbose" {
                    value 4;
                    description
                      "Match verbose messages";
                  }
                  enum "all" {
                    value 5;
                    description
                      "Match all levels";
                  }
                }
                default "error";
                description
                  "Level of debugging output";
              }
    
              list flag {
                key "name";
                ordered-by user;
                description
                  "Area of UDP forwarding helper process on which to enable debugging output";
                leaf name {
                  type enumeration {
                    enum "trace" {
                      value 0;
                      description
                        "Trace tracing code";
                    }
                    enum "address" {
                      value 1;
                      description
                        "Trace address management code";
                    }
                    enum "main" {
                      value 2;
                      description
                        "Trace main loop code";
                    }
                    enum "config" {
                      value 3;
                      description
                        "Trace configuration code";
                    }
                    enum "ifdb" {
                      value 4;
                      description
                        "Trace interface database code";
                    }
                    enum "io" {
                      value 5;
                      description
                        "Trace I/O code";
                    }
                    enum "rtsock" {
                      value 6;
                      description
                        "Trace routing socket code";
                    }
                    enum "ui" {
                      value 7;
                      description
                        "Trace user interface code";
                    }
                    enum "util" {
                      value 8;
                      description
                        "Trace miscellaneous utility code";
                    }
                    enum "gencfg" {
                      value 9;
                      description
                        "Trace fud gencfg message";
                    }
                    enum "domain" {
                      value 10;
                      description
                        "Trace DNS service-specific code";
                    }
                    enum "tftp" {
                      value 11;
                      description
                        "Trace TFTP service-specific code";
                    }
                    enum "bootp" {
                      value 12;
                      description
                        "Trace BOOTP/DHCP service-specific code";
                    }
                    enum "port" {
                      value 13;
                      description
                        "Trace arbitrary protocol code";
                    }
                    enum "if-rtsdb" {
                      value 14;
                      description
                        "Trace interface hierarchy rtsdb";
                    }
                    enum "all" {
                      value 15;
                      description
                        "Trace all areas of code";
                    }
                  }
                }
              }  // list flag
            }  // container traceoptions
    
            container rtsdb-client-traceoptions {
              presence
                "enable rtsdb-client-traceoptions";
              status deprecated;
              description
                "SHM rtsock database client library trace options";
              uses apply-advanced;
    
              container if-rtsdb {
                presence "enable if-rtsdb";
                description
                  "Trace interface hierarchy rtsdb";
                uses apply-advanced;
    
                list flag {
                  key "name";
                  ordered-by user;
                  description
                    "Tracing parameters";
                  leaf name {
                    type enumeration {
                      enum "init" {
                        value 0;
                        description
                          "Trace initialization";
                      }
                      enum "routing-socket" {
                        value 1;
                        description
                          "Trace routing socket messages";
                      }
                      enum "map" {
                        value 2;
                        description
                          "Trace shared memory mapping";
                      }
                      enum "all" {
                        value 3;
                        description "Trace all";
                      }
                    }
                  }
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this trace flag";
                  }
                }  // list flag
              }  // container if-rtsdb
            }  // container rtsdb-client-traceoptions
    
            container domain {
              description
                "Incoming DNS request forwarding configuration";
              uses apply-advanced;
    
              leaf description {
                type string;
                description
                  "Text description of server";
              }
    
              container server {
                description "Server information";
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Name or address of server to which to forward";
                }
    
                choice instance {
                  container logical-system {
                    description
                      "Logical system of server to which to forward";
                    leaf logical-system-name {
                      junos:must "("logical-systems $$")";
                      junos:must-message "referenced logical system must be defined";
                      type string {
                        junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                        junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                      }
                      description
                        "Name of logical system";
                    }
    
                    leaf routing-instance {
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // container logical-system
                  leaf routing-instance {
                    junos:must "("routing-instances $$")";
                    junos:must-message "referenced routing instance must be defined";
                    type union {
                      type string {
                        pattern "default";
                      }
                      type string {
                        junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                        junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                      }
                    }
                    description
                      "Routing instance of server to which to forward";
                  }
                }  // choice instance
              }  // container server
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Incoming DNS request forwarding interface configuration";
                leaf name {
                  type union {
                    type jt:interface-wildcard;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Name of interface or group of interfaces";
                }
    
                uses apply-advanced;
    
                leaf no-listen {
                  type empty;
                  description
                    "Do not listen on this interface";
                }
    
                leaf broadcast {
                  type empty;
                  description
                    "If the layer 2 interface is unknown then broadcast";
                }
    
                leaf description {
                  type string;
                  description
                    "Text description of server";
                }
    
                container server {
                  description
                    "Server information";
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Name or address of server to which to forward";
                  }
    
                  choice instance {
                    container logical-system {
                      description
                        "Logical system of server to which to forward";
                      leaf logical-system-name {
                        junos:must "("logical-systems $$")";
                        junos:must-message "referenced logical system must be defined";
                        type string {
                          junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                          junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                        }
                        description
                          "Name of logical system";
                      }
    
                      leaf routing-instance {
                        type union {
                          type string {
                            pattern "default";
                          }
                          type string {
                            junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                            junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                          }
                        }
                        description
                          "Routing instance of server to which to forward";
                      }
                    }  // container logical-system
                    leaf routing-instance {
                      junos:must "("routing-instances $$")";
                      junos:must-message "referenced routing instance must be defined";
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // choice instance
                }  // container server
              }  // list interface
            }  // container domain
    
            container tftp {
              description
                "Incoming TFTP request forwarding configuration";
              uses apply-advanced;
    
              leaf description {
                type string;
                description
                  "Text description of server";
              }
    
              container server {
                description "Server information";
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Name or address of server to which to forward";
                }
    
                choice instance {
                  container logical-system {
                    description
                      "Logical system of server to which to forward";
                    leaf logical-system-name {
                      junos:must "("logical-systems $$")";
                      junos:must-message "referenced logical system must be defined";
                      type string {
                        junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                        junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                      }
                      description
                        "Name of logical system";
                    }
    
                    leaf routing-instance {
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // container logical-system
                  leaf routing-instance {
                    junos:must "("routing-instances $$")";
                    junos:must-message "referenced routing instance must be defined";
                    type union {
                      type string {
                        pattern "default";
                      }
                      type string {
                        junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                        junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                      }
                    }
                    description
                      "Routing instance of server to which to forward";
                  }
                }  // choice instance
              }  // container server
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Incoming TFTP request forwarding interface configuration";
                leaf name {
                  type union {
                    type jt:interface-wildcard;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Name of interface or group of interfaces";
                }
    
                uses apply-advanced;
    
                leaf no-listen {
                  type empty;
                  description
                    "Do not listen on this interface";
                }
    
                leaf broadcast {
                  type empty;
                  description
                    "If the layer 2 interface is unknown then broadcast";
                }
    
                leaf description {
                  type string;
                  description
                    "Text description of server";
                }
    
                container server {
                  description
                    "Server information";
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Name or address of server to which to forward";
                  }
    
                  choice instance {
                    container logical-system {
                      description
                        "Logical system of server to which to forward";
                      leaf logical-system-name {
                        junos:must "("logical-systems $$")";
                        junos:must-message "referenced logical system must be defined";
                        type string {
                          junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                          junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                        }
                        description
                          "Name of logical system";
                      }
    
                      leaf routing-instance {
                        type union {
                          type string {
                            pattern "default";
                          }
                          type string {
                            junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                            junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                          }
                        }
                        description
                          "Routing instance of server to which to forward";
                      }
                    }  // container logical-system
                    leaf routing-instance {
                      junos:must "("routing-instances $$")";
                      junos:must-message "referenced routing instance must be defined";
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // choice instance
                }  // container server
              }  // list interface
            }  // container tftp
    
            container bootp {
              junos:must "(!("system autoinstallation"))";
              junos:must-message "incompatible with 'system autoinstallation'";
              description
                "Incoming BOOTP/DHCP request forwarding configuration";
              uses apply-advanced;
    
              leaf relay-agent-option {
                type empty;
                description
                  "Use DHCP Relay Agent option in relayed BOOTP/DHCP messages";
              }
    
              leaf description {
                type string;
                description
                  "Text description of servers";
              }
    
              list server {
                key "name";
                ordered-by user;
                description "Server information";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Name or address of servers to which to forward";
                }
    
                uses apply-advanced;
    
                list logical-system {
                  key "name";
                  ordered-by user;
                  description
                    "Logical system of server to which to forward";
                  leaf name {
                    junos:must "("logical-systems $$")";
                    junos:must-message "referenced logical system must be defined";
                    type string {
                      junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                      junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                    }
                    description
                      "Name of logical system";
                  }
    
                  leaf-list routing-instance {
                    type string;
                    ordered-by user;
                    description
                      "Routing instance of server to which to forward";
                  }
                }  // list logical-system
    
                leaf-list routing-instance {
                  type string;
                  ordered-by user;
                  description
                    "Routing instance of server to which to forward";
                }
              }  // list server
    
              leaf maximum-hop-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                default "4";
                description
                  "Maximum number of hops per packet";
              }
    
              leaf minimum-wait-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 30000";
                  }
                }
                default "0";
                description
                  "Minimum number of seconds before requests are forwarded";
              }
    
              leaf client-response-ttl {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "IP time-to-live value to set in responses to client";
              }
    
              leaf vpn {
                type empty;
                description
                  "Enable vpn encryption ";
              }
    
              leaf apply-secondary-as-giaddr {
                type empty;
                description
                  "Enable DHCP relay to use secondary gateway ip on all interfaces";
              }
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Incoming BOOTP/DHCP request forwarding interface configuration";
                leaf name {
                  type union {
                    type jt:interface-wildcard;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Name of interface or group of interfaces";
                }
    
                uses apply-advanced;
    
                leaf no-listen {
                  type empty;
                  description
                    "Do not listen on this interface";
                }
    
                leaf broadcast {
                  type empty;
                  description
                    "If the layer 2 interface is unknown then broadcast";
                }
    
                leaf description {
                  type string;
                  description
                    "Text description of servers";
                }
    
                list server {
                  key "name";
                  ordered-by user;
                  description
                    "Server information";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "Name or address of servers to which to forward";
                  }
    
                  uses apply-advanced;
    
                  list logical-system {
                    key "name";
                    ordered-by user;
                    description
                      "Logical system of server to which to forward";
                    leaf name {
                      junos:must "("logical-systems $$")";
                      junos:must-message "referenced logical system must be defined";
                      type string {
                        junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                        junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                      }
                      description
                        "Name of logical system";
                    }
    
                    leaf-list routing-instance {
                      type string;
                      ordered-by user;
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // list logical-system
    
                  leaf-list routing-instance {
                    type string;
                    ordered-by user;
                    description
                      "Routing instance of server to which to forward";
                  }
                }  // list server
    
                leaf maximum-hop-count {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16";
                    }
                  }
                  default "4";
                  description
                    "Maximum number of hops per packet";
                }
    
                leaf minimum-wait-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 30000";
                    }
                  }
                  default "0";
                  description
                    "Minimum number of seconds before requests are forwarded";
                }
    
                leaf client-response-ttl {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "IP time-to-live value to set in responses to client";
                }
    
                leaf vpn {
                  type empty;
                  description
                    "Enable vpn encryption ";
                }
    
                leaf apply-secondary-as-giaddr {
                  type empty;
                  description
                    "Enable DHCP relay to use secondary gateway ip on this interface";
                }
              }  // list interface
            }  // container bootp
    
            list port {
              key "name";
              ordered-by user;
              description
                "Incoming arbitrary protocol request forwarding configuration";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Port number of the protocol to listen";
              }
    
              uses apply-advanced;
    
              leaf description {
                type string;
                description
                  "Text description of server";
              }
    
              list server {
                key "name";
                ordered-by user;
                description "Server information";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Name or address of server to which to forward";
                }
    
                uses apply-advanced;
    
                choice instance {
                  container logical-system {
                    description
                      "Logical system of server to which to forward";
                    leaf logical-system-name {
                      junos:must "("logical-systems $$")";
                      junos:must-message "referenced logical system must be defined";
                      type string {
                        junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                        junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                      }
                      description
                        "Name of logical system";
                    }
    
                    leaf routing-instance {
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // container logical-system
                  leaf routing-instance {
                    junos:must "("routing-instances $$")";
                    junos:must-message "referenced routing instance must be defined";
                    type union {
                      type string {
                        pattern "default";
                      }
                      type string {
                        junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                        junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                      }
                    }
                    description
                      "Routing instance of server to which to forward";
                  }
                }  // choice instance
              }  // list server
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Incoming request forwarding interface configuration";
                leaf name {
                  type union {
                    type jt:interface-wildcard;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Name of interface or group of interfaces";
                }
    
                uses apply-advanced;
    
                leaf no-listen {
                  type empty;
                  description
                    "Do not listen on this interface";
                }
    
                leaf broadcast {
                  type empty;
                  description
                    "If the layer 2 interface is unknown then broadcast";
                }
    
                leaf description {
                  type string;
                  description
                    "Text description of server";
                }
    
                list server {
                  key "name";
                  ordered-by user;
                  description
                    "Server information";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "Name or address of server to which to forward";
                  }
    
                  uses apply-advanced;
    
                  choice instance {
                    container logical-system {
                      description
                        "Logical system of server to which to forward";
                      leaf logical-system-name {
                        junos:must "("logical-systems $$")";
                        junos:must-message "referenced logical system must be defined";
                        type string {
                          junos:posix-pattern "^[a-zA-Z0-9_-]{1,63}$";
                          junos:pattern-message "Logical-system name is a string consisting of up to 63 letters, numbers, dashes and underscores";
                        }
                        description
                          "Name of logical system";
                      }
    
                      leaf routing-instance {
                        type union {
                          type string {
                            pattern "default";
                          }
                          type string {
                            junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                            junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                          }
                        }
                        description
                          "Routing instance of server to which to forward";
                      }
                    }  // container logical-system
                    leaf routing-instance {
                      junos:must "("routing-instances $$")";
                      junos:must-message "referenced routing instance must be defined";
                      type union {
                        type string {
                          pattern "default";
                        }
                        type string {
                          junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                          junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                        }
                      }
                      description
                        "Routing instance of server to which to forward";
                    }
                  }  // choice instance
                }  // list server
              }  // list interface
            }  // list port
          }  // container helpers
    
          container family {
            description "Protocol family";
            container inet {
              description "IPv4 parameters";
              uses apply-advanced;
    
              container filter {
                description
                  "Filtering for forwarding table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for forwarded packets";
                }
    
                leaf output {
                  type string;
                  description
                    "Name of output filter to apply for forwarded packets";
                }
              }  // container filter
    
              leaf route-accounting {
                type empty;
                description
                  "Enable IPv4 route accounting";
              }
            }  // container inet
    
            container inet6 {
              description "IPv6 parameters";
              uses apply-advanced;
    
              container filter {
                description
                  "Filtering for forwarding table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for forwarded packets";
                }
    
                leaf output {
                  type string;
                  description
                    "Name of output filter to apply for forwarded packets";
                }
              }  // container filter
    
              leaf route-accounting {
                type empty;
                description
                  "Enable IPv6 route accounting";
              }
    
              leaf source-checking {
                type empty;
                description
                  "Discard IPv6 packet when source address type is unspecified, loopback, multicast or link-local ";
              }
            }  // container inet6
    
            container mpls {
              description "MPLS parameters";
              uses apply-advanced;
    
              container filter {
                description
                  "Filtering for forwarding table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for forwarded packets";
                }
    
                leaf output {
                  type string;
                  description
                    "Name of output filter to apply for forwarded packets";
                }
              }  // container filter
            }  // container mpls
    
            container vpls {
              description "VPLS parameters";
              uses apply-advanced;
    
              container filter {
                description
                  "Filtering for VPLS DMAC forwarding table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for forwarded packets";
                }
              }  // container filter
    
              container flood {
                description
                  "Filtering for VPLS flood table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for VPLS flood packets";
                }
              }  // container flood
            }  // container vpls
    
            container evpn {
              description "EVPN parameters";
              uses apply-advanced;
    
              container filter {
                description
                  "Filtering for EVPN DMAC forwarding table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for forwarded packets";
                }
              }  // container filter
    
              container flood {
                description
                  "Filtering for EVPN flood table";
                uses apply-advanced;
    
                leaf input {
                  type string;
                  description
                    "Name of input filter to apply for EVPN flood packets";
                }
              }  // container flood
            }  // container evpn
          }  // container family
    
          list next-hop-group {
            key "name";
            description
              "Next hop group forwarding option";
            uses juniper-next-hop-group-options;
          }  // list next-hop-group
    
          container dhcp-relay {
            junos:must "(!("system services dhcp"))";
            junos:must-message "Incompatible with 'set system services dhcp'";
            junos:must "(!(".. .. instance-type virtual-switch"))";
            junos:must-message "forwarding-options dhcp-relay incompatible with routing-instances instance-type virtual-switch'";
            description
              "Dynamic Host Configuration Protocol relay configuration";
            uses jdhcp-relay-type;
          }  // container dhcp-relay
    
          choice load-balance-label-capability-choice {
            leaf load-balance-label-capability {
              type empty;
              description
                "Load balance label capability";
            }
            leaf no-load-balance-label-capability {
              type empty;
              description
                "Don't load balance label capability";
            }
          }  // choice load-balance-label-capability-choice
    
          leaf fast-reroute-priority {
            junos:must "(".. .. instance-type vpls")";
            junos:must-message "'fast-reroute-priority' configuration can only be used for 'instance-type vpls'";
            type enumeration {
              enum "low" {
                value 0;
                description
                  "Set priority to low";
              }
              enum "medium" {
                value 1;
                description
                  "Set priority to medium";
              }
              enum "high" {
                value 2;
                description
                  "Set priority to high";
              }
            }
            description
              "Fast-reroute repair priority";
          }
    
          list ip-options-protocol-queue {
            key "name";
            ordered-by user;
            description
              "IP Options protocol logical queue parameters";
            leaf name {
              type string;
              description "Protocol name";
            }
    
            uses apply-advanced;
    
            leaf protocol-id {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 254";
                }
              }
              description "Protocol Identifier";
            }
    
            leaf queue-depth {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 807";
                }
              }
              description
                "Size of the protocol logical options queue";
            }
          }  // list ip-options-protocol-queue
    
          leaf link-layer-broadcast-inet-check {
            type empty;
            description
              "Enable destination mac and destination ip address check";
          }
    
          choice hyper-mode-choice {
            leaf hyper-mode {
              type empty;
              description "Enable hyper mode";
            }
            leaf no-hyper-mode {
              type empty;
              description
                "Don't enable hyper mode";
            }
          }  // choice hyper-mode-choice
    
          container access-security {
            description
              "Access security configuration";
            uses jdhcp-access-security-type;
          }  // container access-security
    
          list forwarding-sandbox {
            key "name";
            max-elements 8;
            description
              "Create forwarding sandbox";
            uses juniper-forwarding-sandbox-options;
          }  // list forwarding-sandbox
    
          container vxlan-routing {
            description
              "VXLAN Routing forwarding options";
            uses apply-advanced;
    
            leaf next-hop {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Next-hop. Must be multiple of 4096. This will restart PFE";
            }
    
            leaf interface-num {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Interface. Must be multiple of 2048. This will restart PFE";
            }
    
            leaf overlay-ecmp {
              type empty;
              description
                "Enable overlay ecmp for vxlan L3. This will restart PFE";
            }
    
            leaf loopback-port {
              junos:must "(all "interfaces $$ unit <*> family ethernet-switching interface-mode trunk")";
              junos:must-message "Interface-mode trunk needs to be enabled for loopback AE";
              junos:must "("chassis aggregated-devices ethernet device-count")";
              junos:must-message "Ethernet device-count needs to be configured for loopback AE";
              junos:must "("interfaces $$ aggregated-ether-options loopback")";
              junos:must-message "Loopback needs to be enabled on the AE interface";
              type string;
              description
                "AE loopback interface used for VXLAN routing. This will restart PFE";
            }
          }  // container vxlan-routing
    
          container satellite {
            description
              "Satellite forwarding options";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Global tracing options for satellite control plane";
              uses apply-advanced;
    
              leaf no-remote-trace {
                junos:must "("system tracing")";
                junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
                type empty;
                description
                  "Disable remote tracing";
              }
    
              container file {
                description
                  "Trace file information";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "3";
                  description
                    "Maximum number of trace files";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
    
                leaf match {
                  type jt:regular-expression;
                  description
                    "Regular expression for lines to be logged";
                }
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "all" {
                      value 0;
                      description
                        "Trace everything";
                    }
                    enum "bd" {
                      value 1;
                      description
                        "Trace BD events";
                    }
                    enum "config-internal" {
                      value 2;
                      description
                        "Trace configuration internals";
                    }
                    enum "interface" {
                      value 3;
                      description
                        "Trace interface events";
                    }
                    enum "interface-vlan" {
                      value 4;
                      description
                        "Trace IFBD events";
                    }
                    enum "ipc" {
                      value 5;
                      description
                        "Trace internal IPC messages";
                    }
                    enum "kernel" {
                      value 6;
                      description
                        "Trace Kernel messages";
                    }
                    enum "krt" {
                      value 7;
                      description
                        "Trace communication over routing socket";
                    }
                    enum "mac" {
                      value 8;
                      description
                        "Trace MAC events ";
                    }
                    enum "nh" {
                      value 9;
                      description
                        "Trace NH events";
                    }
                    enum "normal" {
                      value 10;
                      description
                        "Trace normal events";
                    }
                    enum "parse" {
                      value 11;
                      description
                        "Trace configuration parsing";
                    }
                    enum "stp" {
                      value 12;
                      description
                        "Trace STP events";
                    }
                    enum "task" {
                      value 13;
                      description
                        "Trace task processing";
                    }
                    enum "timer" {
                      value 14;
                      description
                        "Trace task timer processing";
                    }
                    enum "firewall" {
                      value 15;
                      description
                        "Trace firewall processing";
                    }
                    enum "l3" {
                      value 16;
                      description
                        "Trace Layer-3 processing";
                    }
                    enum "fip-snooping" {
                      value 17;
                      description
                        "Trace FIP-Snooping processing";
                    }
                  }
                }
              }  // list flag
            }  // container traceoptions
    
            leaf local-replication {
              type empty;
              description
                "Enable satellite multicast replication";
            }
    
            list fpc {
              key "name";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "65 .. 254";
                  }
                }
                description
                  "Satellite slot identifier";
              }
    
              uses apply-advanced;
    
              choice local-switching-mode-choice {
                container local-switching {
                  presence
                    "enable local-switching";
                  description
                    "Enable local-switching on Satellite device";
                  uses apply-advanced;
    
                  leaf l3 {
                    type empty;
                    description
                      "Enable L3 local switching on the Satellite device";
                  }
                }  // container local-switching
                container selective-vlan-switching {
                  description
                    "Enable selective-vlan-switching on Satellite device";
                  uses apply-advanced;
    
                  leaf routing-instance {
                    type string {
                      junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                      junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                    }
                    description
                      "Associated Routing instance name";
                  }
                }  // container selective-vlan-switching
              }  // choice local-switching-mode-choice
            }  // list fpc
    
            container vlan-auto-sense {
              description
                "Vlan-auto-sense attributes provisioning";
              uses apply-advanced;
    
              leaf expiry-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 3600";
                  }
                }
                units "seconds";
                default "600";
                description
                  "Expiry time (in seconds) after last MAC aged out";
              }
            }  // container vlan-auto-sense
    
            container analyzer-vlan {
              description
                "Output VLAN for Analyzer";
              uses apply-advanced;
    
              leaf vlan-name {
                type string;
                description
                  "Name of the analyzer VLAN";
              }
            }  // container analyzer-vlan
    
            choice disable-heartbeat-choice {
              leaf disable-heartbeat {
                type empty;
                description
                  "Disable heartbeat between Aggregation and Satellite";
              }
              leaf no-disable-heartbeat {
                type empty;
                description
                  "Don't disable heartbeat between Aggregation and Satellite";
              }
            }  // choice disable-heartbeat-choice
          }  // container satellite
        }  // grouping juniper-forwarding-options
    
        grouping jdhcp-access-security-type {
          description
            "Access security configuration";
          uses apply-advanced;
    
          container slaac-snooping {
            description
              "Stateless address auto configuration options";
            uses slaacd-config-type;
          }  // container slaac-snooping
    
          container router-advertisement-guard {
            presence
              "enable router-advertisement-guard";
            description
              "Router Advertisement Guard Configuration";
            uses apply-advanced;
    
            list policy {
              key "name";
              ordered-by user;
              description
                "Router Advertisement Guard policy";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description
                  "Router Advertisement Guard policy name";
              }
    
              uses apply-advanced;
    
              container discard {
                description "Discard parameters";
                uses apply-advanced;
    
                leaf source-ip-address-list {
                  type string;
                  description
                    "IPv6 Source address list name";
                }
    
                leaf source-mac-address-list {
                  type string;
                  description
                    "Source mac address list name";
                }
    
                leaf prefix-list-name {
                  type string;
                  description "Prefix-list Name";
                }
              }  // container discard
    
              container accept {
                description "Accept parameters";
                uses apply-advanced;
    
                container match-list {
                  description
                    "List of parameters to check";
                  uses apply-advanced;
    
                  leaf source-ip-address-list {
                    type string;
                    description
                      "IPv6 Source address list name";
                  }
    
                  leaf source-mac-address-list {
                    type string;
                    description
                      "Source mac address list name";
                  }
    
                  leaf prefix-list-name {
                    type string;
                    description
                      "Prefix-list Name";
                  }
    
                  leaf match-criteria {
                    type enumeration {
                      enum "match-all" {
                        value 0;
                        description
                          "A match from every list";
                      }
                      enum "match-any" {
                        value 1;
                        description
                          "A match from any list";
                      }
                    }
                    description "Match Criteria";
                  }
                }  // container match-list
    
                container match-options {
                  presence
                    "enable match-options";
                  description
                    "List of Options to check";
                  uses apply-advanced;
    
                  container hop-limit {
                    description "Hop limit";
                    uses apply-advanced;
    
                    leaf maximum {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255";
                        }
                      }
                      description
                        "Maximum hop limit";
                    }
    
                    leaf minimum {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255";
                        }
                      }
                      description
                        "Minimum hop limit";
                    }
                  }  // container hop-limit
    
                  container route-preference {
                    description
                      "Accept route preference";
                    uses apply-advanced;
    
                    leaf maximum {
                      type enumeration {
                        enum "low" {
                          value 0;
                          description
                            "Route preference low";
                        }
                        enum "medium" {
                          value 1;
                          description
                            "Route preference medium";
                        }
                        enum "high" {
                          value 2;
                          description
                            "Route preference high";
                        }
                      }
                      description
                        "Maximum route preference";
                    }
                  }  // container route-preference
    
                  leaf managed-config-flag {
                    type empty;
                    description
                      "Check Managed config flag";
                  }
    
                  leaf other-config-flag {
                    type empty;
                    description
                      "Check Other config flag";
                  }
                }  // container match-options
              }  // container accept
            }  // list policy
    
            container interface {
              description
                "RA Guard config on Interface";
              uses apply-advanced;
    
              list intf-config {
                key "name";
                description
                  "Interface Configuration";
                uses interface-policy;
              }  // list intf-config
            }  // container interface
    
            container vlans {
              description
                "RA Guard config on Vlan";
              uses apply-advanced;
    
              list vlan-config {
                key "name";
                description
                  "Virtual LAN Configuration";
                uses vlan-policy;
              }  // list vlan-config
            }  // container vlans
          }  // container router-advertisement-guard
        }  // grouping jdhcp-access-security-type
    
        grouping interface-policy {
          description "Interface Name";
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Interface Name";
          }
    
          uses apply-advanced;
    
          container policy {
            description "Attach policy";
            uses apply-advanced;
    
            leaf policy-name {
              type string;
              description
                "Router Advertisement Guard policy name";
            }
    
            choice policy-type {
              leaf stateful {
                type empty;
                description
                  "Stateful router advertisement guard";
              }
              leaf stateless {
                type empty;
                description
                  "Stateless router advertisement guard";
              }
            }  // choice policy-type
          }  // container policy
    
          container mark-interface {
            description "Mark interface";
            uses apply-advanced;
    
            choice mark-intf-type {
              leaf trusted {
                junos:must "(!(".. .. policy"))";
                junos:must-message "Trusted interfaces cannot have policy attached";
                type empty;
                description
                  "Mark interface trusted";
              }
              leaf block {
                junos:must "(!(".. .. policy"))";
                junos:must-message "Blocked interfaces cannot have policy attached";
                type empty;
                description
                  "Block router-advertisement";
              }
            }  // choice mark-intf-type
          }  // container mark-interface
        }  // grouping interface-policy
    
        grouping juniper-forwarding-sandbox-options {
          leaf name {
            junos:must "(".. port")";
            junos:must-message "At least one port is required for port configuration";
            type string;
            description "Sandbox name";
          }
    
          uses apply-advanced;
    
          leaf size {
            type enumeration {
              enum "small" {
                value 0;
                description "Sandbox size small";
              }
              enum "medium" {
                value 1;
                description
                  "Sandbox size medium";
              }
              enum "large" {
                value 2;
                description "Sandbox size large";
              }
            }
            default "small";
            description "Size of the sandbox";
          }
    
          list port {
            key "name";
            max-elements 64;
            description "Sandbox port";
            uses juniper-forwarding-sandbox-port-options;
          }  // list port
        }  // grouping juniper-forwarding-sandbox-options
    
        grouping juniper-forwarding-sandbox-port-options {
          leaf name {
            junos:must "(".. interface")";
            junos:must-message "At least one interface is required for port configuration";
            type string;
            description "Port name";
          }
    
          uses apply-advanced;
    
          list interface {
            key "name";
            max-elements 1;
            ordered-by user;
            description
              "Interface to which the port is mapped";
            leaf name {
              junos:must "(!("interfaces $$ unit"))";
              junos:must-message "Interface must not have configuration defined for adding to a forwarding sandbox";
              type union {
                type jt:interface-device;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
          }  // list interface
        }  // grouping juniper-forwarding-sandbox-port-options
    
        grouping juniper-igmp-snooping-options {
          uses apply-advanced;
    
          leaf use-p2mp-lsp {
            junos:must "(".. .. instance-type vpls")";
            junos:must-message "use-p2mp-lsp supported only on instance type vpls";
            type empty;
            description
              "P2MP will be used to forward traffic instead of PW";
          }
    
          container snoop-pseudowires {
            junos:must "(".. .. instance-type vpls")";
            junos:must-message "snoop-pseudowires supported only on instance type vpls";
            junos:must "(!(" .. use-p2mp-lsp"))";
            junos:must-message "snoop-pseudowires and use-p2mp-lsp cannot be configured together";
            presence "enable snoop-pseudowires";
            description
              "VPLS PE would send traffic selectively to PE's having interest";
            uses apply-advanced;
          }  // container snoop-pseudowires
        }  // grouping juniper-igmp-snooping-options
    
        grouping juniper-mld-snooping-options {
          uses apply-advanced;
    
          leaf use-p2mp-lsp {
            junos:must "(".. .. instance-type vpls")";
            junos:must-message "use-p2mp-lsp supported only on instance type vpls";
            type empty;
            description
              "P2MP will be used to forward traffic instead of PW";
          }
    
          container snoop-pseudowires {
            junos:must "(".. .. instance-type vpls")";
            junos:must-message "snoop-pseudowires supported only on instance type vpls";
            junos:must "(!(" .. use-p2mp-lsp"))";
            junos:must-message "snoop-pseudowires and use-p2mp-lsp cannot be configured together";
            presence "enable snoop-pseudowires";
            description
              "VPLS PE would send traffic selectively to PE's having interest";
            uses apply-advanced;
          }  // container snoop-pseudowires
        }  // grouping juniper-mld-snooping-options
    
        grouping juniper-monitoring-options {
          leaf name {
            type string;
            description
              "Name for monitoring group";
          }
    
          uses apply-advanced;
    
          container family {
            description
              "Address family of packets to monitor";
            container inet {
              presence "enable inet";
              description "Monitor IPv4 packets";
              uses apply-advanced;
    
              container input {
                presence "enable input";
                status deprecated;
                description
                  "Monitor data acquisition";
                uses monitoring_input_type;
              }  // container input
    
              container output {
                presence "enable output";
                description
                  "Monitoring data disposition";
                uses monitoring_output_type;
              }  // container output
            }  // container inet
          }  // container family
        }  // grouping juniper-monitoring-options
    
        grouping juniper-multicast-snooping-options {
          uses apply-advanced;
    
          container options {
            description "Miscellaneous options";
            uses apply-advanced;
    
            container syslog {
              description
                "Set system logging level";
              uses apply-advanced;
    
              container level {
                description "Logging level";
                leaf emergency {
                  type empty;
                  description "Emergency level";
                }
    
                leaf alert {
                  type empty;
                  description "Alert level";
                }
    
                leaf critical {
                  type empty;
                  description "Critical level";
                }
    
                leaf error {
                  type empty;
                  description "Error level";
                }
    
                leaf warning {
                  type empty;
                  description "Warning level";
                }
    
                leaf notice {
                  type empty;
                  description "Notice level";
                }
    
                leaf info {
                  type empty;
                  description
                    "Informational level";
                }
    
                leaf debug {
                  type empty;
                  description "Debugging level";
                }
              }  // container level
    
              leaf upto {
                type enumeration {
                  enum "emergency" {
                    value 0;
                    description
                      "Emergency level";
                  }
                  enum "alert" {
                    value 1;
                    description "Alert level";
                  }
                  enum "critical" {
                    value 2;
                    description "Critical level";
                  }
                  enum "error" {
                    value 3;
                    description "Error level";
                  }
                  enum "warning" {
                    value 4;
                    description "Warning level";
                  }
                  enum "notice" {
                    value 5;
                    description "Notice level";
                  }
                  enum "info" {
                    value 6;
                    description
                      "Informational level";
                  }
                  enum "debug" {
                    value 7;
                    description
                      "Debugging level";
                  }
                }
                description
                  "Log up to a particular logging level";
              }
    
              leaf mark {
                type union {
                  type int32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "seconds";
                description
                  "Periodically mark the trace file";
              }
            }  // container syslog
          }  // container options
    
          container traceoptions {
            description
              "Multicast snooping trace options";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "parse" {
                    value 0;
                    description
                      "Trace configuration parsing";
                  }
                  enum "config-internal" {
                    value 1;
                    description
                      "Trace configuration internals";
                  }
                  enum "route" {
                    value 2;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 3;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 4;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 5;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 6;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 7;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 8;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 9;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container forwarding-cache {
            description
              "Multicast forwarding cache";
            uses apply-advanced;
    
            container threshold {
              description "Threshold";
              uses apply-advanced;
    
              leaf suppress {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 200000";
                  }
                }
                description "Suppress threshold";
              }
    
              leaf reuse {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 200000";
                  }
                }
                description "Reuse threshold";
              }
            }  // container threshold
          }  // container forwarding-cache
    
          leaf-list flood-groups {
            type jt:ipaddr;
            ordered-by user;
            description
              "Groups for which the traffic will be flooded";
          }
    
          container host-outbound-traffic {
            description
              "Host generated protocol packets";
            uses apply-advanced;
    
            leaf forwarding-class {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be string of 64 characters or less";
              }
              description
                "Forwarding class name";
            }
    
            leaf dot1p {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 7";
                }
              }
              description "Dot1p bits";
            }
          }  // container host-outbound-traffic
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 300";
                }
              }
              units "seconds";
              default "180";
              description
                "Maximum time for graceful restart to finish";
            }
          }  // container graceful-restart
    
          leaf ignore-stp-topology-change {
            type empty;
            description
              "Don't process stp topology change";
          }
    
          container multichassis-lag-replicate-state {
            presence
              "enable multichassis-lag-replicate-state";
            description
              "Enable multichassis lag replication";
            uses apply-advanced;
    
            leaf suppress-report {
              type empty;
              description
                "Enable mclag report suppression";
            }
          }  // container multichassis-lag-replicate-state
    
          container oism {
            description
              "Optimized inter subnet multicast options";
            uses apply-advanced;
    
            leaf install-star-g-routes {
              type empty;
              description
                "Install (*,G) multicast routes in data plane";
            }
          }  // container oism
    
          leaf nexthop-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1000";
              }
            }
            units "milliseconds";
            description
              "Nexthop hold time in milliseconds";
          }
        }  // grouping juniper-multicast-snooping-options
    
        grouping juniper-next-hop-group-options {
          leaf name {
            type string;
            description "Next hop group name";
          }
    
          uses apply-advanced;
    
          leaf group-type {
            type enumeration {
              enum "inet" {
                value 0;
                description
                  "Group of family inet next-hops";
              }
              enum "layer-2" {
                value 1;
                description
                  "Layer-2 next-hop group";
              }
              enum "inet6" {
                value 2;
                description
                  "Group of family inet6 next-hops";
              }
            }
            default "inet";
            description "Next hop group type";
          }
    
          list interface {
            key "name";
            description
              "Interfaces through which to send sampled traffic";
            uses next_hop_group_intf_type;
          }  // list interface
    
          list next-hop-subgroup {
            key "name";
            description
              "Group of interfaces through which to send sampled traffic";
            uses juniper-next-hop-subgroup-options;
          }  // list next-hop-subgroup
        }  // grouping juniper-next-hop-group-options
    
        grouping juniper-next-hop-subgroup-options {
          leaf name {
            junos:must "(".. interface")";
            junos:must-message "At least two interfaces are required for next-hop-subgroup configuration";
            type string;
            description
              "Next-hop sub-group name";
          }
    
          uses apply-advanced;
    
          list interface {
            key "name";
            max-elements 16;
            description
              "Interface through which to send the sampled traffic";
            uses next_hop_subgroup_intf_type;
          }  // list interface
        }  // grouping juniper-next-hop-subgroup-options
    
        grouping juniper-packet-accounting-options {
          leaf name {
            type string;
            description
              "Name for accounting group";
          }
    
          uses apply-advanced;
    
          container output {
            description
              "Accounting data disposition";
            uses packet_accounting_output_type;
          }  // container output
        }  // grouping juniper-packet-accounting-options
    
        grouping juniper-packet-capture-options {
          description "Packet capture options";
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable packet-capture";
            }
          }  // choice enable-disable
    
          container file {
            description
              "Parameters for file that contains captured packets";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %.]";
                junos:pattern-message "Must not contain '/', '%', '.' or a space";
                length "1 .. 900";
              }
              description "Name of file";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10000";
                }
              }
              default "10";
              description
                "Maximum number of files";
            }
    
            leaf size {
              type string;
              description "Maximum file size";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read packet-capture files";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read packet-capture files";
              }
            }  // choice world-readable-choice
          }  // container file
    
          leaf maximum-capture-size {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "68 .. 1520";
              }
            }
            units "bytes";
            default "68";
            description
              "Maximum packet size to capture";
          }
        }  // grouping juniper-packet-capture-options
    
        grouping juniper-port-mirror-options {
          uses apply-advanced;
    
          container traceoptions {
            description
              "Port-mirroring trace options";
            uses sampling_traceoptions_type;
          }  // container traceoptions
    
          leaf disable {
            type empty;
            description
              "Disable the global port-mirroring instance";
          }
    
          leaf disable-all-instances {
            type empty;
            description
              "Disable the all port-mirroring instances";
          }
    
          leaf mirror-once {
            type empty;
            description
              "Sample the packet for port mirroring only once";
          }
    
          leaf no-preserve-ingress-tag {
            type empty;
            description
              "Mirror the packet retaining tag value before normalization";
          }
    
          leaf remote-port-mirroring {
            type empty;
            description
              "Flag to specify about remote-port-mirroring";
          }
    
          container input {
            description
              "Settings for sampling of input packets";
            uses pm_family_input_type;
          }  // container input
    
          container family {
            description
              "Address family of packets to mirror";
            container inet {
              description "Mirror IPv4 packets";
              uses apply-advanced;
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "input parameters under family and outside family are mutually exclusive";
                status deprecated;
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
    
              container output {
                description
                  "One or more next hops for port-mirrored packets";
                uses inet_pm_family_output_type;
              }  // container output
            }  // container inet
    
            container inet6 {
              description "Mirror IPv6 packets";
              uses apply-advanced;
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "input parameters under family and outside family are mutually exclusive";
                status deprecated;
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
    
              container output {
                description
                  "One or more next hops for port-mirrored packets";
                uses inet6_pm_family_output_type;
              }  // container output
            }  // container inet6
    
            container mpls {
              description "Mirror MPLS packets";
              uses apply-advanced;
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "input parameters under family and outside family are mutually exclusive";
                status deprecated;
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
    
              container output {
                description
                  "One or more next hops for port-mirrored packets";
                uses mpls_pm_family_output_type;
              }  // container output
            }  // container mpls
    
            container any {
              description "Mirror any packets";
              uses apply-advanced;
    
              container output {
                description
                  "One or more next hops for port-mirrored packets";
                uses any_pm_family_output_type;
              }  // container output
            }  // container any
    
            container vpls {
              description
                "Mirror Layer-2 bridged/vpls packets";
              uses apply-advanced;
    
              container input {
                junos:must "(!(".. .. ..  input"))";
                junos:must-message "input parameters under family and outside family are mutually exclusive";
                status deprecated;
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
    
              container output {
                description
                  "Destination for port-mirrored packets";
                uses layer2_pm_family_output_type;
              }  // container output
            }  // container vpls
    
            container ethernet-switching {
              description
                "Mirror Layer-2 ethernet-switched packets";
              uses apply-advanced;
    
              container output {
                description
                  "Destination for port-mirrored packets";
                uses layer2_pm_family_output_type;
              }  // container output
            }  // container ethernet-switching
    
            container ccc {
              description
                "Mirror layer-2 ccc packets";
              uses apply-advanced;
    
              container input {
                junos:must "(!(".. .. ..  input"))";
                junos:must-message "input parameters under family and outside family are mutually exclusive";
                status deprecated;
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
    
              container output {
                description
                  "Destination for port-mirrored packets";
                uses layer2_pm_family_output_type;
              }  // container output
            }  // container ccc
          }  // container family
    
          list instance {
            key "name";
            ordered-by user;
            description
              "Instance of port-mirroring parameters";
            leaf name {
              type string {
                junos:posix-pattern "!^((__.*)|(.{65,}))$";
                junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                length "1 .. 63";
              }
              description
                "Name for port-mirroring instance";
            }
    
            uses apply-advanced;
    
            leaf disable {
              type empty;
              description
                "Disable the this port-mirroring instance";
            }
    
            choice input_params_or_instance {
              container input {
                description
                  "Settings for sampling of input packets";
                uses pm_family_input_type;
              }  // container input
              leaf input-parameters-instance {
                junos:must "("forwarding-options port-mirroring instance $$")";
                junos:must-message "Referenced port-mirroring instance does not exist";
                type string;
                description
                  "Name of port-mirroring instance to use for input parameters";
              }
            }  // choice input_params_or_instance
    
            container output {
              description
                "One or more next hops for port-mirrored packets";
              uses inet_pm_output_type;
            }  // container output
    
            container family {
              description
                "Address family of packets to mirror";
              container inet {
                description
                  "Mirror IPv4 packets";
                uses apply-advanced;
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "input parameters under family and outside family are mutually exclusive";
                  status deprecated;
                  description
                    "Settings for sampling of input packets";
                  uses pm_family_input_type;
                }  // container input
    
                container output {
                  description
                    "One or more next hops for port-mirrored packets";
                  uses inet_pm_family_output_type;
                }  // container output
              }  // container inet
    
              container inet6 {
                description
                  "Mirror IPv6 packets";
                uses apply-advanced;
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "input parameters under family and outside family are mutually exclusive";
                  status deprecated;
                  description
                    "Settings for sampling of input packets";
                  uses pm_family_input_type;
                }  // container input
    
                container output {
                  description
                    "One or more next hops for port-mirrored packets";
                  uses inet6_pm_family_output_type;
                }  // container output
              }  // container inet6
    
              container mpls {
                description
                  "Mirror MPLS packets";
                uses apply-advanced;
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "input parameters under family and outside family are mutually exclusive";
                  status deprecated;
                  description
                    "Settings for sampling of input packets";
                  uses pm_family_input_type;
                }  // container input
    
                container output {
                  description
                    "One or more next hops for port-mirrored packets";
                  uses mpls_pm_family_output_type;
                }  // container output
              }  // container mpls
    
              container any {
                description "Mirror any packets";
                uses apply-advanced;
    
                container output {
                  description
                    "One or more next hops for port-mirrored packets";
                  uses any_pm_family_output_type;
                }  // container output
              }  // container any
    
              container vpls {
                description
                  "Mirror Layer-2 bridged/vpls packets";
                uses apply-advanced;
    
                container input {
                  junos:must "(!(".. .. ..  input"))";
                  junos:must-message "input parameters under family and outside family are mutually exclusive";
                  status deprecated;
                  description
                    "Settings for sampling of input packets";
                  uses pm_family_input_type;
                }  // container input
    
                container output {
                  description
                    "Destination for port-mirrored packets";
                  uses layer2_pm_family_output_type;
                }  // container output
              }  // container vpls
    
              container ethernet-switching {
                description
                  "Mirror Layer-2 ethernet-switched packets";
                uses apply-advanced;
    
                container output {
                  description
                    "Destination for port-mirrored packets";
                  uses layer2_pm_family_output_type;
                }  // container output
              }  // container ethernet-switching
    
              container ccc {
                description
                  "Mirror layer-2 ccc packets";
                uses apply-advanced;
    
                container input {
                  junos:must "(!(".. .. ..  input"))";
                  junos:must-message "input parameters under family and outside family are mutually exclusive";
                  status deprecated;
                  description
                    "Settings for sampling of input packets";
                  uses pm_family_input_type;
                }  // container input
    
                container output {
                  description
                    "Destination for port-mirrored packets";
                  uses layer2_pm_family_output_type;
                }  // container output
              }  // container ccc
            }  // container family
          }  // list instance
        }  // grouping juniper-port-mirror-options
    
        grouping any_pm_family_output_type {
          uses apply-advanced;
    
          choice interface-or-next-hop-index {
            list interface {
              key "name";
              description
                "Interfaces through which to send sampled traffic";
              uses any_pm_intf_type;
            }  // list interface
            leaf next-hop-group {
              junos:must "(!(".. no-filter-check"))";
              junos:must-message "no-filter-check is not allowed with next-hop-group";
              junos:must "("forwarding-options next-hop-group $$ group-type layer-2")";
              junos:must-message "Referenced next-hop-group must be defined as layer-2 group";
              type string;
              description
                "Next-hop-group through which to send port-mirror traffic";
            }
          }  // choice interface-or-next-hop-index
    
          leaf no-filter-check {
            type empty;
            description
              "Do not check for filters on port-mirroring interface";
          }
    
          container hosted-service {
            description
              "Configure Hosted Service";
            uses apply-advanced;
    
            leaf server-profile {
              junos:must "("services hosted-services server-profile $$")";
              junos:must-message "Only server profiles configured under [services hosted-services server-profile] can be configured here";
              type string {
                length "3 .. 32";
              }
              description "Server profile name";
            }
          }  // container hosted-service
        }  // grouping any_pm_family_output_type
    
        grouping any_pm_intf_type {
          leaf name {
            junos:must "(!(("interfaces $$-IFL family inet" || "interfaces $$-IFL family inet6")))";
            junos:must-message "An interface configured as family inet/inet6 cannot be configured as output interface";
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface through which to send sampled traffic";
          }
    
          uses apply-advanced;
    
          list next-hop {
            key "name";
            ordered-by user;
            description
              "Address of next hop through which to send sampled traffic";
            uses inet_next_hop_type;
          }  // list next-hop
        }  // grouping any_pm_intf_type
    
        grouping inet6_pm_family_output_type {
          uses apply-advanced;
    
          choice interface-or-next-hop-index {
            list interface {
              key "name";
              description
                "Interfaces through which to send sampled traffic";
              uses inet6_pm_intf_type;
            }  // list interface
            leaf next-hop-group {
              junos:must "(!(".. no-filter-check"))";
              junos:must-message "no-filter-check is not allowed with next-hop-group";
              junos:must "("forwarding-options next-hop-group $$ group-type inet6")";
              junos:must-message "Referenced next-hop-group must be defined as inet6 group";
              type string;
              description
                "Next-hop-group through which to send port-mirror traffic";
            }
          }  // choice interface-or-next-hop-index
    
          leaf policer {
            junos:must "("firewall policer $$")";
            junos:must-message "Referenced firewall policer does not exist";
            type string {
              junos:posix-pattern "!^((__.*)|(.{65,}))$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
            }
            description
              "Name of policer to use to rate-limit traffic";
          }
    
          leaf forwarding-class {
            junos:must "("class-of-service forwarding-classes class $$")";
            junos:must-message "Referenced forwarding-class does not exist";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for TOS";
          }
    
          leaf no-filter-check {
            type empty;
            description
              "Do not check for filters on port-mirroring interface";
          }
    
          leaf ipv6-address {
            type jt:ipv6addr;
            description
              "ERSPAN Destination IPv6 Address";
          }
    
          leaf server-profile {
            junos:must "(("services hosted-services server-profile $$" && ("services hosted-services server-profile $$ server-address" && "services hosted-services server-profile $$ client-address")))";
            junos:must-message "Only complete server profiles configured under [services hosted-services server-profile] can be configured here";
            type string {
              length "3 .. 32";
            }
            description "Server profile name";
          }
        }  // grouping inet6_pm_family_output_type
    
        grouping inet6_pm_intf_type {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface through which to send sampled traffic";
          }
    
          uses apply-advanced;
    
          list next-hop {
            key "name";
            ordered-by user;
            description
              "Address of next hop through which to send sampled traffic";
            uses inet6_next_hop_type;
          }  // list next-hop
        }  // grouping inet6_pm_intf_type
    
        grouping inet6_next_hop_type {
          description
            "Address of next hop through which to send sampled traffic";
          leaf name {
            type jt:ipv6addr;
          }
    
          uses apply-advanced;
        }  // grouping inet6_next_hop_type
    
        grouping inet_next_hop_type {
          description
            "Address of next hop through which to send sampled traffic";
          leaf name {
            type jt:ipv4addr;
          }
    
          uses apply-advanced;
        }  // grouping inet_next_hop_type
    
        grouping inet_pm_family_output_type {
          uses apply-advanced;
    
          choice interface-or-next-hop-index {
            list interface {
              key "name";
              description
                "Interfaces through which to send sampled traffic";
              uses inet_pm_intf_type;
            }  // list interface
            leaf next-hop-group {
              junos:must "(!(".. no-filter-check"))";
              junos:must-message "no-filter-check is not allowed with next-hop-group";
              junos:must "("forwarding-options next-hop-group $$ group-type inet")";
              junos:must-message "Referenced next-hop-group must be defined as inet group";
              type string;
              description
                "Next-hop-group through which to send port-mirror traffic";
            }
          }  // choice interface-or-next-hop-index
    
          leaf no-filter-check {
            type empty;
            description
              "Do not check for filters on port-mirroring interface";
          }
    
          leaf ip-address {
            type jt:ipv4addr;
            description
              "ERSPAN Destination IP Address";
          }
    
          list routing-instance {
            key "name";
            max-elements 1;
            description "Routing instances";
            uses inet_pm_output-routing-instance-type;
          }  // list routing-instance
    
          leaf server-profile {
            junos:must "(("services hosted-services server-profile $$" && ("services hosted-services server-profile $$ server-address" && "services hosted-services server-profile $$ client-address")))";
            junos:must-message "Only complete server profiles configured under [services hosted-services server-profile] can be configured here";
            type string {
              length "3 .. 32";
            }
            description "Server profile name";
          }
    
          leaf policer {
            junos:must "("firewall policer $$")";
            junos:must-message "Referenced firewall policer does not exist";
            type string {
              junos:posix-pattern "!^((__.*)|(.{65,}))$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
            }
            description
              "Name of policer to use to rate-limit traffic";
          }
    
          leaf forwarding-class {
            junos:must "("class-of-service forwarding-classes class $$")";
            junos:must-message "Referenced forwarding-class does not exist";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for TOS";
          }
        }  // grouping inet_pm_family_output_type
    
        grouping inet_pm_intf_type {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface through which to send sampled traffic";
          }
    
          uses apply-advanced;
    
          list next-hop {
            key "name";
            ordered-by user;
            description
              "Address of next hop through which to send sampled traffic";
            uses inet_next_hop_type;
          }  // list next-hop
        }  // grouping inet_pm_intf_type
    
        grouping inet_pm_output-routing-instance-type {
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          leaf ip-address {
            type jt:ipv4addr;
            description
              "ERSPAN Destination IP Address";
          }
        }  // grouping inet_pm_output-routing-instance-type
    
        grouping inet_pm_output_type {
          uses apply-advanced;
    
          leaf ip-source-address {
            type jt:ipv4addr;
            description "IP source address";
          }
    
          leaf ip-destination-address {
            type jt:ipv4addr;
            description "IP destination address";
          }
    
          leaf policer {
            junos:must "("firewall policer $$")";
            junos:must-message "Referenced firewall policer does not exist";
            type string {
              junos:posix-pattern "!^((__.*)|(.{65,}))$";
              junos:pattern-message "Must be a non-reserved string of 64 characters or less";
            }
            description
              "Name of policer to use to rate-limit traffic";
          }
    
          leaf dscp {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "("class-of-service forwarding-classes class $$")";
            junos:must-message "Referenced forwarding-class does not exist";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for TOS";
          }
        }  // grouping inet_pm_output_type
    
        grouping juniper-protocols-amt {
          uses apply-advanced;
    
          container traceoptions {
            description "Trace options for AMT";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all AMT packets";
                  }
                  enum "errors" {
                    value 1;
                    description
                      "Trace all error messages";
                  }
                  enum "tunnels" {
                    value 2;
                    description
                      "Trace all AMT tunnel messages";
                  }
                  enum "route" {
                    value 3;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 4;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 5;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 6;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 7;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 8;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 9;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 10;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container relay {
            presence "enable relay";
            description "AMT relay";
            uses juniper-protocols-amt-relay;
          }  // container relay
        }  // grouping juniper-protocols-amt
    
        grouping juniper-protocols-amt-relay {
          uses apply-advanced;
    
          container family {
            presence "enable family";
            description "Protocol family";
            uses apply-advanced;
    
            container inet {
              presence "enable inet";
              uses apply-advanced;
    
              leaf anycast-prefix {
                type jt:ipv4prefix;
                description
                  "IPv4 anycast prefix";
              }
    
              leaf local-address {
                type jt:ipv4addr;
                description "IPv4 local address";
              }
            }  // container inet
          }  // container family
    
          leaf secret-key-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "5 .. 1440";
              }
            }
            units "minutes";
            description
              "Time interval for the secret key to expire";
          }
    
          leaf tunnel-limit {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Number of AMT tunnels";
          }
    
          leaf unicast-stream-limit {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Maximum number of AMT unicast streams(s,g,intf)";
          }
    
          leaf accounting {
            type empty;
            description "Enable AMT accounting";
          }
    
          leaf-list tunnel-devices {
            type union {
              type jt:interface-device;
              type string {
                pattern "<.*>|$.*";
              }
            }
            ordered-by user;
            description
              "Tunnel devices to be used for creating ud interfaces";
          }
        }  // grouping juniper-protocols-amt-relay
    
        grouping juniper-protocols-bd {
          description "Bridging configuration";
          uses apply-advanced;
    
          container mac-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC address forwarding table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container mac-table-size
    
          container mac-ip-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-ip-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC+IP bindings table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings";
            }
          }  // container mac-ip-table-size
    
          container interface-mac-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC address learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses per interface";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
                enum "log" {
                  value 2;
                  description
                    "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                }
                enum "shutdown" {
                  value 3;
                  description
                    "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                }
                enum "drop-and-log" {
                  value 4;
                  description
                    "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container interface-mac-limit
    
          container interface-mac-ip-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-ip-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC+IP bindings learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings per interface";
            }
          }  // container interface-mac-ip-limit
    
          container mac-notification {
            presence "enable mac-notification";
            description
              "MAC notification options";
            uses apply-advanced;
    
            leaf notification-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 60";
                }
              }
              units "seconds";
              default "30";
              description
                "Interval for sending MAC notifications";
            }
          }  // container mac-notification
    
          leaf mac-table-aging-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            units "seconds";
            description
              "Delay for discarding MAC address if no updates are received";
          }
    
          leaf no-mac-learning {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "no-mac-learning needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Disable dynamic MAC address learning";
          }
    
          leaf no-normalization {
            type empty;
            description
              "Disable vlan id normalization for interfaces";
          }
    
          leaf mac-statistics {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-statistics needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Enable MAC address statistics";
          }
    
          container mib {
            presence "enable mib";
            description "Snmp mib options";
            uses apply-advanced;
    
            container dot1q-mib {
              presence "enable dot1q-mib";
              description
                "Dot1q MIB configuration options";
              uses apply-advanced;
    
              leaf port-list {
                type enumeration {
                  enum "bit-map" {
                    value 0;
                    description
                      "Port list is represented in bit-map format";
                  }
                  enum "string" {
                    value 1;
                    description
                      "Port list is represented in string format";
                  }
                }
                description
                  "Port list for staticegressports and staticuntaggedports MIB";
              }
            }  // container dot1q-mib
          }  // container mib
    
          container static-rvtep-mac {
            description
              "Configure Static MAC and remote VxLAN tunnel endpoint entries";
            uses apply-advanced;
    
            list mac {
              key "mac_addr remote-vtep";
              description "Unicast MAC address";
              leaf mac_addr {
                type jt:mac-unicast;
              }
    
              leaf remote-vtep {
                type jt:ipaddr;
                description
                  "Configure static remote VXLAN tunnel endpoints";
              }
            }  // list mac
          }  // container static-rvtep-mac
    
          list interface {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface needs to be specified under switch-options for a virtual-switch instance";
            key "name";
            ordered-by user;
            description
              "Interface that connect this site to the VPN";
            leaf name {
              junos:must "(((".. .. .. interface $$" || (".. .. .. .. .. interface $$" || "interfaces $$-IFL family ethernet-switching vlan")) || (!(".. .. .. .. .. .. .. routing-instances") && ("interfaces $$-IFL family bridge interface-mode" && !(any "routing-instances <*> interface $$")))))";
              junos:must-message "Interface must be part of this routing instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container interface-mac-limit {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              description
                "Maximum number of MAC addresses learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC addresses per interface";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable interface for interface-mac-limit";
              }
    
              leaf packet-action {
                type enumeration {
                  enum "none" {
                    value 0;
                    description
                      "Forward the packet";
                  }
                  enum "drop" {
                    value 1;
                    description
                      "Drop packets and do not learn. Default is forward";
                  }
                  enum "log" {
                    value 2;
                    description
                      "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "shutdown" {
                    value 3;
                    description
                      "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "drop-and-log" {
                    value 4;
                    description
                      "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                  }
                }
                description
                  "Action when MAC limit is reached";
              }
            }  // container interface-mac-limit
    
            leaf action-priority {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 8";
                }
              }
              description
                "Blocking priority of this interface on mac move detection";
            }
    
            list static-mac {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              key "name";
              ordered-by user;
              description
                "Static MAC addresses assigned to this interface";
              leaf name {
                junos:must "((!(".. .. .. .. vlan-id all") || all ".. vlan-id <*>"))";
                junos:must-message " Specify vlan-id for qualified learning ";
                type jt:mac-addr;
                description "MAC address";
              }
    
              uses apply-advanced;
    
              list vlan-id {
                junos:must "(".. .. .. .. vlan-id all")";
                junos:must-message "'vlan-id all' has to be configured for the bridging domain";
                key "name";
                ordered-by user;
                description
                  "VLAN ID of learning VLAN";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4094";
                    }
                  }
                  description "Learning VLAN";
                }
    
                uses apply-advanced;
              }  // list vlan-id
            }  // list static-mac
    
            container interface-mac-ip-limit {
              description
                "Maximum number of MAC+IP bindings learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC+IP bindings per interface";
              }
            }  // container interface-mac-ip-limit
    
            leaf no-mac-learning {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              type empty;
              description
                "Disable dynamic MAC address learning";
            }
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            leaf persistent-learning {
              junos:must "(!("switch-options mac-table-aging-time "))";
              junos:must-message "Persistent learning can not co-exist with mac-table-aging-time";
              type empty;
              description
                "Enable persistent MAC learning on this interface";
            }
          }  // list interface
        }  // grouping juniper-protocols-bd
    
        grouping juniper-protocols-bgp {
          uses apply-advanced;
    
          container path-selection {
            description
              "Configure path selection strategy";
            uses apply-advanced;
    
            leaf l2vpn-use-bgp-rules {
              type empty;
              description
                "Use standard BGP rules during L2VPN path selection";
            }
    
            leaf cisco-non-deterministic {
              type empty;
              description
                "Use Cisco IOS nondeterministic path selection algorithm";
            }
    
            leaf always-compare-med {
              type empty;
              description
                "Always compare MED values, regardless of neighbor AS";
            }
    
            container med-plus-igp {
              presence "enable med-plus-igp";
              description
                "Add IGP cost to next-hop to MED before comparing MED values";
              uses apply-advanced;
    
              leaf med-multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 1000";
                  }
                }
                default "1";
                description "Multiplier for MED";
              }
    
              leaf igp-multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 1000";
                  }
                }
                default "1";
                description
                  "Multiplier for IGP cost to next-hop";
              }
            }  // container med-plus-igp
    
            leaf external-router-id {
              type empty;
              description
                "Compare router ID on BGP externals";
            }
    
            leaf as-path-ignore {
              junos:must "(!(".. .. .. .. routing-options multipath as-path-compare"))";
              junos:must-message "Configuring 'as-path-ignore' is not allowed when 'as-path-compare' is enabled for this routing instance";
              type empty;
              description
                "Ignore AS path comparison during path selection";
            }
          }  // container path-selection
    
          container accept-prpd-connection {
            presence
              "enable accept-prpd-connection";
            description
              "Enable BGP to accept PRPD connections";
          }  // container accept-prpd-connection
    
          leaf advertise-from-main-vpn-tables {
            type empty;
            description
              "Advertise VPN routes from bgp.Xvpn.0 tables in master instance";
          }
    
          leaf stale-labels-holddown-period {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "1 .. 600";
              }
            }
            description
              "Duration (sec) MPLS labels allocated by BGP are kept after they go stale";
          }
    
          leaf holddown-all-stale-labels {
            type empty;
            description
              "Hold all BGP stale-labels, facilating make-before-break for new label advertisements";
          }
    
          container egress-te-backup-paths {
            description
              "Backup-path for Egress-TE peer interface failure";
            uses apply-advanced;
    
            list template {
              key "name";
              description "Backup-path template";
              leaf name {
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of 64 characters or less";
                }
                description
                  "Name of Egress-TE backup path";
              }
    
              uses apply-advanced;
    
              list peer {
                key "name";
                ordered-by user;
                description
                  "Egress peer TE backup exit path";
                leaf name {
                  type jt:ipaddr;
                  description
                    "Address of BGP peer to use as backup next-hop";
                }
    
                uses apply-advanced;
              }  // list peer
    
              container remote-nexthop {
                description
                  "Resolve and use tunnel to this next-hop as backup path";
                uses apply-advanced;
    
                leaf remote-nh-addr {
                  type jt:ipaddr;
                  description
                    "Address of remote-nexthop to use as backup path";
                }
              }  // container remote-nexthop
    
              container ip-forward {
                junos:must "(!(".. remote-nexthop"))";
                junos:must-message "'ip-forward' will not take effect as backup when 'remote-nexthop' is in use";
                presence "enable ip-forward";
                description
                  "Use IP-forward backup path for Egress TE";
                uses apply-advanced;
    
                leaf rti-name {
                  type string {
                    junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                    junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                  }
                  description
                    "Routing-instance to use as IP forward backup-path";
                }
              }  // container ip-forward
            }  // list template
          }  // container egress-te-backup-paths
    
          leaf sr-preference-override {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Replace received segment routing traffic engineering preference value with override value";
          }
    
          leaf vpn-apply-export {
            type empty;
            description
              "Apply BGP export policy when exporting VPN routes";
          }
    
          container family {
            description
              "Protocol family for NLRIs in updates";
            uses apply-advanced;
    
            container inet {
              description "IPv4 NLRI parameters";
              uses apply-advanced;
    
              container labeled-unicast {
                presence
                  "enable labeled-unicast";
                description
                  "Include labeled unicast NLRI";
                uses bgp-afi-labeled;
              }  // container labeled-unicast
    
              container segment-routing-te {
                presence
                  "enable segment-routing-te";
                description
                  "Include segment-routing TE policy";
                uses bgp-afi-srte;
              }  // container segment-routing-te
    
              container transport {
                presence "enable transport";
                description
                  "Include Classful Transport NLRI";
                uses bgp-afi-inet-transport;
              }  // container transport
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-topo;
              }  // container unicast
    
              container multicast {
                presence "enable multicast";
                description
                  "Include multicast NLRI";
                uses bgp-afi-default;
              }  // container multicast
    
              container flow {
                presence "enable flow";
                description "Include flow NLRI";
                uses bgp-afi-flow-with-redirect-ip-action;
              }  // container flow
    
              container any {
                presence "enable any";
                description
                  "Include unicast or multicast NLRI";
                uses bgp-afi-default;
              }  // container any
            }  // container inet
    
            container inet-vpn {
              description
                "IPv4 Layer 3 VPN NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-l3vpn;
              }  // container unicast
    
              container multicast {
                presence "enable multicast";
                description
                  "Include multicast NLRI";
                uses bgp-afi-vpn;
              }  // container multicast
    
              container flow {
                presence "enable flow";
                description
                  "Include flow VPN NLRI";
                uses bgp-afi-flow-with-redirect-ip-action;
              }  // container flow
    
              container any {
                presence "enable any";
                description
                  "Include unicast or multicast NLRI";
                uses bgp-afi-vpn;
              }  // container any
            }  // container inet-vpn
    
            container inet6 {
              description "IPv6 NLRI parameters";
              uses apply-advanced;
    
              container labeled-unicast {
                presence
                  "enable labeled-unicast";
                description
                  "Include labeled unicast NLRI";
                uses bgp-afi-inet6-labeled;
              }  // container labeled-unicast
    
              container segment-routing-te {
                presence
                  "enable segment-routing-te";
                description
                  "Include segment-routing TE policy";
                uses bgp-afi-srte;
              }  // container segment-routing-te
    
              container transport {
                presence "enable transport";
                description
                  "Include Classful Transport NLRI";
                uses bgp-afi-inet6-transport;
              }  // container transport
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-topo;
              }  // container unicast
    
              container multicast {
                presence "enable multicast";
                description
                  "Include multicast NLRI";
                uses bgp-afi-default;
              }  // container multicast
    
              container flow {
                presence "enable flow";
                description "Include flow NLRI";
                uses bgp-afi-flow;
              }  // container flow
    
              container any {
                presence "enable any";
                description
                  "Include unicast or multicast NLRI";
                uses bgp-afi-default;
              }  // container any
            }  // container inet6
    
            container inet6-vpn {
              description
                "IPv6 Layer 3 VPN NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-l3vpn;
              }  // container unicast
    
              container multicast {
                presence "enable multicast";
                description
                  "Include multicast NLRI";
                uses bgp-afi-vpn;
              }  // container multicast
    
              container flow {
                presence "enable flow";
                description
                  "Include flow VPN NLRI";
                uses bgp-afi-flow;
              }  // container flow
    
              container any {
                presence "enable any";
                description
                  "Include unicast or multicast NLRI";
                uses bgp-afi-vpn;
              }  // container any
            }  // container inet6-vpn
    
            container iso-vpn {
              description
                "ISO Layer 3 VPN NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-vpn-protection;
              }  // container unicast
            }  // container iso-vpn
    
            container l2vpn {
              description
                "MPLS-based Layer 2 VPN and VPLS NLRI parameters";
              uses apply-advanced;
    
              container auto-discovery-only {
                presence
                  "enable auto-discovery-only";
                description
                  "Include auto-discovery NLRI for LDP Layer 2 VPN and VPLS";
                uses bgp-afi-default;
              }  // container auto-discovery-only
    
              container auto-discovery-mspw {
                presence
                  "enable auto-discovery-mspw";
                description
                  "Include auto-discovery NLRI for LDP Signalled MultiSegment PW";
                uses bgp-afi-default;
              }  // container auto-discovery-mspw
    
              container signaling {
                presence "enable signaling";
                description
                  "Include Layer 2 VPN and VPLS signaling NLRI";
                uses bgp-afi-l2vpn;
              }  // container signaling
            }  // container l2vpn
    
            container evpn {
              description "EVPN NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include EVPN signaling NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container evpn
    
            container inet-mvpn {
              description
                "IPv4 MVPN NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include IPv4 multicast VPN signaling NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container inet-mvpn
    
            container inet6-mvpn {
              description
                "IPv6 MVPN NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include IPv6 multicast VPN signaling NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container inet6-mvpn
    
            container inet-mdt {
              description
                "IPv4 Multicast Distribution Tree (MDT) NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include IPv4 multicast VPN auto-discovery NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container inet-mdt
    
            container traffic-engineering {
              description
                "Traffic Engineering (BGP-TE) NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include BGP-TE NLRI";
                uses bgp-afi-default;
              }  // container unicast
            }  // container traffic-engineering
    
            container route-target {
              presence "enable route-target";
              description
                "Route target NLRI used for VPN route filtering";
              uses apply-advanced;
    
              container prefix-limit {
                description
                  "Limit maximum number of prefixes from a peer";
                uses bgpaf-prefix-limit;
              }  // container prefix-limit
    
              container accepted-prefix-limit {
                description
                  "Limit maximum number of prefixes accepted from a peer";
                uses bgpaf-accepted-prefix-limit;
              }  // container accepted-prefix-limit
    
              container proxy-generate {
                presence "enable proxy-generate";
                description
                  "Generate route target NLRI for peers that don't support it";
                uses apply-advanced;
    
                leaf-list route-target-policy {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Limit VPN routes that are used to generate proxy route-target filters";
                }
              }  // container proxy-generate
    
              leaf external-paths {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 256";
                  }
                }
                description
                  "Number of external paths accepted for route filtering";
              }
    
              leaf advertise-default {
                type empty;
                description
                  "Advertise default and suppress more specific routes";
              }
    
              leaf damping {
                type empty;
                description
                  "Enable route flap damping";
              }
    
              container graceful-restart {
                description
                  "BGP graceful restart options";
                uses bgp-af-gr;
              }  // container graceful-restart
    
              leaf local-ipv4-address {
                type jt:ipv4addr;
                description "Local IPv4 address";
              }
    
              container output-queue-priority {
                description
                  "Default output-queue to assign updates to";
                uses bgp-output-queue-priority-class;
              }  // container output-queue-priority
    
              container route-refresh-priority {
                description
                  "Default output-queue to assign route refreshes to";
                uses bgp-output-queue-priority-class;
              }  // container route-refresh-priority
    
              container withdraw-priority {
                description
                  "Default output-queue to assign withdrawn routes to";
                uses bgp-output-queue-priority-class;
              }  // container withdraw-priority
            }  // container route-target
    
            container fabric {
              status deprecated;
              description
                "Fabric NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-default;
              }  // container unicast
            }  // container fabric
    
            container bridge {
              status deprecated;
              description
                "Bridge NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-default;
              }  // container unicast
            }  // container bridge
    
            container bridge-vpn {
              status deprecated;
              description
                "Bridge VPN NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-vpn;
              }  // container unicast
            }  // container bridge-vpn
    
            container fabric-vpn {
              status deprecated;
              description
                "Fabric VPN NLRI parameters";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Include unicast NLRI";
                uses bgp-afi-vpn;
              }  // container unicast
            }  // container fabric-vpn
    
            container inet-bgpmcast {
              description
                "IPv4 BGPMCAST NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include IPv4 BGP multicast signaling NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container inet-bgpmcast
    
            container inet6-bgpmcast {
              description
                "IPv6 BGPMCAST NLRI parameters";
              uses apply-advanced;
    
              container signaling {
                presence "enable signaling";
                description
                  "Include IPv6 BGP multicast signaling NLRI";
                uses bgp-afi-default;
              }  // container signaling
            }  // container inet6-bgpmcast
          }  // container family
    
          container egress-te {
            presence "enable egress-te";
            description
              "Use Egress Peering traffic engineering";
            uses apply-advanced;
    
            leaf install-address {
              type jt:ipaddr;
              description
                "Address to use in egress-te created inet route";
            }
    
            container rib {
              description
                "Select primary table for Egress-TE routes";
              uses apply-advanced;
    
              leaf inet.0 {
                type empty;
                description
                  "Install Egress-TE routes in inet.0";
              }
    
              leaf inet6.0 {
                type empty;
                description
                  "Install Egress-TE routes in inet6.0";
              }
            }  // container rib
    
            leaf no-install {
              type empty;
              description
                "Avoid installation to FIB or resolving over";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy to set attributes";
            }
    
            leaf backup-path {
              junos:must "("protocols bgp egress-te-backup-paths template $$")";
              junos:must-message "bgp egress-te-backup-paths template not configured";
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "The 'egress-te-backup-paths template' to use for this peer";
            }
          }  // container egress-te
    
          leaf advertise-prefix-sid {
            type empty;
            description
              "Advertise prefix sid to E-BGP peers";
          }
    
          leaf accept-prefix-sid {
            type empty;
            description
              "Accept prefix sid from E-BGP peers";
          }
    
          leaf advertise-srgb {
            type empty;
            description "Advertise SRGB TLV";
          }
    
          leaf tcp-connect-port {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 65535";
              }
            }
            description
              "TCP port number to connect with peer on";
          }
    
          leaf egress-te-sid-stats {
            type empty;
            description
              "Create BGP-Peer-SID sensor";
          }
    
          list egress-te-set-segment {
            key "name";
            ordered-by user;
            description
              "Configure BGP-Peer-Set segment";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "The BGP-Peer-Set segment name";
            }
    
            uses apply-advanced;
    
            container label {
              description
                "BGP-Peer-Set SID label from static label pool";
              uses apply-advanced;
    
              leaf label-value {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description
                  "BGP-Peer-Set SID label value from static label pool";
              }
            }  // container label
    
            container egress-te-backup-segment {
              description
                "Backup segment for FRR";
              uses apply-advanced;
    
              container label {
                description
                  "Backup segment label from static label pool";
                uses apply-advanced;
    
                leaf label-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "16 .. 1048575";
                    }
                  }
                  description
                    "Backup segment label value from static label pool";
                }
              }  // container label
            }  // container egress-te-backup-segment
    
            container egress-te-backup-ip-forward {
              presence
                "enable egress-te-backup-ip-forward";
              description
                "Use IP-forward backup path for Egress TE";
              uses apply-advanced;
    
              leaf instance-name {
                type string {
                  junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                  junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                }
                description
                  "Routing-instance to use as IP forward backup-path";
              }
            }  // container egress-te-backup-ip-forward
          }  // list egress-te-set-segment
    
          list group {
            key "name";
            ordered-by user;
            description "Define a peer group";
            leaf name {
              type string;
              description "Group name";
            }
    
            uses apply-advanced;
    
            leaf type {
              type enumeration {
                enum "internal" {
                  value 0;
                  description "IBGP group";
                }
                enum "external" {
                  value 1;
                  description "EBGP group";
                }
              }
              description "Type of peer group";
            }
    
            leaf protocol {
              type enumeration {
                enum "rip" {
                  value 0;
                  status deprecated;
                  description
                    "Use RIP to resolve the BGP next hop";
                }
                enum "ospf" {
                  value 1;
                  status deprecated;
                  description
                    "Use OSPF to resolve the BGP next hop";
                }
                enum "isis" {
                  value 2;
                  status deprecated;
                  description
                    "Use IS-IS to resolve the BGP next hop";
                }
              }
              status deprecated;
              description
                "IGP to use to resolve the next hop";
            }
    
            container traceoptions {
              description
                "Trace options for BGP";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "damping" {
                      value 0;
                      description
                        "Trace BGP damping information";
                    }
                    enum "packets" {
                      value 1;
                      description
                        "Trace all BGP protocol packets";
                    }
                    enum "open" {
                      value 2;
                      description
                        "Trace BGP open packets";
                    }
                    enum "update" {
                      value 3;
                      description
                        "Trace BGP update packets";
                    }
                    enum "keepalive" {
                      value 4;
                      description
                        "Trace BGP keepalive packets";
                    }
                    enum "refresh" {
                      value 5;
                      description
                        "Trace BGP refresh packets";
                    }
                    enum "nsr-synchronization" {
                      value 6;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "bfd" {
                      value 7;
                      description
                        "Trace BFD events";
                    }
                    enum "4byte-as" {
                      value 8;
                      description
                        "Trace 4 byte AS events";
                    }
                    enum "add-path" {
                      value 9;
                      description
                        "Trace add-path events";
                    }
                    enum "graceful-restart" {
                      value 10;
                      description
                        "Trace Graceful Restart events";
                    }
                    enum "egress-te" {
                      value 11;
                      description
                        "Egress Peering Traffic-Engineering events";
                    }
                    enum "thread-io" {
                      value 12;
                      description
                        "Trace threaded I/O processing";
                    }
                    enum "sharding" {
                      value 13;
                      description
                        "Trace BGP rib sharding";
                    }
                    enum "thread-update-io" {
                      value 14;
                      description
                        "Trace threaded update I/O processing";
                    }
                    enum "route-validation" {
                      value 15;
                      description
                        "Trace route validation";
                    }
                    enum "ipsec" {
                      value 16;
                      description "Trace ipsec";
                    }
                    enum "route" {
                      value 17;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 18;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 19;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 20;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 21;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 22;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 23;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 24;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
    
                container filter {
                  presence "enable filter";
                  description
                    "Filter to apply to this flag";
                  uses bgp_filter_obj;
                }  // container filter
              }  // list flag
            }  // container traceoptions
    
            leaf description {
              type string {
                length "1 .. 255";
              }
              description "Text description";
            }
    
            container metric-out {
              description
                "Route metric sent in MED";
              choice metric_param {
                leaf metric-value {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4294967295";
                    }
                  }
                  description "Metric value";
                }
                container minimum-igp {
                  presence "enable minimum-igp";
                  description
                    "Track the minimum IGP metric";
                  leaf metric-offset {
                    type union {
                      type int32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Metric offset for MED";
                  }
                }  // container minimum-igp
                container igp {
                  presence "enable igp";
                  description
                    "Track the IGP metric";
                  leaf metric-offset {
                    type union {
                      type int32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Metric offset for MED";
                  }
    
                  leaf delay-med-update {
                    type empty;
                    description
                      "Delay updating MED when IGP metric increases";
                  }
                }  // container igp
                container effective-aigp {
                  presence
                    "enable effective-aigp";
                  description
                    "Track the effective AIGP metric";
                  leaf metric-offset {
                    type union {
                      type int32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Metric offset for MED";
                  }
                }  // container effective-aigp
                container minimum-effective-aigp {
                  presence
                    "enable minimum-effective-aigp";
                  description
                    "Track the minimum effective AIGP metric";
                  leaf metric-offset {
                    type union {
                      type int32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Metric offset for MED";
                  }
                }  // container minimum-effective-aigp
              }  // choice metric_param
            }  // container metric-out
    
            container multihop {
              presence "enable multihop";
              description
                "Configure an EBGP multihop session";
              uses apply-advanced;
    
              leaf ttl {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "1 .. 255";
                  }
                }
                description
                  "TTL value for the session";
              }
    
              leaf no-nexthop-change {
                type empty;
                description
                  "Do not change next hop to self in advertisements";
              }
            }  // container multihop
    
            leaf route-server-client {
              type empty;
              description
                "Enable route server client behavior";
            }
    
            leaf accept-remote-nexthop {
              type empty;
              description
                "Allow import policy to specify a non-directly connected next-hop";
            }
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Preference value";
            }
    
            leaf local-preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Value of LOCAL_PREF path attribute";
            }
    
            leaf local-address {
              type jt:ipaddr;
              description
                "Address of local end of BGP session";
            }
    
            leaf local-interface {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Local interface for IPv6 link local EBGP peering";
            }
    
            leaf forwarding-context {
              type string {
                junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
              }
              description
                "Routing-instance used for data-forwarding and transport-session";
            }
    
            leaf hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 65535";
                }
              }
              description
                "Hold time used when negotiating with a peer";
            }
    
            leaf minimum-hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "3 .. 65535";
                }
              }
              description
                "Minimum hold time accepted from the peer";
            }
    
            leaf passive {
              type empty;
              description
                "Do not send open messages to a peer";
            }
    
            leaf advertise-inactive {
              type empty;
              description
                "Advertise inactive routes";
            }
    
            choice advertise-peer-as-choice {
              leaf advertise-peer-as {
                type empty;
                description
                  "Advertise routes received from the same autonomous system";
              }
              leaf no-advertise-peer-as {
                type empty;
                description
                  "Don't advertise routes received from the same autonomous system";
              }
            }  // choice advertise-peer-as-choice
    
            container advertise-external {
              presence
                "enable advertise-external";
              description
                "Advertise best external routes";
              leaf conditional {
                type empty;
                description
                  "Route matches active route upto med-comparison rule";
              }
            }  // container advertise-external
    
            leaf keep {
              type enumeration {
                enum "all" {
                  value 0;
                  description
                    "Retain all routes";
                }
                enum "none" {
                  value 1;
                  description "Retain no routes";
                }
              }
              description
                "How to retain routes in the routing table";
            }
    
            leaf rfc6514-compliant-safi129 {
              type empty;
              description
                "Compliant with RFC6514 SAFI129 format";
            }
    
            leaf no-aggregator-id {
              type empty;
              description
                "Set router ID in aggregator path attribute to 0";
            }
    
            leaf mtu-discovery {
              type empty;
              description
                "Enable TCP path MTU discovery";
            }
    
            leaf enforce-first-as {
              type empty;
              description
                "Enforce first AS in AS-path is the neighbor's AS";
            }
    
            leaf out-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 65535";
                }
              }
              description
                "How long before exporting routes from routing table";
            }
    
            leaf ttl {
              junos:must "((!(".. .. type internal") && !(".. multihop")))";
              junos:must-message "This option is valid only for single-hop EBGP neighbor";
              type enumeration {
                enum "1" {
                  value 0;
                }
                enum "255" {
                  value 1;
                }
              }
              description
                "TTL value for the single-hop peer";
            }
    
            leaf log-updown {
              type empty;
              description
                "Log a message for peer state transitions";
            }
    
            leaf damping {
              type empty;
              description
                "Enable route flap damping";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
    
            leaf-list nlri {
              type enumeration {
                enum "unicast" {
                  value 0;
                  status deprecated;
                  description
                    "Include unicast NLRI";
                }
                enum "multicast" {
                  value 1;
                  status deprecated;
                  description
                    "Include multicast NLRI";
                }
                enum "any" {
                  value 2;
                  status deprecated;
                  description
                    "Include any kind of NLRI";
                }
              }
              ordered-by user;
              status deprecated;
              description
                "NLRI type to include in updates";
            }
    
            container bgp-error-tolerance {
              presence
                "enable bgp-error-tolerance";
              description
                "Handle BGP malformed updates softly";
              uses apply-advanced;
    
              leaf malformed-update-log-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 65535";
                  }
                }
                units "seconds";
                default "300";
                description
                  "Time used when logging malformed update";
              }
    
              choice malformed-routes-limit-choice {
                leaf malformed-route-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4294967295";
                    }
                  }
                  default "1000";
                  description
                    "Maximum number of malformed routes from a peer";
                }
                leaf no-malformed-route-limit {
                  type empty;
                  description
                    "No malformed route limit";
                }
              }  // choice malformed-routes-limit-choice
            }  // container bgp-error-tolerance
    
            container family {
              description
                "Protocol family for NLRIs in updates";
              uses apply-advanced;
    
              container inet {
                description
                  "IPv4 NLRI parameters";
                uses apply-advanced;
    
                container labeled-unicast {
                  presence
                    "enable labeled-unicast";
                  description
                    "Include labeled unicast NLRI";
                  uses bgp-afi-labeled;
                }  // container labeled-unicast
    
                container segment-routing-te {
                  presence
                    "enable segment-routing-te";
                  description
                    "Include segment-routing TE policy";
                  uses bgp-afi-srte;
                }  // container segment-routing-te
    
                container transport {
                  presence "enable transport";
                  description
                    "Include Classful Transport NLRI";
                  uses bgp-afi-inet-transport;
                }  // container transport
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-topo;
                }  // container unicast
    
                container multicast {
                  presence "enable multicast";
                  description
                    "Include multicast NLRI";
                  uses bgp-afi-default;
                }  // container multicast
    
                container flow {
                  presence "enable flow";
                  description
                    "Include flow NLRI";
                  uses bgp-afi-flow-with-redirect-ip-action;
                }  // container flow
    
                container any {
                  presence "enable any";
                  description
                    "Include unicast or multicast NLRI";
                  uses bgp-afi-default;
                }  // container any
              }  // container inet
    
              container inet-vpn {
                description
                  "IPv4 Layer 3 VPN NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-l3vpn;
                }  // container unicast
    
                container multicast {
                  presence "enable multicast";
                  description
                    "Include multicast NLRI";
                  uses bgp-afi-vpn;
                }  // container multicast
    
                container flow {
                  presence "enable flow";
                  description
                    "Include flow VPN NLRI";
                  uses bgp-afi-flow-with-redirect-ip-action;
                }  // container flow
    
                container any {
                  presence "enable any";
                  description
                    "Include unicast or multicast NLRI";
                  uses bgp-afi-vpn;
                }  // container any
              }  // container inet-vpn
    
              container inet6 {
                description
                  "IPv6 NLRI parameters";
                uses apply-advanced;
    
                container labeled-unicast {
                  presence
                    "enable labeled-unicast";
                  description
                    "Include labeled unicast NLRI";
                  uses bgp-afi-inet6-labeled;
                }  // container labeled-unicast
    
                container segment-routing-te {
                  presence
                    "enable segment-routing-te";
                  description
                    "Include segment-routing TE policy";
                  uses bgp-afi-srte;
                }  // container segment-routing-te
    
                container transport {
                  presence "enable transport";
                  description
                    "Include Classful Transport NLRI";
                  uses bgp-afi-inet6-transport;
                }  // container transport
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-topo;
                }  // container unicast
    
                container multicast {
                  presence "enable multicast";
                  description
                    "Include multicast NLRI";
                  uses bgp-afi-default;
                }  // container multicast
    
                container flow {
                  presence "enable flow";
                  description
                    "Include flow NLRI";
                  uses bgp-afi-flow;
                }  // container flow
    
                container any {
                  presence "enable any";
                  description
                    "Include unicast or multicast NLRI";
                  uses bgp-afi-default;
                }  // container any
              }  // container inet6
    
              container inet6-vpn {
                description
                  "IPv6 Layer 3 VPN NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-l3vpn;
                }  // container unicast
    
                container multicast {
                  presence "enable multicast";
                  description
                    "Include multicast NLRI";
                  uses bgp-afi-vpn;
                }  // container multicast
    
                container flow {
                  presence "enable flow";
                  description
                    "Include flow VPN NLRI";
                  uses bgp-afi-flow;
                }  // container flow
    
                container any {
                  presence "enable any";
                  description
                    "Include unicast or multicast NLRI";
                  uses bgp-afi-vpn;
                }  // container any
              }  // container inet6-vpn
    
              container iso-vpn {
                description
                  "ISO Layer 3 VPN NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-vpn-protection;
                }  // container unicast
              }  // container iso-vpn
    
              container l2vpn {
                description
                  "MPLS-based Layer 2 VPN and VPLS NLRI parameters";
                uses apply-advanced;
    
                container auto-discovery-only {
                  presence
                    "enable auto-discovery-only";
                  description
                    "Include auto-discovery NLRI for LDP Layer 2 VPN and VPLS";
                  uses bgp-afi-default;
                }  // container auto-discovery-only
    
                container auto-discovery-mspw {
                  presence
                    "enable auto-discovery-mspw";
                  description
                    "Include auto-discovery NLRI for LDP Signalled MultiSegment PW";
                  uses bgp-afi-default;
                }  // container auto-discovery-mspw
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include Layer 2 VPN and VPLS signaling NLRI";
                  uses bgp-afi-l2vpn;
                }  // container signaling
              }  // container l2vpn
    
              container evpn {
                description
                  "EVPN NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include EVPN signaling NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container evpn
    
              container inet-mvpn {
                description
                  "IPv4 MVPN NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include IPv4 multicast VPN signaling NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container inet-mvpn
    
              container inet6-mvpn {
                description
                  "IPv6 MVPN NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include IPv6 multicast VPN signaling NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container inet6-mvpn
    
              container inet-mdt {
                description
                  "IPv4 Multicast Distribution Tree (MDT) NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include IPv4 multicast VPN auto-discovery NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container inet-mdt
    
              container traffic-engineering {
                description
                  "Traffic Engineering (BGP-TE) NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include BGP-TE NLRI";
                  uses bgp-afi-default;
                }  // container unicast
              }  // container traffic-engineering
    
              container route-target {
                presence "enable route-target";
                description
                  "Route target NLRI used for VPN route filtering";
                uses apply-advanced;
    
                container prefix-limit {
                  description
                    "Limit maximum number of prefixes from a peer";
                  uses bgpaf-prefix-limit;
                }  // container prefix-limit
    
                container accepted-prefix-limit {
                  description
                    "Limit maximum number of prefixes accepted from a peer";
                  uses bgpaf-accepted-prefix-limit;
                }  // container accepted-prefix-limit
    
                container proxy-generate {
                  presence
                    "enable proxy-generate";
                  description
                    "Generate route target NLRI for peers that don't support it";
                  uses apply-advanced;
    
                  leaf-list route-target-policy {
                    type jt:policy-algebra;
                    ordered-by user;
                    description
                      "Limit VPN routes that are used to generate proxy route-target filters";
                  }
                }  // container proxy-generate
    
                leaf external-paths {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 256";
                    }
                  }
                  description
                    "Number of external paths accepted for route filtering";
                }
    
                leaf advertise-default {
                  type empty;
                  description
                    "Advertise default and suppress more specific routes";
                }
    
                leaf damping {
                  type empty;
                  description
                    "Enable route flap damping";
                }
    
                container graceful-restart {
                  description
                    "BGP graceful restart options";
                  uses bgp-af-gr;
                }  // container graceful-restart
    
                leaf local-ipv4-address {
                  type jt:ipv4addr;
                  description
                    "Local IPv4 address";
                }
    
                container output-queue-priority {
                  description
                    "Default output-queue to assign updates to";
                  uses bgp-output-queue-priority-class;
                }  // container output-queue-priority
    
                container route-refresh-priority {
                  description
                    "Default output-queue to assign route refreshes to";
                  uses bgp-output-queue-priority-class;
                }  // container route-refresh-priority
    
                container withdraw-priority {
                  description
                    "Default output-queue to assign withdrawn routes to";
                  uses bgp-output-queue-priority-class;
                }  // container withdraw-priority
              }  // container route-target
    
              container fabric {
                status deprecated;
                description
                  "Fabric NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-default;
                }  // container unicast
              }  // container fabric
    
              container bridge {
                status deprecated;
                description
                  "Bridge NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-default;
                }  // container unicast
              }  // container bridge
    
              container bridge-vpn {
                status deprecated;
                description
                  "Bridge VPN NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-vpn;
                }  // container unicast
              }  // container bridge-vpn
    
              container fabric-vpn {
                status deprecated;
                description
                  "Fabric VPN NLRI parameters";
                uses apply-advanced;
    
                container unicast {
                  presence "enable unicast";
                  description
                    "Include unicast NLRI";
                  uses bgp-afi-vpn;
                }  // container unicast
              }  // container fabric-vpn
    
              container inet-bgpmcast {
                description
                  "IPv4 BGPMCAST NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include IPv4 BGP multicast signaling NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container inet-bgpmcast
    
              container inet6-bgpmcast {
                description
                  "IPv6 BGPMCAST NLRI parameters";
                uses apply-advanced;
    
                container signaling {
                  presence "enable signaling";
                  description
                    "Include IPv6 BGP multicast signaling NLRI";
                  uses bgp-afi-default;
                }  // container signaling
              }  // container inet6-bgpmcast
            }  // container family
    
            leaf authentication-key {
              type string {
                length "1 .. 126";
              }
              description
                "MD5 authentication key";
            }
    
            leaf authentication-algorithm {
              junos:must "(".. authentication-key-chain")";
              junos:must-message "May not be configured without authentication-key-chain";
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "md5" {
                  value 0;
                  description "Message Digest 5";
                }
                enum "hmac-sha-1-96" {
                  value 1;
                  description
                    "Hash-based Message Authentication Code (SHA1) (96 bits)";
                }
                enum "aes-128-cmac-96" {
                  value 2;
                  description
                    "Cipher-based Message Authentication Code (AES128) (96 bits)";
                }
                enum "ao" {
                  value 3;
                  description
                    "TCP Authentication Option";
                }
              }
              description
                "Authentication algorithm name";
            }
    
            leaf tcpao-handling-with-digest-mismatch {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "drop-if-no-tcpao" {
                  value 0;
                  description
                    "Drop the connection if Digest mismatched";
                }
                enum "allow-without-tcpao" {
                  value 1;
                  description
                    "Allow the connection establishment without TCP-AO";
                }
              }
              description
                "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
            }
    
            leaf authentication-key-chain {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              junos:must "("security authentication-key-chains key-chain $$")";
              junos:must-message "Referenced key-chain must be defined";
              type string {
                length "1 .. 128";
              }
              description "Key chain name";
            }
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            container remove-private {
              presence "enable remove-private";
              description
                "Remove well-known private AS numbers";
              uses apply-advanced;
    
              container all {
                presence "enable all";
                description
                  "Remove all private AS numbers and do not stop at the first public AS number";
                container replace {
                  presence "enable replace";
                  description
                    "Replace private AS numbers with the BGP Group's local AS number";
                  leaf nearest {
                    type empty;
                    description
                      "Use closest public AS number to replace a private AS number";
                  }
                }  // container replace
              }  // container all
    
              leaf no-peer-loop-check {
                type empty;
                description
                  "Remove peer loop-check";
              }
            }  // container remove-private
    
            leaf cluster {
              type jt:areaid;
              description "Cluster identifier";
            }
    
            leaf no-client-reflect {
              type empty;
              description
                "Disable intracluster route redistribution";
            }
    
            leaf peer-as {
              type string {
                junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
              }
              description
                " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
            }
    
            container local-as {
              description
                "Local autonomous system number";
              leaf as-number {
                type string {
                  junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                  junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                }
                description
                  " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
              }
    
              leaf loops {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Maximum number of times this AS can be in an AS path";
              }
    
              leaf private {
                type empty;
                description
                  "Hide this local AS in paths learned from this peering";
              }
    
              leaf alias {
                type empty;
                description
                  "Treat this AS as an alias to the system AS";
              }
    
              leaf no-prepend-global-as {
                type empty;
                description
                  "Do not prepend global autonomous-system number in advertised paths";
              }
            }  // container local-as
    
            leaf ipsec-sa {
              junos:must "("security ipsec security-association $$")";
              junos:must-message "Referenced IPSec Security Association must be defined";
              type string {
                length "1 .. 32";
              }
              description "IPSec SA name";
            }
    
            container graceful-shutdown {
              description
                "BGP peer graceful shutdown option";
              uses apply-advanced;
    
              container receiver {
                presence "enable receiver";
                description
                  "BGP peer graceful-shutdown receiver";
                uses apply-advanced;
    
                leaf disable {
                  junos:must "(!(".. .. sender"))";
                  junos:must-message "Receiver cannot be disabled on Sender";
                  type empty;
                  description
                    "Disable graceful-shutdown receiver";
                }
    
                leaf local-preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Value of receiver LOCAL_PREF path attribute";
                }
              }  // container receiver
    
              container sender {
                presence "enable sender";
                description
                  "BGP peer graceful-shutdown sender";
                uses apply-advanced;
    
                leaf local-preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Value of sender LOCAL_PREF path attribute";
                }
              }  // container sender
            }  // container graceful-shutdown
    
            container shutdown {
              presence "enable shutdown";
              description "Shutdown";
              uses apply-advanced;
    
              leaf notify-message {
                type string;
                description
                  "Notification message";
              }
            }  // container shutdown
    
            leaf unconfigured-peer-graceful-restart {
              junos:must "(".. graceful-restart")";
              junos:must-message "unconfigured-peer-graceful-restart is only valid with 'graceful-restart'";
              type empty;
              description
                "BGP unconfigured peer graceful restart options";
            }
    
            container graceful-restart {
              presence "enable graceful-restart";
              description
                "BGP graceful restart options";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable graceful restart";
                }
              }  // choice enable-disable
    
              leaf restart-time {
                junos:must "(("routing-options graceful-restart" || "fabric routing-options graceful-restart"))";
                junos:must-message "restart-time is only valid with 'routing-options graceful-restart'";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1800";
                  }
                }
                description
                  "Restart time used when negotiating with a peer";
              }
    
              leaf stale-routes-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1800";
                  }
                }
                description
                  "Maximum time for which stale routes are kept";
              }
    
              container long-lived {
                description
                  "Long-lived graceful restart options";
                uses apply-advanced;
    
                container receiver {
                  description
                    "Long-lived graceful restart receiver (helper) options";
                  uses apply-advanced;
    
                  choice enable-disable {
                    leaf disable {
                      type empty;
                      description
                        "Disable receiver (helper) functionality";
                    }
                  }  // choice enable-disable
                }  // container receiver
    
                container advertise-to-non-llgr-neighbor {
                  presence
                    "enable advertise-to-non-llgr-neighbor";
                  description
                    "Advertise stale routes to non-LLGR neighbors";
                  uses apply-advanced;
    
                  leaf omit-no-export {
                    type empty;
                    description
                      "Do not attach no-export community to stale routes";
                  }
                }  // container advertise-to-non-llgr-neighbor
              }  // container long-lived
    
              leaf disable-notification-extensions {
                type empty;
                description
                  "Disable notification extensions";
              }
    
              leaf forwarding-state-bit {
                type enumeration {
                  enum "as-rr-client" {
                    value 0;
                    description
                      "As for a route reflector client";
                  }
                  enum "from-fib" {
                    value 1;
                    description
                      "Always use state of associated FIB(s)";
                  }
                }
                description
                  "Control forwarding-state flag negotiation";
              }
    
              leaf dont-help-shared-fate-bfd-down {
                type empty;
                description
                  "Honor BFD-Down(C=0) if GR-restart not in progress";
              }
            }  // container graceful-restart
    
            leaf include-mp-next-hop {
              type empty;
              description
                "Include NEXT-HOP attribute in multiprotocol updates";
            }
    
            leaf disable-4byte-as {
              type empty;
              description
                "Disable 4 byte AS capability advertisement";
            }
    
            container idle-after-switch-over {
              description
                "Stop peer session from coming up after nonstop-routing switch-over";
              choice idle-interval {
                leaf forever {
                  type empty;
                  description
                    "Idle the peer until the user intervenes";
                }
                leaf timeout {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description
                    "Timeout value, in seconds, for starting peer after switch over";
                }
              }  // choice idle-interval
            }  // container idle-after-switch-over
    
            container outbound-route-filter {
              junos:must "(!("system processes routing bgp update-threading"))";
              junos:must-message "Can't be configured together with update-threading";
              description
                "Dynamically negotiated cooperative route filtering";
              uses apply-advanced;
    
              leaf bgp-orf-cisco-mode {
                type empty;
                description
                  "Using BGP ORF capability code 130 and Prefix ORF type 128";
              }
    
              container extended-community {
                status deprecated;
                description
                  "Extended community filtering";
                uses apply-advanced;
    
                choice accept-choice {
                  leaf accept {
                    type empty;
                    description
                      "Honor remote requests for extended community ORF";
                  }
                  leaf no-accept {
                    type empty;
                    description
                      "Don't honor remote requests for extended community ORF";
                  }
                }  // choice accept-choice
    
                leaf vrf-filter {
                  type empty;
                  description
                    "Request remote filtering using locally configured VRF import targets";
                }
              }  // container extended-community
    
              container prefix-based {
                presence "enable prefix-based";
                description
                  "Prefix-based outbound route filtering";
                uses apply-advanced;
    
                container accept {
                  presence "enable accept";
                  description
                    "Honor Prefix-based ORFs from remote peers";
                  uses apply-advanced;
    
                  leaf inet {
                    type empty;
                    description
                      "Honor IPv4 prefix filters";
                  }
    
                  leaf inet6 {
                    type empty;
                    description
                      "Honor IPv6 prefix filters";
                  }
                }  // container accept
              }  // container prefix-based
            }  // container outbound-route-filter
    
            container message-batching {
              status deprecated;
              description
                "DEPRECATED - Batching of outgoing messages";
              uses apply-advanced;
    
              choice enable-disable {
                leaf enable {
                  type empty;
                  description "Enable parameter";
                }
                leaf disable {
                  type empty;
                  description
                    "Disable parameter";
                }
              }  // choice enable-disable
    
              leaf interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "100 .. 1000";
                  }
                }
                units "milliseconds";
                default "250";
                description
                  "DEPRECATED - Interval over which to batch messages";
              }
            }  // container message-batching
    
            container multipath {
              presence "enable multipath";
              description
                "Allow load sharing among multiple BGP paths";
              uses apply-advanced;
    
              leaf disable {
                type empty;
                description "Disable Multipath";
              }
    
              leaf multiple-as {
                type empty;
                description
                  "Use paths received from different ASs";
              }
    
              leaf allow-protection {
                type empty;
                description
                  "Allow protection for multipath legs";
              }
    
              leaf pause-computation-during-churn {
                type empty;
                description
                  "Pause multipath job to absorb churn";
              }
    
              leaf list-nexthop {
                type empty;
                description
                  "Use List-NH for homogenous nexthop-set also";
              }
            }  // container multipath
    
            leaf tcp-mss {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 4096";
                }
              }
              description
                "Maximum TCP segment size";
            }
    
            leaf bgp-identifier {
              type jt:ipv4addr;
              description "BGP Identifier";
            }
    
            leaf tcp-aggressive-transmission {
              type empty;
              description
                "Enable aggressive transmission of pure TCP ACKs and retransmissions";
            }
    
            container bmp {
              description
                "Specific settings to override the routing-options settings";
              uses apply-advanced;
    
              leaf monitor {
                type enumeration {
                  enum "enable" {
                    value 0;
                    description
                      "Enable monitoring of BGP peer(s)";
                  }
                  enum "disable" {
                    value 1;
                    description
                      "Disable monitoring of BGP peer(s)";
                  }
                }
                description
                  "Enable/Disable monitoring";
              }
    
              container route-monitoring {
                description
                  "Control route monitoring settings";
                uses apply-advanced;
    
                leaf none {
                  junos:must "((!(".. pre-policy") && (!(".. post-policy") && !(".. rib-out"))))";
                  junos:must-message "May not be configured with pre-policy or post-policy or rib-out";
                  type empty;
                  description
                    "Do not send route monitoring messages";
                }
    
                container pre-policy {
                  presence "enable pre-policy";
                  description
                    "Send pre-policy route monitoring messages";
                  leaf exclude-non-feasible {
                    type empty;
                    description
                      "Exclude looped routes, etc";
                  }
                }  // container pre-policy
    
                container post-policy {
                  presence "enable post-policy";
                  description
                    "Send post-policy route monitoring messages";
                  leaf exclude-non-eligible {
                    type empty;
                    description
                      "Exclude unresolved routes, etc.";
                  }
                }  // container post-policy
    
                container rib-out {
                  junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                  junos:must-message "Update threading can't be configured together with bmp rib-out monitoring";
                  presence "enable rib-out";
                  description
                    "Send adj-ribs-out route monitoring messages";
                  leaf pre-policy {
                    type empty;
                    description
                      "Send pre-policy adj-ribs-out route monitoring messages";
                  }
    
                  leaf post-policy {
                    type empty;
                    description
                      "Send post-policy adj-ribs-out route monitoring messages";
                  }
                }  // container rib-out
              }  // container route-monitoring
            }  // container bmp
    
            container advertise-bgp-static {
              presence
                "enable advertise-bgp-static";
              description
                "Advertise bgp-static routes";
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Static route advertisement policy";
              }
            }  // container advertise-bgp-static
    
            leaf add-path-display-ipv4-address {
              type empty;
              description
                "Display add-path path-id in IPv4 address format";
            }
    
            container bfd-liveness-detection {
              description
                "Bidirectional Forwarding Detection (BFD) options";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
    
              container authentication {
                description
                  "Authentication options";
                uses apply-advanced;
    
                leaf key-chain {
                  junos:must "(".. algorithm")";
                  junos:must-message "May not be configured without algorithm";
                  junos:must "("security authentication-key-chains key-chain $$")";
                  junos:must-message "Referenced key-chain must be defined";
                  type string;
                  description "Key chain name";
                }
    
                leaf algorithm {
                  junos:must "(".. key-chain")";
                  junos:must-message "May not be configured without key-chain";
                  type enumeration {
                    enum "simple-password" {
                      value 0;
                      description
                        "Simple password";
                    }
                    enum "keyed-md5" {
                      value 1;
                      description
                        "Keyed message Digest 5";
                    }
                    enum "meticulous-keyed-md5" {
                      value 2;
                      description
                        "Meticulous keyed message Digest 5";
                    }
                    enum "keyed-sha-1" {
                      value 3;
                      description
                        "Keyed secure hash algorithm (SHA1) ";
                    }
                    enum
                      "meticulous-keyed-sha-1" {
                      value 4;
                      description
                        "Meticulous keyed secure hash algorithm (SHA1) ";
                    }
                  }
                  description "Algorithm name";
                }
    
                leaf loose-check {
                  type empty;
                  description
                    "Verify authentication only if authentication is negotiated";
                }
              }  // container authentication
    
              leaf session-mode {
                type enumeration {
                  enum "automatic" {
                    value 0;
                    description
                      "Choose session-mode automatically";
                  }
                  enum "single-hop" {
                    value 1;
                    description "Use single-hop";
                  }
                  enum "multihop" {
                    value 2;
                    description "Use multihop";
                  }
                }
                default "automatic";
                description
                  "BFD single-hop or multihop session-mode";
              }
    
              leaf holddown-interval {
                junos:must "(!(".. .. type internal"))";
                junos:must-message "bfd holddown-interval is only valid for EBGP.";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Time to hold the session-UP notification to the client";
              }
            }  // container bfd-liveness-detection
    
            leaf as-override {
              type empty;
              description
                "Replace neighbor AS number with our AS number";
            }
    
            leaf-list allow {
              type jt:ipprefix;
              ordered-by user;
              description
                "Configure peer connections for specific networks";
            }
    
            list dynamic-neighbor {
              key "name";
              ordered-by user;
              description
                "Configure peer options for specific networks";
              leaf name {
                junos:must "((".. allow" || ".. peer-auto-discovery"))";
                junos:must-message "dynamic-neighbor must enable allow or peer-auto-discovery";
                type string;
                description "Template name";
              }
    
              uses apply-advanced;
    
              leaf-list allow {
                type jt:ipprefix;
                ordered-by user;
                description
                  "Configure peer connections for specific networks";
              }
    
              leaf authentication-key {
                type string {
                  length "1 .. 126";
                }
                description
                  "MD5 authentication key";
              }
    
              leaf authentication-algorithm {
                junos:must "(".. authentication-key-chain")";
                junos:must-message "May not be configured without authentication-key-chain";
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "md5" {
                    value 0;
                    description
                      "Message Digest 5";
                  }
                  enum "hmac-sha-1-96" {
                    value 1;
                    description
                      "Hash-based Message Authentication Code (SHA1) (96 bits)";
                  }
                  enum "aes-128-cmac-96" {
                    value 2;
                    description
                      "Cipher-based Message Authentication Code (AES128) (96 bits)";
                  }
                  enum "ao" {
                    value 3;
                    description
                      "TCP Authentication Option";
                  }
                }
                description
                  "Authentication algorithm name";
              }
    
              leaf tcpao-handling-with-digest-mismatch {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "drop-if-no-tcpao" {
                    value 0;
                    description
                      "Drop the connection if Digest mismatched";
                  }
                  enum "allow-without-tcpao" {
                    value 1;
                    description
                      "Allow the connection establishment without TCP-AO";
                  }
                }
                description
                  "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
              }
    
              leaf authentication-key-chain {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string {
                  length "1 .. 128";
                }
                description "Key chain name";
              }
    
              container peer-auto-discovery {
                junos:must "((!(".. authentication-algorithm") && (!(".. .. authentication-algorithm") && !(".. .. .. authentication-algorithm"))))";
                junos:must-message "Can't be configured along with authentication-algorithm";
                junos:must "((!(".. authentication-key") && (!(".. .. authentication-key") && !(".. .. .. authentication-key"))))";
                junos:must-message "Can't be configured along with authentication-key";
                junos:must "(!(".. allow"))";
                junos:must-message "peer-auto-discovery and allow cannot be configured in the same dynamic-neighbor";
                junos:must "((!(".. .. type internal") && !(".. .. multihop")))";
                junos:must-message "peer-auto-discovery is valid only for single-hop EBGP neighbor";
                description
                  "Configure auto-discovery options for BGP neighbors";
                uses apply-advanced;
    
                container family {
                  description
                    "Address family based neighbor auto-discovery parameters";
                  container inet6 {
                    uses apply-advanced;
    
                    choice auto-discovery-type {
                      container ipv6-nd {
                        presence
                          "enable ipv6-nd";
                        description
                          "Use ipv6 neighbor discovery to learn neighbor address";
                      }  // container ipv6-nd
                    }  // choice auto-discovery-type
                  }  // container inet6
                }  // container family
    
                list interface {
                  key "name";
                  leaf name {
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Configure interfaces over which to discover bgp neighbors";
                  }
    
                  uses apply-advanced;
    
                  choice enable-disable {
                    leaf disable {
                      type empty;
                      description
                        "Disable peer discovery on interface";
                    }
                  }  // choice enable-disable
                }  // list interface
              }  // container peer-auto-discovery
            }  // list dynamic-neighbor
    
            container optimal-route-reflection {
              junos:must "(".. type internal")";
              junos:must-message "Must be configured with type internal";
              description
                "Enable optimal route reflection for this client group";
              uses apply-advanced;
    
              leaf igp-primary {
                type jt:ipv4addr;
                description
                  "Primary node identifier for this client group";
              }
    
              leaf igp-backup {
                type jt:ipv4addr;
                description
                  "Backup node identifier for this client group";
              }
            }  // container optimal-route-reflection
    
            leaf peer-as-list {
              junos:must "((".. allow" || ".. dynamic-neighbor"))";
              junos:must-message "May be configured only with allow or dynamic-neighbor";
              type string;
              description
                "Configure list of peer autonomous systems for unconfigured neighbors";
            }
    
            leaf mvpn-iana-rt-import {
              type empty;
              status deprecated;
              description
                "Use IANA assigned rt-import type value for MVPN";
            }
    
            list neighbor {
              key "name";
              ordered-by user;
              description "Configure a neighbor";
              leaf name {
                type jt:ipaddr-scoped;
              }
    
              uses apply-advanced;
    
              container traceoptions {
                description
                  "Trace options for BGP";
                uses apply-advanced;
    
                container file {
                  description
                    "Trace file options";
                  leaf filename {
                    type string {
                      junos:posix-pattern "![/ %]";
                      junos:pattern-message "Must not contain '/', % or a space";
                      length "1 .. 1024";
                    }
                    description
                      "Name of file in which to write trace information";
                  }
    
                  leaf replace {
                    type empty;
                    status deprecated;
                    description
                      "Replace trace file rather than appending to it";
                  }
    
                  leaf size {
                    type string;
                    description
                      "Maximum trace file size";
                  }
    
                  leaf files {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 1000";
                      }
                    }
                    default "10";
                    description
                      "Maximum number of trace files";
                  }
    
                  leaf no-stamp {
                    type empty;
                    status deprecated;
                    description
                      "Do not timestamp trace file";
                  }
    
                  choice world-readable-choice {
                    leaf world-readable {
                      type empty;
                      description
                        "Allow any user to read the log file";
                    }
                    leaf no-world-readable {
                      type empty;
                      description
                        "Don't allow any user to read the log file";
                    }
                  }  // choice world-readable-choice
                }  // container file
    
                list flag {
                  key "name";
                  ordered-by user;
                  description
                    "Tracing parameters";
                  leaf name {
                    type enumeration {
                      enum "damping" {
                        value 0;
                        description
                          "Trace BGP damping information";
                      }
                      enum "packets" {
                        value 1;
                        description
                          "Trace all BGP protocol packets";
                      }
                      enum "open" {
                        value 2;
                        description
                          "Trace BGP open packets";
                      }
                      enum "update" {
                        value 3;
                        description
                          "Trace BGP update packets";
                      }
                      enum "keepalive" {
                        value 4;
                        description
                          "Trace BGP keepalive packets";
                      }
                      enum "refresh" {
                        value 5;
                        description
                          "Trace BGP refresh packets";
                      }
                      enum "nsr-synchronization" {
                        value 6;
                        description
                          "Trace NSR synchronization events";
                      }
                      enum "bfd" {
                        value 7;
                        description
                          "Trace BFD events";
                      }
                      enum "4byte-as" {
                        value 8;
                        description
                          "Trace 4 byte AS events";
                      }
                      enum "add-path" {
                        value 9;
                        description
                          "Trace add-path events";
                      }
                      enum "graceful-restart" {
                        value 10;
                        description
                          "Trace Graceful Restart events";
                      }
                      enum "egress-te" {
                        value 11;
                        description
                          "Egress Peering Traffic-Engineering events";
                      }
                      enum "thread-io" {
                        value 12;
                        description
                          "Trace threaded I/O processing";
                      }
                      enum "sharding" {
                        value 13;
                        description
                          "Trace BGP rib sharding";
                      }
                      enum "thread-update-io" {
                        value 14;
                        description
                          "Trace threaded update I/O processing";
                      }
                      enum "route-validation" {
                        value 15;
                        description
                          "Trace route validation";
                      }
                      enum "ipsec" {
                        value 16;
                        description
                          "Trace ipsec";
                      }
                      enum "route" {
                        value 17;
                        description
                          "Trace routing information";
                      }
                      enum "normal" {
                        value 18;
                        description
                          "Trace normal events";
                      }
                      enum "general" {
                        value 19;
                        description
                          "Trace general events";
                      }
                      enum "state" {
                        value 20;
                        description
                          "Trace state transitions";
                      }
                      enum "policy" {
                        value 21;
                        description
                          "Trace policy processing";
                      }
                      enum "task" {
                        value 22;
                        description
                          "Trace routing protocol task processing";
                      }
                      enum "timer" {
                        value 23;
                        description
                          "Trace routing protocol timer processing";
                      }
                      enum "all" {
                        value 24;
                        description
                          "Trace everything";
                      }
                    }
                  }
    
                  leaf send {
                    type empty;
                    description
                      "Trace transmitted packets";
                  }
    
                  leaf receive {
                    type empty;
                    description
                      "Trace received packets";
                  }
    
                  leaf detail {
                    type empty;
                    description
                      "Trace detailed information";
                  }
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this trace flag";
                  }
    
                  container filter {
                    presence "enable filter";
                    description
                      "Filter to apply to this flag";
                    uses bgp_filter_obj;
                  }  // container filter
                }  // list flag
              }  // container traceoptions
    
              leaf description {
                type string {
                  length "1 .. 255";
                }
                description "Text description";
              }
    
              container metric-out {
                description
                  "Route metric sent in MED";
                choice metric_param {
                  leaf metric-value {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 4294967295";
                      }
                    }
                    description "Metric value";
                  }
                  container minimum-igp {
                    presence
                      "enable minimum-igp";
                    description
                      "Track the minimum IGP metric";
                    leaf metric-offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
                  }  // container minimum-igp
                  container igp {
                    presence "enable igp";
                    description
                      "Track the IGP metric";
                    leaf metric-offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
    
                    leaf delay-med-update {
                      type empty;
                      description
                        "Delay updating MED when IGP metric increases";
                    }
                  }  // container igp
                  container effective-aigp {
                    presence
                      "enable effective-aigp";
                    description
                      "Track the effective AIGP metric";
                    leaf metric-offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
                  }  // container effective-aigp
                  container minimum-effective-aigp {
                    presence
                      "enable minimum-effective-aigp";
                    description
                      "Track the minimum effective AIGP metric";
                    leaf metric-offset {
                      type union {
                        type int32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Metric offset for MED";
                    }
                  }  // container minimum-effective-aigp
                }  // choice metric_param
              }  // container metric-out
    
              container multihop {
                presence "enable multihop";
                description
                  "Configure an EBGP multihop session";
                uses apply-advanced;
    
                leaf ttl {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "TTL value for the session";
                }
    
                leaf no-nexthop-change {
                  type empty;
                  description
                    "Do not change next hop to self in advertisements";
                }
              }  // container multihop
    
              leaf route-server-client {
                type empty;
                description
                  "Enable route server client behavior";
              }
    
              leaf accept-remote-nexthop {
                type empty;
                description
                  "Allow import policy to specify a non-directly connected next-hop";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Value of LOCAL_PREF path attribute";
              }
    
              leaf local-address {
                type jt:ipaddr;
                description
                  "Address of local end of BGP session";
              }
    
              leaf local-interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Local interface for IPv6 link local EBGP peering";
              }
    
              leaf forwarding-context {
                type string {
                  junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                  junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                }
                description
                  "Routing-instance used for data-forwarding and transport-session";
              }
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 65535";
                  }
                }
                description
                  "Hold time used when negotiating with a peer";
              }
    
              leaf minimum-hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "3 .. 65535";
                  }
                }
                description
                  "Minimum hold time accepted from the peer";
              }
    
              leaf passive {
                type empty;
                description
                  "Do not send open messages to a peer";
              }
    
              leaf advertise-inactive {
                type empty;
                description
                  "Advertise inactive routes";
              }
    
              choice advertise-peer-as-choice {
                leaf advertise-peer-as {
                  type empty;
                  description
                    "Advertise routes received from the same autonomous system";
                }
                leaf no-advertise-peer-as {
                  type empty;
                  description
                    "Don't advertise routes received from the same autonomous system";
                }
              }  // choice advertise-peer-as-choice
    
              container advertise-external {
                presence
                  "enable advertise-external";
                description
                  "Advertise best external routes";
                leaf conditional {
                  type empty;
                  description
                    "Route matches active route upto med-comparison rule";
                }
              }  // container advertise-external
    
              leaf keep {
                type enumeration {
                  enum "all" {
                    value 0;
                    description
                      "Retain all routes";
                  }
                  enum "none" {
                    value 1;
                    description
                      "Retain no routes";
                  }
                }
                description
                  "How to retain routes in the routing table";
              }
    
              leaf rfc6514-compliant-safi129 {
                type empty;
                description
                  "Compliant with RFC6514 SAFI129 format";
              }
    
              leaf no-aggregator-id {
                type empty;
                description
                  "Set router ID in aggregator path attribute to 0";
              }
    
              leaf mtu-discovery {
                type empty;
                description
                  "Enable TCP path MTU discovery";
              }
    
              leaf enforce-first-as {
                type empty;
                description
                  "Enforce first AS in AS-path is the neighbor's AS";
              }
    
              leaf out-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 65535";
                  }
                }
                description
                  "How long before exporting routes from routing table";
              }
    
              leaf ttl {
                junos:must "((!(".. .. type internal") && !(".. multihop")))";
                junos:must-message "This option is valid only for single-hop EBGP neighbor";
                type enumeration {
                  enum "1" {
                    value 0;
                  }
                  enum "255" {
                    value 1;
                  }
                }
                description
                  "TTL value for the single-hop peer";
              }
    
              leaf log-updown {
                type empty;
                description
                  "Log a message for peer state transitions";
              }
    
              leaf damping {
                type empty;
                description
                  "Enable route flap damping";
              }
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
    
              leaf-list nlri {
                type enumeration {
                  enum "unicast" {
                    value 0;
                    status deprecated;
                    description
                      "Include unicast NLRI";
                  }
                  enum "multicast" {
                    value 1;
                    status deprecated;
                    description
                      "Include multicast NLRI";
                  }
                  enum "any" {
                    value 2;
                    status deprecated;
                    description
                      "Include any kind of NLRI";
                  }
                }
                ordered-by user;
                status deprecated;
                description
                  "NLRI type to include in updates";
              }
    
              container bgp-error-tolerance {
                presence
                  "enable bgp-error-tolerance";
                description
                  "Handle BGP malformed updates softly";
                uses apply-advanced;
    
                leaf malformed-update-log-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "10 .. 65535";
                    }
                  }
                  units "seconds";
                  default "300";
                  description
                    "Time used when logging malformed update";
                }
    
                choice malformed-routes-limit-choice {
                  leaf malformed-route-limit {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 4294967295";
                      }
                    }
                    default "1000";
                    description
                      "Maximum number of malformed routes from a peer";
                  }
                  leaf no-malformed-route-limit {
                    type empty;
                    description
                      "No malformed route limit";
                  }
                }  // choice malformed-routes-limit-choice
              }  // container bgp-error-tolerance
    
              container family {
                description
                  "Protocol family for NLRIs in updates";
                uses apply-advanced;
    
                container inet {
                  description
                    "IPv4 NLRI parameters";
                  uses apply-advanced;
    
                  container labeled-unicast {
                    presence
                      "enable labeled-unicast";
                    description
                      "Include labeled unicast NLRI";
                    uses bgp-afi-labeled;
                  }  // container labeled-unicast
    
                  container segment-routing-te {
                    presence
                      "enable segment-routing-te";
                    description
                      "Include segment-routing TE policy";
                    uses bgp-afi-srte;
                  }  // container segment-routing-te
    
                  container transport {
                    presence "enable transport";
                    description
                      "Include Classful Transport NLRI";
                    uses bgp-afi-inet-transport;
                  }  // container transport
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-topo;
                  }  // container unicast
    
                  container multicast {
                    presence "enable multicast";
                    description
                      "Include multicast NLRI";
                    uses bgp-afi-default;
                  }  // container multicast
    
                  container flow {
                    presence "enable flow";
                    description
                      "Include flow NLRI";
                    uses bgp-afi-flow-with-redirect-ip-action;
                  }  // container flow
    
                  container any {
                    presence "enable any";
                    description
                      "Include unicast or multicast NLRI";
                    uses bgp-afi-default;
                  }  // container any
                }  // container inet
    
                container inet-vpn {
                  description
                    "IPv4 Layer 3 VPN NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-l3vpn;
                  }  // container unicast
    
                  container multicast {
                    presence "enable multicast";
                    description
                      "Include multicast NLRI";
                    uses bgp-afi-vpn;
                  }  // container multicast
    
                  container flow {
                    presence "enable flow";
                    description
                      "Include flow VPN NLRI";
                    uses bgp-afi-flow-with-redirect-ip-action;
                  }  // container flow
    
                  container any {
                    presence "enable any";
                    description
                      "Include unicast or multicast NLRI";
                    uses bgp-afi-vpn;
                  }  // container any
                }  // container inet-vpn
    
                container inet6 {
                  description
                    "IPv6 NLRI parameters";
                  uses apply-advanced;
    
                  container labeled-unicast {
                    presence
                      "enable labeled-unicast";
                    description
                      "Include labeled unicast NLRI";
                    uses bgp-afi-inet6-labeled;
                  }  // container labeled-unicast
    
                  container segment-routing-te {
                    presence
                      "enable segment-routing-te";
                    description
                      "Include segment-routing TE policy";
                    uses bgp-afi-srte;
                  }  // container segment-routing-te
    
                  container transport {
                    presence "enable transport";
                    description
                      "Include Classful Transport NLRI";
                    uses bgp-afi-inet6-transport;
                  }  // container transport
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-topo;
                  }  // container unicast
    
                  container multicast {
                    presence "enable multicast";
                    description
                      "Include multicast NLRI";
                    uses bgp-afi-default;
                  }  // container multicast
    
                  container flow {
                    presence "enable flow";
                    description
                      "Include flow NLRI";
                    uses bgp-afi-flow;
                  }  // container flow
    
                  container any {
                    presence "enable any";
                    description
                      "Include unicast or multicast NLRI";
                    uses bgp-afi-default;
                  }  // container any
                }  // container inet6
    
                container inet6-vpn {
                  description
                    "IPv6 Layer 3 VPN NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-l3vpn;
                  }  // container unicast
    
                  container multicast {
                    presence "enable multicast";
                    description
                      "Include multicast NLRI";
                    uses bgp-afi-vpn;
                  }  // container multicast
    
                  container flow {
                    presence "enable flow";
                    description
                      "Include flow VPN NLRI";
                    uses bgp-afi-flow;
                  }  // container flow
    
                  container any {
                    presence "enable any";
                    description
                      "Include unicast or multicast NLRI";
                    uses bgp-afi-vpn;
                  }  // container any
                }  // container inet6-vpn
    
                container iso-vpn {
                  description
                    "ISO Layer 3 VPN NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-vpn-protection;
                  }  // container unicast
                }  // container iso-vpn
    
                container l2vpn {
                  description
                    "MPLS-based Layer 2 VPN and VPLS NLRI parameters";
                  uses apply-advanced;
    
                  container auto-discovery-only {
                    presence
                      "enable auto-discovery-only";
                    description
                      "Include auto-discovery NLRI for LDP Layer 2 VPN and VPLS";
                    uses bgp-afi-default;
                  }  // container auto-discovery-only
    
                  container auto-discovery-mspw {
                    presence
                      "enable auto-discovery-mspw";
                    description
                      "Include auto-discovery NLRI for LDP Signalled MultiSegment PW";
                    uses bgp-afi-default;
                  }  // container auto-discovery-mspw
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include Layer 2 VPN and VPLS signaling NLRI";
                    uses bgp-afi-l2vpn;
                  }  // container signaling
                }  // container l2vpn
    
                container evpn {
                  description
                    "EVPN NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include EVPN signaling NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container evpn
    
                container inet-mvpn {
                  description
                    "IPv4 MVPN NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include IPv4 multicast VPN signaling NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container inet-mvpn
    
                container inet6-mvpn {
                  description
                    "IPv6 MVPN NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include IPv6 multicast VPN signaling NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container inet6-mvpn
    
                container inet-mdt {
                  description
                    "IPv4 Multicast Distribution Tree (MDT) NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include IPv4 multicast VPN auto-discovery NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container inet-mdt
    
                container traffic-engineering {
                  description
                    "Traffic Engineering (BGP-TE) NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include BGP-TE NLRI";
                    uses bgp-afi-default;
                  }  // container unicast
                }  // container traffic-engineering
    
                container route-target {
                  presence "enable route-target";
                  description
                    "Route target NLRI used for VPN route filtering";
                  uses apply-advanced;
    
                  container prefix-limit {
                    description
                      "Limit maximum number of prefixes from a peer";
                    uses bgpaf-prefix-limit;
                  }  // container prefix-limit
    
                  container accepted-prefix-limit {
                    description
                      "Limit maximum number of prefixes accepted from a peer";
                    uses bgpaf-accepted-prefix-limit;
                  }  // container accepted-prefix-limit
    
                  container proxy-generate {
                    presence
                      "enable proxy-generate";
                    description
                      "Generate route target NLRI for peers that don't support it";
                    uses apply-advanced;
    
                    leaf-list route-target-policy {
                      type jt:policy-algebra;
                      ordered-by user;
                      description
                        "Limit VPN routes that are used to generate proxy route-target filters";
                    }
                  }  // container proxy-generate
    
                  leaf external-paths {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 256";
                      }
                    }
                    description
                      "Number of external paths accepted for route filtering";
                  }
    
                  leaf advertise-default {
                    type empty;
                    description
                      "Advertise default and suppress more specific routes";
                  }
    
                  leaf damping {
                    type empty;
                    description
                      "Enable route flap damping";
                  }
    
                  container graceful-restart {
                    description
                      "BGP graceful restart options";
                    uses bgp-af-gr;
                  }  // container graceful-restart
    
                  leaf local-ipv4-address {
                    type jt:ipv4addr;
                    description
                      "Local IPv4 address";
                  }
    
                  container output-queue-priority {
                    description
                      "Default output-queue to assign updates to";
                    uses bgp-output-queue-priority-class;
                  }  // container output-queue-priority
    
                  container route-refresh-priority {
                    description
                      "Default output-queue to assign route refreshes to";
                    uses bgp-output-queue-priority-class;
                  }  // container route-refresh-priority
    
                  container withdraw-priority {
                    description
                      "Default output-queue to assign withdrawn routes to";
                    uses bgp-output-queue-priority-class;
                  }  // container withdraw-priority
                }  // container route-target
    
                container fabric {
                  status deprecated;
                  description
                    "Fabric NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-default;
                  }  // container unicast
                }  // container fabric
    
                container bridge {
                  status deprecated;
                  description
                    "Bridge NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-default;
                  }  // container unicast
                }  // container bridge
    
                container bridge-vpn {
                  status deprecated;
                  description
                    "Bridge VPN NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-vpn;
                  }  // container unicast
                }  // container bridge-vpn
    
                container fabric-vpn {
                  status deprecated;
                  description
                    "Fabric VPN NLRI parameters";
                  uses apply-advanced;
    
                  container unicast {
                    presence "enable unicast";
                    description
                      "Include unicast NLRI";
                    uses bgp-afi-vpn;
                  }  // container unicast
                }  // container fabric-vpn
    
                container inet-bgpmcast {
                  description
                    "IPv4 BGPMCAST NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include IPv4 BGP multicast signaling NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container inet-bgpmcast
    
                container inet6-bgpmcast {
                  description
                    "IPv6 BGPMCAST NLRI parameters";
                  uses apply-advanced;
    
                  container signaling {
                    presence "enable signaling";
                    description
                      "Include IPv6 BGP multicast signaling NLRI";
                    uses bgp-afi-default;
                  }  // container signaling
                }  // container inet6-bgpmcast
              }  // container family
    
              leaf authentication-key {
                type string {
                  length "1 .. 126";
                }
                description
                  "MD5 authentication key";
              }
    
              leaf authentication-algorithm {
                junos:must "(".. authentication-key-chain")";
                junos:must-message "May not be configured without authentication-key-chain";
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "md5" {
                    value 0;
                    description
                      "Message Digest 5";
                  }
                  enum "hmac-sha-1-96" {
                    value 1;
                    description
                      "Hash-based Message Authentication Code (SHA1) (96 bits)";
                  }
                  enum "aes-128-cmac-96" {
                    value 2;
                    description
                      "Cipher-based Message Authentication Code (AES128) (96 bits)";
                  }
                  enum "ao" {
                    value 3;
                    description
                      "TCP Authentication Option";
                  }
                }
                description
                  "Authentication algorithm name";
              }
    
              leaf tcpao-handling-with-digest-mismatch {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "drop-if-no-tcpao" {
                    value 0;
                    description
                      "Drop the connection if Digest mismatched";
                  }
                  enum "allow-without-tcpao" {
                    value 1;
                    description
                      "Allow the connection establishment without TCP-AO";
                  }
                }
                description
                  "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
              }
    
              leaf authentication-key-chain {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string {
                  length "1 .. 128";
                }
                description "Key chain name";
              }
    
              leaf-list export {
                type jt:policy-algebra;
                ordered-by user;
                description "Export policy";
              }
    
              container remove-private {
                presence "enable remove-private";
                description
                  "Remove well-known private AS numbers";
                uses apply-advanced;
    
                container all {
                  presence "enable all";
                  description
                    "Remove all private AS numbers and do not stop at the first public AS number";
                  container replace {
                    presence "enable replace";
                    description
                      "Replace private AS numbers with the BGP Group's local AS number";
                    leaf nearest {
                      type empty;
                      description
                        "Use closest public AS number to replace a private AS number";
                    }
                  }  // container replace
                }  // container all
    
                leaf no-peer-loop-check {
                  type empty;
                  description
                    "Remove peer loop-check";
                }
              }  // container remove-private
    
              leaf cluster {
                type jt:areaid;
                description "Cluster identifier";
              }
    
              leaf no-client-reflect {
                type empty;
                description
                  "Disable intracluster route redistribution";
              }
    
              leaf peer-as {
                type string {
                  junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                  junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                }
                description
                  " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
              }
    
              container local-as {
                description
                  "Local autonomous system number";
                leaf as-number {
                  type string {
                    junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                    junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                  }
                  description
                    " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                }
    
                leaf loops {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "1 .. 10";
                    }
                  }
                  description
                    "Maximum number of times this AS can be in an AS path";
                }
    
                leaf private {
                  type empty;
                  description
                    "Hide this local AS in paths learned from this peering";
                }
    
                leaf alias {
                  type empty;
                  description
                    "Treat this AS as an alias to the system AS";
                }
    
                leaf no-prepend-global-as {
                  type empty;
                  description
                    "Do not prepend global autonomous-system number in advertised paths";
                }
              }  // container local-as
    
              leaf ipsec-sa {
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec Security Association must be defined";
                type string {
                  length "1 .. 32";
                }
                description "IPSec SA name";
              }
    
              container graceful-shutdown {
                description
                  "BGP peer graceful shutdown option";
                uses apply-advanced;
    
                container receiver {
                  presence "enable receiver";
                  description
                    "BGP peer graceful-shutdown receiver";
                  uses apply-advanced;
    
                  leaf disable {
                    junos:must "(!(".. .. sender"))";
                    junos:must-message "Receiver cannot be disabled on Sender";
                    type empty;
                    description
                      "Disable graceful-shutdown receiver";
                  }
    
                  leaf local-preference {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Value of receiver LOCAL_PREF path attribute";
                  }
                }  // container receiver
    
                container sender {
                  presence "enable sender";
                  description
                    "BGP peer graceful-shutdown sender";
                  uses apply-advanced;
    
                  leaf local-preference {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Value of sender LOCAL_PREF path attribute";
                  }
                }  // container sender
              }  // container graceful-shutdown
    
              container shutdown {
                presence "enable shutdown";
                description "Shutdown";
                uses apply-advanced;
    
                leaf notify-message {
                  type string;
                  description
                    "Notification message";
                }
              }  // container shutdown
    
              leaf unconfigured-peer-graceful-restart {
                junos:must "(".. graceful-restart")";
                junos:must-message "unconfigured-peer-graceful-restart is only valid with 'graceful-restart'";
                type empty;
                description
                  "BGP unconfigured peer graceful restart options";
              }
    
              container graceful-restart {
                presence
                  "enable graceful-restart";
                description
                  "BGP graceful restart options";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable graceful restart";
                  }
                }  // choice enable-disable
    
                leaf restart-time {
                  junos:must "(("routing-options graceful-restart" || "fabric routing-options graceful-restart"))";
                  junos:must-message "restart-time is only valid with 'routing-options graceful-restart'";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1800";
                    }
                  }
                  description
                    "Restart time used when negotiating with a peer";
                }
    
                leaf stale-routes-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1800";
                    }
                  }
                  description
                    "Maximum time for which stale routes are kept";
                }
    
                container long-lived {
                  description
                    "Long-lived graceful restart options";
                  uses apply-advanced;
    
                  container receiver {
                    description
                      "Long-lived graceful restart receiver (helper) options";
                    uses apply-advanced;
    
                    choice enable-disable {
                      leaf disable {
                        type empty;
                        description
                          "Disable receiver (helper) functionality";
                      }
                    }  // choice enable-disable
                  }  // container receiver
    
                  container advertise-to-non-llgr-neighbor {
                    presence
                      "enable advertise-to-non-llgr-neighbor";
                    description
                      "Advertise stale routes to non-LLGR neighbors";
                    uses apply-advanced;
    
                    leaf omit-no-export {
                      type empty;
                      description
                        "Do not attach no-export community to stale routes";
                    }
                  }  // container advertise-to-non-llgr-neighbor
                }  // container long-lived
    
                leaf disable-notification-extensions {
                  type empty;
                  description
                    "Disable notification extensions";
                }
    
                leaf forwarding-state-bit {
                  type enumeration {
                    enum "as-rr-client" {
                      value 0;
                      description
                        "As for a route reflector client";
                    }
                    enum "from-fib" {
                      value 1;
                      description
                        "Always use state of associated FIB(s)";
                    }
                  }
                  description
                    "Control forwarding-state flag negotiation";
                }
    
                leaf dont-help-shared-fate-bfd-down {
                  type empty;
                  description
                    "Honor BFD-Down(C=0) if GR-restart not in progress";
                }
              }  // container graceful-restart
    
              leaf include-mp-next-hop {
                type empty;
                description
                  "Include NEXT-HOP attribute in multiprotocol updates";
              }
    
              leaf disable-4byte-as {
                type empty;
                description
                  "Disable 4 byte AS capability advertisement";
              }
    
              container idle-after-switch-over {
                description
                  "Stop peer session from coming up after nonstop-routing switch-over";
                choice idle-interval {
                  leaf forever {
                    type empty;
                    description
                      "Idle the peer until the user intervenes";
                  }
                  leaf timeout {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    description
                      "Timeout value, in seconds, for starting peer after switch over";
                  }
                }  // choice idle-interval
              }  // container idle-after-switch-over
    
              container outbound-route-filter {
                junos:must "(!("system processes routing bgp update-threading"))";
                junos:must-message "Can't be configured together with update-threading";
                description
                  "Dynamically negotiated cooperative route filtering";
                uses apply-advanced;
    
                leaf bgp-orf-cisco-mode {
                  type empty;
                  description
                    "Using BGP ORF capability code 130 and Prefix ORF type 128";
                }
    
                container extended-community {
                  status deprecated;
                  description
                    "Extended community filtering";
                  uses apply-advanced;
    
                  choice accept-choice {
                    leaf accept {
                      type empty;
                      description
                        "Honor remote requests for extended community ORF";
                    }
                    leaf no-accept {
                      type empty;
                      description
                        "Don't honor remote requests for extended community ORF";
                    }
                  }  // choice accept-choice
    
                  leaf vrf-filter {
                    type empty;
                    description
                      "Request remote filtering using locally configured VRF import targets";
                  }
                }  // container extended-community
    
                container prefix-based {
                  presence "enable prefix-based";
                  description
                    "Prefix-based outbound route filtering";
                  uses apply-advanced;
    
                  container accept {
                    presence "enable accept";
                    description
                      "Honor Prefix-based ORFs from remote peers";
                    uses apply-advanced;
    
                    leaf inet {
                      type empty;
                      description
                        "Honor IPv4 prefix filters";
                    }
    
                    leaf inet6 {
                      type empty;
                      description
                        "Honor IPv6 prefix filters";
                    }
                  }  // container accept
                }  // container prefix-based
              }  // container outbound-route-filter
    
              container message-batching {
                status deprecated;
                description
                  "DEPRECATED - Batching of outgoing messages";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf enable {
                    type empty;
                    description
                      "Enable parameter";
                  }
                  leaf disable {
                    type empty;
                    description
                      "Disable parameter";
                  }
                }  // choice enable-disable
    
                leaf interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "100 .. 1000";
                    }
                  }
                  units "milliseconds";
                  default "250";
                  description
                    "DEPRECATED - Interval over which to batch messages";
                }
              }  // container message-batching
    
              container multipath {
                presence "enable multipath";
                description
                  "Allow load sharing among multiple BGP paths";
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable Multipath";
                }
    
                leaf multiple-as {
                  type empty;
                  description
                    "Use paths received from different ASs";
                }
    
                leaf allow-protection {
                  type empty;
                  description
                    "Allow protection for multipath legs";
                }
    
                leaf pause-computation-during-churn {
                  type empty;
                  description
                    "Pause multipath job to absorb churn";
                }
    
                leaf list-nexthop {
                  type empty;
                  description
                    "Use List-NH for homogenous nexthop-set also";
                }
              }  // container multipath
    
              leaf tcp-mss {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4096";
                  }
                }
                description
                  "Maximum TCP segment size";
              }
    
              leaf bgp-identifier {
                type jt:ipv4addr;
                description "BGP Identifier";
              }
    
              leaf tcp-aggressive-transmission {
                type empty;
                description
                  "Enable aggressive transmission of pure TCP ACKs and retransmissions";
              }
    
              container bmp {
                description
                  "Specific settings to override the routing-options settings";
                uses apply-advanced;
    
                leaf monitor {
                  type enumeration {
                    enum "enable" {
                      value 0;
                      description
                        "Enable monitoring of BGP peer(s)";
                    }
                    enum "disable" {
                      value 1;
                      description
                        "Disable monitoring of BGP peer(s)";
                    }
                  }
                  description
                    "Enable/Disable monitoring";
                }
    
                container route-monitoring {
                  description
                    "Control route monitoring settings";
                  uses apply-advanced;
    
                  leaf none {
                    junos:must "((!(".. pre-policy") && (!(".. post-policy") && !(".. rib-out"))))";
                    junos:must-message "May not be configured with pre-policy or post-policy or rib-out";
                    type empty;
                    description
                      "Do not send route monitoring messages";
                  }
    
                  container pre-policy {
                    presence "enable pre-policy";
                    description
                      "Send pre-policy route monitoring messages";
                    leaf exclude-non-feasible {
                      type empty;
                      description
                        "Exclude looped routes, etc";
                    }
                  }  // container pre-policy
    
                  container post-policy {
                    presence
                      "enable post-policy";
                    description
                      "Send post-policy route monitoring messages";
                    leaf exclude-non-eligible {
                      type empty;
                      description
                        "Exclude unresolved routes, etc.";
                    }
                  }  // container post-policy
    
                  container rib-out {
                    junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                    junos:must-message "Update threading can't be configured together with bmp rib-out monitoring";
                    presence "enable rib-out";
                    description
                      "Send adj-ribs-out route monitoring messages";
                    leaf pre-policy {
                      type empty;
                      description
                        "Send pre-policy adj-ribs-out route monitoring messages";
                    }
    
                    leaf post-policy {
                      type empty;
                      description
                        "Send post-policy adj-ribs-out route monitoring messages";
                    }
                  }  // container rib-out
                }  // container route-monitoring
              }  // container bmp
    
              container advertise-bgp-static {
                presence
                  "enable advertise-bgp-static";
                description
                  "Advertise bgp-static routes";
                uses apply-advanced;
    
                leaf-list policy {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Static route advertisement policy";
                }
              }  // container advertise-bgp-static
    
              leaf add-path-display-ipv4-address {
                type empty;
                description
                  "Display add-path path-id in IPv4 address format";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
    
                leaf session-mode {
                  type enumeration {
                    enum "automatic" {
                      value 0;
                      description
                        "Choose session-mode automatically";
                    }
                    enum "single-hop" {
                      value 1;
                      description
                        "Use single-hop";
                    }
                    enum "multihop" {
                      value 2;
                      description "Use multihop";
                    }
                  }
                  default "automatic";
                  description
                    "BFD single-hop or multihop session-mode";
                }
    
                leaf holddown-interval {
                  junos:must "(!(".. .. .. type internal"))";
                  junos:must-message "bfd holddown-interval is only valid for EBGP.";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold the session-UP notification to the client";
                }
              }  // container bfd-liveness-detection
    
              leaf as-override {
                type empty;
                description
                  "Replace neighbor AS number with our AS number";
              }
    
              container egress-te-node-segment {
                description
                  "Configure BGP-Peer-Node segment";
                uses apply-advanced;
    
                container label {
                  description
                    "BGP-Peer-Node SID label from static label pool";
                  uses apply-advanced;
    
                  leaf label-value {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "16 .. 1048575";
                      }
                    }
                    description
                      "BGP-Peer-Node SID label value from static label pool";
                  }
                }  // container label
    
                container egress-te-set {
                  description
                    "Configure as a member of a SET segment";
                  uses apply-advanced;
    
                  leaf set-name {
                    junos:must "("protocols bgp egress-te-set-segment $$")";
                    junos:must-message "protocols bgp egress-te-set-segment not configured";
                    type string {
                      junos:posix-pattern "^.{1,64}$";
                      junos:pattern-message "Must be a string of 64 characters or less";
                    }
                    description "Set name";
                  }
    
                  leaf weight {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    description
                      "Weight for set segment";
                  }
                }  // container egress-te-set
    
                container egress-te-backup-segment {
                  description
                    "Backup segment for FRR";
                  uses apply-advanced;
    
                  container label {
                    description
                      "Backup segment label from static label pool";
                    uses apply-advanced;
    
                    leaf label-value {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Backup segment label value from static label pool";
                    }
                  }  // container label
                }  // container egress-te-backup-segment
    
                container egress-te-backup-ip-forward {
                  presence
                    "enable egress-te-backup-ip-forward";
                  description
                    "Use IP-forward backup path for Egress TE";
                  uses apply-advanced;
    
                  leaf instance-name {
                    type string {
                      junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                      junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                    }
                    description
                      "Routing-instance to use as IP forward backup-path";
                  }
                }  // container egress-te-backup-ip-forward
              }  // container egress-te-node-segment
    
              list egress-te-adj-segment {
                key "name";
                description
                  "Configure BGP-Peer-Adj segment";
                leaf name {
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be a string of 64 characters or less";
                  }
                  description
                    "The BGP-Adj-Set segment name";
                }
    
                uses apply-advanced;
    
                container label {
                  junos:must "(".. next-hop")";
                  junos:must-message "The 'egress-te-adj-segment next-hop' must be configured";
                  description
                    "BGP-Peer-Adj SID label from static label pool";
                  uses apply-advanced;
    
                  leaf label-value {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "16 .. 1048575";
                      }
                    }
                    description
                      "BGP-Peer-Adj SID label value from static label pool";
                  }
                }  // container label
    
                container next-hop {
                  junos:must "(".. label")";
                  junos:must-message "The 'egress-te-adj-segment label' must be configured";
                  description
                    "Address of directly connected next-hop to use";
                  uses apply-advanced;
    
                  leaf next-hop-addr {
                    type jt:ipaddr;
                    description
                      "Address of directly connected next-hop";
                  }
                }  // container next-hop
    
                container egress-te-set {
                  description
                    "Configure as a member of a SET segment";
                  uses apply-advanced;
    
                  leaf set-name {
                    junos:must "("protocols bgp egress-te-set-segment $$")";
                    junos:must-message "protocols bgp egress-te-set-segment not configured";
                    type string {
                      junos:posix-pattern "^.{1,64}$";
                      junos:pattern-message "Must be a string of 64 characters or less";
                    }
                    description "Set name";
                  }
    
                  leaf weight {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    description
                      "Weight for set segment";
                  }
                }  // container egress-te-set
    
                container egress-te-backup-segment {
                  description
                    "Backup segment for FRR";
                  uses apply-advanced;
    
                  container label {
                    description
                      "Backup segment label from static label pool";
                    uses apply-advanced;
    
                    leaf label-value {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Backup segment label value from static label pool";
                    }
                  }  // container label
                }  // container egress-te-backup-segment
    
                container egress-te-backup-ip-forward {
                  presence
                    "enable egress-te-backup-ip-forward";
                  description
                    "Use IP-forward backup path for Egress TE";
                  uses apply-advanced;
    
                  leaf instance-name {
                    type string {
                      junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
                      junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
                    }
                    description
                      "Routing-instance to use as IP forward backup-path";
                  }
                }  // container egress-te-backup-ip-forward
    
                container te-link-attribute {
                  presence
                    "enable te-link-attribute";
                  description "Link attribute";
                  uses apply-advanced;
    
                  leaf te-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    default "1";
                    description
                      "TE Metric value";
                  }
    
                  leaf igp-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16777215";
                      }
                    }
                    default "1";
                    description
                      "IGP Metric value";
                  }
    
                  leaf-list admin-group {
                    type string;
                    max-elements 16;
                    ordered-by user;
                    description
                      "Administrative groups";
                  }
                }  // container te-link-attribute
              }  // list egress-te-adj-segment
    
              leaf vpn-apply-export {
                type empty;
                description
                  "Apply BGP export policy when exporting VPN routes";
              }
    
              container egress-te {
                presence "enable egress-te";
                description
                  "Use Egress Peering traffic engineering";
                uses apply-advanced;
    
                leaf install-address {
                  type jt:ipaddr;
                  description
                    "Address to use in egress-te created inet route";
                }
    
                container rib {
                  description
                    "Select primary table for Egress-TE routes";
                  uses apply-advanced;
    
                  leaf inet.0 {
                    type empty;
                    description
                      "Install Egress-TE routes in inet.0";
                  }
    
                  leaf inet6.0 {
                    type empty;
                    description
                      "Install Egress-TE routes in inet6.0";
                  }
                }  // container rib
    
                leaf no-install {
                  type empty;
                  description
                    "Avoid installation to FIB or resolving over";
                }
    
                leaf-list import {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Import policy to set attributes";
                }
    
                leaf backup-path {
                  junos:must "("protocols bgp egress-te-backup-paths template $$")";
                  junos:must-message "bgp egress-te-backup-paths template not configured";
                  type string {
                    junos:posix-pattern "^.{1,64}$";
                    junos:pattern-message "Must be a string of 64 characters or less";
                  }
                  description
                    "The 'egress-te-backup-paths template' to use for this peer";
                }
              }  // container egress-te
    
              leaf advertise-prefix-sid {
                type empty;
                description
                  "Advertise prefix sid to E-BGP peers";
              }
    
              leaf accept-prefix-sid {
                type empty;
                description
                  "Accept prefix sid from E-BGP peers";
              }
    
              leaf advertise-srgb {
                type empty;
                description "Advertise SRGB TLV";
              }
    
              leaf tcp-connect-port {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "TCP port number to connect with peer on";
              }
            }  // list neighbor
    
            leaf vpn-apply-export {
              type empty;
              description
                "Apply BGP export policy when exporting VPN routes";
            }
    
            container egress-te {
              presence "enable egress-te";
              description
                "Use Egress Peering traffic engineering";
              uses apply-advanced;
    
              leaf install-address {
                type jt:ipaddr;
                description
                  "Address to use in egress-te created inet route";
              }
    
              container rib {
                description
                  "Select primary table for Egress-TE routes";
                uses apply-advanced;
    
                leaf inet.0 {
                  type empty;
                  description
                    "Install Egress-TE routes in inet.0";
                }
    
                leaf inet6.0 {
                  type empty;
                  description
                    "Install Egress-TE routes in inet6.0";
                }
              }  // container rib
    
              leaf no-install {
                type empty;
                description
                  "Avoid installation to FIB or resolving over";
              }
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy to set attributes";
              }
    
              leaf backup-path {
                junos:must "("protocols bgp egress-te-backup-paths template $$")";
                junos:must-message "bgp egress-te-backup-paths template not configured";
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of 64 characters or less";
                }
                description
                  "The 'egress-te-backup-paths template' to use for this peer";
              }
            }  // container egress-te
    
            leaf advertise-prefix-sid {
              type empty;
              description
                "Advertise prefix sid to E-BGP peers";
            }
    
            leaf accept-prefix-sid {
              type empty;
              description
                "Accept prefix sid from E-BGP peers";
            }
    
            leaf advertise-srgb {
              type empty;
              description "Advertise SRGB TLV";
            }
    
            leaf tcp-connect-port {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              description
                "TCP port number to connect with peer on";
            }
          }  // list group
    
          container traffic-statistics-labeled-path {
            presence
              "enable traffic-statistics-labeled-path";
            description
              "Collect periodic ingress labeled statistics for BGP label-switched paths ";
            uses apply-advanced;
    
            container file {
              description
                "Statistics file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            leaf interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "60 .. 65535";
                }
              }
              units "seconds";
              description
                "Time interval to collect statistics";
            }
          }  // container traffic-statistics-labeled-path
    
          container source-packet-routing {
            description
              "Enable Source Packet Routing (SPRING)";
            uses apply-advanced;
    
            container srgb {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              junos:must "(".. .. .. .. protocols mpls ")";
              junos:must-message "SPRING configuration is not allowed without 'protocols mpls'";
              description
                "Set the SRGB global block in SPRING";
              leaf start-label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Start range for SRGB label block";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Index to the SRGB start label block";
              }
            }  // container srgb
    
            container srv6 {
              description
                "Enable IPv6 Segment Routing (SRv6)";
              uses apply-advanced;
    
              list locator {
                key "name";
                ordered-by user;
                description "SRv6 Locator";
                leaf name {
                  junos:must "("routing-options source-packet-routing srv6 locator $$")";
                  junos:must-message "Referenced srv6 locator must be defined";
                  type string;
                  description "Locator name";
                }
    
                uses apply-advanced;
    
                leaf end-dt4-sid {
                  type jt:ipv6addr;
                  description
                    "End dt4 sid with 128 bit address";
                }
    
                leaf end-dt6-sid {
                  type jt:ipv6addr;
                  description
                    "End dt6 sid with 128 bit address";
                }
              }  // list locator
            }  // container srv6
          }  // container source-packet-routing
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable BGP";
            }
          }  // choice enable-disable
    
          choice precision-timers-choice {
            leaf precision-timers {
              type empty;
              description
                "Use precision timers for scheduling keepalives";
            }
            leaf no-precision-timers {
              type empty;
              description
                "Don't use precision timers for scheduling keepalives";
            }
          }  // choice precision-timers-choice
    
          container snmp-options {
            description
              "Customize SNMP behaviors specifically for BGP MIBs";
            uses apply-advanced;
    
            leaf backward-traps-only-from-established {
              type empty;
              description
                "Limit traps for backward transitions to only those moving from Established state.";
            }
    
            leaf emit-inet-address-length-in-oid {
              type empty;
              description
                "Emit Length in OID for InetAddress MIB type.";
            }
          }  // container snmp-options
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          leaf prioritize-route-queueing {
            type empty;
            description
              "Let route-queue building happen without getting throttled";
          }
    
          container traceoptions {
            description "Trace options for BGP";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "damping" {
                    value 0;
                    description
                      "Trace BGP damping information";
                  }
                  enum "packets" {
                    value 1;
                    description
                      "Trace all BGP protocol packets";
                  }
                  enum "open" {
                    value 2;
                    description
                      "Trace BGP open packets";
                  }
                  enum "update" {
                    value 3;
                    description
                      "Trace BGP update packets";
                  }
                  enum "keepalive" {
                    value 4;
                    description
                      "Trace BGP keepalive packets";
                  }
                  enum "refresh" {
                    value 5;
                    description
                      "Trace BGP refresh packets";
                  }
                  enum "nsr-synchronization" {
                    value 6;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "bfd" {
                    value 7;
                    description
                      "Trace BFD events";
                  }
                  enum "4byte-as" {
                    value 8;
                    description
                      "Trace 4 byte AS events";
                  }
                  enum "add-path" {
                    value 9;
                    description
                      "Trace add-path events";
                  }
                  enum "graceful-restart" {
                    value 10;
                    description
                      "Trace Graceful Restart events";
                  }
                  enum "egress-te" {
                    value 11;
                    description
                      "Egress Peering Traffic-Engineering events";
                  }
                  enum "thread-io" {
                    value 12;
                    description
                      "Trace threaded I/O processing";
                  }
                  enum "sharding" {
                    value 13;
                    description
                      "Trace BGP rib sharding";
                  }
                  enum "thread-update-io" {
                    value 14;
                    description
                      "Trace threaded update I/O processing";
                  }
                  enum "route-validation" {
                    value 15;
                    description
                      "Trace route validation";
                  }
                  enum "ipsec" {
                    value 16;
                    description "Trace ipsec";
                  }
                  enum "route" {
                    value 17;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 18;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 19;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 20;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 21;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 22;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 23;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 24;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
    
              container filter {
                presence "enable filter";
                description
                  "Filter to apply to this flag";
                uses bgp_filter_obj;
              }  // container filter
            }  // list flag
          }  // container traceoptions
    
          leaf description {
            type string {
              length "1 .. 255";
            }
            description "Text description";
          }
    
          container metric-out {
            description
              "Route metric sent in MED";
            choice metric_param {
              leaf metric-value {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                description "Metric value";
              }
              container minimum-igp {
                presence "enable minimum-igp";
                description
                  "Track the minimum IGP metric";
                leaf metric-offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-igp
              container igp {
                presence "enable igp";
                description
                  "Track the IGP metric";
                leaf metric-offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
    
                leaf delay-med-update {
                  type empty;
                  description
                    "Delay updating MED when IGP metric increases";
                }
              }  // container igp
              container effective-aigp {
                presence "enable effective-aigp";
                description
                  "Track the effective AIGP metric";
                leaf metric-offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container effective-aigp
              container minimum-effective-aigp {
                presence
                  "enable minimum-effective-aigp";
                description
                  "Track the minimum effective AIGP metric";
                leaf metric-offset {
                  type union {
                    type int32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Metric offset for MED";
                }
              }  // container minimum-effective-aigp
            }  // choice metric_param
          }  // container metric-out
    
          container multihop {
            presence "enable multihop";
            description
              "Configure an EBGP multihop session";
            uses apply-advanced;
    
            leaf ttl {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 255";
                }
              }
              description
                "TTL value for the session";
            }
    
            leaf no-nexthop-change {
              type empty;
              description
                "Do not change next hop to self in advertisements";
            }
          }  // container multihop
    
          leaf route-server-client {
            type empty;
            description
              "Enable route server client behavior";
          }
    
          leaf accept-remote-nexthop {
            type empty;
            description
              "Allow import policy to specify a non-directly connected next-hop";
          }
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Preference value";
          }
    
          leaf local-preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Value of LOCAL_PREF path attribute";
          }
    
          leaf local-address {
            type jt:ipaddr;
            description
              "Address of local end of BGP session";
          }
    
          leaf local-interface {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Local interface for IPv6 link local EBGP peering";
          }
    
          leaf forwarding-context {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description
              "Routing-instance used for data-forwarding and transport-session";
          }
    
          leaf hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 65535";
              }
            }
            description
              "Hold time used when negotiating with a peer";
          }
    
          leaf minimum-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "3 .. 65535";
              }
            }
            description
              "Minimum hold time accepted from the peer";
          }
    
          leaf passive {
            type empty;
            description
              "Do not send open messages to a peer";
          }
    
          leaf advertise-inactive {
            type empty;
            description
              "Advertise inactive routes";
          }
    
          choice advertise-peer-as-choice {
            leaf advertise-peer-as {
              type empty;
              description
                "Advertise routes received from the same autonomous system";
            }
            leaf no-advertise-peer-as {
              type empty;
              description
                "Don't advertise routes received from the same autonomous system";
            }
          }  // choice advertise-peer-as-choice
    
          container advertise-external {
            presence "enable advertise-external";
            description
              "Advertise best external routes";
            leaf conditional {
              type empty;
              description
                "Route matches active route upto med-comparison rule";
            }
          }  // container advertise-external
    
          leaf keep {
            type enumeration {
              enum "all" {
                value 0;
                description "Retain all routes";
              }
              enum "none" {
                value 1;
                description "Retain no routes";
              }
            }
            description
              "How to retain routes in the routing table";
          }
    
          leaf rfc6514-compliant-safi129 {
            type empty;
            description
              "Compliant with RFC6514 SAFI129 format";
          }
    
          leaf no-aggregator-id {
            type empty;
            description
              "Set router ID in aggregator path attribute to 0";
          }
    
          leaf mtu-discovery {
            type empty;
            description
              "Enable TCP path MTU discovery";
          }
    
          leaf enforce-first-as {
            type empty;
            description
              "Enforce first AS in AS-path is the neighbor's AS";
          }
    
          leaf out-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 65535";
              }
            }
            description
              "How long before exporting routes from routing table";
          }
    
          leaf ttl {
            junos:must "((!(".. .. type internal") && !(".. multihop")))";
            junos:must-message "This option is valid only for single-hop EBGP neighbor";
            type enumeration {
              enum "1" {
                value 0;
              }
              enum "255" {
                value 1;
              }
            }
            description
              "TTL value for the single-hop peer";
          }
    
          leaf log-updown {
            type empty;
            description
              "Log a message for peer state transitions";
          }
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf-list nlri {
            type enumeration {
              enum "unicast" {
                value 0;
                status deprecated;
                description
                  "Include unicast NLRI";
              }
              enum "multicast" {
                value 1;
                status deprecated;
                description
                  "Include multicast NLRI";
              }
              enum "any" {
                value 2;
                status deprecated;
                description
                  "Include any kind of NLRI";
              }
            }
            ordered-by user;
            status deprecated;
            description
              "NLRI type to include in updates";
          }
    
          container bgp-error-tolerance {
            presence
              "enable bgp-error-tolerance";
            description
              "Handle BGP malformed updates softly";
            uses apply-advanced;
    
            leaf malformed-update-log-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "10 .. 65535";
                }
              }
              units "seconds";
              default "300";
              description
                "Time used when logging malformed update";
            }
    
            choice malformed-routes-limit-choice {
              leaf malformed-route-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                default "1000";
                description
                  "Maximum number of malformed routes from a peer";
              }
              leaf no-malformed-route-limit {
                type empty;
                description
                  "No malformed route limit";
              }
            }  // choice malformed-routes-limit-choice
          }  // container bgp-error-tolerance
    
          leaf authentication-key {
            type string {
              length "1 .. 126";
            }
            description "MD5 authentication key";
          }
    
          leaf authentication-algorithm {
            junos:must "(".. authentication-key-chain")";
            junos:must-message "May not be configured without authentication-key-chain";
            junos:must "(!(".. authentication-key"))";
            junos:must-message "May not be configured with authentication-key";
            type enumeration {
              enum "md5" {
                value 0;
                description "Message Digest 5";
              }
              enum "hmac-sha-1-96" {
                value 1;
                description
                  "Hash-based Message Authentication Code (SHA1) (96 bits)";
              }
              enum "aes-128-cmac-96" {
                value 2;
                description
                  "Cipher-based Message Authentication Code (AES128) (96 bits)";
              }
              enum "ao" {
                value 3;
                description
                  "TCP Authentication Option";
              }
            }
            default "hmac-sha-1-96";
            description
              "Authentication algorithm name";
          }
    
          leaf tcpao-handling-with-digest-mismatch {
            junos:must "(!(".. authentication-key"))";
            junos:must-message "May not be configured with authentication-key";
            type enumeration {
              enum "drop-if-no-tcpao" {
                value 0;
                description
                  "Drop the connection if Digest mismatched";
              }
              enum "allow-without-tcpao" {
                value 1;
                description
                  "Allow the connection establishment without TCP-AO";
              }
            }
            description
              "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
          }
    
          leaf authentication-key-chain {
            junos:must "(!(".. authentication-key"))";
            junos:must-message "May not be configured with authentication-key";
            junos:must "("security authentication-key-chains key-chain $$")";
            junos:must-message "Referenced key-chain must be defined";
            type string {
              length "1 .. 128";
            }
            description "Key chain name";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          container remove-private {
            presence "enable remove-private";
            description
              "Remove well-known private AS numbers";
            uses apply-advanced;
    
            container all {
              presence "enable all";
              description
                "Remove all private AS numbers and do not stop at the first public AS number";
              container replace {
                presence "enable replace";
                description
                  "Replace private AS numbers with the BGP Group's local AS number";
                leaf nearest {
                  type empty;
                  description
                    "Use closest public AS number to replace a private AS number";
                }
              }  // container replace
            }  // container all
    
            leaf no-peer-loop-check {
              type empty;
              description
                "Remove peer loop-check";
            }
          }  // container remove-private
    
          leaf cluster {
            type jt:areaid;
            description "Cluster identifier";
          }
    
          leaf no-client-reflect {
            type empty;
            description
              "Disable intracluster route redistribution";
          }
    
          leaf peer-as {
            type string {
              junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
              junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
            }
            description
              " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
          }
    
          container local-as {
            description
              "Local autonomous system number";
            leaf as-number {
              type string {
                junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
              }
              description
                " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
            }
    
            leaf loops {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 10";
                }
              }
              description
                "Maximum number of times this AS can be in an AS path";
            }
    
            leaf private {
              type empty;
              description
                "Hide this local AS in paths learned from this peering";
            }
    
            leaf alias {
              type empty;
              description
                "Treat this AS as an alias to the system AS";
            }
    
            leaf no-prepend-global-as {
              type empty;
              description
                "Do not prepend global autonomous-system number in advertised paths";
            }
          }  // container local-as
    
          leaf ipsec-sa {
            junos:must "("security ipsec security-association $$")";
            junos:must-message "Referenced IPSec Security Association must be defined";
            type string {
              length "1 .. 32";
            }
            description "IPSec SA name";
          }
    
          container graceful-shutdown {
            description
              "BGP peer graceful shutdown option";
            uses apply-advanced;
    
            container receiver {
              presence "enable receiver";
              description
                "BGP peer graceful-shutdown receiver";
              uses apply-advanced;
    
              leaf disable {
                junos:must "(!(".. .. sender"))";
                junos:must-message "Receiver cannot be disabled on Sender";
                type empty;
                description
                  "Disable graceful-shutdown receiver";
              }
    
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Value of receiver LOCAL_PREF path attribute";
              }
            }  // container receiver
    
            container sender {
              presence "enable sender";
              description
                "BGP peer graceful-shutdown sender";
              uses apply-advanced;
    
              leaf local-preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Value of sender LOCAL_PREF path attribute";
              }
            }  // container sender
          }  // container graceful-shutdown
    
          container shutdown {
            presence "enable shutdown";
            description "Shutdown";
            uses apply-advanced;
    
            leaf notify-message {
              type string;
              description "Notification message";
            }
          }  // container shutdown
    
          leaf unconfigured-peer-graceful-restart {
            junos:must "(".. graceful-restart")";
            junos:must-message "unconfigured-peer-graceful-restart is only valid with 'graceful-restart'";
            type empty;
            description
              "BGP unconfigured peer graceful restart options";
          }
    
          container graceful-restart {
            presence "enable graceful-restart";
            description
              "BGP graceful restart options";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-time {
              junos:must "(("routing-options graceful-restart" || "fabric routing-options graceful-restart"))";
              junos:must-message "restart-time is only valid with 'routing-options graceful-restart'";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1800";
                }
              }
              description
                "Restart time used when negotiating with a peer";
            }
    
            leaf stale-routes-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1800";
                }
              }
              description
                "Maximum time for which stale routes are kept";
            }
    
            container long-lived {
              description
                "Long-lived graceful restart options";
              uses apply-advanced;
    
              container receiver {
                description
                  "Long-lived graceful restart receiver (helper) options";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable receiver (helper) functionality";
                  }
                }  // choice enable-disable
              }  // container receiver
    
              container advertise-to-non-llgr-neighbor {
                presence
                  "enable advertise-to-non-llgr-neighbor";
                description
                  "Advertise stale routes to non-LLGR neighbors";
                uses apply-advanced;
    
                leaf omit-no-export {
                  type empty;
                  description
                    "Do not attach no-export community to stale routes";
                }
              }  // container advertise-to-non-llgr-neighbor
            }  // container long-lived
    
            leaf disable-notification-extensions {
              type empty;
              description
                "Disable notification extensions";
            }
    
            leaf forwarding-state-bit {
              type enumeration {
                enum "as-rr-client" {
                  value 0;
                  description
                    "As for a route reflector client";
                }
                enum "from-fib" {
                  value 1;
                  description
                    "Always use state of associated FIB(s)";
                }
              }
              description
                "Control forwarding-state flag negotiation";
            }
    
            leaf dont-help-shared-fate-bfd-down {
              type empty;
              description
                "Honor BFD-Down(C=0) if GR-restart not in progress";
            }
          }  // container graceful-restart
    
          leaf include-mp-next-hop {
            type empty;
            description
              "Include NEXT-HOP attribute in multiprotocol updates";
          }
    
          leaf disable-4byte-as {
            type empty;
            description
              "Disable 4 byte AS capability advertisement";
          }
    
          container idle-after-switch-over {
            description
              "Stop peer session from coming up after nonstop-routing switch-over";
            choice idle-interval {
              leaf forever {
                type empty;
                description
                  "Idle the peer until the user intervenes";
              }
              leaf timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Timeout value, in seconds, for starting peer after switch over";
              }
            }  // choice idle-interval
          }  // container idle-after-switch-over
    
          container outbound-route-filter {
            junos:must "(!("system processes routing bgp update-threading"))";
            junos:must-message "Can't be configured together with update-threading";
            description
              "Dynamically negotiated cooperative route filtering";
            uses apply-advanced;
    
            leaf bgp-orf-cisco-mode {
              type empty;
              description
                "Using BGP ORF capability code 130 and Prefix ORF type 128";
            }
    
            container extended-community {
              status deprecated;
              description
                "Extended community filtering";
              uses apply-advanced;
    
              choice accept-choice {
                leaf accept {
                  type empty;
                  description
                    "Honor remote requests for extended community ORF";
                }
                leaf no-accept {
                  type empty;
                  description
                    "Don't honor remote requests for extended community ORF";
                }
              }  // choice accept-choice
    
              leaf vrf-filter {
                type empty;
                description
                  "Request remote filtering using locally configured VRF import targets";
              }
            }  // container extended-community
    
            container prefix-based {
              presence "enable prefix-based";
              description
                "Prefix-based outbound route filtering";
              uses apply-advanced;
    
              container accept {
                presence "enable accept";
                description
                  "Honor Prefix-based ORFs from remote peers";
                uses apply-advanced;
    
                leaf inet {
                  type empty;
                  description
                    "Honor IPv4 prefix filters";
                }
    
                leaf inet6 {
                  type empty;
                  description
                    "Honor IPv6 prefix filters";
                }
              }  // container accept
            }  // container prefix-based
          }  // container outbound-route-filter
    
          container message-batching {
            status deprecated;
            description
              "DEPRECATED - Batching of outgoing messages";
            uses apply-advanced;
    
            choice enable-disable {
              leaf enable {
                type empty;
                description "Enable parameter";
              }
              leaf disable {
                type empty;
                description "Disable parameter";
              }
            }  // choice enable-disable
    
            leaf interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "100 .. 1000";
                }
              }
              units "milliseconds";
              default "250";
              description
                "DEPRECATED - Interval over which to batch messages";
            }
          }  // container message-batching
    
          container multipath {
            presence "enable multipath";
            description
              "Allow load sharing among multiple BGP paths";
            uses apply-advanced;
    
            leaf disable {
              type empty;
              description "Disable Multipath";
            }
    
            leaf multiple-as {
              type empty;
              description
                "Use paths received from different ASs";
            }
    
            leaf allow-protection {
              type empty;
              description
                "Allow protection for multipath legs";
            }
    
            leaf pause-computation-during-churn {
              type empty;
              description
                "Pause multipath job to absorb churn";
            }
    
            leaf list-nexthop {
              type empty;
              description
                "Use List-NH for homogenous nexthop-set also";
            }
          }  // container multipath
    
          leaf tcp-mss {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 4096";
              }
            }
            description
              "Maximum TCP segment size";
          }
    
          leaf bgp-identifier {
            type jt:ipv4addr;
            description "BGP Identifier";
          }
    
          leaf tcp-aggressive-transmission {
            type empty;
            description
              "Enable aggressive transmission of pure TCP ACKs and retransmissions";
          }
    
          container bmp {
            description
              "Specific settings to override the routing-options settings";
            uses apply-advanced;
    
            leaf monitor {
              type enumeration {
                enum "enable" {
                  value 0;
                  description
                    "Enable monitoring of BGP peer(s)";
                }
                enum "disable" {
                  value 1;
                  description
                    "Disable monitoring of BGP peer(s)";
                }
              }
              description
                "Enable/Disable monitoring";
            }
    
            container route-monitoring {
              description
                "Control route monitoring settings";
              uses apply-advanced;
    
              leaf none {
                junos:must "((!(".. pre-policy") && (!(".. post-policy") && !(".. rib-out"))))";
                junos:must-message "May not be configured with pre-policy or post-policy or rib-out";
                type empty;
                description
                  "Do not send route monitoring messages";
              }
    
              container pre-policy {
                presence "enable pre-policy";
                description
                  "Send pre-policy route monitoring messages";
                leaf exclude-non-feasible {
                  type empty;
                  description
                    "Exclude looped routes, etc";
                }
              }  // container pre-policy
    
              container post-policy {
                presence "enable post-policy";
                description
                  "Send post-policy route monitoring messages";
                leaf exclude-non-eligible {
                  type empty;
                  description
                    "Exclude unresolved routes, etc.";
                }
              }  // container post-policy
    
              container rib-out {
                junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                junos:must-message "Update threading can't be configured together with bmp rib-out monitoring";
                presence "enable rib-out";
                description
                  "Send adj-ribs-out route monitoring messages";
                leaf pre-policy {
                  type empty;
                  description
                    "Send pre-policy adj-ribs-out route monitoring messages";
                }
    
                leaf post-policy {
                  type empty;
                  description
                    "Send post-policy adj-ribs-out route monitoring messages";
                }
              }  // container rib-out
            }  // container route-monitoring
          }  // container bmp
    
          container advertise-bgp-static {
            presence
              "enable advertise-bgp-static";
            description
              "Advertise bgp-static routes";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Static route advertisement policy";
            }
          }  // container advertise-bgp-static
    
          leaf add-path-display-ipv4-address {
            type empty;
            description
              "Display add-path path-id in IPv4 address format";
          }
    
          container bfd-liveness-detection {
            description
              "Bidirectional Forwarding Detection (BFD) options";
            uses apply-advanced;
    
            leaf version {
              type enumeration {
                enum "0" {
                  value 0;
                  description
                    "BFD version 0 (deprecated)";
                }
                enum "1" {
                  value 1;
                  description "BFD version 1";
                }
                enum "automatic" {
                  value 2;
                  description
                    "Choose BFD version automatically";
                }
              }
              default "automatic";
              description
                "BFD protocol version number";
            }
    
            leaf minimum-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum transmit and receive interval";
            }
    
            leaf minimum-transmit-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              status deprecated;
              description
                "Minimum transmit interval";
            }
    
            leaf minimum-receive-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum receive interval";
            }
    
            leaf multiplier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255";
                }
              }
              default "3";
              description
                "Detection time multiplier";
            }
    
            choice adaptation-choice {
              leaf no-adaptation {
                type empty;
                description "Disable adaptation";
              }
            }  // choice adaptation-choice
    
            container transmit-interval {
              description
                "Transmit-interval options";
              uses apply-advanced;
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit interval";
              }
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High transmit interval triggering a trap";
              }
            }  // container transmit-interval
    
            container detection-time {
              description
                "Detection-time options";
              uses apply-advanced;
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High detection-time triggering a trap";
              }
            }  // container detection-time
    
            container authentication {
              description
                "Authentication options";
              uses apply-advanced;
    
              leaf key-chain {
                junos:must "(".. algorithm")";
                junos:must-message "May not be configured without algorithm";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string;
                description "Key chain name";
              }
    
              leaf algorithm {
                junos:must "(".. key-chain")";
                junos:must-message "May not be configured without key-chain";
                type enumeration {
                  enum "simple-password" {
                    value 0;
                    description
                      "Simple password";
                  }
                  enum "keyed-md5" {
                    value 1;
                    description
                      "Keyed message Digest 5";
                  }
                  enum "meticulous-keyed-md5" {
                    value 2;
                    description
                      "Meticulous keyed message Digest 5";
                  }
                  enum "keyed-sha-1" {
                    value 3;
                    description
                      "Keyed secure hash algorithm (SHA1) ";
                  }
                  enum "meticulous-keyed-sha-1" {
                    value 4;
                    description
                      "Meticulous keyed secure hash algorithm (SHA1) ";
                  }
                }
                description "Algorithm name";
              }
    
              leaf loose-check {
                type empty;
                description
                  "Verify authentication only if authentication is negotiated";
              }
            }  // container authentication
    
            leaf session-mode {
              type enumeration {
                enum "automatic" {
                  value 0;
                  description
                    "Choose session-mode automatically";
                }
                enum "single-hop" {
                  value 1;
                  description "Use single-hop";
                }
                enum "multihop" {
                  value 2;
                  description "Use multihop";
                }
              }
              default "automatic";
              description
                "BFD single-hop or multihop session-mode";
            }
    
            leaf holddown-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Time to hold the session-UP notification to the client";
            }
          }  // container bfd-liveness-detection
    
          container output-queue-priority {
            description
              "BGP output queue priority scheduler for updates";
            uses apply-advanced;
    
            container expedited {
              presence "enable expedited";
              description
                "Expedited queue; highest priority";
              leaf update-tokens {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description "Number of tokens";
              }
            }  // container expedited
    
            list priority {
              key "name";
              description
                "Output queue priority 1..16; higher is better";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                description
                  "Output queue priority; higher is better";
              }
    
              leaf update-tokens {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description "Number of tokens";
              }
            }  // list priority
    
            container defaults {
              description
                "Map policy's priority class and BGP output-queue";
              uses apply-advanced;
    
              container low {
                description
                  "Assign the 'low' priority class to this output-queue";
                uses bgp-output-queue-priority-class;
              }  // container low
    
              container medium {
                description
                  "Assign the 'medium' priority class to this output-queue";
                uses bgp-output-queue-priority-class;
              }  // container medium
    
              container high {
                description
                  "Assign the 'high' priority class to this output-queue";
                uses bgp-output-queue-priority-class;
              }  // container high
            }  // container defaults
          }  // container output-queue-priority
    
          container multipath-build-priority {
            description
              "Configure the multipath build priority";
            uses apply-advanced;
    
            choice multipath-priority {
              leaf low {
                type empty;
                description
                  "Do multipath build with low priority";
              }
              leaf medium {
                type empty;
                description
                  "Do multipath build with medium priority";
              }
            }  // choice multipath-priority
          }  // container multipath-build-priority
    
          leaf send-addpath-optimization {
            type empty;
            description
              "Enable BGP addpath advertisement optimization";
          }
    
          container defaults {
            uses apply-advanced;
    
            container ebgp {
              description
                "Options impacting external BGP default behaviors";
              uses apply-advanced;
    
              container no-policy {
                description
                  "Default ebgp behaviors in the absence of configured policy";
                uses apply-advanced;
    
                leaf receive {
                  type enumeration {
                    enum "accept" {
                      value 0;
                      description
                        "By default, accept routes from all address families";
                    }
                    enum "reject" {
                      value 1;
                      description
                        "By default, reject routes from IPv4/IPv6 unicast address families";
                    }
                    enum "reject-always" {
                      value 2;
                      description
                        "By default, reject routes from all address families";
                    }
                  }
                  description
                    "Default ebgp receive behavior";
                }
    
                leaf advertise {
                  type enumeration {
                    enum "accept" {
                      value 0;
                      description
                        "By default, advertise routes for all address families";
                    }
                    enum "reject" {
                      value 1;
                      description
                        "By default, do not advertise routes from IPv4/IPv6 unicast address families";
                    }
                    enum "reject-always" {
                      value 2;
                      description
                        "By default, do not advertise routes from any address families";
                    }
                  }
                  description
                    "Default ebgp advertise behavior";
                }
              }  // container no-policy
            }  // container ebgp
          }  // container defaults
        }  // grouping juniper-protocols-bgp
    
        grouping bgp-af-gr {
          uses apply-advanced;
    
          container long-lived {
            description
              "Long-lived graceful restart options";
            uses apply-advanced;
    
            container restarter {
              description
                "Long-lived graceful restart restarter options";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable restarter functionality";
                }
              }  // choice enable-disable
    
              leaf stale-time {
                type string;
                description
                  "Stale time in seconds or dhms notation (1..16777215)";
              }
            }  // container restarter
          }  // container long-lived
    
          leaf forwarding-state-bit {
            type enumeration {
              enum "set" {
                value 0;
                description "Always set";
              }
              enum "from-fib" {
                value 1;
                description
                  "Use state of associated FIB(s)";
              }
            }
            description
              "Control forwarding-state flag negotiation";
          }
        }  // grouping bgp-af-gr
    
        grouping bgp-afi-default {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
        }  // grouping bgp-afi-default
    
        grouping apath-options {
          description
            "Number of paths to advertise";
          uses apply-advanced;
    
          leaf receive {
            type empty;
            description
              "Receive multiple paths from peer";
          }
    
          container send {
            presence "enable send";
            description
              "Send multiple paths to peer";
            uses apply-advanced;
    
            container path-selection-mode {
              junos:must "(!(".. multipath"))";
              junos:must-message "Multipath must be disabled";
              description
                "Configure how to select add-path routes";
              uses apply-advanced;
    
              choice mode {
                leaf all-paths {
                  type empty;
                  description
                    "Advertise all paths allowed by path count";
                }
                leaf equal-cost-paths {
                  type empty;
                  description
                    "Advertise equal cost paths";
                }
              }  // choice mode
            }  // container path-selection-mode
    
            leaf-list prefix-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Perform add-path only for prefixes that match policy";
            }
    
            leaf path-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "2 .. 64";
                }
              }
              description
                "Number of paths to advertise";
            }
    
            leaf include-backup-path {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 2";
                }
              }
              description
                "Number of backup paths to advertise";
            }
    
            leaf multipath {
              type empty;
              description
                "Include only multipath contributor routes";
            }
          }  // container send
        }  // grouping apath-options
    
        grouping bgp-afi-flow {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          leaf-list no-validate {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Bypass validation procedure for routes that match policy";
          }
    
          leaf strip-nexthop {
            type empty;
            description
              "Strip the next-hop from the outgoing flow update";
          }
    
          leaf allow-policy-add-nexthop {
            type empty;
            status deprecated;
            description
              "Allow policy to add nexthop to a route without nexthop";
          }
        }  // grouping bgp-afi-flow
    
        grouping bgp-afi-flow-with-redirect-ip-action {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          leaf-list no-validate {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Bypass validation procedure for routes that match policy";
          }
    
          leaf strip-nexthop {
            type empty;
            description
              "Strip the next-hop from the outgoing flow update";
          }
    
          container legacy-redirect-ip-action {
            presence
              "enable legacy-redirect-ip-action";
            description
              "Configure legacy redirect to IP support";
            uses apply-advanced;
    
            leaf receive {
              type empty;
              description
                "Accept legacy encoded redirect-to-ip action attribute";
            }
    
            leaf send {
              type empty;
              description
                "Advertise Redirect action as legacy redirect attribute";
            }
          }  // container legacy-redirect-ip-action
    
          leaf secondary-independent-resolution {
            type empty;
            description
              "Resolve FLOW routes in VRF table independent of VPN FLOW route";
          }
        }  // grouping bgp-afi-flow-with-redirect-ip-action
    
        grouping bgp-afi-inet-transport {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          leaf per-prefix-label {
            type empty;
            description
              "Allocate a unique label to each advertised prefix";
          }
    
          leaf per-group-label {
            type empty;
            description
              "Advertise prefixes with unique labels per group";
          }
    
          container traffic-statistics {
            presence "enable traffic-statistics";
            description
              "Collect statistics for BGP label-switched paths";
            uses bgpaf-traffic-statistics;
          }  // container traffic-statistics
    
          container protection {
            presence "enable protection";
            description
              "Compute backup path for active nexthop failure";
          }  // container protection
        }  // grouping bgp-afi-inet-transport
    
        grouping bgp-afi-inet6-labeled {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          leaf per-group-label {
            type empty;
            description
              "Advertise prefixes with unique labels per group";
          }
    
          container traffic-statistics {
            presence "enable traffic-statistics";
            description
              "Collect statistics for BGP label-switched paths";
            uses bgpaf-traffic-statistics;
          }  // container traffic-statistics
    
          container rib {
            description
              "Select table used by labeled unicast routes";
            uses apply-advanced;
    
            leaf inet6.3 {
              type empty;
              description
                "Use inet6.3 to exchange labeled unicast routes";
            }
          }  // container rib
    
          container explicit-null {
            presence "enable explicit-null";
            description
              "Advertise explicit null";
            leaf connected-only {
              type empty;
              description
                "Advertise explicit null only for connected routes";
            }
          }  // container explicit-null
    
          container protection {
            junos:must "((!(".. .. .. .. type internal") && !(".. .. .. .. .. type internal")))";
            junos:must-message "Protection for labeled-bgp valid only for EBGP";
            presence "enable protection";
            description
              "Compute backup path for active nexthop failure";
          }  // container protection
    
          list topology {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            junos:must "(!("routing-options no-multi-topology-routing"))";
            junos:must-message "Multi topology routing is disabled";
            key "name";
            ordered-by user;
            description
              "Multi topology routing tables";
            leaf name {
              type string {
                junos:posix-pattern "!^((.*:.*)|(.{129,}))$";
                junos:pattern-message "Must be a non-reserved string of 128 characters or less";
              }
              description "Topology name";
            }
    
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify multi topology routes";
            }
          }  // list topology
        }  // grouping bgp-afi-inet6-labeled
    
        grouping bgp-afi-inet6-transport {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          leaf per-prefix-label {
            type empty;
            description
              "Allocate a unique label to each advertised prefix";
          }
    
          leaf per-group-label {
            type empty;
            description
              "Advertise prefixes with unique labels per group";
          }
    
          container traffic-statistics {
            presence "enable traffic-statistics";
            description
              "Collect statistics for BGP label-switched paths";
            uses bgpaf-traffic-statistics;
          }  // container traffic-statistics
    
          container lu-export {
            presence "enable lu-export";
            description
              "Install Classful Transport routes in inet6.3";
            uses apply-advanced;
          }  // container lu-export
    
          container protection {
            presence "enable protection";
            description
              "Compute backup path for active nexthop failure";
          }  // container protection
        }  // grouping bgp-afi-inet6-transport
    
        grouping bgp-afi-l2vpn {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container egress-protection {
            junos:must "(!(".. .. .. .. type external"))";
            junos:must-message "Egress-protection is valid only for IBGP";
            presence "enable egress-protection";
            description
              "Egress router protection";
            uses apply-advanced;
    
            container context-identifier {
              description "Context identifier";
              uses apply-advanced;
    
              leaf context-id {
                junos:must "("protocols mpls egress-protection context-identifier $$ primary")";
                junos:must-message "context-identifier must be type primary";
                junos:must "("protocols mpls egress-protection context-identifier $$")";
                junos:must-message "same context-identifier must be defined in protocols mpls egress-protection";
                type jt:ipv4addr;
                description "IP address";
              }
            }  // container context-identifier
    
            leaf-list keep-import {
              junos:must "("policy-options policy-statement ")";
              junos:must-message "policy-options policy-statement";
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
          }  // container egress-protection
        }  // grouping bgp-afi-l2vpn
    
        grouping bgp-afi-l3vpn {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          container egress-protection {
            junos:must "(!(".. .. .. .. type external"))";
            junos:must-message "Egress-protection is valid only for IBGP";
            presence "enable egress-protection";
            description
              "Egress router protection";
            uses apply-advanced;
    
            container context-identifier {
              description "Context identifier";
              uses apply-advanced;
    
              leaf context-id {
                junos:must "("protocols mpls egress-protection context-identifier $$ primary")";
                junos:must-message "context-identifier must be type primary";
                junos:must "("protocols mpls egress-protection context-identifier $$")";
                junos:must-message "same context-identifier must be defined in protocols mpls egress-protection";
                type jt:ipv4addr;
                description "IP address";
              }
            }  // container context-identifier
    
            leaf-list keep-import {
              junos:must "("policy-options policy-statement ")";
              junos:must-message "policy-options policy-statement";
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
          }  // container egress-protection
    
          leaf accept-local-nexthop {
            type empty;
            description
              "Enable processing of routes with own nexthop";
          }
        }  // grouping bgp-afi-l3vpn
    
        grouping bgp-afi-labeled {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          leaf per-prefix-label {
            type empty;
            description
              "Allocate a unique label to each advertised prefix";
          }
    
          leaf per-group-label {
            type empty;
            description
              "Advertise prefixes with unique labels per group";
          }
    
          container traffic-statistics {
            presence "enable traffic-statistics";
            description
              "Collect statistics for BGP label-switched paths";
            uses bgpaf-traffic-statistics;
          }  // container traffic-statistics
    
          list topology {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            junos:must "(!("routing-options no-multi-topology-routing"))";
            junos:must-message "Multi topology routing is disabled";
            key "name";
            ordered-by user;
            description
              "Multi topology routing tables";
            leaf name {
              type string {
                junos:posix-pattern "!^((.*:.*)|(.{129,}))$";
                junos:pattern-message "Must be a non-reserved string of 128 characters or less";
              }
              description "Topology name";
            }
    
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify multi topology routes";
            }
          }  // list topology
    
          container rib {
            description
              "Select table used by labeled unicast routes";
            uses rib-inet3;
          }  // container rib
    
          container explicit-null {
            presence "enable explicit-null";
            description
              "Advertise explicit null";
            leaf connected-only {
              type empty;
              description
                "Advertise explicit null only for connected routes";
            }
          }  // container explicit-null
    
          container protection {
            junos:must "((!(".. .. .. .. type internal") && !(".. .. .. .. .. type internal")))";
            junos:must-message "Protection for labeled-bgp valid only for EBGP";
            presence "enable protection";
            description
              "Compute backup path for active nexthop failure";
            uses apply-advanced;
          }  // container protection
    
          container egress-protection {
            junos:must "(!(".. .. .. .. type external"))";
            junos:must-message "Egress-protection is valid only for IBGP";
            presence "enable egress-protection";
            description
              "Egress router protection";
            uses apply-advanced;
    
            container context-identifier {
              description "Context identifier";
              uses apply-advanced;
    
              leaf context-id {
                junos:must "("protocols mpls egress-protection context-identifier $$ primary")";
                junos:must-message "context-identifier must be type primary";
                junos:must "("protocols mpls egress-protection context-identifier $$")";
                junos:must-message "same context-identifier must be defined in protocols mpls egress-protection";
                type jt:ipv4addr;
                description "IP address";
              }
            }  // container context-identifier
    
            leaf-list keep-import {
              junos:must "("policy-options policy-statement ")";
              junos:must-message "policy-options policy-statement";
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
          }  // container egress-protection
    
          leaf resolve-vpn {
            type empty;
            description
              "Install received NLRI in inet.3 also";
          }
    
          container entropy-label {
            presence "enable entropy-label";
            description
              "Use entropy label for entropy label capable BGP LSPs";
            uses apply-advanced;
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Policy to select BGP LSPs to use entropy label";
            }
    
            leaf no-next-hop-validation {
              type empty;
              description
                "Don't validate next hop field against route next hop";
            }
          }  // container entropy-label
        }  // grouping bgp-afi-labeled
    
        grouping bgp-afi-srte {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
        }  // grouping bgp-afi-srte
    
        grouping bgp-afi-topo {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container protection {
            junos:must "((!(".. .. .. .. type internal") && !(".. .. .. .. .. type internal")))";
            junos:must-message "Protection is valid only for EBGP";
            presence "enable protection";
            description
              "Compute backup path for active nexthop failure";
          }  // container protection
    
          list topology {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            junos:must "(!("routing-options no-multi-topology-routing"))";
            junos:must-message "Multi topology routing is disabled";
            key "name";
            ordered-by user;
            description
              "Multi topology routing tables";
            leaf name {
              type string {
                junos:posix-pattern "!^((.*:.*)|(.{129,}))$";
                junos:pattern-message "Must be a non-reserved string of 128 characters or less";
              }
              description "Topology name";
            }
    
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify multi topology routes";
            }
          }  // list topology
        }  // grouping bgp-afi-topo
    
        grouping bgp-afi-vpn {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
        }  // grouping bgp-afi-vpn
    
        grouping bgp-afi-vpn-protection {
          uses apply-advanced;
    
          container prefix-limit {
            description
              "Limit maximum number of prefixes from a peer";
            uses bgpaf-prefix-limit;
          }  // container prefix-limit
    
          container accepted-prefix-limit {
            description
              "Limit maximum number of prefixes accepted from a peer";
            uses bgpaf-accepted-prefix-limit;
          }  // container accepted-prefix-limit
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container add-path {
            description
              "Advertise multiple paths to peer";
            uses apath-options;
          }  // container add-path
    
          container aigp {
            presence "enable aigp";
            description
              "Allow sending and receiving of AIGP attribute";
            uses bgpaf-aigp-options;
          }  // container aigp
    
          leaf damping {
            type empty;
            description
              "Enable route flap damping";
          }
    
          leaf local-ipv4-address {
            type jt:ipv4addr;
            description "Local IPv4 address";
          }
    
          container loops {
            description
              "Allow local AS in received AS paths";
            uses bgpaf-loops;
          }  // container loops
    
          container delay-route-advertisements {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable delay-route-advertisements";
            description
              "Delay route updates for this family until FIB-sync";
            uses apply-advanced;
    
            leaf always-wait-for-krt-drain {
              type empty;
              description
                "Wait for KRT-queue drain for more-specific prefixes";
            }
    
            container minimum-delay {
              description
                "Minumum-delay to ensure KRT sees the route flash";
              uses apply-advanced;
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after RPD start";
              }
    
              leaf inbound-convergence {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Min delay(sec) advertisement after source-peer sent all routes";
              }
            }  // container minimum-delay
    
            container maximum-delay {
              description
                "Maximum delay deferring routes";
              uses apply-advanced;
    
              leaf route-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement route age";
              }
    
              leaf routing-uptime {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 36000";
                  }
                }
                description
                  "Max delay(sec) advertisement after RPD start";
              }
            }  // container maximum-delay
          }  // container delay-route-advertisements
    
          container nexthop-resolution {
            description
              "Configure nexthop resolution properties";
            uses apply-advanced;
    
            leaf no-resolution {
              type empty;
              description
                "Consider nexthop good without resolution attempt";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Attempt preserving resolved nexthop chain in forwarding";
            }
          }  // container nexthop-resolution
    
          container defer-initial-multipath-build {
            presence
              "enable defer-initial-multipath-build";
            description
              "Defer initial multipath build until EOR is received";
            uses apply-advanced;
    
            leaf maximum-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              description
                "Max delay(sec) multipath build after peer is up";
            }
          }  // container defer-initial-multipath-build
    
          container graceful-restart {
            description
              "BGP graceful restart options";
            uses bgp-af-gr;
          }  // container graceful-restart
    
          leaf extended-nexthop {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            type empty;
            description
              "Extended nexthop encoding";
          }
    
          leaf extended-nexthop-color {
            type empty;
            description
              "Resolve using extended color nexthop";
          }
    
          leaf extended-nexthop-tunnel {
            type empty;
            description
              "Use BGP tunnel attribute";
          }
    
          leaf no-install {
            type empty;
            description
              "Dont install received routes in forwarding";
          }
    
          leaf route-age-bgp-view {
            type empty;
            description
              "Maintain BGP route's age based on Update messages only";
          }
    
          container output-queue-priority {
            description
              "Default output-queue to assign updates to";
            uses bgp-output-queue-priority-class;
          }  // container output-queue-priority
    
          container route-refresh-priority {
            description
              "Default output-queue to assign route refreshes to";
            uses bgp-output-queue-priority-class;
          }  // container route-refresh-priority
    
          container withdraw-priority {
            description
              "Default output-queue to assign withdrawn routes to";
            uses bgp-output-queue-priority-class;
          }  // container withdraw-priority
    
          leaf advertise-srv6-service {
            type empty;
            description "Advertise SRv6 service";
          }
    
          leaf accept-srv6-service {
            type empty;
            description "Accept SRv6 service";
          }
    
          container aggregate-label {
            presence "enable aggregate-label";
            description
              "Aggregate labels of incoming routes with the same FEC";
            uses apply-advanced;
    
            leaf community {
              type string;
              description
                "Community to identify the FEC of incoming routes";
            }
          }  // container aggregate-label
    
          container egress-protection {
            junos:must "(!(".. .. .. .. type external"))";
            junos:must-message "Egress-protection is valid only for IBGP";
            presence "enable egress-protection";
            description
              "Egress router protection";
            uses apply-advanced;
    
            container context-identifier {
              description "Context identifier";
              uses apply-advanced;
    
              leaf context-id {
                junos:must "("protocols mpls egress-protection context-identifier $$ primary")";
                junos:must-message "context-identifier must be type primary";
                junos:must "("protocols mpls egress-protection context-identifier $$")";
                junos:must-message "same context-identifier must be defined in protocols mpls egress-protection";
                type jt:ipv4addr;
                description "IP address";
              }
            }  // container context-identifier
    
            leaf-list keep-import {
              junos:must "("policy-options policy-statement ")";
              junos:must-message "policy-options policy-statement";
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
          }  // container egress-protection
        }  // grouping bgp-afi-vpn-protection
    
        grouping bgp-output-queue-priority-class {
          choice class {
            leaf priority {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16";
                }
              }
              description
                "Output queue priority; higher is better";
            }
            leaf expedited {
              type empty;
              description
                "Expedited queue; highest priority";
            }
          }  // choice class
        }  // grouping bgp-output-queue-priority-class
    
        grouping bgp_filter_obj {
          description
            "Filter to apply to tracing";
          leaf match-on {
            type enumeration {
              enum "prefix" {
                value 0;
                description
                  "Filter based on prefix";
              }
            }
            description
              "Argument on which to match";
          }
    
          leaf-list policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Filter policy";
          }
        }  // grouping bgp_filter_obj
    
        grouping bgpaf-accepted-prefix-limit {
          uses apply-advanced;
    
          leaf maximum {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 4294967295";
              }
            }
            description
              "Maximum number of prefixes accepted from a peer";
          }
    
          container teardown {
            junos:must "(!(".. hide-excess"))";
            junos:must-message "Can't be configured together with hide-excess";
            junos:must "(!(".. drop-excess"))";
            junos:must-message "Can't be configured together with drop-excess";
            presence "enable teardown";
            description
              "Clear peer connection on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
    
            container idle-timeout {
              presence "enable idle-timeout";
              description
                "Timeout before attempting to restart peer";
              choice idle-parm {
                leaf forever {
                  type empty;
                  description
                    "Idle the peer until the user intervenes";
                }
                leaf timeout {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 2400";
                    }
                  }
                  description
                    "Timeout value, in minutes, for restarting peer";
                }
              }  // choice idle-parm
            }  // container idle-timeout
          }  // container teardown
    
          container drop-excess {
            junos:must "(!(".. hide-excess"))";
            junos:must-message "Can't be configured together with hide-excess";
            junos:must "(!(".. teardown"))";
            junos:must-message "Can't be configured together with teardown";
            presence "enable drop-excess";
            description
              "Drop routes from peer on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
          }  // container drop-excess
    
          container hide-excess {
            junos:must "(!(".. teardown"))";
            junos:must-message "Can't be configured together with teardown";
            junos:must "(!(".. drop-excess"))";
            junos:must-message "Can't be configured together with drop-excess";
            presence "enable hide-excess";
            description
              "Hide routes from peer on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
          }  // container hide-excess
        }  // grouping bgpaf-accepted-prefix-limit
    
        grouping bgpaf-aigp-options {
          uses apply-advanced;
    
          leaf disable {
            type empty;
            description
              "Disable sending and receiving of AIGP attribute";
          }
        }  // grouping bgpaf-aigp-options
    
        grouping bgpaf-loops {
          uses apply-advanced;
    
          leaf loops {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "1 .. 10";
              }
            }
            description "AS-Path loop count";
          }
        }  // grouping bgpaf-loops
    
        grouping bgpaf-prefix-limit {
          uses apply-advanced;
    
          leaf maximum {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 4294967295";
              }
            }
            description
              "Maximum number of prefixes from a peer";
          }
    
          container teardown {
            junos:must "(!(".. hide-excess"))";
            junos:must-message "Can't be configured together with hide-excess";
            junos:must "(!(".. drop-excess"))";
            junos:must-message "Can't be configured together with drop-excess";
            presence "enable teardown";
            description
              "Clear peer connection on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
    
            container idle-timeout {
              presence "enable idle-timeout";
              description
                "Timeout before attempting to restart peer";
              choice idle-parm {
                leaf forever {
                  type empty;
                  description
                    "Idle the peer until the user intervenes";
                }
                leaf timeout {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 2400";
                    }
                  }
                  description
                    "Timeout value, in minutes, for restarting peer";
                }
              }  // choice idle-parm
            }  // container idle-timeout
          }  // container teardown
    
          container drop-excess {
            junos:must "(!(".. hide-excess"))";
            junos:must-message "Can't be configured together with hide-excess";
            junos:must "(!(".. teardown"))";
            junos:must-message "Can't be configured together with teardown";
            presence "enable drop-excess";
            description
              "Drop routes from peer on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
          }  // container drop-excess
    
          container hide-excess {
            junos:must "(!(".. teardown"))";
            junos:must-message "Can't be configured together with teardown";
            junos:must "(!(".. drop-excess"))";
            junos:must-message "Can't be configured together with drop-excess";
            presence "enable hide-excess";
            description
              "Hide routes from peer on reaching limit";
            uses apply-advanced;
    
            leaf limit-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of prefix-limit to start warnings";
            }
          }  // container hide-excess
        }  // grouping bgpaf-prefix-limit
    
        grouping bgpaf-traffic-statistics {
          uses apply-advanced;
    
          leaf labeled-path {
            type empty;
            description
              "Ingress labeled path statistics";
          }
    
          container file {
            description
              "Statistics file options";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf replace {
              type empty;
              status deprecated;
              description
                "Replace trace file rather than appending to it";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "10";
              description
                "Maximum number of trace files";
            }
    
            leaf no-stamp {
              type empty;
              status deprecated;
              description
                "Do not timestamp trace file";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
          }  // container file
    
          leaf interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "60 .. 65535";
              }
            }
            description
              "Time to collect statistics (seconds)";
          }
        }  // grouping bgpaf-traffic-statistics
    
        grouping juniper-protocols-esis {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable ES-IS";
            }
          }  // choice enable-disable
    
          container traceoptions {
            description
              "Trace options for ES-IS";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "error" {
                    value 0;
                    description
                      "Trace errored packets";
                  }
                  enum "esh" {
                    value 1;
                    description
                      "Trace end system hello packets";
                  }
                  enum "ish" {
                    value 2;
                    description
                      "Trace intermediate system hello packets";
                  }
                  enum "graceful-restart" {
                    value 3;
                    description
                      "Trace graceful restart events";
                  }
                  enum "route" {
                    value 4;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 5;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 6;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 7;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 8;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 9;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 10;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 11;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Preference of routes";
          }
    
          container graceful-restart {
            description
              "ES-IS graceful restart options";
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 300";
                }
              }
              units "seconds";
              description
                "Maximum time for graceful restart to finish";
            }
          }  // container graceful-restart
    
          list interface {
            key "name";
            description
              "Interface configuration";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              units "seconds";
              description
                "Time after which neighbors think the interface is down";
            }
    
            leaf end-system-configuration-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              units "seconds";
              description
                "Suggested end system configuration timer";
            }
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable ES-IS on this interface";
              }
            }  // choice enable-disable
          }  // list interface
        }  // grouping juniper-protocols-esis
    
        grouping juniper-protocols-isis {
          uses apply-advanced;
    
          list interface {
            key "name";
            description
              "Interface configuration";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container ldp-synchronization {
              presence
                "enable ldp-synchronization";
              description
                "Advertise maximum metric until LDP is operational";
              uses ldp-sync-obj;
            }  // container ldp-synchronization
    
            list level {
              key "name";
              ordered-by user;
              description
                "Configure levels on this interface";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 2";
                  }
                }
                description "IS-IS level number";
              }
    
              uses apply-advanced;
    
              leaf te-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "Traffic engineering metric";
              }
    
              leaf no-advertise-adjacency-segment {
                type empty;
                description
                  "Do not advertise an adjacency segment for this level";
              }
    
              container ipv4-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the level";
                junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv4 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv4-adjacency-segment
    
              container ipv6-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same level";
                junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv6 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv6-adjacency-segment
    
              container srm6-adjacency-segment {
                description
                  "Configure srm6 adjacency segment";
                uses apply-advanced;
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  leaf sid {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Set Adjacency SID Value";
                  }
                }  // container unprotected
              }  // container srm6-adjacency-segment
    
              container srv6-adjacency-segment {
                description
                  "Configure srv6 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  presence "enable protected";
                  description
                    "SRv6 Adjacency segment is eligible for protection";
                  uses apply-advanced;
    
                  list locator {
                    key "name";
                    ordered-by user;
                    description
                      "Locator to bind SRv6 adjacency segment";
                    leaf name {
                      junos:must "("routing-options source-packet-routing srv6 locator $$")";
                      junos:must-message "Referenced source-packet-routing srv6 must be defined";
                      type string;
                      description "Locator name";
                    }
    
                    uses apply-advanced;
    
                    list end-x-sid {
                      key "name";
                      ordered-by user;
                      description
                        "Endpoint 128 bit address";
                      leaf name {
                        type jt:ipv6addr;
                      }
    
                      uses apply-advanced;
    
                      container flavor {
                        presence "enable flavor";
                        uses apply-advanced;
    
                        leaf psp {
                          type empty;
                          description
                            "Penultimate segment pop of the SRH";
                        }
    
                        leaf usp {
                          type empty;
                          description
                            "Ultimate segment pop of the SRH";
                        }
    
                        leaf usd {
                          type empty;
                          description
                            "Ultimate segment decapsulation";
                        }
                      }  // container flavor
                    }  // list end-x-sid
                  }  // list locator
                }  // container protected
    
                container unprotected {
                  presence "enable unprotected";
                  description
                    "SRv6 Adjacency segment is uneligible for protection";
                  uses apply-advanced;
    
                  list locator {
                    key "name";
                    ordered-by user;
                    description
                      "Locator to bind SRv6 adjacency segment";
                    leaf name {
                      junos:must "("routing-options source-packet-routing srv6 locator $$")";
                      junos:must-message "Referenced source-packet-routing srv6 must be defined";
                      type string;
                      description "Locator name";
                    }
    
                    uses apply-advanced;
    
                    list end-x-sid {
                      key "name";
                      ordered-by user;
                      description
                        "Endpoint 128 bit address";
                      leaf name {
                        type jt:ipv6addr;
                      }
    
                      uses apply-advanced;
    
                      container flavor {
                        presence "enable flavor";
                        uses apply-advanced;
    
                        leaf psp {
                          type empty;
                          description
                            "Penultimate segment pop of the SRH";
                        }
    
                        leaf usp {
                          type empty;
                          description
                            "Ultimate segment pop of the SRH";
                        }
    
                        leaf usd {
                          type empty;
                          description
                            "Ultimate segment decapsulation";
                        }
                      }  // container flavor
                    }  // list end-x-sid
                  }  // list locator
                }  // container unprotected
              }  // container srv6-adjacency-segment
    
              list lan-neighbor {
                junos:must "(!(".. ipv6-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if ipv6-adjacency-segment is configured in the same interface";
                junos:must "(!(".. ipv4-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if ipv4-adjacency-segment is configured in the same interface";
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if no-advertise-adjacency-segment is configured in the same level";
                junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if  no-advertise-adjacency-segment is configured in the same interface";
                junos:must "(!(".. .. point-to-point"))";
                junos:must-message "lan-neighbor can't be configured for point-to-point interfaces";
                key "name";
                ordered-by user;
                description
                  "Configuration specific to a LAN neighbor";
                leaf name {
                  type jt:sysid;
                  description "Neighbor's sysid";
                }
    
                uses apply-advanced;
    
                container ipv4-adjacency-segment {
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the level";
                  junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                  description
                    "Configure ipv4 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    description
                      "Adjacency SID is eligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container protected
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container unprotected
                }  // container ipv4-adjacency-segment
    
                container ipv6-adjacency-segment {
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same level";
                  junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                  description
                    "Configure ipv6 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    description
                      "Adjacency SID is eligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container protected
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container unprotected
                }  // container ipv6-adjacency-segment
    
                container srm6-adjacency-segment {
                  description
                    "Configure srm6 adjacency segment";
                  uses apply-advanced;
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    leaf sid {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Set Adjacency SID Value";
                    }
                  }  // container unprotected
                }  // container srm6-adjacency-segment
    
                container srv6-adjacency-segment {
                  description
                    "Configure srv6 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    presence "enable protected";
                    description
                      "SRv6 Adjacency segment is eligible for protection";
                    uses apply-advanced;
    
                    list locator {
                      key "name";
                      ordered-by user;
                      description
                        "Locator to bind SRv6 adjacency segment";
                      leaf name {
                        junos:must "("routing-options source-packet-routing srv6 locator $$")";
                        junos:must-message "Referenced source-packet-routing srv6 must be defined";
                        type string;
                        description
                          "Locator name";
                      }
    
                      uses apply-advanced;
    
                      list end-x-sid {
                        key "name";
                        ordered-by user;
                        description
                          "Endpoint 128 bit address";
                        leaf name {
                          type jt:ipv6addr;
                        }
    
                        uses apply-advanced;
    
                        container flavor {
                          presence
                            "enable flavor";
                          uses apply-advanced;
    
                          leaf psp {
                            type empty;
                            description
                              "Penultimate segment pop of the SRH";
                          }
    
                          leaf usp {
                            type empty;
                            description
                              "Ultimate segment pop of the SRH";
                          }
    
                          leaf usd {
                            type empty;
                            description
                              "Ultimate segment decapsulation";
                          }
                        }  // container flavor
                      }  // list end-x-sid
                    }  // list locator
                  }  // container protected
    
                  container unprotected {
                    presence
                      "enable unprotected";
                    description
                      "SRv6 Adjacency segment is uneligible for protection";
                    uses apply-advanced;
    
                    list locator {
                      key "name";
                      ordered-by user;
                      description
                        "Locator to bind SRv6 adjacency segment";
                      leaf name {
                        junos:must "("routing-options source-packet-routing srv6 locator $$")";
                        junos:must-message "Referenced source-packet-routing srv6 must be defined";
                        type string;
                        description
                          "Locator name";
                      }
    
                      uses apply-advanced;
    
                      list end-x-sid {
                        key "name";
                        ordered-by user;
                        description
                          "Endpoint 128 bit address";
                        leaf name {
                          type jt:ipv6addr;
                        }
    
                        uses apply-advanced;
    
                        container flavor {
                          presence
                            "enable flavor";
                          uses apply-advanced;
    
                          leaf psp {
                            type empty;
                            description
                              "Penultimate segment pop of the SRH";
                          }
    
                          leaf usp {
                            type empty;
                            description
                              "Ultimate segment pop of the SRH";
                          }
    
                          leaf usd {
                            type empty;
                            description
                              "Ultimate segment decapsulation";
                          }
                        }  // container flavor
                      }  // list end-x-sid
                    }  // list locator
                  }  // container unprotected
                }  // container srv6-adjacency-segment
              }  // list lan-neighbor
    
              container post-convergence-lfa {
                junos:must "(".. .. .. backup-spf-options use-post-convergence-lfa")";
                junos:must-message "Not allowed without 'protocols isis backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable post-convergence-lfa";
                description
                  "Configure backup along post convergence on this interface";
                uses apply-advanced;
    
                container node-protection {
                  presence
                    "enable node-protection";
                  description
                    "Enable node protection";
                  uses apply-advanced;
    
                  leaf cost {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 16777215";
                      }
                    }
                    description
                      "Cost for node protection";
                  }
                }  // container node-protection
    
                leaf srlg-protection {
                  type empty;
                  description
                    "Enable srlg protection";
                }
    
                leaf fate-sharing-protection {
                  type empty;
                  description
                    "Enable fate-sharing protection";
                }
              }  // container post-convergence-lfa
    
              container application-specific {
                description
                  "Advertise application-specific TE attributes";
                uses apply-advanced;
    
                list attribute-group {
                  key "name";
                  max-elements 1;
                  ordered-by user;
                  description
                    "Link attribute group name";
                  leaf name {
                    type string;
                    description
                      "Link attribute group name";
                  }
    
                  uses apply-advanced;
    
                  leaf te-metric {
                    junos:must "(".. application")";
                    junos:must-message "Atleast one application is must";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 16777215";
                      }
                    }
                    description
                      "Traffic engineering metric for this attribute group";
                  }
    
                  leaf-list admin-group {
                    type string;
                    max-elements 16;
                    ordered-by user;
                    description
                      "Administrative groups for this attribute-group";
                  }
    
                  container application {
                    junos:must "((".. delay-metric" || (".. admin-group" || (".. te-metric" || (".. admin-groups" || (".. legacy" || ".. advertise-delay-metric"))))))";
                    junos:must-message "Atleast one attribute must be configured";
                    description
                      "Standard Applications part of this attribute-group";
                    uses apply-advanced;
    
                    leaf flex-algorithm {
                      type empty;
                      description
                        "Set X flag in standard application bit mask";
                    }
                  }  // container application
                }  // list attribute-group
              }  // container application-specific
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable IS-IS for this level";
                }
              }  // choice enable-disable
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "Metric for this level";
              }
    
              leaf ipv4-multicast-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "IPv4 multicast metric for this level";
              }
    
              leaf ipv6-unicast-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "IPv6 unicast metric for this level";
              }
    
              leaf ipv6-multicast-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "IPv6 multicast metric for this level";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type enumeration {
                    enum "default" {
                      value 0;
                      description
                        "Default topology";
                    }
                    enum "ipv4-multicast" {
                      value 1;
                      description
                        "IPv4 multicast topology";
                    }
                    enum "ipv6-unicast" {
                      value 2;
                      description
                        "IPv6 unicast topology";
                    }
                    enum "ipv6-multicast" {
                      value 3;
                      description
                        "IPv6 multicast topology";
                    }
                  }
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 16777215";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 16777215";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
    
              leaf authentication-key {
                type jt:unreadable;
                status deprecated;
                description
                  "Authentication key (password)";
              }
    
              leaf authentication-type {
                type enumeration {
                  enum "md5" {
                    value 0;
                    status deprecated;
                    description
                      "MD5 authentication";
                  }
                  enum "simple" {
                    value 1;
                    status deprecated;
                    description
                      "Simple password authentication";
                  }
                }
                status deprecated;
                description
                  "Authentication type";
              }
    
              leaf hello-authentication-key {
                type jt:unreadable;
                description
                  "Authentication key (password) for hello packets";
              }
    
              leaf hello-authentication-type {
                type enumeration {
                  enum "md5" {
                    value 0;
                    description
                      "MD5 authentication";
                  }
                  enum "simple" {
                    value 1;
                    description
                      "Simple password authentication";
                  }
                }
                description
                  "Authentication type for hello packets";
              }
    
              leaf hello-authentication-key-chain {
                junos:must "(!(".. hello-authentication-type"))";
                junos:must-message "May not be configured with hello-authentication-type";
                junos:must "(!(".. hello-authentication-key"))";
                junos:must-message "May not be configured with hello-authentication-key";
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string {
                  junos:posix-pattern "[A-za-z]$";
                  junos:pattern-message "Keychain name must not end with number.";
                  length "1 .. 128";
                }
                description "Key chain name";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 21845";
                  }
                }
                units "seconds";
                description
                  "Interval between hello packet transmissions";
              }
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Time after which neighbors think the interface is down";
              }
    
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 127";
                  }
                }
                description
                  "Designated router election priority";
              }
    
              container flood-reflector {
                junos:must "(".. .. level 1 disable")";
                junos:must-message "flood-reflector cannot be enabled on level 1 interface";
                junos:must "(("protocols isis level 2 flood-reflector" && !(".. .. level 1 flood-reflector")))";
                junos:must-message "flood-reflector is only supported on level 2 interfaces";
                presence
                  "enable flood-reflector";
                description
                  "Configure interface as flood-reflector";
                uses apply-advanced;
    
                leaf cluster-id {
                  junos:must "("protocols isis level 2 flood-reflector client")";
                  junos:must-message "flood-reflector client is not configured at isis level";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description "Cluster-ID";
                }
              }  // container flood-reflector
    
              container passive {
                presence "enable passive";
                description
                  "Do not run IS-IS at this level, but advertise it";
                uses apply-advanced;
    
                leaf remote-node-iso {
                  junos:must "(".. remote-node-id")";
                  junos:must-message "remote-node-id must be configured";
                  type jt:sysid;
                  description
                    "ISO System-ID of the remote node";
                }
    
                leaf remote-node-id {
                  junos:must "(".. remote-node-iso")";
                  junos:must-message "remote-node-iso must be configured";
                  type jt:ipv4addr;
                  description
                    "Remote address of the link";
                }
              }  // container passive
            }  // list level
    
            leaf delay-metric {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 16777215";
                }
              }
              units "microseconds";
              description "Delay metric";
            }
    
            container delay-measurement {
              presence
                "enable delay-measurement";
              description
                "Enable delay measurement";
              uses apply-advanced;
    
              leaf probe-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                units "seconds";
                description "Probe interval";
              }
    
              leaf probe-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 15";
                  }
                }
                units "seconds";
                description "Probe count";
              }
    
              container advertisement {
                description
                  "Delay advertisement";
                uses apply-advanced;
    
                container periodic {
                  description
                    "Periodic advertisement parameters";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 100";
                      }
                    }
                    units "percentage";
                    description "Threshold";
                  }
    
                  leaf interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "30 .. 3600";
                      }
                    }
                    units "seconds";
                    description "Interval";
                  }
                }  // container periodic
    
                container accelerated {
                  presence "enable accelerated";
                  description
                    "Accelerated advertisement parameters";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 100";
                      }
                    }
                    units "percentage";
                    description "Threshold";
                  }
                }  // container accelerated
              }  // container advertisement
            }  // container delay-measurement
    
            leaf no-advertise-adjacency-segment {
              type empty;
              description
                "Do not advertise an adjacency segment for this interface";
            }
    
            container auto-bandwidth {
              description
                "Auto bandwidth configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("protocols isis source-packet-routing traffic-statistics statistics-granularity per-interface")";
                junos:must-message "Config protocols isis source-packet-routing traffic-statistics statistics-granularity per-interface is must";
                junos:must "("routing-options auto-bandwidth template $$")";
                junos:must-message "Referenced auto-bandwidth template must be defined";
                type string;
                description
                  "Auto bandwidth template name";
              }
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable Auto bandwidth on this interface";
                }
              }  // choice enable-disable
            }  // container auto-bandwidth
    
            choice protection-type {
              leaf link-protection {
                type empty;
                description
                  "Protect interface from link faults only";
              }
              leaf node-link-protection {
                type empty;
                description
                  "Protect interface from both link and node faults";
              }
            }  // choice protection-type
    
            leaf no-eligible-backup {
              type empty;
              description
                "Not eligible for backup traffic from protected interfaces";
            }
    
            leaf no-eligible-remote-backup {
              type empty;
              description
                "Not eligible for Remote-LFA backup traffic from protected interfaces";
            }
    
            container link-degradation-threshold {
              presence
                "enable link-degradation-threshold";
              description
                "Link up and down thresholds (in %) for proactive link protection";
              leaf link-down {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 100";
                  }
                }
                description
                  "Signal degradation threshold above which link marked down";
              }
    
              leaf link-up {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 100";
                  }
                }
                description
                  "Signal degradation threshold below which link is marked up.";
              }
            }  // container link-degradation-threshold
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable IS-IS on this interface";
              }
            }  // choice enable-disable
    
            leaf authentication-key {
              type jt:unreadable;
              status deprecated;
              description
                "Authentication key (password)";
            }
    
            leaf authentication-type {
              type enumeration {
                enum "md5" {
                  value 0;
                  status deprecated;
                  description
                    "MD5 authentication";
                }
                enum "simple" {
                  value 1;
                  status deprecated;
                  description
                    "Simple password authentication";
                }
              }
              status deprecated;
              description "Authentication type";
            }
    
            leaf flood-group {
              type string {
                junos:posix-pattern "^[[:xdigit:]]{2}.(([[:xdigit:]]){2}){1,2}((.(([[:xdigit:]]){2}){1,2}){0,1}){0,5}$";
                junos:pattern-message "At max 26 hexa decimal digits, standard ISO area ID format";
              }
              description
                "ISO Area that this interface should send LSPs to";
            }
    
            leaf hello-authentication-key {
              type jt:unreadable;
              status deprecated;
              description
                "Authentication key (password) for hello packets";
            }
    
            leaf hello-authentication-type {
              type enumeration {
                enum "md5" {
                  value 0;
                  status deprecated;
                  description
                    "MD5 authentication";
                }
                enum "simple" {
                  value 1;
                  status deprecated;
                  description
                    "Simple password authentication";
                }
              }
              status deprecated;
              description
                "Authentication type for hello packets";
            }
    
            leaf hello-padding-type {
              type enumeration {
                enum "strict" {
                  value 0;
                  description
                    "Padding for all adjacency states";
                }
                enum "adaptive" {
                  value 1;
                  description
                    "Padding until state of neighbor adjacency is 'up'";
                }
                enum "loose" {
                  value 2;
                  description
                    "Padding until state of adjacency is 'initializing'";
                }
                enum "disable" {
                  value 3;
                  description
                    "Do not add any padding for hello packets";
                }
              }
              default "loose";
              description
                "Type of padding for hello packets";
            }
    
            leaf interface-group-holddown-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 60";
                }
              }
              units "seconds";
              description
                "Time to wait before including in BBM calculation";
            }
    
            choice layer2-map-choice {
              leaf layer2-map {
                type empty;
                description
                  "Kernel ARP/ND creation for nexthops";
              }
              leaf no-layer2-map {
                type empty;
                description
                  "Don't kernel ARP/ND creation for nexthops";
              }
            }  // choice layer2-map-choice
    
            leaf max-hello-size {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "512 .. 16000";
                }
              }
              description
                "Maximum size allowed for ISIS Hello PDUs";
            }
    
            leaf lsp-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000";
                }
              }
              units "milliseconds";
              default "100";
              description
                "Interval between LSP transmissions";
            }
    
            container csnp-interval {
              description
                "Rate of CSN packets (for LAN interfaces only)";
              choice csnp_interval_option {
                leaf csnp-interval-number {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  units "seconds";
                  description
                    "Interval between CSN packets";
                }
                leaf disable {
                  type empty;
                  description
                    "Do not send CSN packets on this interface";
                }
              }  // choice csnp_interval_option
            }  // container csnp-interval
    
            container strict-dual-isis {
              junos:must "(!(".. .. topologies"))";
              junos:must-message "strict-dual-isis is not allowed with multi-topologies";
              presence "enable strict-dual-isis";
              description
                "Ensure both ipv4 and ipv6 connectivity for adjacencies on this interface";
              uses apply-advanced;
    
              leaf holdown {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                default "12";
                description
                  "Set the holddown timer for strict spf computation";
              }
            }  // container strict-dual-isis
    
            container mesh-group {
              description
                "Add the interface to a mesh group";
              choice mesh_group_option {
                leaf mesh-group-number {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Mesh group number for this interface";
                }
                leaf blocked {
                  type empty;
                  description
                    "Do not flood new LSPs on this interface";
                }
              }  // choice mesh_group_option
            }  // container mesh-group
    
            leaf point-to-point {
              type empty;
              description
                "Treat interface as point to point";
            }
    
            container passive {
              presence "enable passive";
              description
                "Do not run IS-IS, but advertise it";
              uses apply-advanced;
    
              leaf remote-node-iso {
                junos:must "(".. remote-node-id")";
                junos:must-message "remote-node-id must be configured";
                type jt:sysid;
                description
                  "ISO System-ID of the remote node";
              }
    
              leaf remote-node-id {
                junos:must "(".. remote-node-iso")";
                junos:must-message "remote-node-iso must be configured";
                type jt:ipv4addr;
                description
                  "Remote address of the link";
              }
            }  // container passive
    
            leaf checksum {
              type empty;
              description
                "Enable checksum for packets on this interface";
            }
    
            leaf no-unicast-topology {
              type empty;
              description
                "Do not include this interface in the unicast topology";
            }
    
            leaf no-ipv4-multicast {
              type empty;
              description
                "Do not include this interface in the IPv4 multicast topology";
            }
    
            leaf no-ipv6-unicast {
              type empty;
              description
                "Do not include this interface in the IPv6 unicast topology";
            }
    
            leaf no-ipv6-multicast {
              type empty;
              description
                "Do not include this interface in the IPv6 multicast topology";
            }
    
            leaf no-adjacency-down-notification {
              type empty;
              description
                "Do not inform other protocols about adjacency down events";
            }
    
            container bfd-liveness-detection {
              junos:must "(!(".. family inet bfd-liveness-detection"))";
              junos:must-message "To configure bfd-liveness-detection, 'family inet bfd-liveness-detection' must not be configured";
              status deprecated;
              description
                "Bidirectional Forwarding Detection options";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
    
              container authentication {
                description
                  "Authentication options";
                uses apply-advanced;
    
                leaf key-chain {
                  junos:must "(".. algorithm")";
                  junos:must-message "May not be configured without algorithm";
                  junos:must "("security authentication-key-chains key-chain $$")";
                  junos:must-message "Referenced key-chain must be defined";
                  type string;
                  description "Key chain name";
                }
    
                leaf algorithm {
                  junos:must "(".. key-chain")";
                  junos:must-message "May not be configured without key-chain";
                  type enumeration {
                    enum "simple-password" {
                      value 0;
                      description
                        "Simple password";
                    }
                    enum "keyed-md5" {
                      value 1;
                      description
                        "Keyed message Digest 5";
                    }
                    enum "meticulous-keyed-md5" {
                      value 2;
                      description
                        "Meticulous keyed message Digest 5";
                    }
                    enum "keyed-sha-1" {
                      value 3;
                      description
                        "Keyed secure hash algorithm (SHA1) ";
                    }
                    enum
                      "meticulous-keyed-sha-1" {
                      value 4;
                      description
                        "Meticulous keyed secure hash algorithm (SHA1) ";
                    }
                  }
                  description "Algorithm name";
                }
    
                leaf loose-check {
                  type empty;
                  description
                    "Verify authentication only if authentication is negotiated";
                }
              }  // container authentication
            }  // container bfd-liveness-detection
    
            list family {
              key "name";
              ordered-by user;
              description
                "Address family specific interface attributes";
              leaf name {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet6" {
                    value 1;
                    description "IPv6 family";
                  }
                }
              }
    
              uses apply-advanced;
    
              container bfd-liveness-detection {
                junos:must "(!((".. .. bfd-liveness-detection" && ".. .. family inet bfd-liveness-detection")))";
                junos:must-message "bfd-liveness-detection and 'family inet bfd-liveness-detection' cannot be configured at the same time";
                description
                  "Bidirectional Forwarding Detection options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
              }  // container bfd-liveness-detection
            }  // list family
          }  // list interface
    
          container source-packet-routing {
            junos:must "(!(".. srm6"))";
            junos:must-message "must not have 'protocols isis srm6' configured";
            presence
              "enable source-packet-routing";
            description
              "Enable Source Packet Routing (SPRING)";
            uses apply-advanced;
    
            container adjacency-segment {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Configure attributes for Adjacency Segments in SPRING";
              uses apply-advanced;
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "180000 .. 900000";
                  }
                }
                description
                  "Duration(ms) for which adjacency segments will be retained after isolating from an interface";
              }
            }  // container adjacency-segment
    
            container udp-tunneling {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Enable SR over UDP feature";
              uses apply-advanced;
    
              leaf encapsulation {
                type empty;
                description
                  "Enable UDP Tunnel Encapsulation";
              }
    
              leaf decapsulation {
                type empty;
                description
                  "Enable UDP Tunnel decapsulation";
              }
            }  // container udp-tunneling
    
            container srgb {
              junos:must "(!(".. node-segment index-range"))";
              junos:must-message "May not be confiugred with node-segment index-range";
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Set the SRGB global block in SPRING";
              leaf start-label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Start range for SRGB label block";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Index to the SRGB start label block";
              }
            }  // container srgb
    
            container node-segment {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Enable support for Node segments in SPRING";
              uses apply-advanced;
    
              leaf ipv4-index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set IPv4 Node Segment index";
              }
    
              leaf ipv6-index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set IPv6 Node Segment index";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "32 .. 16385";
                  }
                }
                description
                  "Set Range of Node Segment indices allowed";
              }
            }  // container node-segment
    
            leaf-list flex-algorithm {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "128 .. 255";
                }
              }
              max-elements 16;
              description
                "Flex-algorithms we would like to participate in";
            }
    
            leaf use-flex-algorithm-metric-always {
              type empty;
              description
                "Use flex-algo prefix metric whenever available";
            }
    
            leaf strict-asla-based-flex-algorithm {
              type empty;
              description
                "Flex-Algorithm to ignore links not having ASLA sub-TLVs";
            }
    
            leaf new-capability-subtlv {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              type empty;
              description
                "Advertise all ranges in single spring capability subtlv";
            }
    
            leaf explicit-null {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              type empty;
              description
                "Set E and P bits in all Prefix SID advertisements";
            }
    
            leaf mapping-server {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              junos:must "("routing-options source-packet-routing mapping-server-entry $$")";
              junos:must-message "Referenced source-packet-routing mapping-server-entry must be defined";
              type string;
              description "Mapping server name";
            }
    
            leaf no-strict-spf {
              type empty;
              description
                " Disable strict spf algo 1 advertisement";
            }
    
            leaf ldp-stitching {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              type empty;
              description
                "Enable SR to LDP stitching";
            }
    
            container srv6 {
              presence "enable srv6";
              description
                "Enable IPv6 Segment Routing (SRv6)";
              uses apply-advanced;
    
              list locator {
                key "name";
                ordered-by user;
                description "SRv6 Locator";
                leaf name {
                  junos:must "("routing-options source-packet-routing srv6 locator $$")";
                  junos:must-message "Referenced source-packet-routing srv6 must be defined";
                  type string;
                  description "Locator name";
                }
    
                uses apply-advanced;
    
                list end-sid {
                  key "name";
                  ordered-by user;
                  leaf name {
                    type jt:ipv6addr;
                  }
    
                  uses apply-advanced;
    
                  container flavor {
                    presence "enable flavor";
                    uses apply-advanced;
    
                    leaf psp {
                      type empty;
                      description
                        "Penultimate segment pop of the SRH";
                    }
    
                    leaf usp {
                      type empty;
                      description
                        "Ultimate segment pop of the SRH";
                    }
    
                    leaf usd {
                      type empty;
                      description
                        "Ultimate segment decapsulation";
                    }
                  }  // container flavor
                }  // list end-sid
              }  // list locator
            }  // container srv6
    
            container sensor-based-stats {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Configure sensor based stats in SPRING";
              uses apply-advanced;
    
              container per-interface-per-member-link {
                description
                  "Configure sensor based stats per nexthop";
                leaf ingress {
                  type empty;
                  description
                    "Enable sensor based stats on ingress interface";
                }
    
                leaf egress {
                  type empty;
                  description
                    "Enable sensor based stats on egress interface";
                }
              }  // container per-interface-per-member-link
    
              container per-sid {
                description
                  "Configure sensor based stats per spring route";
                leaf ingress {
                  type empty;
                  description
                    "Enable sensor based stats for per-sid ingress accounting";
                }
    
                leaf egress {
                  type empty;
                  description
                    "Enable sensor based stats for IP-MPLS egress accounting";
                }
              }  // container per-sid
            }  // container sensor-based-stats
    
            container traffic-statistics {
              junos:must "(!(".. .. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              description
                "Enable support for traffic statistics in SPRING";
              uses apply-advanced;
    
              container statistics-granularity {
                description
                  "Granularity for traffic statistics in SPRING";
                uses apply-advanced;
    
                leaf per-interface {
                  type empty;
                  description
                    "Interface Based traffic statistics in SPRING";
                }
              }  // container statistics-granularity
    
              leaf auto-bandwidth {
                junos:must "("protocols isis source-packet-routing traffic-statistics statistics-granularity per-interface")";
                junos:must-message "Config protocols isis source-packet-routing traffic-statistics statistics-granularity per-interface is must";
                junos:must "("routing-options auto-bandwidth template $$")";
                junos:must-message "Referenced auto-bandwidth template must be defined";
                type string;
                description
                  "Auto bandwidth name";
              }
            }  // container traffic-statistics
          }  // container source-packet-routing
    
          container srm6 {
            junos:must "(!(".. source-packet-routing"))";
            junos:must-message "must not have 'protocols isis source-packet-routing' configured";
            presence "enable srm6";
            description "Enable SRm6";
            uses apply-advanced;
    
            container sid {
              description
                "Configure attributes for SID in srm6";
              uses apply-advanced;
    
              leaf node-sid {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description "Set Node SID Value";
              }
    
              leaf address {
                type jt:ipv6addr;
                description
                  "IPv6 address corresponding to SID";
              }
            }  // container sid
          }  // container srm6
    
          list level {
            key "name";
            ordered-by user;
            description
              "Configure global level attributes";
            leaf name {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 2";
                }
              }
              description "IS-IS level number";
            }
    
            uses apply-advanced;
    
            leaf labeled-preference {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "labeled-preference cannot be specified without 'protocols isis source-packet-routing'";
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of labeled IS-IS routes";
            }
    
            leaf srv6-preference {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "srv6-preference cannot be specified without 'protocols isis source-packet-routing'";
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of SRV6 IS-IS routes";
            }
    
            leaf flex-algorithm-preference {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "flex-algorithm-preference cannot be specified without 'protocols isis source-packet-routing'";
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of flex-algorithm L-ISIS routes";
            }
    
            container source-packet-routing {
              presence
                "enable source-packet-routing";
              description
                "Enable Source Packet Routing (SPRING)";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable Source Packet Routing on this level";
                }
              }  // choice enable-disable
    
              leaf srms-preference {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Set SRMS preference value";
              }
            }  // container source-packet-routing
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable IS-IS on this level";
              }
            }  // choice enable-disable
    
            leaf authentication-key {
              type jt:unreadable;
              description
                "Authentication key (password)";
            }
    
            leaf authentication-type {
              type enumeration {
                enum "md5" {
                  value 0;
                  description
                    "MD5 authentication";
                }
                enum "simple" {
                  value 1;
                  description
                    "Simple password authentication";
                }
              }
              description "Authentication type";
            }
    
            leaf purge-originator {
              type enumeration {
                enum "self" {
                  value 0;
                  description
                    "Add POI only for self-originated purge LSPs";
                }
                enum "empty" {
                  value 1;
                  description
                    "Add POI for purge LSPs who do not have POI information";
                }
              }
              description
                "Add Purge Originator information";
            }
    
            leaf no-hello-authentication {
              type empty;
              description
                "Disable authentication for hello packets";
            }
    
            leaf no-csnp-authentication {
              type empty;
              description
                "Disable authentication for CSN packets";
            }
    
            leaf no-psnp-authentication {
              type empty;
              description
                "Disable authentication for PSN packets";
            }
    
            leaf authentication-key-chain {
              junos:must "(!(".. authentication-type"))";
              junos:must-message "May not be configured with authentication-type";
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              junos:must "("security authentication-key-chains key-chain $$")";
              junos:must-message "Referenced key-chain must be defined";
              type string {
                junos:posix-pattern "[A-za-z]$";
                junos:pattern-message "Keychain name must not end with number.";
                length "1 .. 128";
              }
              description "Key chain name";
            }
    
            leaf wide-metrics-only {
              junos:must "(!(".. .. clns-routing"))";
              junos:must-message "wide-metrics-only cannot be specified with clns-routing";
              type empty;
              description
                "Generate wide metrics only";
            }
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of internal routes";
            }
    
            leaf external-preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of external routes";
            }
    
            leaf prefix-export-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Maximum number of external prefixes that can be exported";
            }
    
            container flood-reflector {
              junos:must "(!(".. .. level 1 flood-reflector"))";
              junos:must-message "Flood-reflector is supported only in level 2";
              description
                "Enable flood-reflector";
              uses apply-advanced;
    
              container reflector {
                junos:must "(!(".. client"))";
                junos:must-message "flood-reflector and client can't be configured together";
                description
                  "Configure this as a flood-reflector";
                uses apply-advanced;
    
                leaf cluster-id {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description "Cluster-ID";
                }
              }  // container reflector
    
              leaf client {
                type empty;
                description
                  "Configure interface as flood-reflector client";
              }
            }  // container flood-reflector
          }  // list level
    
          list interface-group {
            key "name";
            description
              "Interface grouping configuration";
            leaf name {
              type string;
              description "Interface group name";
            }
    
            uses apply-advanced;
    
            list level {
              key "name";
              ordered-by user;
              description
                "Configure levels on this interface-group";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 2";
                  }
                }
                description "IS-IS level number";
              }
    
              uses apply-advanced;
    
              container ipv4-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the level";
                junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv4 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv4-adjacency-segment
    
              container ipv6-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same level";
                junos:must "(!(".. .. no-advertise-adjacency-segment"))";
                junos:must-message "ipv6-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv6 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv6-adjacency-segment
    
              container srm6-adjacency-segment {
                description
                  "Configure srm6 adjacency segment";
                uses apply-advanced;
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  leaf sid {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Set Adjacency SID Value";
                  }
                }  // container unprotected
              }  // container srm6-adjacency-segment
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type enumeration {
                    enum "default" {
                      value 0;
                      description
                        "Default topology";
                    }
                    enum "ipv4-multicast" {
                      value 1;
                      description
                        "IPv4 multicast topology";
                    }
                    enum "ipv6-unicast" {
                      value 2;
                      description
                        "IPv6 unicast topology";
                    }
                    enum "ipv6-multicast" {
                      value 3;
                      description
                        "IPv6 multicast topology";
                    }
                  }
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 16777215";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 16777215";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list level
    
            container link-group-protection {
              junos:must "(!(".. .. backup-spf-options"))";
              junos:must-message "Backup SPF options can't be configured";
              description
                "Configure link group protection";
              uses apply-advanced;
    
              leaf minimum-bandwidth {
                type string;
                description
                  "Minimum bandwidth to carry traffic";
              }
    
              leaf revert-bandwidth {
                type string;
                description
                  "Revert bandwidth to carry traffic";
              }
            }  // container link-group-protection
    
            list interface {
              key "name";
              description
                "List interfaces for this group";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf weight {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Interface weight for adjacency set";
              }
            }  // list interface
          }  // list interface-group
    
          container spf-options {
            description
              "Configure SPF attributes";
            uses apply-advanced;
    
            container microloop-avoidance {
              description
                "Configure microloop avoidance mechanisms";
              uses apply-advanced;
    
              container post-convergence-path {
                junos:must "(!(".. use-route-convergence-delay"))";
                junos:must-message "use-route-convergence-delay is not allowed with post-convergence-path";
                presence
                  "enable post-convergence-path";
                description
                  "Temporarily install post-convergence path for routes potentially affected by microloops";
                uses apply-advanced;
    
                leaf delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "500 .. 60000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time after which temporary post-convergence paths are removed";
                }
    
                leaf maximum-labels {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 8";
                    }
                  }
                  description
                    "Set maximum number of label supported for Micro-Loop-Avoidance calculations";
                }
    
                leaf maximum-srv6-sids {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 6";
                    }
                  }
                  description
                    "Set maximum number of SRV6 SIDs supported for Micro-Loop-Avoidance calculations";
                }
              }  // container post-convergence-path
            }  // container microloop-avoidance
    
            leaf delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "50 .. 1000";
                }
              }
              units "milliseconds";
              description
                "Time to wait before running an SPF";
            }
    
            leaf holddown {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2000 .. 10000";
                }
              }
              units "milliseconds";
              description
                "Time to hold down before running an SPF";
            }
    
            leaf rapid-runs {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 5";
                }
              }
              description
                "Number of rapid SPF runs before SPF holddown";
            }
    
            container multipath {
              description
                "Configure multipath options";
              uses apply-advanced;
    
              container weighted {
                description
                  "Weighted multipath options";
                uses apply-advanced;
    
                leaf one-hop {
                  type empty;
                  description
                    "Enable load balancing on onehop multipath based on interface bandwidth";
                }
              }  // container weighted
            }  // container multipath
          }  // container spf-options
    
          container traceoptions {
            description
              "Trace options for IS-IS";
            uses apply-advanced;
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "traffic-statistics" {
                    value 0;
                    description
                      "Trace traffic-statistics related events";
                  }
                  enum "post-convergence-lfa" {
                    value 1;
                    description
                      "Trace post-convergence-lfa related events";
                  }
                  enum "error" {
                    value 2;
                    description
                      "Trace errored packets";
                  }
                  enum "spf" {
                    value 3;
                    description
                      "Trace SPF events";
                  }
                  enum "packets" {
                    value 4;
                    description
                      "Trace IS-IS packets";
                  }
                  enum "hello" {
                    value 5;
                    description
                      "Trace hello packets";
                  }
                  enum "lsp" {
                    value 6;
                    description
                      "Trace link-state packets";
                  }
                  enum "psn" {
                    value 7;
                    description
                      "Trace partial sequence number (PSN) packets";
                  }
                  enum "csn" {
                    value 8;
                    description
                      "Trace complete sequence number (CSN) packets";
                  }
                  enum "layer2-map" {
                    value 9;
                    description
                      "Trace ARP/ND kernel state manipulation";
                  }
                  enum "lsp-generation" {
                    value 10;
                    description
                      "Trace LSP generation";
                  }
                  enum "graceful-restart" {
                    value 11;
                    description
                      "Trace graceful restart events";
                  }
                  enum "ldp-synchronization" {
                    value 12;
                    description
                      "Trace synchronization between IS-IS and LDP";
                  }
                  enum "nsr-synchronization" {
                    value 13;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "spring" {
                    value 14;
                    description
                      "Trace source packet routing";
                  }
                  enum "prefix-sid" {
                    value 15;
                    description
                      "Trace source packet routing, prefix-sids";
                  }
                  enum "flex-algorithm" {
                    value 16;
                    description
                      "Trace flex-algorithm related events";
                  }
                  enum "adj-sid" {
                    value 17;
                    description
                      "Trace adj-sid related events";
                  }
                  enum "route" {
                    value 18;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 19;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 20;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 21;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 22;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 23;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 24;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "srv6" {
                    value 25;
                    description
                      "Trace srv6 related events";
                  }
                  enum "rmopd" {
                    value 26;
                    description
                      "Trace rmopd interactions";
                  }
                  enum "all" {
                    value 27;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
          }  // container traceoptions
    
          container backup-spf-options {
            description
              "Configure backup SPF attributes";
            uses apply-advanced;
    
            container remote-backup-calculation {
              junos:must "(!(".. .. backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols isis backup-spf-options use-post-convergence-lfa'";
              presence
                "enable remote-backup-calculation";
              description
                "Calculate Remote LFA backup nexthops";
              uses apply-advanced;
            }  // container remote-backup-calculation
    
            container use-post-convergence-lfa {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "Configuration of 'protocols isis source-packet-routing' is must";
              presence
                "enable use-post-convergence-lfa";
              description
                "Calculate Post Convergence Backup Nexthops";
              uses apply-advanced;
    
              leaf maximum-labels {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 8";
                  }
                }
                description
                  "Set maximum number of label supported for post convergence path calculations";
              }
    
              leaf maximum-srv6-sids {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 6";
                  }
                }
                description
                  "Set maximum number of SRV6 SIDs for post convergence path calculations";
              }
    
              leaf maximum-backup-paths {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 8";
                  }
                }
                description
                  "Set maximum equal cost backup post convergence paths";
              }
            }  // container use-post-convergence-lfa
    
            container use-source-packet-routing {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "Use of SPRING paths as backup can't be configured without configuring 'protocols isis source-packet-routing'";
              presence
                "enable use-source-packet-routing";
              description
                "Use SPRING routed paths for protection";
              uses apply-advanced;
            }  // container use-source-packet-routing
    
            leaf per-prefix-calculation {
              type empty;
              description
                "Calculate backup nexthops for non-best prefix originators";
            }
    
            leaf node-link-degradation {
              junos:must "(!(".. .. backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols isis backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Degrade to link protection when nodelink protection not available";
            }
          }  // container backup-spf-options
    
          list context-identifier {
            key "name";
            ordered-by user;
            description
              "Configuration for advertisement of a context-identifier ";
            leaf name {
              type jt:ipprefix;
              description
                "Context identifier range";
            }
    
            uses apply-advanced;
    
            list level {
              key "name";
              ordered-by user;
              description
                "Configure global level attributes";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 2";
                  }
                }
                description "IS-IS level number";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable advertisements to this level";
                }
              }  // choice enable-disable
            }  // list level
          }  // list context-identifier
    
          container traffic-engineering {
            description
              "Configure traffic engineering attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable traffic engineering";
              }
            }  // choice enable-disable
    
            leaf l3-unicast-topology {
              type empty;
              description
                "Download IGP topology into TED";
            }
    
            leaf ipv6 {
              type empty;
              description "Enable TEDv6";
            }
    
            leaf credibility-protocol-preference {
              type empty;
              description
                "Follow IGP protocol preference for TED protocol credibility";
            }
    
            leaf ipv4-multicast-rpf-routes {
              junos:must "(!(".. .. topologies ipv4-multicast"))";
              junos:must-message "ipv4-multicast-rpf-routes cannot be used with the ipv4-multicast topology";
              junos:must "(!(".. .. multicast-topology"))";
              junos:must-message "ipv4-multicast-rpf-routes cannot be used with multicast-topology";
              junos:must "(".. shortcuts")";
              junos:must-message "ipv4-multicast-rpf-routes cannot be used without shortcuts";
              type empty;
              status deprecated;
              description
                "Install IPv4 routes for multicast RPF checks into inet.2";
            }
    
            leaf ignore-lsp-metrics {
              type empty;
              description
                "Ignore label-switched path metrics when doing shortcuts";
            }
    
            container tunnel-source-protocol {
              description
                "Protocols from which to pick label-switched paths";
              uses apply-advanced;
    
              container rsvp {
                presence "enable rsvp";
                description
                  "Pick label-switched paths from rsvp";
                uses apply-advanced;
    
                leaf preference {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Preference for label-switched paths from this protocol";
                }
              }  // container rsvp
    
              container spring-te {
                presence "enable spring-te";
                description
                  "Pick label-switched paths from spring-te";
                uses apply-advanced;
    
                leaf preference {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Preference for label-switched paths from this protocol";
                }
              }  // container spring-te
            }  // container tunnel-source-protocol
    
            list family {
              key "name";
              ordered-by user;
              description
                "Address family specific traffic-engineering attributes";
              leaf name {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet6" {
                    value 1;
                    description "IPv6 family";
                  }
                  enum "inet-mpls" {
                    value 2;
                    description
                      "IPv4-MPLS family";
                  }
                  enum "inet6-mpls" {
                    value 3;
                    description
                      "IPv6-MPLS family";
                  }
                }
              }
    
              uses apply-advanced;
    
              container shortcuts {
                junos:must "(!(".. .. no-ldp-shortcuts"))";
                junos:must-message "Shortcuts configuration cannot be used with no-ldp-shortcuts";
                junos:must "(!(".. .. shortcuts"))";
                junos:must-message "per-family shortcuts configuration cannot be used with global shortcuts enabled";
                junos:must "(!(".. .. disable"))";
                junos:must-message "shortcuts cannot be used without traffic-engineering enabled";
                presence "enable shortcuts";
                description
                  "Use label-switched paths as next hops, if possible";
                uses apply-advanced;
    
                leaf multicast-rpf-routes {
                  junos:must "(!(".. .. .. .. multicast-topology"))";
                  junos:must-message "ipv4 multicast-rpf-routes cannot be used with the multicast-topology";
                  junos:must "(!(".. .. .. .. topologies ipv4-multicast"))";
                  junos:must-message "ipv4 multicast-rpf-routes cannot be used with the ipv4-multicast topology";
                  type empty;
                  description
                    "Install routes for multicast RPF checks into multicast RIB";
                }
    
                leaf-list import {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Import policy for shortcut";
                }
              }  // container shortcuts
            }  // list family
    
            container shortcuts {
              presence "enable shortcuts";
              status deprecated;
              description
                "Use label-switched paths as next hops, if possible";
              uses apply-advanced;
    
              leaf ignore-lsp-metrics {
                type empty;
                status deprecated;
                description
                  "Ignore label-switched path metrics when doing shortcuts";
              }
            }  // container shortcuts
    
            container multipath {
              description
                "Configure label-switched-path multipath behavior";
              uses apply-advanced;
    
              leaf lsp-equal-cost {
                junos:must "((".. .. shortcuts" || (".. .. family $$={inet} shortcuts" || (".. .. family $$={inet6} shortcuts" || ".. .. family $$={iso} shortcuts"))))";
                junos:must-message "Traffic engineering shortcuts for inet, inet6 or iso family must be configured.";
                type empty;
                description
                  "Include equal cost label-switched-paths";
              }
            }  // container multipath
    
            container advertisement {
              description
                "Configure traffic engineering attribute advertisements";
              uses apply-advanced;
    
              leaf always {
                type empty;
                description
                  "Advertise applicable legacy TE attributes always";
              }
    
              container application-specific {
                description
                  "Advertise application-specific TE attributes";
                uses apply-advanced;
    
                container all-applications {
                  presence
                    "enable all-applications";
                  description
                    "Advertise common application-specific link attributes";
                  uses apply-advanced;
    
                  leaf legacy {
                    type empty;
                    description
                      "Use legacy TE attributes for this application";
                  }
                }  // container all-applications
              }  // container application-specific
            }  // container advertisement
          }  // container traffic-engineering
    
          list label-switched-path {
            junos:must "(!(".. traffic-engineering ipv4-multicast-rpf-routes"))";
            junos:must-message "cannot advertise LSPs when using ipv4-multicast-rpf-routes";
            key "name";
            ordered-by user;
            description
              "Configuration for advertisement of a label-switched path";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description
                "Name of label-switched path to be advertised";
            }
    
            uses apply-advanced;
    
            list level {
              key "name";
              ordered-by user;
              description
                "Configure global level attributes";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 2";
                  }
                }
                description "IS-IS level number";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable advertisements to this level";
                }
              }  // choice enable-disable
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 16777215";
                  }
                }
                description
                  "SPF metric for this level";
              }
            }  // list level
          }  // list label-switched-path
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable IS-IS";
            }
          }  // choice enable-disable
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf reference-bandwidth {
            type string;
            description
              "Bandwidth for calculating metric defaults";
          }
    
          choice layer2-map-choice {
            leaf layer2-map {
              type empty;
              description
                "Kernel ARP/ND creation for nexthops";
            }
            leaf no-layer2-map {
              type empty;
              description
                "Don't kernel ARP/ND creation for nexthops";
            }
          }  // choice layer2-map-choice
    
          leaf job-stats {
            type empty;
            description "Collect job statistics";
          }
    
          leaf lsp-lifetime {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "350 .. 65535";
              }
            }
            units "seconds";
            description "Lifetime of LSPs";
          }
    
          leaf max-lsp-size {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "512 .. 1492";
              }
            }
            default "1492";
            description
              "Maximum size allowed for LSPs";
          }
    
          leaf max-hello-size {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "512 .. 16000";
              }
            }
            default "1492";
            description
              "Maximum size allowed for ISIS Hello PDUs";
          }
    
          leaf max-snp-size {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "512 .. 1400";
              }
            }
            default "1400";
            description
              "Maximum size allowed for Sequence Number (Complete/Partial) PDUs";
          }
    
          leaf spf-delay {
            junos:must "(!(".. spf-options delay"))";
            junos:must-message "You can only configure either spf-delay or delay under spf-options";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "50 .. 120000";
              }
            }
            units "milliseconds";
            status deprecated;
            description
              "Time to wait before running an SPF";
          }
    
          leaf authentication-key {
            type jt:unreadable;
            status deprecated;
            description
              "Authentication key (password)";
          }
    
          leaf authentication-type {
            type enumeration {
              enum "md5" {
                value 0;
                status deprecated;
                description "MD5 authentication";
              }
              enum "simple" {
                value 1;
                status deprecated;
                description
                  "Simple password authentication";
              }
            }
            status deprecated;
            description "Authentication type";
          }
    
          leaf loose-authentication-check {
            type empty;
            description
              "Verify authentication only if PDU has authentication TLV";
          }
    
          leaf max-areas {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "3 .. 36";
              }
            }
            default "3";
            description
              "Maximum number of advertised Areas";
          }
    
          leaf no-authentication-check {
            type empty;
            description
              "Disable authentication checking";
          }
    
          leaf no-ipv4-routing {
            type empty;
            description "Disable IPv4 routing";
          }
    
          leaf no-ipv6-routing {
            type empty;
            description "Disable IPv6 routing";
          }
    
          leaf clns-routing {
            type empty;
            description "Enable CLNS routing";
          }
    
          leaf clns-updown-compatibility {
            type empty;
            description
              "Set the Up/Down Bit in place of the I/E bit in CLNS TLVs";
          }
    
          leaf no-adjacency-holddown {
            type empty;
            description
              "Disable adjacency hold down";
          }
    
          leaf multicast-topology {
            type empty;
            status deprecated;
            description
              "Enable multicast topology";
          }
    
          leaf ignore-attached-bit {
            type empty;
            description
              "Ignore the attached bit in Level 1 LSPs";
          }
    
          container rib-group {
            description
              "Routing table group for importing IS-IS routes";
            uses rib_group_type;
          }  // container rib-group
    
          container strict-dual-isis {
            junos:must "(!(".. topologies"))";
            junos:must-message "strict-dual-isis is not allowed with multi-topologies";
            presence "enable strict-dual-isis";
            description
              "Ensure both ipv4 and ipv6 connectivity for all adjacencies";
            uses apply-advanced;
    
            leaf holdown {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              default "12";
              description
                "Set the holddown timer for strict spf computation";
            }
          }  // container strict-dual-isis
    
          container topologies {
            description "Enable topologies";
            uses apply-advanced;
    
            leaf ipv4-multicast {
              type empty;
              description
                "Enable IPv4-multicast topology";
            }
    
            leaf ipv6-unicast {
              type empty;
              description
                "Enable IPv6-unicast topology";
            }
    
            leaf ipv6-multicast {
              type empty;
              description
                "Enable IPv6-multicast topology";
            }
          }  // container topologies
    
          container overload {
            presence "enable overload";
            description
              "Set the overload bit (no transit traffic)";
            uses apply-advanced;
    
            leaf timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 3600";
                }
              }
              units "seconds";
              description
                "Time after which overload bit is reset";
            }
    
            leaf advertise-high-metrics {
              type empty;
              description
                "Advertise high metrics instead of setting the overload bit";
            }
    
            leaf allow-route-leaking {
              type empty;
              description
                "Allow routes to be leaked when overload is configured";
            }
    
            leaf internal-prefixes {
              type empty;
              description
                "Allow internal prefixes to be advertised with high metric";
            }
    
            leaf external-prefixes {
              type empty;
              description
                "Allow external prefixes to be advertised with high metric";
            }
          }  // container overload
    
          container graceful-restart {
            description
              "IS-IS graceful restart options";
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf helper-disable {
              type empty;
              description
                "Disable graceful restart helper capability";
            }
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 300";
                }
              }
              units "seconds";
              description
                "Maximum time for graceful restart to finish";
            }
          }  // container graceful-restart
        }  // grouping juniper-protocols-isis
    
        grouping juniper-protocols-l2vpn {
          description
            "Layer 2 VPN, VPLS or EVPN configuration";
          uses apply-advanced;
    
          leaf bum-hashing {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "Bum-hashing knob is only applicable for instance type vpls";
            type empty;
            description
              "Enable BUM hashing feature in the instance";
          }
    
          leaf enable-mac-move-action {
            type empty;
            description
              "Enable VPLS loop prevention feature in the instance";
          }
    
          leaf mac-pinning {
            junos:must "((".. .. .. protocols vpls" || ".. pbb-evpn-core"))";
            junos:must-message "mac-pinning is allowed in VPLS or PBB EVPN instance";
            type empty;
            description "Enable MAC pinning";
          }
    
          container mac-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC address forwarding table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container mac-table-size
    
          container mac-ip-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-ip-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC+IP bindings table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings";
            }
          }  // container mac-ip-table-size
    
          container interface-mac-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC address learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses per interface";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
                enum "log" {
                  value 2;
                  description
                    "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                }
                enum "shutdown" {
                  value 3;
                  description
                    "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                }
                enum "drop-and-log" {
                  value 4;
                  description
                    "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container interface-mac-limit
    
          container interface-mac-ip-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-ip-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC+IP bindings learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings per interface";
            }
          }  // container interface-mac-ip-limit
    
          container mac-notification {
            presence "enable mac-notification";
            description
              "MAC notification options";
            uses apply-advanced;
    
            leaf notification-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 60";
                }
              }
              units "seconds";
              default "30";
              description
                "Interval for sending MAC notifications";
            }
          }  // container mac-notification
    
          leaf mac-table-aging-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            units "seconds";
            description
              "Delay for discarding MAC address if no updates are received";
          }
    
          leaf no-mac-learning {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "no-mac-learning needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Disable dynamic MAC address learning";
          }
    
          leaf no-normalization {
            type empty;
            description
              "Disable vlan id normalization for interfaces";
          }
    
          leaf mac-statistics {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-statistics needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Enable MAC address statistics";
          }
    
          container mib {
            presence "enable mib";
            description "Snmp mib options";
            uses apply-advanced;
    
            container dot1q-mib {
              presence "enable dot1q-mib";
              description
                "Dot1q MIB configuration options";
              uses apply-advanced;
    
              leaf port-list {
                type enumeration {
                  enum "bit-map" {
                    value 0;
                    description
                      "Port list is represented in bit-map format";
                  }
                  enum "string" {
                    value 1;
                    description
                      "Port list is represented in string format";
                  }
                }
                description
                  "Port list for staticegressports and staticuntaggedports MIB";
              }
            }  // container dot1q-mib
          }  // container mib
    
          container static-rvtep-mac {
            description
              "Configure Static MAC and remote VxLAN tunnel endpoint entries";
            uses apply-advanced;
    
            list mac {
              key "mac_addr remote-vtep";
              description "Unicast MAC address";
              leaf mac_addr {
                type jt:mac-unicast;
              }
    
              leaf remote-vtep {
                type jt:ipaddr;
                description
                  "Configure static remote VXLAN tunnel endpoints";
              }
            }  // list mac
          }  // container static-rvtep-mac
    
          list interface {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface needs to be specified under switch-options for a virtual-switch instance";
            key "name";
            ordered-by user;
            description
              "Interface that connect this site to the VPN";
            leaf name {
              junos:must "(((".. .. .. .. protocols evpn flexible-cross-connect-vlan-aware" || ".. .. .. .. interface $$") || "FALSE"))";
              junos:must-message "Interface must be part of this routing instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container interface-mac-limit {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              description
                "Maximum number of MAC addresses learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC addresses per interface";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable interface for interface-mac-limit";
              }
    
              leaf packet-action {
                type enumeration {
                  enum "none" {
                    value 0;
                    description
                      "Forward the packet";
                  }
                  enum "drop" {
                    value 1;
                    description
                      "Drop packets and do not learn. Default is forward";
                  }
                  enum "log" {
                    value 2;
                    description
                      "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "shutdown" {
                    value 3;
                    description
                      "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "drop-and-log" {
                    value 4;
                    description
                      "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                  }
                }
                description
                  "Action when MAC limit is reached";
              }
            }  // container interface-mac-limit
    
            leaf action-priority {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 8";
                }
              }
              description
                "Blocking priority of this interface on mac move detection";
            }
    
            list static-mac {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              key "name";
              ordered-by user;
              description
                "Static MAC addresses assigned to this interface";
              leaf name {
                junos:must "((!(".. .. .. .. .. vlan-id all") || all ".. vlan-id <*>"))";
                junos:must-message " Specify vlan-id for qualified learning ";
                type jt:mac-addr;
                description "MAC address";
              }
    
              uses apply-advanced;
    
              list vlan-id {
                junos:must "(".. .. .. .. .. vlan-id all")";
                junos:must-message "'vlan-id all' has to be configured for the bridging domain";
                key "name";
                ordered-by user;
                description
                  "VLAN ID of learning VLAN";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4094";
                    }
                  }
                  description "Learning VLAN";
                }
    
                uses apply-advanced;
              }  // list vlan-id
            }  // list static-mac
    
            container interface-mac-ip-limit {
              description
                "Maximum number of MAC+IP bindings learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC+IP bindings per interface";
              }
            }  // container interface-mac-ip-limit
    
            leaf no-mac-learning {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              type empty;
              description
                "Disable dynamic MAC address learning";
            }
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            leaf persistent-learning {
              junos:must "(!("switch-options mac-table-aging-time "))";
              junos:must-message "Persistent learning can not co-exist with mac-table-aging-time";
              type empty;
              description
                "Enable persistent MAC learning on this interface";
            }
    
            container vpws-service-id {
              presence "enable vpws-service-id";
              description
                "Service-id for EVPN VPWS routing instance";
              uses apply-advanced;
    
              leaf local {
                junos:must "(unique ".. .. .. interface <*> vpws-service-id local $$")";
                junos:must-message "Unique Local SID can only be configured ";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16777215";
                  }
                }
                description
                  "Local EVPN VPWS service id";
              }
    
              leaf remote {
                junos:must "(unique ".. .. .. interface <*> vpws-service-id remote $$")";
                junos:must-message "Unique Remote SID can only be configured ";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16777215";
                  }
                }
                description
                  "Remote EVPN VPWS service id";
              }
            }  // container vpws-service-id
    
            leaf flow-label-transmit-static {
              junos:must "(".. .. .. .. instance-type evpn-vpws")";
              junos:must-message "Flow-Label static only supported for EVPN-VPWS";
              type empty;
              description
                "Push Flow Label on PW packets sent to remote PE";
            }
    
            leaf flow-label-receive-static {
              junos:must "(".. .. .. .. instance-type evpn-vpws")";
              junos:must-message "Flow-Label static only supported for EVPN-VPWS";
              type empty;
              description
                "Pop Flow Label from PW packets received from remote PE";
            }
    
            leaf protect-interface {
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be part of this routing instance";
              junos:must "(!("interfaces ${inter_name} esi"))";
              junos:must-message "ESI can not be configured for protect interface";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Name of protect interface";
            }
    
            leaf remote-site-id {
              junos:must "(!(".. .. .. .. .. l2vpn-id"))";
              junos:must-message "Remote site identifier is not valid for FEC 129 VPWS instances";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65534";
                }
              }
              description
                "Site identifier associated with this interface";
            }
    
            leaf target-attachment-identifier {
              junos:must "(".. .. source-attachment-identifier")";
              junos:must-message "Source attachment identifier configuration required for the containing site";
              junos:must "(unique ".. .. interface <*> target-attachment-identifier $$")";
              junos:must-message "All interface target attachment identifiers must be unique within a site";
              type string {
                junos:posix-pattern "^([[:digit:].]){1,15}$|^([[:digit:]]){0,10}:([[:digit:].]){0,15}:([[:digit:]]){1,10}$";
                junos:pattern-message "
    Use fec129 AII type 1 format with just <AC-ID> or
    fec129 AII type 2 format <Global-ID>:<Prefix>:<AC-ID> where
    <Global-ID> is a value between 0..4294967295,
    <Prefix> is a value between 0..4294967295 or a valid IP address,
    <AC-ID> is a value between 1..4294967295 (or a valid IP address for AII type 1).
    e.g. 1, 0.0.0.1, 0:0:1, 1:2:3, 1:2.2.2.2:3, ::1, 1::2, :1:2";
              }
              description
                "FEC 129 VPWS target attachment identifier";
            }
    
            leaf flow-label-transmit {
              junos:must "(".. .. source-attachment-identifier")";
              junos:must-message "Source attachment identifier configuration required for the containing site";
              type empty;
              description
                "Advertise capability to push Flow Label in transmit direction to remote PE";
            }
    
            leaf flow-label-receive {
              junos:must "(".. .. source-attachment-identifier")";
              junos:must-message "Source attachment identifier configuration required for the containing site";
              type empty;
              description
                "Advertise capability to pop Flow Label in receive direction to remote PE";
            }
    
            leaf encapsulation-type {
              type enumeration {
                enum "atm-aal5" {
                  value 0;
                  description
                    "ATM AAL/5 encapsulation";
                }
                enum "atm-cell" {
                  value 1;
                  description
                    "ATM port promiscuous mode cell encapsulation";
                }
                enum "atm-cell-port-mode" {
                  value 2;
                  description
                    "ATM port promiscuous mode cell encapsulation";
                }
                enum "atm-cell-vp-mode" {
                  value 3;
                  description
                    "ATM VP promiscuous mode cell encapsulation";
                }
                enum "atm-cell-vc-mode" {
                  value 4;
                  description
                    "ATM non-promiscuous cell encapsulation";
                }
                enum "frame-relay" {
                  value 5;
                  description
                    "Frame Relay encapsulation";
                }
                enum "ppp" {
                  value 6;
                  description
                    "PPP encapsulation";
                }
                enum "cisco-hdlc" {
                  value 7;
                  description
                    "Cisco-compatible HDLC encapsulation";
                }
                enum "ethernet-vlan" {
                  value 8;
                  description
                    "Ethernet VLAN encapsulation";
                }
                enum "ethernet" {
                  value 9;
                  description
                    "Ethernet encapsulation";
                }
                enum "interworking" {
                  value 10;
                  description
                    "Layer 2.5 interworking VPN";
                }
                enum "frame-relay-port-mode" {
                  value 11;
                  description
                    "Frame Relay port mode encapsulation";
                }
                enum "satop-t1" {
                  value 12;
                  description
                    "SATOP-T1 based Layer 2 VPN";
                }
                enum "satop-e1" {
                  value 13;
                  description
                    "SATOP-E1 based Layer 2 VPN";
                }
                enum "satop-t3" {
                  value 14;
                  description
                    "SATOP-T3 based Layer 2 VPN";
                }
                enum "satop-e3" {
                  value 15;
                  description
                    "SATOP-E3 based Layer 2 VPN";
                }
                enum "cesop" {
                  value 16;
                  description
                    "CESOP based Layer 2 VPN";
                }
              }
              description
                "Encapsulation type for VPN";
            }
    
            leaf ignore-encapsulation-mismatch {
              type empty;
              description
                "Allow different encapsulation types on local and remote end";
            }
    
            leaf mtu {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "512 .. 65535";
                }
              }
              description
                "MTU to be advertised to the remote end";
            }
    
            leaf ignore-mtu-mismatch {
              type empty;
              description
                "Allow different MTU values on local and remote end";
            }
    
            choice cword {
              leaf control-word {
                type empty;
                description
                  "Adds control-word to the Layer 2 encapsulation";
              }
              leaf no-control-word {
                type empty;
                description
                  "Disables control-word to the Layer 2 encapsulation";
              }
            }  // choice cword
    
            leaf pseudowire-status-tlv {
              type empty;
              description
                "Send pseudowire status TLV";
            }
    
            container oam {
              description
                "OAM Configuration for VPN";
              uses apply-advanced;
    
              leaf ping-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "30 .. 3600";
                  }
                }
                units "seconds";
                default "60";
                description
                  "Time interval between ping messages";
              }
    
              leaf ping-multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "1 .. 5";
                  }
                }
                description
                  "Number of ping reply missed before declaring BFD down";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
              }  // container bfd-liveness-detection
            }  // container oam
    
            leaf community {
              type string;
              description
                "Community associated with this interface";
            }
    
            leaf description {
              type string;
              description "Text description";
            }
          }  // list interface
    
          list site {
            key "name";
            ordered-by user;
            description
              "Sites connected to this provider equipment";
            leaf name {
              type string;
              description
                "Name of Layer 2 VPN or VPLS site";
            }
    
            uses apply-advanced;
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            list mesh-group {
              key "name";
              ordered-by user;
              description
                "Mesh-groups that are part of this site";
              leaf name {
                junos:must "(".. .. .. mesh-group $$")";
                junos:must-message "Mesh-group must be configured to associate with a site";
                type string;
                description "Mesh-group name";
              }
    
              uses apply-advanced;
            }  // list mesh-group
    
            list interface {
              junos:must "(!(!((".. .. .. .. protocols vpls" || ".. .. .. .. protocols l2vpn"))))";
              junos:must-message "interface needs to be specified under switch-options for a virtual-switch instance";
              key "name";
              ordered-by user;
              description
                "Interface that connect this site to the VPN";
              leaf name {
                junos:must "((".. .. .. .. .. interface $$" || any ".. .. .. .. .. bridge-domains <*> interface $$"))";
                junos:must-message "Interface must be part of this routing instance";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              container interface-mac-limit {
                junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
                description
                  "Maximum number of MAC addresses learned on the interface";
                uses apply-advanced;
    
                leaf limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32;
                  }
                  description
                    "Maximum number of MAC addresses per interface";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable interface for interface-mac-limit";
                }
    
                leaf packet-action {
                  type enumeration {
                    enum "none" {
                      value 0;
                      description
                        "Forward the packet";
                    }
                    enum "drop" {
                      value 1;
                      description
                        "Drop packets and do not learn. Default is forward";
                    }
                    enum "log" {
                      value 2;
                      description
                        "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                    }
                    enum "shutdown" {
                      value 3;
                      description
                        "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                    }
                    enum "drop-and-log" {
                      value 4;
                      description
                        "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                    }
                  }
                  description
                    "Action when MAC limit is reached";
                }
              }  // container interface-mac-limit
    
              leaf action-priority {
                junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 8";
                  }
                }
                description
                  "Blocking priority of this interface on mac move detection";
              }
    
              list static-mac {
                junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
                key "name";
                ordered-by user;
                description
                  "Static MAC addresses assigned to this interface";
                leaf name {
                  junos:must "((!(".. .. .. .. .. .. vlan-id all") || all ".. vlan-id <*>"))";
                  junos:must-message " Specify vlan-id for qualified learning ";
                  type jt:mac-addr;
                  description "MAC address";
                }
    
                uses apply-advanced;
    
                list vlan-id {
                  junos:must "(".. .. .. .. .. .. vlan-id all")";
                  junos:must-message "'vlan-id all' has to be configured for the bridging domain";
                  key "name";
                  ordered-by user;
                  description
                    "VLAN ID of learning VLAN";
                  leaf name {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 4094";
                      }
                    }
                    description "Learning VLAN";
                  }
    
                  uses apply-advanced;
                }  // list vlan-id
              }  // list static-mac
    
              container interface-mac-ip-limit {
                description
                  "Maximum number of MAC+IP bindings learned on the interface";
                uses apply-advanced;
    
                leaf limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32;
                  }
                  description
                    "Maximum number of MAC+IP bindings per interface";
                }
              }  // container interface-mac-ip-limit
    
              leaf no-mac-learning {
                junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
                type empty;
                description
                  "Disable dynamic MAC address learning";
              }
    
              leaf mac-pinning {
                type empty;
                description "Enable MAC pinning";
              }
    
              leaf persistent-learning {
                junos:must "(!("switch-options mac-table-aging-time "))";
                junos:must-message "Persistent learning can not co-exist with mac-table-aging-time";
                type empty;
                description
                  "Enable persistent MAC learning on this interface";
              }
    
              leaf remote-site-id {
                junos:must "(!(".. .. .. .. .. l2vpn-id"))";
                junos:must-message "Remote site identifier is not valid for FEC 129 VPWS instances";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65534";
                  }
                }
                description
                  "Site identifier associated with this interface";
              }
    
              leaf target-attachment-identifier {
                junos:must "(".. .. source-attachment-identifier")";
                junos:must-message "Source attachment identifier configuration required for the containing site";
                junos:must "(unique ".. .. interface <*> target-attachment-identifier $$")";
                junos:must-message "All interface target attachment identifiers must be unique within a site";
                type string {
                  junos:posix-pattern "^([[:digit:].]){1,15}$|^([[:digit:]]){0,10}:([[:digit:].]){0,15}:([[:digit:]]){1,10}$";
                  junos:pattern-message "
    Use fec129 AII type 1 format with just <AC-ID> or
    fec129 AII type 2 format <Global-ID>:<Prefix>:<AC-ID> where
    <Global-ID> is a value between 0..4294967295,
    <Prefix> is a value between 0..4294967295 or a valid IP address,
    <AC-ID> is a value between 1..4294967295 (or a valid IP address for AII type 1).
    e.g. 1, 0.0.0.1, 0:0:1, 1:2:3, 1:2.2.2.2:3, ::1, 1::2, :1:2";
                }
                description
                  "FEC 129 VPWS target attachment identifier";
              }
    
              leaf flow-label-transmit {
                junos:must "(".. .. source-attachment-identifier")";
                junos:must-message "Source attachment identifier configuration required for the containing site";
                type empty;
                description
                  "Advertise capability to push Flow Label in transmit direction to remote PE";
              }
    
              leaf flow-label-receive {
                junos:must "(".. .. source-attachment-identifier")";
                junos:must-message "Source attachment identifier configuration required for the containing site";
                type empty;
                description
                  "Advertise capability to pop Flow Label in receive direction to remote PE";
              }
    
              leaf encapsulation-type {
                type enumeration {
                  enum "atm-aal5" {
                    value 0;
                    description
                      "ATM AAL/5 encapsulation";
                  }
                  enum "atm-cell" {
                    value 1;
                    description
                      "ATM port promiscuous mode cell encapsulation";
                  }
                  enum "atm-cell-port-mode" {
                    value 2;
                    description
                      "ATM port promiscuous mode cell encapsulation";
                  }
                  enum "atm-cell-vp-mode" {
                    value 3;
                    description
                      "ATM VP promiscuous mode cell encapsulation";
                  }
                  enum "atm-cell-vc-mode" {
                    value 4;
                    description
                      "ATM non-promiscuous cell encapsulation";
                  }
                  enum "frame-relay" {
                    value 5;
                    description
                      "Frame Relay encapsulation";
                  }
                  enum "ppp" {
                    value 6;
                    description
                      "PPP encapsulation";
                  }
                  enum "cisco-hdlc" {
                    value 7;
                    description
                      "Cisco-compatible HDLC encapsulation";
                  }
                  enum "ethernet-vlan" {
                    value 8;
                    description
                      "Ethernet VLAN encapsulation";
                  }
                  enum "ethernet" {
                    value 9;
                    description
                      "Ethernet encapsulation";
                  }
                  enum "interworking" {
                    value 10;
                    description
                      "Layer 2.5 interworking VPN";
                  }
                  enum "frame-relay-port-mode" {
                    value 11;
                    description
                      "Frame Relay port mode encapsulation";
                  }
                  enum "satop-t1" {
                    value 12;
                    description
                      "SATOP-T1 based Layer 2 VPN";
                  }
                  enum "satop-e1" {
                    value 13;
                    description
                      "SATOP-E1 based Layer 2 VPN";
                  }
                  enum "satop-t3" {
                    value 14;
                    description
                      "SATOP-T3 based Layer 2 VPN";
                  }
                  enum "satop-e3" {
                    value 15;
                    description
                      "SATOP-E3 based Layer 2 VPN";
                  }
                  enum "cesop" {
                    value 16;
                    description
                      "CESOP based Layer 2 VPN";
                  }
                }
                description
                  "Encapsulation type for VPN";
              }
    
              leaf ignore-encapsulation-mismatch {
                type empty;
                description
                  "Allow different encapsulation types on local and remote end";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "512 .. 65535";
                  }
                }
                description
                  "MTU to be advertised to the remote end";
              }
    
              leaf ignore-mtu-mismatch {
                type empty;
                description
                  "Allow different MTU values on local and remote end";
              }
    
              choice cword {
                leaf control-word {
                  type empty;
                  description
                    "Adds control-word to the Layer 2 encapsulation";
                }
                leaf no-control-word {
                  type empty;
                  description
                    "Disables control-word to the Layer 2 encapsulation";
                }
              }  // choice cword
    
              leaf pseudowire-status-tlv {
                type empty;
                description
                  "Send pseudowire status TLV";
              }
    
              container oam {
                description
                  "OAM Configuration for VPN";
                uses apply-advanced;
    
                leaf ping-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "30 .. 3600";
                    }
                  }
                  units "seconds";
                  default "60";
                  description
                    "Time interval between ping messages";
                }
    
                leaf ping-multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 5";
                    }
                  }
                  description
                    "Number of ping reply missed before declaring BFD down";
                }
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection (BFD) options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
                }  // container bfd-liveness-detection
              }  // container oam
    
              leaf community {
                type string;
                description
                  "Community associated with this interface";
              }
    
              leaf description {
                type string;
                description "Text description";
              }
            }  // list interface
    
            choice site-identifier-mode {
              leaf site-identifier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65534";
                  }
                }
                description
                  "Layer 2 VPN or VPLS site identifier (unique in the VPN)";
              }
              container automatic-site-id {
                junos:must "(!(".. .. .. .. protocols l2vpn"))";
                junos:must-message "Automatic site ID is supported only for VPLS service";
                junos:must "(!(any ".. .. mesh-group <*> peer-as"))";
                junos:must-message "Automatic site cannot be configured with BGP mesh group";
                presence
                  "enable automatic-site-id";
                description
                  "Enable automatic assignment of site identifier";
                uses apply-advanced;
    
                leaf startup-wait-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 3600";
                    }
                  }
                  units "seconds";
                  description
                    "Time to wait at startup before claming a site identifier (seconds)";
                }
    
                leaf new-site-wait-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 3600";
                    }
                  }
                  units "seconds";
                  description
                    "Time to wait before claiming a site identifier";
                }
    
                leaf collision-detect-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 3600";
                    }
                  }
                  units "seconds";
                  description
                    "Time to wait for detecting a collision";
                }
    
                container reclaim-wait-time {
                  presence
                    "enable reclaim-wait-time";
                  description
                    "Time to wait for reclaiming a site identifier";
                  leaf minimum {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum wait time";
                  }
    
                  leaf maximum {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "Maximum wait time";
                  }
                }  // container reclaim-wait-time
              }  // container automatic-site-id
            }  // choice site-identifier-mode
    
            leaf source-attachment-identifier {
              junos:must "(".. .. .. .. l2vpn-id")";
              junos:must-message "Source attachment identifier only supported for FEC 129 VPWS instances";
              junos:must "(unique ".. .. site <*> source-attachment-identifier $$")";
              junos:must-message "All site source attachment identifiers must be unique within an instance";
              type string {
                junos:posix-pattern "^([[:digit:].]){1,15}$|^([[:digit:]]){0,10}:([[:digit:].]){0,15}:([[:digit:]]){1,10}$";
                junos:pattern-message "
    Use fec129 AII type 1 format with just <AC-ID> or
    fec129 AII type 2 format <Global-ID>:<Prefix>:<AC-ID> where
    <Global-ID> is a value between 0..4294967295,
    <Prefix> is a value between 0..4294967295 or a valid IP address,
    <AC-ID> is a value between 1..4294967295 (or a valid IP address for AII type 1).
    e.g. 1, 0.0.0.1, 0:0:1, 1:2:3, 1:2.2.2.2:3, ::1, 1::2, :1:2";
              }
              description
                "FEC 129 VPWS source attachment identifier";
            }
    
            leaf flow-label-transmit {
              junos:must "(".. .. .. .. l2vpn-id")";
              junos:must-message "Per-site Flow Label Config is only supported for FEC129 VPWS";
              type empty;
              description
                "Advertise capability to push Flow Label in transmit direction to remote PE";
            }
    
            leaf flow-label-receive {
              junos:must "(".. .. .. .. l2vpn-id")";
              junos:must-message "Per-site Flow Label Config is only supported for FEC129 VPWS";
              type empty;
              description
                "Advertise capability to push Flow Label in receive direction to remote PE";
            }
    
            leaf encapsulation-type {
              type enumeration {
                enum "atm-aal5" {
                  value 0;
                  description
                    "ATM AAL/5 encapsulation";
                }
                enum "atm-cell" {
                  value 1;
                  description
                    "ATM port promiscuous mode cell encapsulation";
                }
                enum "atm-cell-port-mode" {
                  value 2;
                  description
                    "ATM port promiscuous mode cell encapsulation";
                }
                enum "atm-cell-vp-mode" {
                  value 3;
                  description
                    "ATM VP promiscuous mode cell encapsulation";
                }
                enum "atm-cell-vc-mode" {
                  value 4;
                  description
                    "ATM non-promiscuous cell encapsulation";
                }
                enum "frame-relay" {
                  value 5;
                  description
                    "Frame Relay encapsulation";
                }
                enum "ppp" {
                  value 6;
                  description
                    "PPP encapsulation";
                }
                enum "cisco-hdlc" {
                  value 7;
                  description
                    "Cisco-compatible HDLC encapsulation";
                }
                enum "ethernet-vlan" {
                  value 8;
                  description
                    "Ethernet VLAN encapsulation";
                }
                enum "ethernet" {
                  value 9;
                  description
                    "Ethernet encapsulation";
                }
                enum "interworking" {
                  value 10;
                  description
                    "Layer 2.5 interworking VPN";
                }
                enum "frame-relay-port-mode" {
                  value 11;
                  description
                    "Frame Relay port mode encapsulation";
                }
                enum "satop-t1" {
                  value 12;
                  description
                    "SATOP-T1 based Layer 2 VPN";
                }
                enum "satop-e1" {
                  value 13;
                  description
                    "SATOP-E1 based Layer 2 VPN";
                }
                enum "satop-t3" {
                  value 14;
                  description
                    "SATOP-T3 based Layer 2 VPN";
                }
                enum "satop-e3" {
                  value 15;
                  description
                    "SATOP-E3 based Layer 2 VPN";
                }
                enum "cesop" {
                  value 16;
                  description
                    "CESOP based Layer 2 VPN";
                }
              }
              description
                "Encapsulation type for VPN";
            }
    
            leaf ignore-encapsulation-mismatch {
              type empty;
              description
                "Allow different encapsulation types on local and remote end";
            }
    
            choice cword {
              leaf control-word {
                type empty;
                description
                  "Adds control-word to the Layer 2 encapsulation";
              }
              leaf no-control-word {
                type empty;
                description
                  "Disables control-word to the Layer 2 encapsulation";
              }
            }  // choice cword
    
            leaf pseudowire-status-tlv {
              type empty;
              description
                "Send pseudowire status TLV";
            }
    
            container oam {
              description
                "OAM Configuration for VPN";
              uses apply-advanced;
    
              leaf ping-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "30 .. 3600";
                  }
                }
                units "seconds";
                default "60";
                description
                  "Time interval between ping messages";
              }
    
              leaf ping-multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "1 .. 5";
                  }
                }
                description
                  "Number of ping reply missed before declaring BFD down";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
              }  // container bfd-liveness-detection
            }  // container oam
    
            leaf community {
              type string;
              description
                "Community associated with this site";
            }
    
            container multi-homing {
              junos:must "(!(".. automatic-site-id"))";
              junos:must-message "Multi-homing cannot be configured for automatic site";
              presence "enable multi-homing";
              description
                "Enable multi-homing functionality for this site";
              uses apply-advanced;
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 18000";
                  }
                }
                units "seconds";
                description
                  "Enable multi-homing non-designated forwarder hold time (seconds)";
              }
            }  // container multi-homing
    
            leaf site-preference {
              type string;
              description
                "Layer 2 VPN or VPLS site preference";
            }
    
            leaf hot-standby {
              junos:must "(!(".. site-preference primary"))";
              junos:must-message "primary site cannot be hot-standby";
              type empty;
              description
                "Keep backup pseudowire in continuous standby mode and ready for traffic forwarding";
            }
    
            leaf mtu {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "512 .. 65535";
                }
              }
              description
                "MTU to be advertised to the remote end";
            }
    
            leaf ignore-mtu-mismatch {
              type empty;
              description
                "Allow different MTU values on local and remote end";
            }
    
            container active-interface {
              description
                "Configure interface to designate as active";
              choice interface_name {
                leaf any {
                  type empty;
                  description
                    "One configured interface is designated active at random";
                }
                leaf primary {
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Interface to designate as active if it is operational";
                }
              }  // choice interface_name
            }  // container active-interface
    
            leaf best-site {
              junos:must "(!(".. .. .. l2vpn"))";
              junos:must-message "'best-site' feature not supported for VPWS/BGP-L2VPN instances";
              junos:must "(!(".. .. vpls-id"))";
              junos:must-message "'best-site' feature not supported for LDP based VPLS instances";
              junos:must "(!(".. interface"))";
              junos:must-message "'interface' must not be defined when 'best-site' knob is activated";
              type empty;
              description
                "Activates best-site functionality for this instance";
            }
          }  // list site
    
          list neighbor {
            junos:must "(".. vpls-id")";
            junos:must-message "'vpls-id' must be defined";
            key "name";
            ordered-by user;
            description
              "Neighbor for this VPLS instance";
            leaf name {
              type jt:ipv4addr;
              description "Neighbor ID";
            }
    
            uses apply-advanced;
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            container static {
              junos:must "((!(".. backup-neighbor") || all ".. backup-neighbor <*> static"))";
              junos:must-message "Backup neighbor should be static";
              presence "enable static";
              description
                "Configuration of static vpls";
              uses apply-advanced;
    
              leaf incoming-label {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "VPLS incoming static label [1000000 - 1048575] or [29696 - 41983]";
              }
    
              leaf outgoing-label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description
                  "VPLS outgoing static label";
              }
    
              choice cword {
                leaf control-word {
                  type empty;
                  description
                    "Adds control-word to the Layer 2 encapsulation";
                }
                leaf no-control-word {
                  type empty;
                  description
                    "Disables control-word to the Layer 2 encapsulation";
                }
              }  // choice cword
            }  // container static
    
            container associate-profile {
              description
                "Associate profile options for dynamic IFL";
              uses apply-advanced;
    
              leaf profile-name {
                type string {
                  length "1 .. 81";
                }
                description
                  "Associated profile name";
              }
    
              leaf profile-variable-set {
                type string {
                  length "1 .. 81";
                }
                description
                  "Associate dynamic variable set with the profile";
              }
            }  // container associate-profile
    
            leaf psn-tunnel-endpoint {
              type jt:ipv4addr;
              description
                "Endpoint of the transport tunnel on the remote PE";
            }
    
            leaf community {
              type string;
              description
                "Community associated with this neighbor";
            }
    
            leaf encapsulation-type {
              type enumeration {
                enum "ethernet-vlan" {
                  junos:must "(!(".. static"))";
                  junos:must-message "not supported for static vpls";
                  value 0;
                  description
                    "Ethernet VLAN encapsulation";
                }
                enum "ethernet" {
                  junos:must "(!(".. static"))";
                  junos:must-message "not supported for static vpls";
                  value 1;
                  description
                    "Ethernet encapsulation";
                }
              }
              description
                "Encapsulation type for VPN";
            }
    
            leaf ignore-encapsulation-mismatch {
              junos:must "(!(".. static"))";
              junos:must-message "not supported for static vpls";
              type empty;
              description
                "Allow different encapsulation types on local and remote end";
            }
    
            container pseudowire-status-tlv {
              junos:must "(!(".. static"))";
              junos:must-message "not supported for static vpls";
              presence
                "enable pseudowire-status-tlv";
              description
                "Send pseudowire status TLV";
              uses apply-advanced;
    
              leaf hot-standby-vc-on {
                type empty;
                description
                  "Activate pseudowire upon arrival of 'hot-standby' status TLV message";
              }
            }  // container pseudowire-status-tlv
    
            leaf switchover-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 180000";
                }
              }
              units "milliseconds";
              default "10000";
              description
                "Pseudowire switchover delay ";
            }
    
            container revert-time {
              presence "enable revert-time";
              description
                "Enable pseudowire redundancy reversion (seconds)";
              leaf delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 600";
                  }
                }
                units "seconds";
                description
                  "Reversion timer (seconds)";
              }
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1200";
                  }
                }
                units "seconds";
                description
                  "Maximum reversion interval to add over revert-time delay";
              }
            }  // container revert-time
    
            leaf connection-protection {
              junos:must "((!(".. backup-neighbor") || all ".. backup-neighbor <*> standby"))";
              junos:must-message "For connection-protection services, backup neighbor must be standby";
              junos:must "(!(".. switchover-delay"))";
              junos:must-message "connection-protection cannot be configured with switchover-delay";
              junos:must "(!(".. revert-time"))";
              junos:must-message "connection-protection cannot be configured with revert-time";
              type empty;
              description
                "End-2-end protection via OAM failure detection";
            }
    
            list backup-neighbor {
              key "name";
              ordered-by user;
              description
                "Configuration of redundant l2circuit";
              leaf name {
                type jt:ipv4addr;
                description "Neighbor ID";
              }
    
              uses apply-advanced;
    
              container static {
                junos:must "(".. .. static")";
                junos:must-message "Primary Neighbor must be static";
                presence "enable static";
                description
                  "Configuration of static vpls";
                uses apply-advanced;
    
                leaf incoming-label {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "VPLS incoming static label [1000000 - 1048575] or [29696 - 41983]";
                }
    
                leaf outgoing-label {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "16 .. 1048575";
                    }
                  }
                  description
                    "VPLS outgoing static label";
                }
              }  // container static
    
              leaf community {
                junos:must "(!(".. .. connection-protection"))";
                junos:must-message "The backup neighbor cannot be configured with community alongwith connection-protection";
                type string;
                description
                  "Community associated with this Layer 2 circuit";
              }
    
              leaf psn-tunnel-endpoint {
                type jt:ipv4addr;
                description
                  "Endpoint of the transport tunnel on the remote PE";
              }
    
              leaf standby {
                type empty;
                description
                  "Keep backup pseudowire in continuous standby";
              }
    
              leaf hot-standby {
                junos:must "((!(".. .. .. control-word") && !(".. .. .. .. control-word")))";
                junos:must-message "Hot-standby cannot be configured while having control-word enabled";
                junos:must "(".. .. pseudowire-status-tlv")";
                junos:must-message "Pseudowire-status-tlv must be configured in order to have hot-standby enabled";
                junos:must "(!(".. .. connection-protection"))";
                junos:must-message "Hot-standby cannot be configured while having connection-protection enabled";
                junos:must "(!(".. standby"))";
                junos:must-message "The backup neighbor cannot be configured with standby and hot-standby features simultaneously";
                type empty;
                description
                  "Keep backup pseudowire in continuous standby mode and ready for traffic forwarding";
              }
            }  // list backup-neighbor
    
            container oam {
              description
                "OAM Configuration for VPN";
              uses apply-advanced;
    
              leaf ping-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "30 .. 3600";
                  }
                }
                units "seconds";
                default "60";
                description
                  "Time interval between ping messages";
              }
    
              leaf ping-multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "1 .. 5";
                  }
                }
                description
                  "Number of ping reply missed before declaring BFD down";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
              }  // container bfd-liveness-detection
            }  // container oam
          }  // list neighbor
    
          list mesh-group {
            key "name";
            description
              "Mesh-group under this VPLS instance";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,32}$";
                junos:pattern-message "The mesh-group name should be between 1 and 32 characters";
              }
              description "Mesh-group name";
            }
    
            uses apply-advanced;
    
            leaf local-switching {
              type empty;
              description
                "Allow local-switching within interfaces in this mesh-group";
            }
    
            list neighbor {
              junos:must "(!(".. peer-as"))";
              junos:must-message "'peer-as' and 'neighbor' must not be defined in the same mesh-group";
              junos:must "(!(".. interface"))";
              junos:must-message "'interface' and 'neighbor' must not be defined in the same mesh-group";
              junos:must "((".. vpls-id" || ".. .. vpls-id"))";
              junos:must-message "'vpls-id' must be defined";
              key "name";
              ordered-by user;
              description
                "Neighbor belonging to this mesh-group";
              leaf name {
                type jt:ipv4addr;
                description "Neighbor ID";
              }
    
              uses apply-advanced;
    
              leaf mac-pinning {
                type empty;
                description "Enable MAC pinning";
              }
    
              container static {
                junos:must "((!(".. backup-neighbor") || all ".. backup-neighbor <*> static"))";
                junos:must-message "Backup neighbor should be static";
                presence "enable static";
                description
                  "Configuration of static vpls";
                uses apply-advanced;
    
                leaf incoming-label {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "VPLS incoming static label [1000000 - 1048575] or [29696 - 41983]";
                }
    
                leaf outgoing-label {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "16 .. 1048575";
                    }
                  }
                  description
                    "VPLS outgoing static label";
                }
    
                choice cword {
                  leaf control-word {
                    type empty;
                    description
                      "Adds control-word to the Layer 2 encapsulation";
                  }
                  leaf no-control-word {
                    type empty;
                    description
                      "Disables control-word to the Layer 2 encapsulation";
                  }
                }  // choice cword
              }  // container static
    
              container associate-profile {
                description
                  "Associate profile options for dynamic IFL";
                uses apply-advanced;
    
                leaf profile-name {
                  type string {
                    length "1 .. 81";
                  }
                  description
                    "Associated profile name";
                }
    
                leaf profile-variable-set {
                  type string {
                    length "1 .. 81";
                  }
                  description
                    "Associate dynamic variable set with the profile";
                }
              }  // container associate-profile
    
              leaf psn-tunnel-endpoint {
                type jt:ipv4addr;
                description
                  "Endpoint of the transport tunnel on the remote PE";
              }
    
              leaf community {
                type string;
                description
                  "Community associated with this neighbor";
              }
    
              leaf encapsulation-type {
                type enumeration {
                  enum "ethernet-vlan" {
                    junos:must "(!(".. static"))";
                    junos:must-message "not supported for static vpls";
                    value 0;
                    description
                      "Ethernet VLAN encapsulation";
                  }
                  enum "ethernet" {
                    junos:must "(!(".. static"))";
                    junos:must-message "not supported for static vpls";
                    value 1;
                    description
                      "Ethernet encapsulation";
                  }
                }
                description
                  "Encapsulation type for VPN";
              }
    
              leaf ignore-encapsulation-mismatch {
                junos:must "(!(".. static"))";
                junos:must-message "not supported for static vpls";
                type empty;
                description
                  "Allow different encapsulation types on local and remote end";
              }
    
              container pseudowire-status-tlv {
                junos:must "(!(".. static"))";
                junos:must-message "not supported for static vpls";
                presence
                  "enable pseudowire-status-tlv";
                description
                  "Send pseudowire status TLV";
                uses apply-advanced;
    
                leaf hot-standby-vc-on {
                  type empty;
                  description
                    "Activate pseudowire upon arrival of 'hot-standby' status TLV message";
                }
              }  // container pseudowire-status-tlv
    
              leaf switchover-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 180000";
                  }
                }
                units "milliseconds";
                default "10000";
                description
                  "Pseudowire switchover delay ";
              }
    
              container revert-time {
                presence "enable revert-time";
                description
                  "Enable pseudowire redundancy reversion (seconds)";
                leaf delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 600";
                    }
                  }
                  units "seconds";
                  description
                    "Reversion timer (seconds)";
                }
    
                leaf maximum {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 1200";
                    }
                  }
                  units "seconds";
                  description
                    "Maximum reversion interval to add over revert-time delay";
                }
              }  // container revert-time
    
              leaf connection-protection {
                junos:must "((!(".. backup-neighbor") || all ".. backup-neighbor <*> standby"))";
                junos:must-message "For connection-protection services, backup neighbor must be standby";
                junos:must "(!(".. switchover-delay"))";
                junos:must-message "connection-protection cannot be configured with switchover-delay";
                junos:must "(!(".. revert-time"))";
                junos:must-message "connection-protection cannot be configured with revert-time";
                type empty;
                description
                  "End-2-end protection via OAM failure detection";
              }
    
              list backup-neighbor {
                key "name";
                ordered-by user;
                description
                  "Configuration of redundant l2circuit";
                leaf name {
                  type jt:ipv4addr;
                  description "Neighbor ID";
                }
    
                uses apply-advanced;
    
                container static {
                  junos:must "(".. .. static")";
                  junos:must-message "Primary Neighbor must be static";
                  presence "enable static";
                  description
                    "Configuration of static vpls";
                  uses apply-advanced;
    
                  leaf incoming-label {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "VPLS incoming static label [1000000 - 1048575] or [29696 - 41983]";
                  }
    
                  leaf outgoing-label {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "16 .. 1048575";
                      }
                    }
                    description
                      "VPLS outgoing static label";
                  }
                }  // container static
    
                leaf community {
                  junos:must "(!(".. .. connection-protection"))";
                  junos:must-message "The backup neighbor cannot be configured with community alongwith connection-protection";
                  type string;
                  description
                    "Community associated with this Layer 2 circuit";
                }
    
                leaf psn-tunnel-endpoint {
                  type jt:ipv4addr;
                  description
                    "Endpoint of the transport tunnel on the remote PE";
                }
    
                leaf standby {
                  type empty;
                  description
                    "Keep backup pseudowire in continuous standby";
                }
    
                leaf hot-standby {
                  junos:must "((!(".. .. .. control-word") && !(".. .. .. .. control-word")))";
                  junos:must-message "Hot-standby cannot be configured while having control-word enabled";
                  junos:must "(".. .. pseudowire-status-tlv")";
                  junos:must-message "Pseudowire-status-tlv must be configured in order to have hot-standby enabled";
                  junos:must "(!(".. .. connection-protection"))";
                  junos:must-message "Hot-standby cannot be configured while having connection-protection enabled";
                  junos:must "(!(".. standby"))";
                  junos:must-message "The backup neighbor cannot be configured with standby and hot-standby features simultaneously";
                  type empty;
                  description
                    "Keep backup pseudowire in continuous standby mode and ready for traffic forwarding";
                }
              }  // list backup-neighbor
    
              container oam {
                description
                  "OAM Configuration for VPN";
                uses apply-advanced;
    
                leaf ping-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "30 .. 3600";
                    }
                  }
                  units "seconds";
                  default "60";
                  description
                    "Time interval between ping messages";
                }
    
                leaf ping-multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 5";
                    }
                  }
                  description
                    "Number of ping reply missed before declaring BFD down";
                }
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection (BFD) options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
                }  // container bfd-liveness-detection
              }  // container oam
    
              leaf-list vpls-id-list {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                ordered-by user;
                description
                  "LDP VPLS Identifier list for this neighbor";
              }
            }  // list neighbor
    
            list interface {
              key "name";
              description
                "Interfaces belonging to this flood group";
              leaf name {
                junos:must "(".. .. .. .. .. interface $$")";
                junos:must-message "Interface must be part of this VPLS routing instance";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
            }  // list interface
    
            container associate-profile {
              description
                "Associate profile options for dynamic IFL";
              uses apply-advanced;
    
              leaf profile-name {
                type string {
                  length "1 .. 81";
                }
                description
                  "Associated profile name";
              }
    
              leaf profile-variable-set {
                type string {
                  length "1 .. 81";
                }
                description
                  "Associate dynamic variable set with the profile";
              }
            }  // container associate-profile
    
            choice peer-as-choice {
              container peer-as {
                description
                  "Autonomous system of the peer";
                uses apply-advanced;
    
                leaf all {
                  type empty;
                  description
                    "Include peers from all autonomous systems";
                }
              }  // container peer-as
            }  // choice peer-as-choice
    
            leaf vpls-id {
              junos:must "(!(any ".. .. mesh-group <*> route-distinguisher"))";
              junos:must-message "Does not support FEC129 and FEC128 LDP VPLS mesh-group under the same instance";
              junos:must "(!(".. interface"))";
              junos:must-message "'vpls-id' must not be defined when specifying 'interface' in a mesh-group";
              type string;
              description
                "LDP VPLS Identifier for this mesh-group";
            }
    
            leaf-list vrf-import {
              junos:must "(".. route-distinguisher")";
              junos:must-message "route distinguisher must be defined";
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy for VPLS instance mesh-group";
            }
    
            leaf-list vrf-export {
              junos:must "(".. route-distinguisher")";
              junos:must-message "route distinguisher must be defined";
              type jt:policy-algebra;
              ordered-by user;
              description
                "Export policy for VPLS instance mesh-group";
            }
    
            container vrf-target {
              junos:must "(".. route-distinguisher")";
              junos:must-message "route distinguisher must be defined";
              description
                "VPLS mesh-group target community configuration";
              uses apply-advanced;
    
              leaf community {
                type string {
                  junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                }
                description
                  "Target community to use in import and export";
              }
    
              leaf import {
                type string {
                  junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                }
                description
                  "Target community to use when filtering on import";
              }
    
              leaf export {
                type string {
                  junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                }
                description
                  "Target community to use when marking routes on export";
              }
            }  // container vrf-target
    
            container mac-flush {
              presence "enable mac-flush";
              description
                "Enables mac-flush processing";
              uses apply-advanced;
    
              leaf any-interface {
                junos:must "((".. .. vpls-id" || ".. .. .. vpls-id"))";
                junos:must-message "'any-interface' can be configured only for LDP VPLS";
                type empty;
                description
                  "Send mac-flush when any AC interface goes down";
              }
    
              leaf any-spoke {
                junos:must "((".. .. vpls-id" || ".. .. .. vpls-id"))";
                junos:must-message "'any-spoke' can be configured only for LDP VPLS";
                type empty;
                description
                  "Send mac-flush when any spoke pseudo wire goes down";
              }
    
              leaf propagate {
                junos:must "((".. .. vpls-id" || ".. .. .. vpls-id"))";
                junos:must-message "'propagate' can be configured only for LDP VPLS";
                type empty;
                description
                  "Propagate mac-flush to the core";
              }
            }  // container mac-flush
    
            container route-distinguisher {
              junos:must "(!(any ".. .. mesh-group <*> vpls-id"))";
              junos:must-message "Does not support FEC129 and FEC128 LDP VPLS mesh-group under the same instance";
              description
                "Route distinguisher for this mesh-group";
              leaf rd-type {
                type string {
                  junos:posix-pattern "^[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100";
                }
                description
                  "Number in (16 bit:32 bit) or (32 bit 'L':16 bit) or (IP address:16 bit) format";
              }
            }  // container route-distinguisher
          }  // list mesh-group
    
          container proxy-mac {
            junos:must "(".. .. .. instance-type evpn")";
            junos:must-message "Applicable to instance-type evpn only";
            description "Proxy MAC settings";
            uses apply-advanced;
    
            leaf irb {
              junos:must "(!(".. .. no-arp-suppression"))";
              junos:must-message "Proxy MAC is not supported with no-arp-suppression";
              junos:must "(((".. .. .. .. l3-interface" || ".. .. .. .. routing-interface") && !(".. proxy-mac-address")))";
              junos:must-message "Proxy MAC in IRB mode should have routing-interface configured";
              type empty;
              description
                "Reply with virtual-gateway MAC or IRB MAC";
            }
    
            leaf proxy-mac-address {
              junos:must "(!(".. .. no-arp-suppression"))";
              junos:must-message "Proxy MAC is not supported with no-arp-suppression";
              junos:must "((!(".. .. .. .. routing-interface") && (!(".. .. .. .. l3-interface") && !(".. irb"))))";
              junos:must-message "Proxy MAC with specified MAC should not have routing-interface configured";
              type jt:mac-unicast;
              description
                "Reply with configured MAC for all requests";
            }
          }  // container proxy-mac
    
          container mclag {
            description
              "EVPN with MC-LAG support";
            uses apply-advanced;
    
            leaf bgp-peer {
              junos:must "(!(".. .. encapsulation vxlan"))";
              junos:must-message "encapsulation vxlan cannot be configured with bgp-peer";
              junos:must "(!(".. source-vtep-peer"))";
              junos:must-message "bgp-peer cannot be configured with source-vtep-peer.";
              type jt:ipaddr;
              description
                "Configure IP address of BGP neighbor, which is also MC-LAG peer";
            }
    
            leaf source-vtep-peer {
              junos:must "(".. .. encapsulation vxlan")";
              junos:must-message "encapsulation vxlan must be configured";
              type jt:ipaddr;
              description
                "Confiugure IP address of MC-LAG peer's source vtep IP address";
            }
          }  // container mclag
    
          leaf service-type {
            type enumeration {
              enum "single" {
                value 0;
                description
                  "Only one service for the virtual-switch";
              }
            }
            description
              "Specify service type for vpls";
          }
    
          leaf designated-forwarder-election-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1800";
              }
            }
            units "seconds";
            description
              "Time to wait before electing a DF(seconds)";
          }
    
          leaf designated-forwarder-preference-least {
            type empty;
            description
              "Use least preference in DF election";
          }
    
          leaf encapsulation {
            junos:must "((((".. .. .. instance-type virtual-switch" || (".. .. ..  instance-type evpn" || (".. .. .. instance-type mac-vrf" || ".. .. .. instance-type evpn-vpws"))) && !(".. .. .. switch-options route-distinguisher")) || ".. .. .. switch-options route-distinguisher"))";
            junos:must-message "Encapsulation can only be configured for an EVPN instance";
            type enumeration {
              enum "mpls" {
                value 0;
                description "MPLS encapsulation";
              }
              enum "vxlan" {
                value 1;
                description
                  "VXLAN encapsulation";
              }
              enum "mpls-inet6" {
                value 2;
                description
                  "MPLS over IPv6 encapsulation";
              }
            }
            default "mpls";
            description
              "Encapsulation type for EVPN";
          }
    
          leaf default-gateway {
            type enumeration {
              enum "advertise" {
                value 0;
                description
                  "Advertise IRB MACs with default gateway community";
              }
              enum "no-gateway-community" {
                value 1;
                description
                  "Advertise IRB MACs without default gateway community";
              }
              enum "do-not-advertise" {
                value 2;
                description
                  "Do not advertise IRB MACs";
              }
            }
            description "Default gateway mode";
          }
    
          container duplicate-mac-detection {
            description
              "Duplicate MAC detection settings";
            uses apply-advanced;
    
            leaf detection-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 20";
                }
              }
              description
                "Number of moves to trigger duplicate MAC detection";
            }
    
            leaf detection-window {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "5 .. 600";
                }
              }
              units "seconds";
              description
                "Time window for detection of duplicate MACs";
            }
    
            leaf auto-recovery-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 360";
                }
              }
              units "minutes";
              description
                "Automatically unblock duplicate MACs after a time delay";
            }
          }  // container duplicate-mac-detection
    
          choice extended-attributes {
            leaf-list extended-vlan-list {
              junos:must "(!((".. .. .. .. .. chassis satellite-management redundancy-groups" && !(".. mclag"))))";
              junos:must-message "Need to configure 'protocols evpn mclag' when evpn is configured with mclag.";
              junos:must "(!(".. pbb-evpn-core"))";
              junos:must-message "Extended VLAN list can't be configured in the PBB EVPN";
              junos:must "(!(".. encapsulation vxlan"))";
              junos:must-message "Extended VLAN list cannot coexist with encapsulation vxlan option";
              junos:must "(".. .. .. instance-type virtual-switch")";
              junos:must-message "Extended VLAN list can only be configured in a virtual switch instance";
              type jt:vlan-range;
              description
                "List of VLAN identifiers that are to be EVPN extended";
            }
            leaf-list extended-vni-list {
              junos:must "(!((".. .. .. .. .. chassis satellite-management redundancy-groups" && !(".. mclag"))))";
              junos:must-message "Need to configure 'protocols evpn mclag' when evpn is configured with mclag.";
              junos:must "(".. encapsulation vxlan")";
              junos:must-message "Extended VNI list can only be configured with encapsulation vxlan";
              junos:must "((".. .. .. instance-type virtual-switch" || ".. .. .. instance-type mac-vrf"))";
              junos:must-message "Extended VNI list can only be configured in a virtual switch instance";
              type string;
              description
                "List of VNI identifiers (1..16777214) or all, that are to be EVPN extended";
            }
            leaf-list extended-isid-list {
              junos:must "(".. pbb-evpn-core")";
              junos:must-message "Extended ISID list can only be configured in the PBB EVPN";
              junos:must "(".. .. .. instance-type virtual-switch")";
              junos:must-message "Extended ISID list can only be configured in a virtual switch instance";
              type string;
              description
                "Configure list of isids or all for extending to PBB EVPN";
            }
          }  // choice extended-attributes
    
          container evi-options {
            junos:must "(".. extended-isid-list")";
            junos:must-message "Extended-isid-list must be configured";
            description "EVI options";
            uses juniper-protocols-evi-options;
          }  // container evi-options
    
          leaf p2mp-bud-support {
            type empty;
            description
              "Enable EVPN to act as P2MP transit and egress PE (bud)";
          }
    
          container remote-ip-host-routes {
            junos:must "(!(".. encapsulation mpls-inet6"))";
            junos:must-message "VMTO not supported with encapsulation mpls-inet6";
            junos:must "(!(".. .. .. instance-type vrf"))";
            junos:must-message "remote-ip-host-routes knob is for virtual-switch, EVPN or default instance";
            presence
              "enable remote-ip-host-routes";
            description
              "Virtual machine traffic optimization(VMTO) for EVPN";
            uses apply-advanced;
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Policy to control the creation of remote IP host routes";
            }
    
            leaf no-advertise-community {
              type empty;
              description
                "Don't advertise Type 2 route's community";
            }
          }  // container remote-ip-host-routes
    
          leaf pbb-evpn-core {
            junos:must "(!(".. encapsulation mpls-inet6"))";
            junos:must-message "PBB not supported with encapsulation mpls-inet6";
            junos:must "(".. .. .. instance-type virtual-switch")";
            junos:must-message "pbb-evpn-core can only be configured in a virtual switch instance";
            junos:must "("chassis network-services enhanced-ip")";
            junos:must-message "PBB EVPN supported only with enhanced-ip mode";
            type empty;
            description
              "Configure PBB EVPN core";
          }
    
          leaf label-allocation {
            junos:must "(!(".. encapsulation vxlan"))";
            junos:must-message "label-allocation cannot coexist with encapsulation vxlan option";
            type enumeration {
              enum "per-instance" {
                value 0;
                description
                  "Allocate one label for the entire instance";
              }
            }
            description
              "Label allocation policy";
          }
    
          leaf evpn-etree {
            junos:must "(!(".. encapsulation mpls-inet6"))";
            junos:must-message "Not supported for encapsulation mpls-inet6";
            type empty;
            description "Evpn etree mode";
          }
    
          container assisted-replication {
            junos:must "(!("forwarding-options multicast-replication evpn irb local-only"))";
            junos:must-message "Assisted Replication is not valid with forwarding-options multicast-replication evpn irb local-only";
            junos:must "(".. encapsulation vxlan")";
            junos:must-message "Assisted Replication is supported only with encapsulation vxlan option";
            description
              "Option to enable Assisted Replication";
            uses apply-advanced;
    
            choice AR {
              container leaf {
                presence "enable leaf";
                description
                  "Assisted Replicator Leaf";
                uses apply-advanced;
    
                leaf replicator-activation-delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 180";
                    }
                  }
                  units "seconds";
                  default "10";
                  description
                    "Dealy interval in starting replication";
                }
              }  // container leaf
              container replicator {
                presence "enable replicator";
                description
                  "Assisted Replicator";
                uses apply-advanced;
    
                choice family {
                  container inet {
                    presence "enable inet";
                    description "IPv4 source";
                    uses apply-advanced;
    
                    leaf ip {
                      type jt:ipv4addr;
                      description
                        "Assisted Replicator IP address";
                    }
                  }  // container inet
                }  // choice family
    
                leaf vxlan-encapsulation-source-ip {
                  type enumeration {
                    enum
                      "ingress-replication-ip" {
                      value 0;
                      description
                        "Use regular ingress replication IP address";
                    }
                  }
                  description
                    "VXLAN encapsulation source IP for replicated traffic";
                }
              }  // container replicator
            }  // choice AR
          }  // container assisted-replication
    
          container vrf-target {
            junos:must "((".. extended-isid-list" || ".. extended-vlan-list"))";
            junos:must-message "Extended-isid-list or extended-vlan-list must be configured";
            description
              "VRF target community configuration";
            uses apply-advanced;
    
            leaf community {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use in import and export";
            }
          }  // container vrf-target
    
          container interconnect {
            description "Interconnect";
            uses juniper-protocols-evpn-interconnect;
          }  // container interconnect
    
          leaf pmsi-tunnel-endpoint {
            junos:must "(!(".. pbb-evpn-core"))";
            junos:must-message "Not Supported for PBB EVPN";
            junos:must "(!(".. encapsulation mpls-inet6"))";
            junos:must-message "Not supported for encapsulation mpls-inet6";
            junos:must "(!(".. encapsulation vxlan"))";
            junos:must-message "Not Supported for EVPN-VXLAN encapsulation";
            junos:must "(!(".. .. .. provider-tunnel"))";
            junos:must-message "Not Applicable for P2MP Tunnels";
            junos:must "(!(".. .. .. instance-type evpn-vpws"))";
            junos:must-message "Not Applicable for instance-type EVPN-VPWS";
            type jt:ipv4addr;
            description
              "IM IR PMSI tunnel Endpoint for remote PE";
          }
    
          leaf pmsi-tunnel-endpoint-inet6 {
            junos:must "(".. encapsulation mpls-inet6")";
            junos:must-message "Supported for mpls-inet6 encapsulation only";
            junos:must "(!(".. .. .. instance-type evpn-vpws"))";
            junos:must-message "Not Applicable for instance-type EVPN-VPWS";
            type jt:ipv6addr;
            description
              "IM IR PMSI IPv6 tunnel Endpoint for remote PE";
          }
    
          leaf normalization {
            junos:must "(!(".. encapsulation vxlan"))";
            junos:must-message "Not applicable for EVPN-VXLAN encapsulation";
            junos:must "((".. .. .. instance-type mac-vrf" && ".. .. .. service-type vlan-based"))";
            junos:must-message "Applicable for mac-vrf vlan-based service only";
            type empty;
            description
              "Enable vlan id normalization for interfaces";
          }
    
          leaf smet-etag-carry-vid {
            junos:must "((".. .. .. instance-type mac-vrf" && ".. .. .. service-type vlan-based"))";
            junos:must-message "Applicable for mac-vrf vlan-based service only";
            type empty;
            description
              "SMET Type 6,7 and 8 Routes to carry vlan id in Ethernet Tag field";
          }
    
          container irb-symmetric-routing {
            junos:must "(".. .. .. instance-type vrf")";
            junos:must-message "EVPN T-2 symmetric-routing must be configured with instance-type vrf";
            description
              "Enable EVPN T-2 symmtric routing";
            uses apply-advanced;
    
            leaf vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777214";
                }
              }
              description
                "VXLAN network identifier used for T-2 Symmetric Routing IP prefixes";
            }
          }  // container irb-symmetric-routing
    
          container ip-prefix-routes {
            junos:must "(".. .. .. instance-type vrf")";
            junos:must-message "ip-prefix-routes must be configured with instance-type vrf";
            presence "enable ip-prefix-routes";
            description
              "Advertise IP prefixes through EVPN";
            uses apply-advanced;
    
            leaf advertise {
              type enumeration {
                enum "gateway-address" {
                  junos:must "(".. gateway-interface")";
                  junos:must-message "advertise gateway-address must be configured with gateway-interface";
                  value 0;
                  description
                    "Advertise a gateway address in exported IP prefix routes";
                }
                enum "direct-nexthop" {
                  junos:must "((".. encapsulation vxlan" || ".. .. .. .. vrf-table-label"))";
                  junos:must-message "vrf-table-label must be used unless encapsulation vxlan is configured";
                  value 1;
                  description
                    "Advertise a direct nexthop in exported IP prefix routes";
                }
              }
              description
                "Advertisement attributes for IP prefixes";
            }
    
            leaf gateway-interface {
              junos:must "(".. advertise gateway-address")";
              junos:must-message "gateway-interface must be configured with advertise gateway-address";
              junos:must "(".. .. .. .. interface $$")";
              junos:must-message "Interface must configured in this routing instance";
              junos:must "("interfaces $$ family inet")";
              junos:must-message "Family inet must be defined";
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be defined";
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Gateway interface used when gateway address is advertised";
            }
    
            leaf encapsulation {
              type enumeration {
                enum "mpls" {
                  junos:must "(".. advertise direct-nexthop")";
                  junos:must-message "encapsulation must be configured with advertise direct-nexthop";
                  value 0;
                  description
                    "MPLS encapsulation";
                }
                enum "vxlan" {
                  junos:must "(".. vni")";
                  junos:must-message "encapsulation vxlan must be configured with vni";
                  junos:must "((".. advertise direct-nexthop" || ".. .. irb-symmetric-routing"))";
                  junos:must-message "encapsulation must be configured with advertise direct-nexthop or irb-symmetric-routing";
                  value 1;
                  description
                    "VXLAN encapsulation";
                }
              }
              description
                "Encapsulation used for IP prefixes";
            }
    
            leaf vni {
              junos:must "(".. encapsulation vxlan")";
              junos:must-message "vni must be configured with encapsulation vxlan";
              junos:must "((".. advertise direct-nexthop" || ".. .. irb-symmetric-routing"))";
              junos:must-message "vni must be configured with advertise direct-nexthop or irb-symmetric-routing";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777214";
                }
              }
              description
                "VXLAN network identifier used for IP prefixes";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Policy to control import of IP prefixes from EVPN";
            }
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Policy to control export of IP prefixes through EVPN";
            }
    
            container route-attributes {
              description
                "Route Attribute Import Export Option";
              uses apply-advanced;
    
              container as-path {
                description "AS-PATH Attribute";
                uses apply-advanced;
    
                leaf import-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit as-path from EVPN routes to IP routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inehrit as-path from EVPN routes to IP routes";
                    }
                  }
                  description
                    "AS-PATH Attribute Inherit Option on Import";
                }
    
                leaf export-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit as-path from IP routes to EVPN routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inherit as-path from IP routes to EVPN routes";
                    }
                  }
                  description
                    "AS-PATH Attribute Inherit Option on Export";
                }
              }  // container as-path
    
              container preference {
                description
                  "Preference Attribute";
                uses apply-advanced;
    
                leaf import-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit preference from EVPN routes to IP routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inherit preference from EVPN routes to EVPN routes";
                    }
                  }
                  description
                    "Preference Attribute Inerit Option on Import";
                }
    
                leaf export-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit preference from IP routes to EVPN routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inherit preference from IP routes to EVPN routes";
                    }
                  }
                  description
                    "Preference Attribute Inherit Option on Export";
                }
              }  // container preference
    
              container community {
                description
                  "Community Attribute";
                uses apply-advanced;
    
                leaf import-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit community from EVPN routes to IP routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inherit community from EVPN routes to IP routes";
                    }
                  }
                  description
                    "Community Attribute Inherit Option on Import";
                }
    
                leaf export-action {
                  type enumeration {
                    enum "allow" {
                      value 0;
                      description
                        "Inherit community from IP routes to EVPN routes";
                    }
                    enum "skip" {
                      value 1;
                      description
                        "Donot inherit community from IP route to EVPN routes";
                    }
                  }
                  description
                    "Community Attribute Inherit Option on Export";
                }
              }  // container community
            }  // container route-attributes
          }  // container ip-prefix-routes
    
          leaf igmp-id {
            junos:must "(!(".. encapsulation mpls-inet6"))";
            junos:must-message "IGMP snooping not supported with encapsulation mpls-inet6";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "EVPN IGMP Identifier value";
          }
    
          leaf multicast-mode {
            junos:must "(".. encapsulation vxlan")";
            junos:must-message "multicast-mode can only be configured with encapsulation vxlan";
            junos:must "((((".. .. .. instance-type virtual-switch" || ".. .. .. instance-type mac-vrf") && !(".. .. .. switch-options route-distinguisher")) || ".. .. .. switch-options route-distinguisher"))";
            junos:must-message "multicast-mode can only be configured in a virtual switch instance";
            type enumeration {
              enum "ingress-replication" {
                value 0;
                description
                  "Ingress Replication";
              }
            }
            default "ingress-replication";
            description
              "Multicast mode for EVPN";
          }
    
          container oism {
            junos:must "(".. oism supplemental-bridge-domain-irb")";
            junos:must-message "OISM must be configured with Supplemental Bridge Domain";
            junos:must "(".. .. .. instance-type vrf")";
            junos:must-message "oism must be configured with instance-type vrf";
            description
              "EVPN Multicast OISM features";
            uses apply-advanced;
    
            leaf supplemental-bridge-domain-irb {
              junos:must "(".. .. .. .. interface $$")";
              junos:must-message "Interface must configured in this routing instance";
              junos:must "("interfaces $$")";
              junos:must-message "Interface must be defined";
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "OISM SBD irb interface address";
            }
    
            leaf originate-smet-on-revenue-vlan-too {
              type empty;
              description
                "Originate smet route on revenue vlan too";
            }
    
            container pim-evpn-gateway {
              presence "enable pim-evpn-gateway";
              description
                "Configure PIM EVPN Gateway PEG parameters";
              uses apply-advanced;
    
              list external-irb {
                key "name";
                ordered-by user;
                description
                  "List of IRBs for external connectivity";
                leaf name {
                  junos:must "(".. .. .. .. .. .. interface $$")";
                  junos:must-message "Interface must be configured in this instance";
                  junos:must "("interfaces $$")";
                  junos:must-message "Interface must be defined";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "External vlan interface name";
                }
    
                uses apply-advanced;
              }  // list external-irb
            }  // container pim-evpn-gateway
          }  // container oism
    
          choice flexible-cross-connect-type {
            leaf flexible-cross-connect-vlan-aware {
              junos:must "(!(".. encapsulation mpls-inet6"))";
              junos:must-message "EVPN flexible cross-connect not supported with encapsulation mpls-inet6";
              junos:must "(!(".. flexible-cross-connect-vlan-unaware"))";
              junos:must-message "VPWS Instance can support either vlan aware or unaware service";
              junos:must "(".. .. .. instance-type evpn-vpws")";
              junos:must-message "instance-type evpn-vpws must be configured";
              type empty;
              description
                "Enable EVPN flexible cross-connect VLAN aware Service";
            }
            leaf flexible-cross-connect-vlan-unaware {
              junos:must "(!(".. flexible-cross-connect-vlan-aware"))";
              junos:must-message "VPWS Instance can support either vlan aware or unaware service";
              junos:must "(!(".. encapsulation mpls-inet6"))";
              junos:must-message "EVPN flexible cross-connect not supported with encapsulation mpls-inet6";
              junos:must "(".. .. .. instance-type evpn-vpws")";
              junos:must-message "instance-type evpn-vpws must be configured";
              type empty;
              description
                "Enable EVPN flexible cross-connect VLAN unaware Service";
            }
          }  // choice flexible-cross-connect-type
    
          leaf auto-service-id {
            junos:must "(".. flexible-cross-connect-vlan-aware")";
            junos:must-message "flexible-cross-connect-vlan-aware must be configured";
            junos:must "(".. .. .. instance-type evpn-vpws")";
            junos:must-message "instance-type evpn-vpws must be configured";
            type empty;
            description
              "Enable auto-derivation of VPWS service instance identifier";
          }
    
          leaf hot-standby-on {
            junos:must "(".. .. .. instance-type evpn-vpws")";
            junos:must-message "instance-type evpn-vpws must be configured";
            type empty;
            description
              "Activate evpn vpws upon becoming DF";
          }
    
          list group {
            junos:must "(".. flexible-cross-connect-vlan-unaware")";
            junos:must-message "flexible-cross-connect-vlan-unaware must be configured";
            junos:must "(".. .. .. instance-type evpn-vpws")";
            junos:must-message "instance-type evpn-vpws must be configured";
            key "name";
            ordered-by user;
            description
              "Enable EVPN flexible cross-connect VLAN unaware Service";
            leaf name {
              type string;
              description
                "Group name to group vlan unaware cross connects";
            }
    
            uses apply-advanced;
    
            container esi {
              presence "enable esi";
              description
                "ESI configuration to group vlan unaware cross connects";
              uses apply-advanced;
    
              leaf identifier {
                type jt:esi;
                description
                  "ESI value for grouping of vlan unaware cross connects";
              }
            }  // container esi
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Name of the  interface part of vlan unaware fxc";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
            }  // list interface
    
            container service-id {
              presence "enable service-id";
              description
                "Service-id for vlan unaware cross connects for  EVPN VPWS";
              uses apply-advanced;
    
              leaf local {
                junos:must "(unique ".. .. group <*> service-id local $$")";
                junos:must-message "Unique Local SID can only be configured ";
                junos:must "(unique ".. .. interface <*> vpws-service-id local $$")";
                junos:must-message "Unique Local SID can only be configured ";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16777215";
                  }
                }
                description
                  "Local service id for vlan unaware service";
              }
    
              leaf remote {
                junos:must "(unique ".. .. group <*> service-id remote $$")";
                junos:must-message "Unique Remote SID can only be configured ";
                junos:must "(unique ".. .. interface <*> vpws-service-id remote $$")";
                junos:must-message "Unique Remote SID can only be configured ";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16777215";
                  }
                }
                description
                  "Remote service id for vlan unaware service";
              }
            }  // container service-id
          }  // list group
    
          container vni-options {
            junos:must "(".. .. .. vrf-target")";
            junos:must-message "vrf-target must be configured";
            junos:must "((".. extended-vni-list" || ".. .. .. instance-type mac-vrf"))";
            junos:must-message "Extended-vni-list must be configured for non mac-vrf instance";
            junos:must "(".. encapsulation vxlan")";
            junos:must-message "encapsulation vxlan must be configured";
            description "VNI options";
            uses apply-advanced;
    
            list vni {
              key "name";
              description "Per-vni options";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "1 .. 16777214";
                  }
                }
              }
    
              uses apply-advanced;
    
              container vrf-target {
                description
                  "VRF target community configuration";
                uses apply-advanced;
    
                leaf export {
                  type string {
                    junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                    junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                  }
                  status deprecated;
                  description
                    "Target community to use when marking routes on export";
                }
    
                leaf community {
                  type string {
                    junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                    junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                  }
                  description "Target community";
                }
              }  // container vrf-target
            }  // list vni
          }  // container vni-options
    
          container traceoptions {
            description
              "Trace options for Layer 2 VPNs";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "error" {
                    value 0;
                    description "Trace errors";
                  }
                  enum "topology" {
                    value 1;
                    description
                      "Trace Layer 2 VPN, VPLS and EVPN topology changes";
                  }
                  enum "nlri" {
                    value 2;
                    description
                      "Trace Layer 2 VPN, VPLS and EVPN remote site advertisements";
                  }
                  enum "connections" {
                    value 3;
                    description
                      "Trace Layer 2 VPN and VPLS connections";
                  }
                  enum "automatic-site" {
                    value 4;
                    description
                      "Trace VPLS automatic site state";
                  }
                  enum "oam" {
                    value 5;
                    description
                      "Trace OAM messages";
                  }
                  enum "mac-database" {
                    value 6;
                    description
                      "Trace MAC route database in a EVPN instance";
                  }
                  enum "nsr" {
                    value 7;
                    description
                      "Trace NSR in a EVPN instance";
                  }
                  enum "egress-protection" {
                    value 8;
                    description
                      "Trace Edge Protection messages";
                  }
                  enum "instance" {
                    value 9;
                    description
                      "Evpn instance related messages";
                  }
                  enum "interface" {
                    value 10;
                    description
                      "Interface related messages";
                  }
                  enum "l2aldsync" {
                    value 11;
                    description
                      "Messages related to EVPN-L2ALD communication";
                  }
                  enum "p2mp" {
                    value 12;
                    description "P2MP messages";
                  }
                  enum "esi" {
                    value 13;
                    description
                      "Evpn ethernet segment related messages";
                  }
                  enum "mcsn" {
                    value 14;
                    description
                      "Evpn multicast snooping related messages";
                  }
                  enum "vpws" {
                    value 15;
                    description "VPWS messages";
                  }
                  enum "irb" {
                    value 16;
                    description
                      "Integrated routing bridging messages";
                  }
                  enum "ar" {
                    value 17;
                    description
                      "Assisted-replication messages";
                  }
                  enum "etree" {
                    value 18;
                    description
                      "Evpn etree messages";
                  }
                  enum "kernel" {
                    value 19;
                    description
                      "Messages related to rpd-kernel communication";
                  }
                  enum "bd" {
                    value 20;
                    description
                      "Evpn bridge domain messages";
                  }
                  enum "pbb" {
                    value 21;
                    description
                      "Evpn provider backbone bridging messages";
                  }
                  enum "infra" {
                    value 22;
                    description
                      "Messages related to infrastructure in evpn";
                  }
                  enum "pfxdb" {
                    value 23;
                    description
                      "Type-5 related messages";
                  }
                  enum "route" {
                    value 24;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 25;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 26;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 27;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 28;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 29;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 30;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 31;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf encapsulation-type {
            type enumeration {
              enum "atm-aal5" {
                value 0;
                description
                  "ATM AAL/5 encapsulation";
              }
              enum "atm-cell" {
                value 1;
                description
                  "ATM port promiscuous mode cell encapsulation";
              }
              enum "atm-cell-port-mode" {
                value 2;
                description
                  "ATM port promiscuous mode cell encapsulation";
              }
              enum "atm-cell-vp-mode" {
                value 3;
                description
                  "ATM VP promiscuous mode cell encapsulation";
              }
              enum "atm-cell-vc-mode" {
                value 4;
                description
                  "ATM non-promiscuous cell encapsulation";
              }
              enum "frame-relay" {
                value 5;
                description
                  "Frame Relay encapsulation";
              }
              enum "ppp" {
                value 6;
                description "PPP encapsulation";
              }
              enum "cisco-hdlc" {
                value 7;
                description
                  "Cisco-compatible HDLC encapsulation";
              }
              enum "ethernet-vlan" {
                value 8;
                description
                  "Ethernet VLAN encapsulation";
              }
              enum "ethernet" {
                value 9;
                description
                  "Ethernet encapsulation";
              }
              enum "interworking" {
                value 10;
                description
                  "Layer 2.5 interworking VPN";
              }
              enum "frame-relay-port-mode" {
                value 11;
                description
                  "Frame Relay port mode encapsulation";
              }
              enum "satop-t1" {
                value 12;
                description
                  "SATOP-T1 based Layer 2 VPN";
              }
              enum "satop-e1" {
                value 13;
                description
                  "SATOP-E1 based Layer 2 VPN";
              }
              enum "satop-t3" {
                value 14;
                description
                  "SATOP-T3 based Layer 2 VPN";
              }
              enum "satop-e3" {
                value 15;
                description
                  "SATOP-E3 based Layer 2 VPN";
              }
              enum "cesop" {
                value 16;
                description
                  "CESOP based Layer 2 VPN";
              }
            }
            description
              "Encapsulation type for VPN";
          }
    
          leaf control-word {
            type empty;
            description
              "Add control word to the Layer 2 encapsulation";
          }
    
          leaf no-control-word {
            type empty;
            description
              "Disables control word on the Layer 2 encapsulation";
          }
    
          leaf site-range {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65534";
              }
            }
            description
              "Maximum site identifier in this VPLS domain";
          }
    
          leaf label-block-size {
            type enumeration {
              enum "2" {
                value 0;
                description
                  "Label block size of 2";
              }
              enum "4" {
                value 1;
                description
                  "Label block size of 4";
              }
              enum "8" {
                value 2;
                description
                  "Label block size of 8";
              }
              enum "16" {
                value 3;
                description
                  "Label block size of 16";
              }
            }
            description
              "Label block size for this VPLS instance";
          }
    
          choice tunnel-services-choice {
            container tunnel-services {
              description
                "Use tunnel services for this VPLS instance";
              uses apply-advanced;
    
              leaf-list devices {
                type union {
                  type jt:interface-device;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description
                  "Tunnel services devices to use for this VPLS instance";
              }
    
              leaf primary {
                type union {
                  type jt:interface-device;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Primary tunnel services device to use for VPLS instance";
              }
            }  // container tunnel-services
            leaf no-tunnel-services {
              type empty;
              description
                "Do not use tunnel services for this VPLS instance";
            }
          }  // choice tunnel-services-choice
    
          leaf community {
            type string;
            description
              "Community associated with this VPLS instance";
          }
    
          leaf vpls-id {
            type string;
            description
              "Identifier for this VPLS instance";
          }
    
          leaf mtu {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "512 .. 65535";
              }
            }
            description
              "MTU to be advertised to the remote end";
          }
    
          leaf ignore-mtu-mismatch {
            type empty;
            description
              "Allow different MTU values on local and remote end";
          }
    
          container mac-flush {
            presence "enable mac-flush";
            description
              "Enables mac-flush processing";
            uses apply-advanced;
    
            leaf any-interface {
              junos:must "((".. .. vpls-id" || any ".. .. mesh-group <*> vpls-id"))";
              junos:must-message "'any-interface' can be configured only for LDP VPLS";
              type empty;
              description
                "Send mac-flush when any AC interface goes down";
            }
    
            leaf any-spoke {
              junos:must "((".. .. vpls-id" || any ".. .. mesh-group <*> vpls-id"))";
              junos:must-message "'any-spoke' can be configured only for LDP VPLS";
              type empty;
              description
                "Send mac-flush when any spoke pseudo wire goes down";
            }
    
            leaf propagate {
              junos:must "((".. .. vpls-id" || any ".. .. mesh-group <*> vpls-id"))";
              junos:must-message "'propagate' can be configured only for LDP VPLS";
              type empty;
              description
                "Propagate mac-flush to the core";
            }
          }  // container mac-flush
    
          leaf ignore-encapsulation-mismatch {
            type empty;
            description
              "Allow different encapsulation types on local and remote end";
          }
    
          leaf pseudowire-status-tlv {
            type empty;
            description
              "Send pseudowire status TLV";
          }
    
          leaf flow-label-transmit {
            type empty;
            description
              "Advertise capability to push Flow Label in transmit direction to remote PE";
          }
    
          leaf flow-label-receive {
            type empty;
            description
              "Advertise capability to pop Flow Label in receive direction to remote PE";
          }
    
          leaf flow-label-transmit-static {
            junos:must "((".. vpls-id" || (".. .. .. l2vpn-id" || (".. .. .. instance-type evpn-vpws" || (".. .. .. instance-type evpn" || ".. .. .. instance-type virtual-switch")))))";
            junos:must-message "Flow-Label static only supported for FEC128 or FEC129 VPLS, EVPN, Virtual-switch or VPWS";
            junos:must "(!(".. flow-label-transmit"))";
            junos:must-message "Can't have flow-label-transmit-static along with flow-label-transmit";
            type empty;
            description
              "Push Flow Label on PW packets sent to remote PE";
          }
    
          leaf flow-label-receive-static {
            junos:must "((".. vpls-id" || (".. .. .. l2vpn-id" || (".. .. .. instance-type evpn-vpws" || (".. .. .. instance-type evpn" || ".. .. .. instance-type virtual-switch")))))";
            junos:must-message "Flow-Label static only supported for FEC128 or FEC129 VPLS, EVPN, Virtual-switch or VPWS";
            junos:must "(!(".. flow-label-receive"))";
            junos:must-message "Can't have flow-label-receive-static along with flow-label-receive";
            type empty;
            description
              "Pop Flow Label from PW packets received from remote PE";
          }
    
          container associate-profile {
            description
              "Associate profile options for dynamic IFL";
            uses apply-advanced;
    
            leaf profile-name {
              type string {
                length "1 .. 81";
              }
              description
                "Associated profile name";
            }
    
            leaf profile-variable-set {
              type string {
                length "1 .. 81";
              }
              description
                "Associate dynamic variable set with the profile";
            }
          }  // container associate-profile
    
          leaf connectivity-type {
            type enumeration {
              enum "ce" {
                value 0;
                description
                  "CE interface is required";
              }
              enum "irb" {
                value 1;
                description
                  "IRB interface is sufficient";
              }
              enum "permanent" {
                value 2;
                description
                  "Pseudowire permanently up";
              }
            }
            description
              "Specify type of interface sufficient to bring vpls connection up";
          }
    
          list import-labeled-routes {
            junos:must "(!(".. neighbor"))";
            junos:must-message "not supported for static vpls";
            key "name";
            ordered-by user;
            description
              "Import ingress label route to instance.mpls.0 from mpls.0";
            leaf name {
              junos:must "("routing-instances $$ protocols mpls")";
              junos:must-message "protocols MPLS must be configured on routing-instance to import the labeled routes";
              junos:must "("routing-instances $$ instance-type virtual-router")";
              junos:must-message "Ingress labelled route can be imported only to routing-instance type virtual-router";
              junos:must "("routing-instances $$")";
              junos:must-message "Referenced routing instance must be defined";
              type string;
              description
                "Routing instance name where label route has to be imported";
            }
          }  // list import-labeled-routes
    
          container oam {
            description
              "OAM Configuration for VPN";
            uses apply-advanced;
    
            leaf ping-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "30 .. 3600";
                }
              }
              units "seconds";
              default "60";
              description
                "Time interval between ping messages";
            }
    
            leaf ping-multiplier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 5";
                }
              }
              description
                "Number of ping reply missed before declaring BFD down";
            }
    
            container bfd-liveness-detection {
              description
                "Bidirectional Forwarding Detection (BFD) options";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
            }  // container bfd-liveness-detection
    
            container control-channel {
              description
                "Supported control channel type ";
              uses apply-advanced;
    
              choice action-choice {
                leaf pwe3-control-word {
                  type empty;
                  description
                    "For BGP based PW send oam packets with control word, with 0001b as first nibble";
                }
                leaf router-alert-label {
                  type empty;
                  description
                    "For BGP based PW send oam packets with router alert label";
                }
                leaf pw-label-ttl-1 {
                  type empty;
                  description
                    "For BGP based PW send oam packets with MPLS pw label TTL = 1";
                }
              }  // choice action-choice
            }  // container control-channel
          }  // container oam
    
          container multi-homing {
            description
              "Multi-homing configuration for FEC129 VPLS";
            uses apply-advanced;
    
            leaf peer-active {
              type empty;
              description
                "Keep CE interfaces in up state when all BGP peers go down";
            }
    
            list site {
              key "name";
              description
                "Sites connected to this provider equipment";
              leaf name {
                type string;
                description
                  "Name of Layer 2 VPN or VPLS site";
              }
    
              uses apply-advanced;
    
              leaf identifier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65534";
                  }
                }
                description
                  "Layer 2 VPN or VPLS multi-homing identifier";
              }
    
              leaf preference {
                type string;
                description
                  "Layer 2 VPN or VPLS multi-homing preference";
              }
    
              container active-interface {
                description
                  "Configure interface to designate as active";
                uses apply-advanced;
    
                choice interface_name {
                  leaf any {
                    type empty;
                    description
                      "One configured interface is designated active at random";
                  }
                  leaf primary {
                    junos:must "(".. .. .. .. .. .. interface $$")";
                    junos:must-message "Interface must be part of this VPLS routing instance";
                    type union {
                      type jt:interface-name;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "Interface to designate as active if it is operational";
                  }
                }  // choice interface_name
              }  // container active-interface
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Interface that connects this site to the VPN";
                leaf name {
                  junos:must "(".. .. .. .. .. .. interface $$")";
                  junos:must-message "Interface must be part of this VPLS routing instance";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                leaf preference {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Layer 2 VPN or VPLS multi-homing preference for the interface";
                }
              }  // list interface
    
              leaf peer-active {
                type empty;
                description
                  "Keep CE interfaces in up state when all BGP peers go down";
              }
            }  // list site
          }  // container multi-homing
        }  // grouping juniper-protocols-l2vpn
    
        grouping juniper-protocols-evi-options {
          uses apply-advanced;
    
          list isid {
            key "name";
            description "Per-evi options";
            leaf name {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "256 .. 16777214";
                }
              }
            }
    
            uses apply-advanced;
    
            container vrf-target {
              description
                "VRF target community configuration";
              uses apply-advanced;
    
              leaf community {
                type string {
                  junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                }
                description "Target community";
              }
            }  // container vrf-target
          }  // list isid
        }  // grouping juniper-protocols-evi-options
    
        grouping juniper-protocols-evpn-interconnect {
          description
            "Interconnect configuration for the routing instance";
          uses apply-advanced;
    
          leaf-list vrf-import {
            junos:must "(".. route-distinguisher")";
            junos:must-message "route distinguisher must be defined for vrf-import";
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy for Interconnect";
          }
    
          leaf-list vrf-export {
            junos:must "(".. route-distinguisher")";
            junos:must-message "route distinguisher must be defined for vrf-export";
            type jt:policy-algebra;
            ordered-by user;
            description
              "Export policy for Interconnect";
          }
    
          container vrf-target {
            junos:must "(".. route-distinguisher")";
            junos:must-message "route distinguisher must be defined for vrf-target";
            description
              "Interconnect target community configuration";
            uses apply-advanced;
    
            leaf community {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use in import and export";
            }
    
            leaf import {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use when filtering on import";
            }
    
            leaf export {
              type string {
                junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
              }
              description
                "Target community to use when marking routes on export";
            }
          }  // container vrf-target
    
          container route-distinguisher {
            description
              "Route distinguisher for this interconnect";
            leaf rd-type {
              type string {
                junos:posix-pattern "^[0-9.]+L?:[0-9]+$";
                junos:pattern-message "Use format 'x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100";
              }
              description
                "Number in (16 bit:32 bit) or (32 bit 'L':16 bit) or (IP address:16 bit) format";
            }
          }  // container route-distinguisher
    
          container esi {
            description
              "ESI configuration of interconnect";
            uses apply-advanced;
    
            leaf identifier {
              junos:must "(unique "interfaces <*> esi $$")";
              junos:must-message "ESI value must be unique across all IFDs and IFLs";
              type jt:esi;
              description
                "ESI value for interconnect";
            }
    
            choice mode {
              leaf all-active {
                type empty;
                description "All-active mode";
              }
            }  // choice mode
    
            container df-election-type {
              presence "enable df-election-type";
              description "DF Election Type";
              uses apply-advanced;
    
              choice pref_choice {
                container preference {
                  presence "enable preference";
                  description
                    "Preference based DF election";
                  uses apply-advanced;
    
                  leaf value {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 65535";
                      }
                    }
                    default "32767";
                    description
                      "Preference value for EVPN Multihoming DF election";
                  }
                }  // container preference
              }  // choice pref_choice
    
              choice mod_choice {
                container mod {
                  junos:must "(!(".. preference"))";
                  junos:must-message "preference must not be configured";
                  presence "enable mod";
                  description
                    "MOD based DF election";
                }  // container mod
              }  // choice mod_choice
            }  // container df-election-type
          }  // container esi
    
          leaf-list interconnected-vni-list {
            type string;
            description
              "List of translated VNIs (1..16777214) or all, that are to be EVPN interconnected";
          }
        }  // grouping juniper-protocols-evpn-interconnect
    
        grouping juniper-protocols-ldp {
          uses apply-advanced;
    
          container traceoptions {
            description "Trace options for LDP";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "error" {
                    value 0;
                    description
                      "Trace errored packets";
                  }
                  enum "event" {
                    value 1;
                    description
                      "Trace LDP state machine events";
                  }
                  enum "packet-dump" {
                    value 2;
                    description
                      "Dump the contents of selected packet types";
                  }
                  enum "packets" {
                    value 3;
                    description
                      "Trace all LDP packets";
                  }
                  enum "periodic" {
                    value 4;
                    description
                      "Trace periodic (hello and keepalive) packets";
                  }
                  enum "initialization" {
                    value 5;
                    description
                      "Trace initialization packets";
                  }
                  enum "notification" {
                    value 6;
                    description
                      "Trace notification packets";
                  }
                  enum "address" {
                    value 7;
                    description
                      "Trace address packets";
                  }
                  enum "label" {
                    value 8;
                    description
                      "Trace label packets";
                  }
                  enum "binding" {
                    value 9;
                    description
                      "Trace label binding state";
                  }
                  enum "path" {
                    value 10;
                    description
                      "Trace label path state";
                  }
                  enum "ppmd" {
                    value 11;
                    description
                      "Trace state and events for ppmd process";
                  }
                  enum "nsr-synchronization" {
                    value 12;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "link-protection" {
                    value 13;
                    description
                      "Trace link protection events";
                  }
                  enum
                    "p2mp-nsr-synchronization" {
                    value 14;
                    description
                      "Trace p2mp NSR synchronization events";
                  }
                  enum "route" {
                    value 15;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 16;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 17;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 18;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 19;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 20;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 21;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 22;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
    
              container filter {
                presence "enable filter";
                description
                  "Filter to apply to this flag";
                uses ldp_filter_obj;
              }  // container filter
            }  // list flag
          }  // container traceoptions
    
          container traffic-statistics {
            description
              "Collect statistics for LDP label-switched paths";
            uses apply-advanced;
    
            container file {
              description
                "Statistics file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            leaf interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "60 .. 65535";
                }
              }
              description
                "Time to collect statistics (seconds)";
            }
    
            leaf no-penultimate-hop {
              type empty;
              description
                "No penultimate hop statistics collection";
            }
          }  // container traffic-statistics
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf helper-disable {
              type empty;
              description
                "Disable the graceful restart helper capability";
            }
    
            leaf recovery-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "120 .. 1800";
                }
              }
              units "seconds";
              description
                "Time required for recovery";
            }
    
            leaf maximum-neighbor-recovery-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "140 .. 1900";
                }
              }
              units "seconds";
              description
                "Maximum time stale mappings are maintained";
            }
    
            leaf reconnect-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 300";
                }
              }
              units "seconds";
              description
                "Time required to reestablish session after graceful restart";
            }
    
            leaf maximum-neighbor-reconnect-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 300";
                }
              }
              units "seconds";
              description
                "Maximum reconnect time allowed from a restarting neighbor";
            }
          }  // container graceful-restart
    
          container auto-targeted-session {
            presence
              "enable auto-targeted-session";
            description
              "Configure auto targeted session parameters";
            uses apply-advanced;
    
            leaf teardown-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 300";
                }
              }
              units "seconds";
              default "90";
              description
                "Auto targeted session tear down delay";
            }
    
            leaf maximum-sessions {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000";
                }
              }
              default "100";
              description
                "Auto targeted maximum sessions";
            }
    
            leaf no-rlfa {
              type empty;
              description
                "Do not allow RLFA in auto targeted sessions";
            }
    
            leaf no-dynamic-tunnels {
              type empty;
              description
                "Do not allow dynamic tunnels in auto targeted sessions";
            }
          }  // container auto-targeted-session
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Route preference";
          }
    
          leaf no-forwarding {
            type empty;
            description
              "Do not use LDP ingress routes for forwarding";
          }
    
          leaf rib-group {
            junos:must "("routing-options rib-groups $$")";
            junos:must-message "Referenced rib-group must be defined";
            type string;
            description
              "Routing table group for importing ingress routes";
          }
    
          leaf rib-group6 {
            junos:must "("routing-options rib-groups $$")";
            junos:must-message "Referenced rib-group must be defined";
            type string;
            description
              "Routing table group for importing ingress v6 routes";
          }
    
          leaf l2-smart-policy {
            type empty;
            description
              "Do not export or import Layer 3 FECs for Layer 2 sessions";
          }
    
          leaf track-igp-metric {
            type empty;
            description "Track the IGP metric";
          }
    
          leaf strict-targeted-hellos {
            type empty;
            description
              "Do not send targeted hellos to unconfigured neighbors";
          }
    
          container longest-match {
            presence "enable longest-match";
            description
              "Configure longest match";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Longest match import policy";
            }
          }  // container longest-match
    
          leaf-list color-import-policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Import color policy";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf-list egress-policy {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Configure LSP egress policy";
          }
    
          leaf-list dod-request-policy {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Configure DoD label request policy";
          }
    
          container next-hop {
            description "LDP next-hop control";
            uses apply-advanced;
    
            container merged {
              junos:must "("protocols ldp deaggregate")";
              junos:must-message "next-hop merged policy requires deaggregate to be enabled.";
              description "Merged next hop";
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Merged next-hop policy";
              }
            }  // container merged
    
            container no-rsvp-tunneling {
              junos:must "("protocols ldp deaggregate")";
              junos:must-message "next-hop no-rsvp-tunneling policy requires deaggregate to be enabled.";
              description "No rsvp tunneling";
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "No rsvp tunneling next-hop policy";
              }
            }  // container no-rsvp-tunneling
          }  // container next-hop
    
          choice mtu-discovery-choice {
            leaf mtu-discovery {
              type empty;
              description
                "Enable TCP path MTU discovery";
            }
            leaf no-mtu-discovery {
              type empty;
              description
                "Don't enable TCP path MTU discovery";
            }
          }  // choice mtu-discovery-choice
    
          choice deaggregate-choice {
            leaf deaggregate {
              type empty;
              description
                "Deaggregate FECs into separate labels";
            }
            leaf no-deaggregate {
              type empty;
              description
                "Don't deaggregate FECs into separate labels";
            }
          }  // choice deaggregate-choice
    
          leaf explicit-null {
            type empty;
            description
              "Advertise the EXPLICIT_NULL label for egress FECs";
          }
    
          leaf label-withdrawal-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 120";
              }
            }
            units "seconds";
            default "60";
            description
              "Delay label withdrawal for FECs to avoid label churn";
          }
    
          container make-before-break {
            presence "enable make-before-break";
            description
              "Configure make before break";
            uses apply-advanced;
    
            leaf timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 300";
                }
              }
              units "seconds";
              default "30";
              description
                "Make before break timeout";
            }
    
            leaf switchover-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 300";
                }
              }
              units "seconds";
              default "3";
              description
                "Make before break switchover delay";
            }
          }  // container make-before-break
    
          container transport-address {
            description
              "Address used for TCP sessions";
            choice address-choice {
              leaf router-id {
                type empty;
                description
                  "Use router ID for TCP connections";
              }
              leaf interface {
                type empty;
                description
                  "Use interface address for TCP connections";
              }
              leaf address {
                type jt:ipaddr;
                description
                  "Use specified address for TCP connections";
              }
            }  // choice address-choice
          }  // container transport-address
    
          leaf keepalive-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Keepalive interval (seconds)";
          }
    
          leaf keepalive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Keepalive timeout (seconds)";
          }
    
          list interface {
            key "name";
            description
              "Enable LDP on this interface";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable LDP on this interface";
              }
            }  // choice enable-disable
    
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Hello interval (seconds)";
            }
    
            leaf hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Hello hold time (seconds)";
            }
    
            container link-protection {
              presence "enable link-protection";
              description
                "Enable link protection to protect interface for link faults only";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable link-protection";
                }
              }  // choice enable-disable
    
              leaf dynamic-rsvp-lsp {
                type empty;
                description
                  "Enable setup of dynamic rsvp lsp for link protection";
              }
            }  // container link-protection
    
            container transport-address {
              description
                "Address used for TCP sessions";
              choice address-choice {
                leaf router-id {
                  type empty;
                  description
                    "Use router ID for TCP connections";
                }
                leaf interface {
                  type empty;
                  description
                    "Use interface address for TCP connections";
                }
                leaf address {
                  type jt:ipaddr;
                  description
                    "Use specified address for TCP connections";
                }
              }  // choice address-choice
            }  // container transport-address
    
            choice allow-subnet-mismatch-choice {
              leaf allow-subnet-mismatch {
                type empty;
                description
                  "Allow subnet mismatch for source address in hello packet";
              }
              leaf no-allow-subnet-mismatch {
                type empty;
                description
                  "Don't allow subnet mismatch for source address in hello packet";
              }
            }  // choice allow-subnet-mismatch-choice
          }  // list interface
    
          list neighbor {
            key "name";
            description
              "Configure a remote LDP neighbor";
            leaf name {
              type jt:ipaddr;
              description "Neighbor address";
            }
    
            uses apply-advanced;
          }  // list neighbor
    
          list session {
            key "name";
            description
              "Configure session parameters";
            leaf name {
              type jt:ipaddr;
              description
                "Session destination address";
            }
    
            uses apply-advanced;
    
            leaf authentication-key {
              type string {
                length "1 .. 126";
              }
              description
                "MD5 authentication key";
            }
    
            leaf authentication-algorithm {
              junos:must "(".. authentication-key-chain")";
              junos:must-message "May not be configured without authentication-key-chain";
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "md5" {
                  value 0;
                  description "Message Digest 5";
                }
                enum "hmac-sha-1-96" {
                  value 1;
                  description
                    "Hash-based Message Authentication Code (SHA1) (96 bits)";
                }
                enum "aes-128-cmac-96" {
                  value 2;
                  description
                    "Cipher-based Message Authentication Code (AES128) (96 bits)";
                }
                enum "ao" {
                  value 3;
                  description
                    "TCP Authentication Option";
                }
              }
              default "hmac-sha-1-96";
              description
                "Authentication algorithm name";
            }
    
            leaf tcpao-handling-with-digest-mismatch {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "drop-if-no-tcpao" {
                  value 0;
                  description
                    "Drop the connection if Digest mismatched";
                }
                enum "allow-without-tcpao" {
                  value 1;
                  description
                    "Allow the connection establishment without TCP-AO";
                }
              }
              description
                "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
            }
    
            leaf authentication-key-chain {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              junos:must "("security authentication-key-chains key-chain $$")";
              junos:must-message "Referenced key-chain must be defined";
              type string {
                length "1 .. 128";
              }
              description "Key chain name";
            }
    
            leaf downstream-on-demand {
              type empty;
              description
                "Configure downstream on demand label distribution mode";
            }
    
            leaf transport-address {
              type jt:ipaddr;
              description
                "Address used for TCP sessions to the neighbor";
            }
    
            choice mtu-discovery-choice {
              leaf mtu-discovery {
                type empty;
                description
                  "Enable TCP path MTU discovery";
              }
              leaf no-mtu-discovery {
                type empty;
                description
                  "Don't enable TCP path MTU discovery";
              }
            }  // choice mtu-discovery-choice
          }  // list session
    
          list session-group {
            key "name";
            description
              "Configure session group parameters";
            leaf name {
              type jt:ipprefix;
              description
                "Session destination address/prefix length";
            }
    
            uses apply-advanced;
    
            leaf authentication-key {
              type string {
                length "1 .. 126";
              }
              description
                "MD5 authentication key";
            }
    
            leaf authentication-algorithm {
              junos:must "(".. authentication-key-chain")";
              junos:must-message "May not be configured without authentication-key-chain";
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "md5" {
                  value 0;
                  description "Message Digest 5";
                }
                enum "hmac-sha-1-96" {
                  value 1;
                  description
                    "Hash-based Message Authentication Code (SHA1) (96 bits)";
                }
                enum "aes-128-cmac-96" {
                  value 2;
                  description
                    "Cipher-based Message Authentication Code (AES128) (96 bits)";
                }
                enum "ao" {
                  value 3;
                  description
                    "TCP Authentication Option";
                }
              }
              default "hmac-sha-1-96";
              description
                "Authentication algorithm name";
            }
    
            leaf tcpao-handling-with-digest-mismatch {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "drop-if-no-tcpao" {
                  value 0;
                  description
                    "Drop the connection if Digest mismatched";
                }
                enum "allow-without-tcpao" {
                  value 1;
                  description
                    "Allow the connection establishment without TCP-AO";
                }
              }
              description
                "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
            }
    
            leaf authentication-key-chain {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              junos:must "("security authentication-key-chains key-chain $$")";
              junos:must-message "Referenced key-chain must be defined";
              type string {
                length "1 .. 128";
              }
              description "Key chain name";
            }
    
            leaf downstream-on-demand {
              type empty;
              description
                "Configure downstream on demand label distribution mode";
            }
    
            leaf transport-address {
              type jt:ipaddr;
              description
                "Address used for TCP sessions to the neighbor";
            }
    
            choice mtu-discovery-choice {
              leaf mtu-discovery {
                type empty;
                description
                  "Enable TCP path MTU discovery";
              }
              leaf no-mtu-discovery {
                type empty;
                description
                  "Don't enable TCP path MTU discovery";
              }
            }  // choice mtu-discovery-choice
          }  // list session-group
    
          container session-protection {
            presence "enable session-protection";
            description
              "Configure session protection";
            leaf timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              units "seconds";
              description
                "Session protection timeout";
            }
          }  // container session-protection
    
          container igp-synchronization {
            description
              "Configure IGP synchronization parameters";
            uses apply-advanced;
    
            leaf holddown-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "10 .. 300";
                }
              }
              units "seconds";
              description
                "Time to hold the up notification to the IGPs";
            }
          }  // container igp-synchronization
    
          container log-updown {
            description
              "Logging actions for LSP up/down events";
            uses apply-advanced;
    
            container trap {
              description "SNMP traps options";
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable LDP LSP up/down trap";
                }
              }  // choice enable-disable
            }  // container trap
          }  // container log-updown
    
          container policing {
            description
              "Configure policing for an LDP FEC";
            uses apply-advanced;
    
            list fec {
              key "name";
              ordered-by user;
              description
                "Forwarding equivalence class";
              leaf name {
                type jt:ipv4prefix;
                description
                  "Forwarding equivalence class address";
              }
    
              uses apply-advanced;
    
              leaf ingress-traffic {
                junos:must "(("firewall family any filter $$" || (!("firewall") && ".. .. .. .. .. .. .. .. firewall family any filter $$")))";
                junos:must-message "referenced filter must be defined under firewall family any";
                type string {
                  junos:posix-pattern "!^((__.*)|(.{65,}))$";
                  junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                }
                description
                  "Name of filter to use for policing ingress LDP traffic";
              }
    
              leaf transit-traffic {
                junos:must "(("firewall family any filter $$" || (!("firewall") && ".. .. .. .. .. .. .. .. firewall family any filter $$")))";
                junos:must-message "referenced filter must be defined under firewall family any";
                type string {
                  junos:posix-pattern "!^((__.*)|(.{65,}))$";
                  junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                }
                description
                  "Name of filter to use for policing transit LDP traffic";
              }
            }  // list fec
          }  // container policing
    
          container entropy-label {
            description
              "Insert entropy label for  a LDP FEC";
            uses apply-advanced;
    
            leaf-list ingress-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Entropy label ingress policy";
            }
          }  // container entropy-label
    
          container oam {
            description
              "Configure periodic OAM for a LDP FEC";
            uses apply-advanced;
    
            leaf-list ingress-policy {
              type jt:policy-algebra;
              ordered-by user;
              description "OAM ingress policy";
            }
    
            leaf-list bfd-port-egress-policy {
              type jt:policy-algebra;
              ordered-by user;
              description "OAM egress policy";
            }
    
            list fec {
              key "name";
              ordered-by user;
              description
                "Forwarding equivalence class";
              leaf name {
                type jt:ipv4prefix;
                description
                  "Forwarding equivalence class address";
              }
    
              uses apply-advanced;
    
              choice bfd_liveness_detection_type {
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection (BFD) options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  leaf ecmp {
                    type empty;
                    description
                      "Enable equal cost multipath (ECMP) support for BFD";
                  }
    
                  container failure-action {
                    description
                      "Action to take when BFD session goes down";
                    choice action-choice {
                      leaf remove-route {
                        type empty;
                        description
                          "Remove LDP route from the ribs";
                      }
                      leaf remove-nexthop {
                        type empty;
                        description
                          "Remove LDP nexthop from the route";
                      }
                    }  // choice action-choice
                  }  // container failure-action
    
                  leaf holddown-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255000";
                      }
                    }
                    units "milliseconds";
                    default "0";
                    description
                      "Time to hold the session-UP notification to the client";
                  }
    
                  leaf no-router-alert-option {
                    type empty;
                    description
                      "Do not set Router-Alert options in IP header for MPLS-BFD";
                  }
    
                  leaf use-ip-ttl-1 {
                    type empty;
                    description
                      "Set TTL value to 1 in IP header for MPLS-BFD";
                  }
                }  // container bfd-liveness-detection
                leaf no-bfd-liveness-detection {
                  type empty;
                  description
                    "Disable BFD liveness detection";
                }
              }  // choice bfd_liveness_detection_type
    
              container periodic-traceroute {
                presence
                  "enable periodic-traceroute";
                description
                  "Configure periodic traceroute";
                uses apply-advanced;
    
                leaf frequency {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "15 .. 120";
                    }
                  }
                  units "minutes";
                  description
                    "Time between traceroute attempts";
                }
    
                leaf ttl {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Maximum time-to-live value";
                }
    
                leaf retries {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 9";
                    }
                  }
                  description
                    "Number of times to resend probe";
                }
    
                leaf wait {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "5 .. 15";
                    }
                  }
                  units "seconds";
                  description
                    "Time to wait before resending probe";
                }
    
                leaf paths {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Maximum number of paths to traverse";
                }
    
                leaf source {
                  type jt:ipv4addr;
                  description
                    "Source address to use when sending probes";
                }
    
                leaf exp {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "0 .. 7";
                    }
                  }
                  description
                    "Class-of-service value to use when sending probes";
                }
    
                leaf fanout {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 64";
                    }
                  }
                  description
                    "Maximum number of nexthops to search per node";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable periodic traceroute for a FEC";
                }
              }  // container periodic-traceroute
            }  // list fec
    
            container bfd-liveness-detection {
              description
                "Bidirectional Forwarding Detection (BFD) options";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
    
              leaf ecmp {
                type empty;
                description
                  "Enable equal cost multipath (ECMP) support for BFD";
              }
    
              container failure-action {
                description
                  "Action to take when BFD session goes down";
                choice action-choice {
                  leaf remove-route {
                    type empty;
                    description
                      "Remove LDP route from the ribs";
                  }
                  leaf remove-nexthop {
                    type empty;
                    description
                      "Remove LDP nexthop from the route";
                  }
                }  // choice action-choice
              }  // container failure-action
    
              leaf holddown-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255000";
                  }
                }
                units "milliseconds";
                default "0";
                description
                  "Time to hold the session-UP notification to the client";
              }
    
              leaf no-router-alert-option {
                type empty;
                description
                  "Do not set Router-Alert options in IP header for MPLS-BFD";
              }
    
              leaf use-ip-ttl-1 {
                type empty;
                description
                  "Set TTL value to 1 in IP header for MPLS-BFD";
              }
            }  // container bfd-liveness-detection
    
            container periodic-traceroute {
              presence
                "enable periodic-traceroute";
              description
                "Configure periodic traceroute";
              uses apply-advanced;
    
              leaf frequency {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "15 .. 120";
                  }
                }
                units "minutes";
                description
                  "Time between traceroute attempts";
              }
    
              leaf ttl {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 255";
                  }
                }
                description
                  "Maximum time-to-live value";
              }
    
              leaf retries {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 9";
                  }
                }
                description
                  "Number of times to resend probe";
              }
    
              leaf wait {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "5 .. 15";
                  }
                }
                units "seconds";
                description
                  "Time to wait before resending probe";
              }
    
              leaf paths {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 255";
                  }
                }
                description
                  "Maximum number of paths to traverse";
              }
    
              leaf source {
                type jt:ipv4addr;
                description
                  "Source address to use when sending probes";
              }
    
              leaf exp {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "0 .. 7";
                  }
                }
                description
                  "Class-of-service value to use when sending probes";
              }
    
              leaf fanout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 64";
                  }
                }
                description
                  "Maximum number of nexthops to search per node";
              }
            }  // container periodic-traceroute
    
            leaf lsp-ping-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "30 .. 3600";
                }
              }
              units "seconds";
              default "60";
              description
                "Time interval between LSP ping messages";
            }
    
            leaf lsp-ping-multiplier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 5";
                }
              }
              description
                "Number of ping reply missed before declaring BFD down";
            }
          }  // container oam
    
          container targeted-hello {
            description
              "Configure targeted hello parameters";
            uses apply-advanced;
    
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Hello interval (seconds)";
            }
    
            leaf hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Hold interval (seconds)";
            }
          }  // container targeted-hello
    
          container p2mp {
            presence "enable p2mp";
            description
              "Advertise P2MP capability to peers";
            uses apply-advanced;
    
            container recursive {
              description
                "Configure P2MP recursive parameters";
              uses apply-advanced;
    
              leaf route {
                type empty;
                description
                  "Allow recursive route resolution to signal P2MP FEC";
              }
            }  // container recursive
    
            list root-address {
              key "name";
              description
                "Configure the root address of P2MP LSP";
              leaf name {
                type jt:ipaddr;
                description
                  "Root address of the P2MP LSP";
              }
    
              uses apply-advanced;
    
              list lsp-id {
                key "name";
                description
                  "Configure the generic LSP identifier";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Generic LSP identifier value";
                }
    
                uses apply-advanced;
              }  // list lsp-id
    
              list group-address {
                key "name";
                description
                  "IPv4/Ipv6 group address for mLDP LSP";
                leaf name {
                  type jt:ipaddr;
                  description
                    "IPv4/Ipv6 group address";
                }
    
                uses apply-advanced;
    
                list source-address {
                  key "name";
                  description
                    "IPv4/Ipv6 source address";
                  leaf name {
                    type jt:ipaddr;
                    description
                      "IPv4/Ipv6 source address for mLDP LSP";
                  }
    
                  uses apply-advanced;
                }  // list source-address
              }  // list group-address
            }  // list root-address
    
            leaf no-rsvp-tunneling {
              type empty;
              description
                "Do not allow LDP P2MP to use RSVP-TE LSPs for tunneling";
            }
          }  // container p2mp
    
          container sr-mapping-client {
            presence "enable sr-mapping-client";
            description
              "Enable LDP to SR mapping-client functionality";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "SR mapping-client policy";
            }
          }  // container sr-mapping-client
    
          leaf upstream-label-assignment {
            type empty;
            description
              "Allow Upstream Label Assignment capability";
          }
    
          list family {
            key "name";
            ordered-by user;
            description "Address family";
            leaf name {
              type enumeration {
                enum "inet" {
                  value 0;
                  description "IPv4 family";
                }
                enum "inet6" {
                  value 1;
                  description "IPv6 family";
                }
              }
            }
    
            uses apply-advanced;
          }  // list family
    
          leaf transport-preference {
            type enumeration {
              enum "ipv4" {
                value 0;
                description
                  "Use IPv4 for TCP connections";
              }
              enum "ipv6" {
                value 1;
                description
                  "Use IPv6 for TCP connections";
              }
            }
            description
              "TCP transport preference";
          }
    
          container dual-transport {
            presence "enable dual-transport";
            description
              "Use separate IPv4 and IPv6 TCP transport";
            uses apply-advanced;
    
            leaf inet-lsr-id {
              type jt:ipv4addr;
              description
                "LSR identifier for address family inet";
            }
    
            leaf inet6-lsr-id {
              type jt:ipv4addr;
              description
                "LSR identifier for address family inet6";
            }
          }  // container dual-transport
        }  // grouping juniper-protocols-ldp
    
        grouping juniper-protocols-mpls {
          description
            "Multiprotocol Label Switching options";
          uses apply-advanced;
    
          list lsp-external-controller {
            key "name";
            ordered-by user;
            description
              "External path computing entity";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of less than 64 characters";
              }
              description
                "Name of the external path computing entity";
            }
    
            uses apply-advanced;
    
            container label-switched-path-template {
              description
                "Template for externally provisioned LSP parameters";
              uses apply-advanced;
    
              choice dynamic-template {
                leaf template-name {
                  junos:must "(!("protocols mpls label-switched-path $$ p2mp"))";
                  junos:must-message "Referenced template cannot be a p2mp template";
                  junos:must "("protocols mpls label-switched-path $$ template")";
                  junos:must-message "Referenced point-to-point LSP template does not exist";
                  type string {
                    junos:posix-pattern "![*<>]";
                    junos:pattern-message "Template name should not contain '*' and angle brackets";
                    length "1 .. 32";
                  }
                  description
                    "Name of point-to-point LSP template";
                }
                leaf default-template {
                  type empty;
                  description
                    "Use default parameters";
                }
              }  // choice dynamic-template
            }  // container label-switched-path-template
    
            container label-switched-path-p2mp-template {
              description
                "Template for externally provisioned P2MP LSP parameters";
              uses apply-advanced;
    
              choice dynamic-template {
                leaf template-name {
                  junos:must "("protocols mpls label-switched-path $$ p2mp")";
                  junos:must-message "Referenced template should be a p2mp template";
                  junos:must "("protocols mpls label-switched-path $$ template")";
                  junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                  type string {
                    junos:posix-pattern "![*<>]";
                    junos:pattern-message "Template name should not contain '*' and angle brackets";
                    length "1 .. 32";
                  }
                  description
                    "Name of point-to-multipoint LSP template";
                }
                leaf default-template {
                  type empty;
                  description
                    "Use default parameters";
                }
              }  // choice dynamic-template
            }  // container label-switched-path-p2mp-template
    
            list pce-controlled-lsp {
              key "name";
              ordered-by user;
              description
                "Template for externally provisioned LSP using regular expression";
              leaf name {
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of less than 64 characters";
                }
                description
                  "Template regular expression";
              }
    
              uses apply-advanced;
    
              container label-switched-path-template {
                description
                  "Template for externally provisioned LSP parameters";
                uses apply-advanced;
    
                leaf template-name {
                  junos:must "(!("protocols mpls label-switched-path $$ p2mp"))";
                  junos:must-message "Referenced template cannot be a p2mp template";
                  junos:must "("protocols mpls label-switched-path $$ template")";
                  junos:must-message "Referenced point-to-point LSP template does not exist";
                  type string {
                    junos:posix-pattern "![*<>]";
                    junos:pattern-message "Template name should not contain '*' and angle brackets";
                    length "1 .. 64";
                  }
                  description
                    "Name of point-to-point LSP template";
                }
              }  // container label-switched-path-template
    
              container label-switched-path-p2mp-template {
                description
                  "Template for externally provisioned P2MP LSP parameters";
                uses apply-advanced;
    
                leaf template-name {
                  junos:must "("protocols mpls label-switched-path $$ p2mp")";
                  junos:must-message "Referenced template should be a p2mp template";
                  junos:must "("protocols mpls label-switched-path $$ template")";
                  junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                  type string {
                    junos:posix-pattern "![*<>]";
                    junos:pattern-message "Template name should not contain '*' and angle brackets";
                    length "1 .. 64";
                  }
                  description
                    "Name of point-to-multipoint LSP template";
                }
              }  // container label-switched-path-p2mp-template
            }  // list pce-controlled-lsp
          }  // list lsp-external-controller
    
          container path-mtu {
            presence "enable path-mtu";
            description "Path MTU configuration";
            uses apply-advanced;
    
            leaf allow-fragmentation {
              type empty;
              description
                "If needed, fragment IP before encapsulating in MPLS";
            }
    
            container rsvp {
              presence "enable rsvp";
              description
                "RSVP-specific path MTU options";
              uses apply-advanced;
    
              leaf mtu-signaling {
                type empty;
                description
                  "Enable RSVP path MTU signaling";
              }
            }  // container rsvp
          }  // container path-mtu
    
          container diffserv-te {
            description
              "Global diffserv-traffic-engineering options";
            uses apply-advanced;
    
            leaf bandwidth-model {
              type enumeration {
                enum "extended-mam" {
                  value 0;
                  description
                    "Maximum allocation model with support for E-LSPs";
                }
                enum "mam" {
                  value 1;
                  description
                    "Maximum allocation model";
                }
                enum "rdm" {
                  value 2;
                  description
                    "Russian dolls model";
                }
              }
              description
                "Bandwidth constraint model supported";
            }
    
            container te-class-matrix {
              description
                "Supported combinations of traffic-class and preemption";
              uses apply-advanced;
    
              container te0 {
                description
                  "Definition for traffic-engineering class te0";
                uses te-class-object;
              }  // container te0
    
              container te1 {
                description
                  "Definition for traffic-engineering class te1";
                uses te-class-object;
              }  // container te1
    
              container te2 {
                description
                  "Definition for traffic-engineering class te2";
                uses te-class-object;
              }  // container te2
    
              container te3 {
                description
                  "Definition for traffic-engineering class te3";
                uses te-class-object;
              }  // container te3
    
              container te4 {
                description
                  "Definition for traffic-engineering class te4";
                uses te-class-object;
              }  // container te4
    
              container te5 {
                description
                  "Definition for traffic-engineering class te5";
                uses te-class-object;
              }  // container te5
    
              container te6 {
                description
                  "Definition for traffic-engineering class te6";
                uses te-class-object;
              }  // container te6
    
              container te7 {
                description
                  "Definition for traffic-engineering class te7";
                uses te-class-object;
              }  // container te7
            }  // container te-class-matrix
          }  // container diffserv-te
    
          container auto-policing {
            description
              "Automatic policing of LSPs";
            uses apply-advanced;
    
            list class {
              key "name";
              ordered-by user;
              description "Forwarding class";
              leaf name {
                type enumeration {
                  enum "all" {
                    value 0;
                    description
                      "All forwarding classes";
                  }
                  enum "ct0" {
                    value 1;
                    description
                      "Forwarding class 0";
                  }
                  enum "ct1" {
                    value 2;
                    description
                      "Forwarding class 1";
                  }
                  enum "ct2" {
                    value 3;
                    description
                      "Forwarding class 2";
                  }
                  enum "ct3" {
                    value 4;
                    description
                      "Forwarding class 3";
                  }
                }
              }
    
              uses apply-advanced;
    
              choice policing-action {
                leaf drop {
                  type empty;
                  description
                    "Drop packets if bandwidth is exceeded";
                }
                leaf loss-priority-high {
                  type empty;
                  description
                    "Set loss priority to high if bandwidth is exceeded";
                }
                leaf loss-priority-low {
                  type empty;
                  description
                    "Set loss priority to low if bandwidth is exceeded";
                }
              }  // choice policing-action
            }  // list class
          }  // container auto-policing
    
          container statistics {
            description
              "Collect statistics for signaled label-switched paths";
            uses apply-advanced;
    
            container file {
              presence "enable file";
              description
                "Statistics file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            leaf interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 65535";
                }
              }
              description
                "Time to collect statistics (seconds)";
            }
    
            leaf auto-bandwidth {
              type empty;
              description
                "Enable auto bandwidth allocation";
            }
    
            leaf no-transit-statistics {
              type empty;
              description
                "Disable transit LSP statistics collection";
            }
    
            choice transit-polling-type {
              leaf no-transit-statistics-polling {
                type empty;
                status deprecated;
                description
                  "Disable polling and display of transit lsp statistics";
              }
              leaf transit-statistics-polling {
                junos:must "(!(" .. no-transit-statistics"))";
                junos:must-message "no-transit-statistics and transit-statistics-polling cannot coexist";
                type empty;
                description
                  "Enable polling and display of transit lsp statistics";
              }
            }  // choice transit-polling-type
    
            leaf no-bypass-statistics-polling {
              type empty;
              description
                "Disable polling and display of bypass lsp statistics";
            }
    
            leaf statistics-query-batch-size {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 25";
                }
              }
              description
                "Number of LSPs for which statistics will be queried together";
            }
    
            leaf traffic-class-statistics {
              type empty;
              description
                "Create per traffic class statistics sensors for LSPs";
            }
          }  // container statistics
    
          container p2mp-lsp {
            description
              "P2MP LSP control configuration";
            uses apply-advanced;
    
            leaf single-abr {
              type empty;
              description
                "Try to use same exit node for all inter-domain sub LSPs";
            }
    
            leaf no-re-merge {
              type empty;
              description
                "Avoid LSP CSPF creating remerge";
            }
          }  // container p2mp-lsp
    
          container log-updown {
            description
              "Logging actions for LSP up/down events";
            uses apply-advanced;
    
            choice syslog-choice {
              leaf syslog {
                type empty;
                description
                  "Send syslog messages";
              }
              leaf no-syslog {
                type empty;
                description
                  "Don't send syslog messages";
              }
            }  // choice syslog-choice
    
            choice trap-choice {
              leaf trap {
                type empty;
                description "Send SNMP traps";
              }
              container no-trap {
                presence "enable no-trap";
                description
                  "Don't send SNMP traps";
                uses apply-advanced;
    
                leaf mpls-lsp-traps {
                  type empty;
                  description
                    "Dont send mpls lsp up/down traps";
                }
    
                leaf rfc3812-traps {
                  type empty;
                  description
                    "Dont send rfc3812 traps";
                }
              }  // container no-trap
            }  // choice trap-choice
    
            leaf trap-path-down {
              type empty;
              description
                "Send SNMP traps when a path goes down";
            }
    
            leaf trap-path-up {
              type empty;
              description
                "Send SNMP traps when a path goes up";
            }
          }  // container log-updown
    
          container optimize-adaptive-teardown {
            description
              "Post make before break adaptive teardown";
            uses apply-advanced;
    
            leaf p2p {
              type empty;
              description
                "Turn on post make before break adaptive teardown for p2p";
            }
    
            leaf timeout {
              junos:must "(".. p2p")";
              junos:must-message "adaptive-teardown must include 'p2p' attribute";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 65535";
                }
              }
              units "seconds";
              description
                "Timeout for adaptive teardown to clean up LSP";
            }
    
            container delay {
              junos:must "(".. p2p")";
              junos:must-message "adaptive-teardown must include 'p2p' attribute";
              description
                "Delay tearing down old optimized path after adaptive-teardown kicks in";
              uses apply-advanced;
    
              leaf delay-value {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "3 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Delay tearing down old optimized path after adaptive-teardown kicks in";
              }
            }  // container delay
          }  // container optimize-adaptive-teardown
    
          container traffic-engineering {
            presence
              "enable traffic-engineering";
            description
              "Traffic-engineering control";
            uses apply-advanced;
    
            choice protocols {
              leaf bgp {
                type empty;
                description
                  "BGP destinations only";
              }
              leaf bgp-igp {
                type empty;
                description
                  "BGP and IGP destinations";
              }
              leaf bgp-igp-both-ribs {
                type empty;
                description
                  "BGP and IGP destinations with routes in both routing tables";
              }
              leaf mpls-forwarding {
                type empty;
                description
                  "Use MPLS routes for forwarding, not routing";
              }
            }  // choice protocols
    
            container database {
              description
                "Traffic engineering database";
              uses apply-advanced;
    
              container import {
                description
                  "Configure TED import parameters";
                uses apply-advanced;
    
                container l3-unicast-topology {
                  presence
                    "enable l3-unicast-topology";
                  description
                    "Download L3-Unicast topology into RIB";
                  uses apply-advanced;
    
                  leaf bgp-link-state {
                    type empty;
                    description
                      "Export L3-Unicast topology, instead of TE topology, into BGP-LS";
                  }
                }  // container l3-unicast-topology
    
                leaf-list policy {
                  type jt:policy-algebra;
                  ordered-by user;
                  description
                    "Configure import policy";
                }
    
                leaf identifier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint64 {
                      range
                        "2 .. 18446744073709551615";
                    }
                  }
                  description
                    "BGP-TE identifier";
                }
    
                leaf bgp-ls-identifier {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "BGP-TE domain identifier";
                }
    
                leaf ipv6 {
                  type empty;
                  description
                    "Import ipv6 addresses";
                }
              }  // container import
    
              container export {
                description
                  "Configure TED export related parameters";
                uses apply-advanced;
    
                leaf-list policy {
                  type jt:policy-algebra;
                  ordered-by user;
                  description "Export policy";
                }
    
                container credibility {
                  description
                    "TED credibility value for entries from BGP-TE";
                  uses apply-advanced;
    
                  leaf unknown {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from unknown entities";
                  }
    
                  leaf direct {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from directly connected links";
                  }
    
                  leaf static {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from static configuration";
                  }
    
                  leaf ospf {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from ospf";
                  }
    
                  leaf isis-level-1 {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from ISIS Level 1";
                  }
    
                  leaf isis-level-2 {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from ISIS Level 2";
                  }
    
                  leaf bgp {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 512";
                      }
                    }
                    description
                      "Entries sourced from BGP";
                  }
                }  // container credibility
    
                leaf l3-unicast-topology {
                  type empty;
                  description
                    "Download RIB entries into L3-Unicast topology";
                }
              }  // container export
            }  // container database
          }  // container traffic-engineering
    
          list admin-groups {
            key "name";
            ordered-by user;
            description "Administrative groups";
            leaf name {
              type string;
              description "Group name";
            }
    
            uses apply-advanced;
    
            leaf group-value {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 31";
                }
              }
              description "Group bit position";
            }
          }  // list admin-groups
    
          leaf advertisement-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            default "5";
            description
              "Time that an 'LSP down' advertisement will be delayed";
          }
    
          leaf rsvp-error-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 240";
              }
            }
            units "seconds";
            default "25";
            description
              "Time that RSVP PathErr events will be remembered";
          }
    
          leaf optimize-aggressive {
            type empty;
            description
              "Run aggressive optimization algorithm based on IGP metric only";
          }
    
          leaf smart-optimize-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            description
              "Path optimization interval after a link traversed by the path goes down";
          }
    
          leaf optimize-switchover-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "1 .. 900";
              }
            }
            units "seconds";
            description
              "Delay before switching LSP to newly optimized path";
          }
    
          leaf no-propagate-ttl {
            type empty;
            description
              "Disable TTL propagation from IP to MPLS (on push) and MPLS to IP (on pop)";
          }
    
          leaf sensor-based-stats {
            type empty;
            description
              "Enable sensor based statistics collection";
          }
    
          leaf explicit-null {
            type empty;
            description
              "Advertise the EXPLICIT_NULL label when the router is the egress";
          }
    
          leaf icmp-tunneling {
            type empty;
            description
              "Allow MPLS LSPs to be used for tunneling ICMP error packets";
          }
    
          leaf revert-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            description
              "Hold-down window before reverting back to primary path, 0 means disable";
          }
    
          leaf optimize-hold-dead-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            description
              "Delay before tearing down the old optimized path";
          }
    
          leaf cspf-backoff-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            description
              "Delay before CSPF, when there is PathErr on backup path";
          }
    
          leaf expand-loose-hop {
            type empty;
            description
              "Perform CSPF path computation to expand loose hops";
          }
    
          leaf mib-mpls-show-p2mp {
            type empty;
            description
              "Show p2mp tunnels entries in mpls mib walk";
          }
    
          container bandwidth {
            description
              "Bandwidth to reserve (bps)";
            uses bandwidth-type;
          }  // container bandwidth
    
          container admin-group {
            description
              "Administrative group policy";
            uses admin_group_include_exclude;
          }  // container admin-group
    
          container admin-group-extended {
            description
              "Extended administrative group policy";
            uses admin_group_include_exclude;
          }  // container admin-group-extended
    
          container priority {
            presence "enable priority";
            description "Preemption priorities";
          }  // container priority
    
          leaf setup-priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 7";
              }
            }
            description "Set-up priority";
          }
    
          leaf reservation-priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 7";
              }
            }
            description "Reservation priority";
          }
    
          container oam {
            description "Periodic OAM";
            uses periodic_oam;
          }  // container oam
    
          leaf class-of-service {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 7";
              }
            }
            description "Class-of-service value";
          }
    
          leaf no-decrement-ttl {
            type empty;
            description
              "Do not decrement the TTL within an LSP";
          }
    
          leaf hop-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "2 .. 255";
              }
            }
            description
              "Maximum allowed router hops";
          }
    
          leaf no-cspf {
            type empty;
            description
              "Disable automatic path computation";
          }
    
          leaf admin-down {
            type empty;
            description
              "Set GMPLS LSP to administrative down state";
          }
    
          leaf optimize-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type int32 {
                range "0 .. 65535";
              }
            }
            units "seconds";
            description
              "Periodical path reoptimizations";
          }
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Preference value";
          }
    
          choice record-choice {
            leaf record {
              type empty;
              description
                "Record transit routers";
            }
            leaf no-record {
              type empty;
              description
                "Don't record transit routers";
            }
          }  // choice record-choice
    
          leaf standby {
            type empty;
            description
              "Keep backup paths in continuous standby";
          }
    
          leaf exclude-srlg {
            type empty;
            description
              "Exclude SRLG links for secondary path";
          }
    
          leaf ultimate-hop-popping {
            type empty;
            description
              "Request ultimate hop popping from egress";
          }
    
          leaf sync-active-path-bandwidth {
            type empty;
            description
              "Signal standby path with bandwidth obtained from active path";
          }
    
          leaf cross-credibility-cspf {
            type empty;
            description
              "Compute paths across multi-protocol links and nodes";
          }
    
          list label-switched-path {
            key "name";
            ordered-by user;
            description "Label-switched path";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description "Name of path";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable MPLS label-switched path";
              }
            }  // choice enable-disable
    
            container traceoptions {
              description
                "Trace options for MPLS label-switched path";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "cspf" {
                      value 0;
                      description
                        "Trace CSPF computation";
                    }
                    enum "cspf-node" {
                      value 1;
                      description
                        "Trace nodes visited during CSPF";
                    }
                    enum "cspf-link" {
                      value 2;
                      description
                        "Trace links visited during CSPF";
                    }
                    enum "cspf-abstract" {
                      value 3;
                      description
                        "Trace abstract hop based CSPF details";
                    }
                    enum "state" {
                      value 4;
                      description
                        "Trace state transitions";
                    }
                    enum "all" {
                      value 5;
                      description
                        "Trace everything";
                    }
                  }
                }
              }  // list flag
            }  // container traceoptions
    
            leaf no-install-to-address {
              type empty;
              description
                "Don't install host route 'to' address into routing tables";
            }
    
            leaf backup {
              type empty;
              description
                "Use LSP for IGP backup";
            }
    
            leaf from {
              type jt:ipv4addr;
              description
                "Address of ingress router";
            }
    
            container pop-and-forward {
              junos:must "(!(".. lsp-external-controller"))";
              junos:must-message "lsp-external-controller unsupported for pop-and-forward LSP";
              junos:must "(!(".. lsp-attributes"))";
              junos:must-message "lsp-attributes unsupported for pop-and-forward LSP";
              junos:must "(!(".. single-sided-associated-bidirectional"))";
              junos:must-message "single-sided-associated-bidirectional unsupported for pop-and-forward LSP";
              junos:must "(!(".. associate-lsp"))";
              junos:must-message "associate-lsp unsupported for pop-and-forward LSP";
              junos:must "(!(".. corouted-bidirectional-passive"))";
              junos:must-message "corouted-bidirectional-passive unsupported for pop-and-forward LSP";
              junos:must "(!(".. corouted-bidirectional"))";
              junos:must-message "corouted-bidirectional unsupported for pop-and-forward LSP";
              junos:must "(!(".. backup"))";
              junos:must-message "backup unsupported for pop-and-forward LSP";
              junos:must "(!(".. no-cspf"))";
              junos:must-message "no-cspf unsupported for pop-and-forward LSP";
              junos:must "(!((".. ultimate-hop-popping" || ".. .. ultimate-hop-popping")))";
              junos:must-message "ultimate hop popping unsupported for pop-and-forward LSP";
              junos:must "(!(".. p2mp"))";
              junos:must-message "p2mp unsupported for pop-and-forward LSP";
              junos:must "(!(".. node-link-protection"))";
              junos:must-message "link/node protection unsupported for pop-and-forward LSP";
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "fast-reroute unsupported for pop-and-forward LSP";
              presence "enable pop-and-forward";
              description
                "Enable LSP as pop-and-forward with auto-delegation";
            }  // container pop-and-forward
    
            choice label-switched-path-or-template {
              leaf to {
                type jt:ipv4addr;
                description
                  "Address of egress router";
              }
              leaf template {
                junos:must "(!(".. associate-lsp"))";
                junos:must-message "Template cannot have associate-lsp";
                junos:must "(!(".. corouted-bidirectional-passive"))";
                junos:must-message "Template cannot be passive bidirectional";
                junos:must "(!(".. corouted-bidirectional"))";
                junos:must-message "Template cannot be active bidirectional";
                junos:must "(!(".. lsp-external-controller"))";
                junos:must-message "Can't configure external controller in template";
                junos:must "(!(".. disable"))";
                junos:must-message "Not applicable for template";
                junos:must "(!((".. primary" || ".. secondary")))";
                junos:must-message "Template cannot include 'path' statement";
                type empty;
                description
                  "Template for dynamic lsp paramaters";
              }
            }  // choice label-switched-path-or-template
    
            leaf corouted-bidirectional {
              junos:must "(!(".. p2mp"))";
              junos:must-message "p2mp unsupported for bidirectional LSP";
              junos:must "(!(".. auto-bandwidth"))";
              junos:must-message "auto-bandwidth unsupported for bidirectional LSP";
              junos:must "(!((".. link-protection" || ".. node-link-protection")))";
              junos:must-message "link/node protection unsupported for bidirectional LSP";
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "fast-reroute unsupported for bidirectional LSP";
              junos:must "(!(".. corouted-bidirectional-passive"))";
              junos:must-message "Passive and active bidirectional attributes cannot coexist";
              type empty;
              description
                "Setup the LSP as a corouted bidirectional LSP";
            }
    
            leaf corouted-bidirectional-passive {
              junos:must "(!(".. p2mp"))";
              junos:must-message "p2mp unsupported for bidirectional LSP";
              junos:must "(!(".. auto-bandwidth"))";
              junos:must-message "auto-bandwidth unsupported for bidirectional LSP";
              junos:must "(!((".. link-protection" || ".. node-link-protection")))";
              junos:must-message "link/node protection unsupported for bidirectional LSP";
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "fast-reroute unsupported for bidirectional LSP";
              junos:must "(!((".. standby" || ".. .. standby")))";
              junos:must-message "standby unsupported for passive bidirectional LSP";
              junos:must "(!(".. soft-preemption"))";
              junos:must-message "soft-preemption unsupported for passive bidirectional LSP";
              junos:must "(!((".. oam bfd-liveness-detection" || ".. .. oam bfd-liveness-detection")))";
              junos:must-message "oam bfd-liveness-detection unsupported for passive bidirectional LSP";
              junos:must "(!((".. no-decrement-ttl" || ".. .. no-decrement-ttl")))";
              junos:must-message "no-decrement-ttl unsupported for passive bidirectional LSP";
              junos:must "(!((".. exclude-srlg" || ".. .. exclude-srlg")))";
              junos:must-message "exclude-srlg unsupported for passive bidirectional LSP";
              junos:must "(!((".. bandwidth" || ".. .. bandwidth")))";
              junos:must-message "bandwidth unsupported for passive bidirectional LSP";
              junos:must "(!((".. admin-group-extended" || ".. .. admin-group-extended")))";
              junos:must-message "admin-group-extended unsupported for passive bidirectional LSP";
              junos:must "(!((".. admin-group" || ".. .. admin-group")))";
              junos:must-message "admin-group unsupported for passive bidirectional LSP";
              junos:must "(!(".. adaptive"))";
              junos:must-message "adaptive unsupported for passive bidirectional LSP";
              junos:must "(!(".. lsp-attributes"))";
              junos:must-message "Passive bidirectional LSP cannot include 'lsp-attributes' statement";
              junos:must "(!((".. primary" || ".. secondary")))";
              junos:must-message "Passive bidirectional LSP cannot include 'path' statement";
              type empty;
              description
                "Associate LSP with incoming corouted bidirectional LSP";
            }
    
            leaf metric {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777215";
                }
              }
              description "Metric value";
            }
    
            leaf ldp-tunneling {
              type empty;
              description
                "Allow LDP to use this LSP for tunneling";
            }
    
            leaf soft-preemption {
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "soft-preemption is unsupported when fast-reroute is desired";
              type empty;
              description
                "Attempt make-before-break service while preempting this LSP";
            }
    
            list install {
              key "name";
              ordered-by user;
              description "Install prefix";
              leaf name {
                type jt:ipprefix;
                description "Destination prefix";
              }
    
              leaf active {
                type empty;
                description
                  "Install prefix into forwarding table";
              }
            }  // list install
    
            leaf retry-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 600";
                }
              }
              units "seconds";
              description
                "Time before retrying the primary path";
            }
    
            leaf retry-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 10000";
                }
              }
              description
                "Maximum number of times to retry primary path";
            }
    
            container lsp-attributes {
              description
                "Attributes for generalized LSP";
              uses apply-advanced;
    
              leaf signal-bandwidth {
                junos:must "(!((".. switching-type l2sc" || (".. switching-type psc-1" || ".. switching-type ethernet-vlan"))))";
                junos:must-message "signal-bandwidth invalid for VLAN LSP and Packet LSP";
                type enumeration {
                  enum "ds1" {
                    value 0;
                    description "1.544 Mbps";
                  }
                  enum "vt1-5" {
                    value 1;
                    description "1.728 Mbps";
                  }
                  enum "e1" {
                    value 2;
                    description "2.048 Mbps";
                  }
                  enum "vt2" {
                    value 3;
                    description "2.304 Mbps";
                  }
                  enum "ethernet" {
                    value 4;
                    description "10 Mbps";
                  }
                  enum "e3" {
                    value 5;
                    description "34.368 Mbps";
                  }
                  enum "ds3" {
                    value 6;
                    description "44.736 Mbps";
                  }
                  enum "sts-1" {
                    value 7;
                    description "51.84 Mbps";
                  }
                  enum "fastether" {
                    value 8;
                    description "100.00 Mbps";
                  }
                  enum "stm-1" {
                    value 9;
                    description "155.52 Mbps";
                  }
                  enum "stm-4" {
                    value 10;
                    description "622.08 Mbps";
                  }
                  enum "gigether" {
                    value 11;
                    description "1000.00 Mbps";
                  }
                  enum "stm-16" {
                    value 12;
                    description "2488.32 Mbps";
                  }
                  enum "stm-64" {
                    value 13;
                    description "9953.28 Mbps";
                  }
                  enum "10gigether" {
                    value 14;
                    description "10000.00 Mbps";
                  }
                  enum "stm-256" {
                    value 15;
                    description "39813.12 Mbps";
                  }
                  enum "100gige" {
                    value 16;
                    description "100000.00 Mbps";
                  }
                }
                description
                  "Signal bandwidth for the LSP";
              }
    
              leaf switching-type {
                type enumeration {
                  enum "psc-1" {
                    value 0;
                    description
                      "Packet switching";
                  }
                  enum "lambda" {
                    value 1;
                    description
                      "Lambda switching";
                  }
                  enum "fiber" {
                    value 2;
                    description
                      "Fiber switching";
                  }
                  enum "tdm" {
                    value 3;
                    description "TDM switching";
                  }
                  enum "ethernet-vlan" {
                    junos:must "((!(".. encoding-type") || ".. encoding-type ethernet"))";
                    junos:must-message "Only ethernet encoding supported for VLAN LSP";
                    value 4;
                    description
                      "Ethernet VLAN switching";
                  }
                }
                description
                  "LSP switching type desired";
              }
    
              leaf encoding-type {
                type enumeration {
                  enum "packet" {
                    value 0;
                    description
                      "Packet encoding";
                  }
                  enum "ethernet" {
                    value 1;
                    description
                      "Ethernet encoding";
                  }
                  enum "pdh" {
                    value 2;
                    description "PDH encoding";
                  }
                  enum "sonet-sdh" {
                    value 3;
                    description
                      "SONET-SDH encoding";
                  }
                }
                description
                  "LSP encoding type desired";
              }
    
              leaf gpid {
                type enumeration {
                  enum "ipv4" {
                    value 0;
                  }
                  enum "ethernet" {
                    value 1;
                  }
                  enum "ppp" {
                    value 2;
                  }
                  enum "hdlc" {
                    value 3;
                  }
                  enum
                    "pos-no-scrambling-crc-16" {
                    value 4;
                  }
                  enum
                    "pos-no-scrambling-crc-32" {
                    value 5;
                  }
                  enum "pos-scrambling-crc-16" {
                    value 6;
                  }
                  enum "pos-scrambling-crc-32" {
                    value 7;
                  }
                }
                description "Generalized PID";
              }
    
              container upstream-label {
                description
                  "Upstream Label for the bidirectional label-switched path";
                uses apply-advanced;
    
                leaf vlan-id {
                  junos:must "(".. .. switching-type ethernet-vlan")";
                  junos:must-message "VLAN label is valid only for VLAN LSP";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4094";
                    }
                  }
                  description
                    "VLAN ID label for the label-switched path";
                }
              }  // container upstream-label
            }  // container lsp-attributes
    
            leaf revert-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Hold-down window before reverting back to primary path, 0 means disable";
            }
    
            leaf optimize-hold-dead-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Delay before tearing down the old optimized path";
            }
    
            leaf cspf-backoff-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Delay before CSPF, when there is PathErr on backup path";
            }
    
            container bandwidth {
              description
                "Bandwidth to reserve (bps)";
              uses bandwidth-type;
            }  // container bandwidth
    
            container admin-group {
              description
                "Administrative group policy";
              uses admin_group_include_exclude;
            }  // container admin-group
    
            container admin-group-extended {
              description
                "Extended administrative group policy";
              uses admin_group_include_exclude;
            }  // container admin-group-extended
    
            container priority {
              presence "enable priority";
              description
                "Preemption priorities";
            }  // container priority
    
            leaf setup-priority {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 7";
                }
              }
              description "Set-up priority";
            }
    
            leaf reservation-priority {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 7";
                }
              }
              description "Reservation priority";
            }
    
            container oam {
              description "Periodic OAM";
              uses periodic_oam;
            }  // container oam
    
            leaf class-of-service {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 7";
                }
              }
              description
                "Class-of-service value";
            }
    
            leaf no-decrement-ttl {
              type empty;
              description
                "Do not decrement the TTL within an LSP";
            }
    
            leaf hop-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "2 .. 255";
                }
              }
              description
                "Maximum allowed router hops";
            }
    
            leaf no-cspf {
              type empty;
              description
                "Disable automatic path computation";
            }
    
            leaf admin-down {
              type empty;
              description
                "Set GMPLS LSP to administrative down state";
            }
    
            leaf optimize-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Periodical path reoptimizations";
            }
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Preference value";
            }
    
            choice record-choice {
              leaf record {
                type empty;
                description
                  "Record transit routers";
              }
              leaf no-record {
                type empty;
                description
                  "Don't record transit routers";
              }
            }  // choice record-choice
    
            leaf standby {
              type empty;
              description
                "Keep backup paths in continuous standby";
            }
    
            leaf exclude-srlg {
              type empty;
              description
                "Exclude SRLG links for secondary path";
            }
    
            leaf ultimate-hop-popping {
              type empty;
              description
                "Request ultimate hop popping from egress";
            }
    
            leaf sync-active-path-bandwidth {
              type empty;
              description
                "Signal standby path with bandwidth obtained from active path";
            }
    
            leaf cross-credibility-cspf {
              type empty;
              description
                "Compute paths across multi-protocol links and nodes";
            }
    
            leaf entropy-label {
              type empty;
              description "Enable entropy label";
            }
    
            leaf self-ping-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 65535";
                }
              }
              units "seconds";
              description
                "Duration over which to run self-ping (65535 = until success). Default = 1800s";
            }
    
            leaf no-self-ping {
              type empty;
              description
                "Do not run self-ping for this LSP";
            }
    
            choice cspf-attribute {
              leaf random {
                type empty;
                description
                  "Randomly select among equal-cost paths";
              }
              leaf least-fill {
                type empty;
                description
                  "Select the least filled among equal-cost paths";
              }
              leaf most-fill {
                type empty;
                description
                  "Select the most filled among equal-cost paths";
              }
            }  // choice cspf-attribute
    
            leaf description {
              type string {
                length "1 .. 80";
              }
              description
                "Text description of label-switched path";
            }
    
            choice lp-type {
              leaf link-protection {
                type empty;
                description
                  "Protect LSP from link faults only";
              }
              leaf node-link-protection {
                type empty;
                description
                  "Protect LSP from both link and node faults";
              }
            }  // choice lp-type
    
            leaf intra-domain {
              type empty;
              status deprecated;
              description "Intra-domain LSP";
            }
    
            leaf inter-domain {
              type empty;
              description "Inter-domain LSP";
            }
    
            leaf adaptive {
              type empty;
              description
                "Have the LSP smoothly cut over to new routes";
            }
    
            container in-place-lsp-bandwidth-update {
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "In-place update unsupported for LSPs requesting detour protection";
              junos:must "(!((".. lsp-external-controller" || ".. .. lsp-external-controller")))";
              junos:must-message "In-place update unsupported for externally controlled LSPs";
              junos:must "(!(".. single-sided-associated-bidirectional"))";
              junos:must-message "In-place update unsupported for single-sided-associated-bidirectional LSPs";
              junos:must "(!(".. corouted-bidirectional-passive"))";
              junos:must-message "In-place update unsupported for corouted-bidirectional-passive LSPs";
              junos:must "(!(".. corouted-bidirectional"))";
              junos:must-message "In-place update unsupported for corouted-bidirectional LSPs";
              junos:must "(!((".. no-cspf" || ".. .. no-cspf")))";
              junos:must-message "In-place update unsupported for no-cspf LSPs";
              junos:must "(!(".. p2mp"))";
              junos:must-message "In-place update unsupported for p2mp sub-LSPs";
              presence
                "enable in-place-lsp-bandwidth-update";
              description
                "Update LSP in-place re-using the same LSP identifier";
            }  // container in-place-lsp-bandwidth-update
    
            container fast-reroute {
              presence "enable fast-reroute";
              description "Fast reroute";
              uses apply-advanced;
    
              leaf hop-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Maximum allowed router hops";
              }
    
              choice bw-attribute {
                leaf bandwidth {
                  type string;
                  description
                    "Bandwidth to reserve (bps)";
                }
                leaf bandwidth-percent {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of main path bandwidth to reserve";
                }
              }  // choice bw-attribute
    
              choice include_any_or_no_include_any {
                leaf no-include-any {
                  type empty;
                  description
                    "Disable include-any checking";
                }
                leaf-list include-any {
                  type string;
                  ordered-by user;
                  description
                    "Groups, one or more of which must be present";
                }
              }  // choice include_any_or_no_include_any
    
              choice include_all_or_no_include_all {
                leaf no-include-all {
                  type empty;
                  description
                    "Disable include-all checking";
                }
                leaf-list include-all {
                  type string;
                  ordered-by user;
                  description
                    "Groups, all of which must be present";
                }
              }  // choice include_all_or_no_include_all
    
              choice exclude_or_no_exclude {
                leaf no-exclude {
                  type empty;
                  description
                    "Disable exclude checking";
                }
                leaf-list exclude {
                  type string;
                  ordered-by user;
                  description
                    "Groups, all of which must be absent";
                }
              }  // choice exclude_or_no_exclude
            }  // container fast-reroute
    
            container p2mp {
              junos:must "(!(".. associate-backup-pe-groups"))";
              junos:must-message "backup-pe-group cannot be associated with P2MP LSP";
              junos:must "(!(".. egress-protection"))";
              junos:must-message "egress-protection unsupported for P2MP LSP branch";
              junos:must "(!(any ".. primary <*> adaptive"))";
              junos:must-message "adaptive unsupported for P2MP LSP branch path";
              junos:must "(!(".. adaptive"))";
              junos:must-message "adaptive unsupported for P2MP LSP branch";
              junos:must "(!(".. install"))";
              junos:must-message "install prefixes invalid for P2MP LSP branch";
              junos:must "(!(".. ldp-tunneling"))";
              junos:must-message "ldp-tunneling unsupported for P2MP LSP branch";
              junos:must "(!(".. backup"))";
              junos:must-message "backup invalid for P2MP LSP branch";
              junos:must "(!(".. no-install-to-address"))";
              junos:must-message "no-install-to-address invalid for P2MP LSP branch";
              junos:must "(!(".. node-link-protection"))";
              junos:must-message "node protection unsupported for P2MP LSP branch";
              junos:must "(!(".. fast-reroute"))";
              junos:must-message "fast-reroute unsupported for P2MP LSP branch";
              junos:must "(!(".. secondary"))";
              junos:must-message "secondary paths unsupported for P2MP LSP branch";
              junos:must "(!(".. ultimate-hop-popping"))";
              junos:must-message "For point-to-multipoint LSP, ultimate hop popping cannot be configured";
              junos:must "(!(".. lsp-external-controller"))";
              junos:must-message "Can't configure lsp-external-controller knob in p2mp LSPs";
              junos:must "((!(".. .. .. .. .. logical-systems") || !(".. .. ipv6-tunneling")))";
              junos:must-message "In logical systems, IPv6 tunneling cannot be configured with P2MP LSPs";
              junos:must "((any ".. p2mp <*>" || ".. template"))";
              junos:must-message "For S2L point-to-multipoint LSP, parent point-to-multipoint LSP name must be configured";
              presence "enable p2mp";
              description
                "Point-to-multipoint label-switched path";
              leaf path_name {
                junos:must "(!(".. .. .. label-switched-path $$"))";
                junos:must-message "The P2MP name is the same as an existing LSP name";
                junos:must "(!(".. .. template"))";
                junos:must-message "Name not applicable for point-to-multipoint template";
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of less than 64 characters";
                }
                description
                  "Name of point-to-multipoint LSP";
              }
            }  // container p2mp
    
            container auto-bandwidth {
              junos:must "(!(".. p2mp"))";
              junos:must-message "Cannot do auto-bandwidth for P2MP LSP branch";
              junos:must "((!(".. lsp-attributes") || (".. lsp-attributes switching-type psc-1" && (!(".. lsp-attributes encoding-type") || ".. lsp-attributes encoding-type packet"))))";
              junos:must-message "Cannot do auto-bandwidth for non-packet LSP";
              presence "enable auto-bandwidth";
              description
                "Do auto bandwidth allocation for this LSP";
              uses apply-advanced;
    
              leaf adjust-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "300 .. 315360000";
                  }
                }
                units "seconds";
                default "86400";
                description
                  "Time to adjust LSP bandwidth";
              }
    
              leaf adjust-threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 50";
                  }
                }
                units "percent";
                default "0";
                description
                  "Percentage change in average LSP utilization to trigger auto-adjustment";
              }
    
              leaf adjust-threshold-absolute {
                type string;
                units "bps";
                default "0";
                description
                  "Change in average LSP utilization to trigger auto-adjustment";
              }
    
              leaf adjust-threshold-activate-bandwidth {
                type string;
                units "bps";
                description
                  "Adjusts signaled bw if greater than this value";
              }
    
              leaf minimum-bandwidth {
                type string;
                units "bps";
                description
                  "Minimum LSP bandwidth";
              }
    
              leaf maximum-bandwidth {
                type string;
                units "bps";
                description
                  "Maximum LSP bandwidth";
              }
    
              leaf minimum-bandwidth-adjust-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "300 .. 31536000";
                  }
                }
                units "seconds";
                description
                  "Duration for which minimum bandwidth will be frozen";
              }
    
              leaf minimum-bandwidth-adjust-threshold-change {
                junos:must "(".. minimum-bandwidth-adjust-interval")";
                junos:must-message "minimum-bandwidth-adjust-interval must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 100";
                  }
                }
                units "percent";
                description
                  "Change in max average bandwidth to freeze min bandwidth";
              }
    
              leaf minimum-bandwidth-adjust-threshold-value {
                junos:must "(!(".. minimum-bandwidth-adjust-threshold-change"))";
                junos:must-message "minimum-bandwidth-adjust-threshold-change cannot be configured with minimum-bandwidth-adjust-threshold-value";
                junos:must "(".. minimum-bandwidth-adjust-interval")";
                junos:must-message "minimum-bandwidth-adjust-interval must be configured";
                type string;
                units "bps";
                status deprecated;
                description
                  "Freeze min bandwidth if max average bandwidth falls below this bw";
              }
    
              leaf monitor-bandwidth {
                type empty;
                description
                  "Monitor LSP bandwidth without adjustments";
              }
    
              leaf adjust-threshold-overflow-limit {
                junos:must "(((".. adjust-threshold" && ".. maximum-bandwidth") && (!(".. adjust-threshold $$={0}") && !(".. maximum-bandwidth $$={0}"))))";
                junos:must-message "Non-zero adjust-threshold and maximum-bandwidth MUST be configured";
                junos:must "(!(".. monitor-bandwidth"))";
                junos:must-message "adjust-threshold-overflow-limit cannot be used with monitor-bandwidth";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Number of consecutive overflow samples to trigger auto-adjustment";
              }
    
              leaf adjust-threshold-underflow-limit {
                junos:must "((".. adjust-threshold" && !(".. adjust-threshold 0")))";
                junos:must-message "Non-zero adjust-threshold must be configured";
                junos:must "(!(".. monitor-bandwidth"))";
                junos:must-message "adjust-threshold-underflow-limit cannot be used with monitor-bandwidth";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Number of consecutive underflow samples to trigger auto-adjustment";
              }
    
              leaf resignal-minimum-bandwidth {
                type empty;
                description
                  "Resignal the LSP using minimum-bandwidth";
              }
    
              leaf sync-active-path-bandwidth {
                type empty;
                description
                  "Signal standby path with bandwidth obtained from active path";
              }
            }  // container auto-bandwidth
    
            container optimize-on-change {
              description
                "Specify additional re-optimization triggers for this LSP";
              uses apply-advanced;
    
              leaf link-congestion {
                type empty;
                description
                  "Optimize when a link becomes congested";
              }
            }  // container optimize-on-change
    
            container deselect-on-bandwidth-failure {
              presence
                "enable deselect-on-bandwidth-failure";
              description
                "Deselect active path if it cannot meet the bandwidth constraint";
              uses apply-advanced;
    
              leaf tear-lsp {
                type empty;
                description
                  "Bring down active path when all paths fail to reserve required bandwidth";
              }
            }  // container deselect-on-bandwidth-failure
    
            container track-igp-metric {
              description
                "Track IGP metric for LSP install prefixes";
              uses apply-advanced;
    
              leaf install-v4-prefixes {
                type empty;
                description
                  "Track IGP metric for IPV4 prefixes";
              }
    
              leaf install-v6-prefixes {
                type empty;
                description
                  "Track IGP metric for IPV6 prefixes";
              }
            }  // container track-igp-metric
    
            container associate-lsp {
              junos:must "((".. oam mpls-tp-mode" || ".. .. oam mpls-tp-mode"))";
              junos:must-message "mpls-tp-mode must be configured for associate-lsp";
              description
                "Associate the LSP for OAM";
              uses apply-advanced;
    
              leaf lsp-name {
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of 64 characters or less";
                }
                description
                  "Name of assocation LSP";
              }
    
              leaf from {
                type jt:ipv4addr;
                description
                  "Address of ingress router of associated LSP";
              }
            }  // container associate-lsp
    
            list primary {
              key "name";
              ordered-by user;
              description "Preferred path";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description "Name of path";
              }
    
              uses apply-advanced;
    
              container bandwidth {
                description
                  "Bandwidth to reserve (bps)";
                uses bandwidth-type;
              }  // container bandwidth
    
              container admin-group {
                description
                  "Administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group
    
              container admin-group-extended {
                description
                  "Extended administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group-extended
    
              container priority {
                presence "enable priority";
                description
                  "Preemption priorities";
              }  // container priority
    
              leaf setup-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description "Set-up priority";
              }
    
              leaf reservation-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Reservation priority";
              }
    
              container oam {
                description "Periodic OAM";
                uses periodic_oam;
              }  // container oam
    
              leaf class-of-service {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Class-of-service value";
              }
    
              leaf no-decrement-ttl {
                type empty;
                description
                  "Do not decrement the TTL within an LSP";
              }
    
              leaf hop-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "2 .. 255";
                  }
                }
                description
                  "Maximum allowed router hops";
              }
    
              leaf no-cspf {
                type empty;
                description
                  "Disable automatic path computation";
              }
    
              leaf admin-down {
                type empty;
                description
                  "Set GMPLS LSP to administrative down state";
              }
    
              leaf optimize-timer {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Periodical path reoptimizations";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              choice record-choice {
                leaf record {
                  type empty;
                  description
                    "Record transit routers";
                }
                leaf no-record {
                  type empty;
                  description
                    "Don't record transit routers";
                }
              }  // choice record-choice
    
              leaf standby {
                type empty;
                description
                  "Keep backup paths in continuous standby";
              }
    
              leaf exclude-srlg {
                type empty;
                description
                  "Exclude SRLG links for secondary path";
              }
    
              leaf ultimate-hop-popping {
                type empty;
                description
                  "Request ultimate hop popping from egress";
              }
    
              leaf sync-active-path-bandwidth {
                type empty;
                description
                  "Signal standby path with bandwidth obtained from active path";
              }
    
              leaf cross-credibility-cspf {
                type empty;
                description
                  "Compute paths across multi-protocol links and nodes";
              }
    
              leaf adaptive {
                type empty;
                description
                  "Have the LSP smoothly cut over to new routes";
              }
    
              leaf select {
                type enumeration {
                  enum "manual" {
                    value 0;
                    description
                      "Manual override as preferred active path, if up and stable";
                  }
                  enum "unconditional" {
                    value 1;
                    description
                      "Unconditional override as preferred active path, regardless of up/down status";
                  }
                }
              }
    
              container upstream-label {
                description
                  "Upstream Label for the bidirectional label-switched path";
                uses apply-advanced;
    
                leaf vlan-id {
                  junos:must "(".. .. .. lsp-attributes switching-type ethernet-vlan")";
                  junos:must-message "VLAN label is valid only for VLAN LSP";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4094";
                    }
                  }
                  description
                    "VLAN ID label for the label-switched path";
                }
              }  // container upstream-label
    
              container optimize-on-change {
                junos:must "(!("protocols mpls label-switched-path $$ optimize-on-change"))";
                junos:must-message "LSP already has optimize-on-change";
                description
                  "Specify additional re-optimization triggers for this path";
                uses apply-advanced;
    
                leaf link-congestion {
                  type empty;
                  description
                    "Optimize when a link becomes congested";
                }
              }  // container optimize-on-change
            }  // list primary
    
            list secondary {
              key "name";
              ordered-by user;
              description "Backup path";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description "Name of path";
              }
    
              uses apply-advanced;
    
              container bandwidth {
                description
                  "Bandwidth to reserve (bps)";
                uses bandwidth-type;
              }  // container bandwidth
    
              container admin-group {
                description
                  "Administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group
    
              container admin-group-extended {
                description
                  "Extended administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group-extended
    
              container priority {
                presence "enable priority";
                description
                  "Preemption priorities";
              }  // container priority
    
              leaf setup-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description "Set-up priority";
              }
    
              leaf reservation-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Reservation priority";
              }
    
              container oam {
                description "Periodic OAM";
                uses periodic_oam;
              }  // container oam
    
              leaf class-of-service {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Class-of-service value";
              }
    
              leaf no-decrement-ttl {
                type empty;
                description
                  "Do not decrement the TTL within an LSP";
              }
    
              leaf hop-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "2 .. 255";
                  }
                }
                description
                  "Maximum allowed router hops";
              }
    
              leaf no-cspf {
                type empty;
                description
                  "Disable automatic path computation";
              }
    
              leaf admin-down {
                type empty;
                description
                  "Set GMPLS LSP to administrative down state";
              }
    
              leaf optimize-timer {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Periodical path reoptimizations";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              choice record-choice {
                leaf record {
                  type empty;
                  description
                    "Record transit routers";
                }
                leaf no-record {
                  type empty;
                  description
                    "Don't record transit routers";
                }
              }  // choice record-choice
    
              leaf standby {
                type empty;
                description
                  "Keep backup paths in continuous standby";
              }
    
              leaf exclude-srlg {
                type empty;
                description
                  "Exclude SRLG links for secondary path";
              }
    
              leaf ultimate-hop-popping {
                type empty;
                description
                  "Request ultimate hop popping from egress";
              }
    
              leaf sync-active-path-bandwidth {
                type empty;
                description
                  "Signal standby path with bandwidth obtained from active path";
              }
    
              leaf cross-credibility-cspf {
                type empty;
                description
                  "Compute paths across multi-protocol links and nodes";
              }
    
              leaf adaptive {
                type empty;
                description
                  "Have the LSP smoothly cut over to new routes";
              }
    
              leaf select {
                type enumeration {
                  enum "manual" {
                    value 0;
                    description
                      "Manual override as preferred active path, if up and stable";
                  }
                  enum "unconditional" {
                    value 1;
                    description
                      "Unconditional override as preferred active path, regardless of up/down status";
                  }
                }
              }
    
              container upstream-label {
                description
                  "Upstream Label for the bidirectional label-switched path";
                uses apply-advanced;
    
                leaf vlan-id {
                  junos:must "(".. .. .. lsp-attributes switching-type ethernet-vlan")";
                  junos:must-message "VLAN label is valid only for VLAN LSP";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4094";
                    }
                  }
                  description
                    "VLAN ID label for the label-switched path";
                }
              }  // container upstream-label
    
              container optimize-on-change {
                junos:must "(!("protocols mpls label-switched-path $$ optimize-on-change"))";
                junos:must-message "LSP already has optimize-on-change";
                description
                  "Specify additional re-optimization triggers for this path";
                uses apply-advanced;
    
                leaf link-congestion {
                  type empty;
                  description
                    "Optimize when a link becomes congested";
                }
              }  // container optimize-on-change
    
              container non-active-hold-priority {
                description
                  "Non-active hold priority";
                leaf non-active-hold-prio-value {
                  junos:must "(!((".. .. no-cspf" || (".. .. .. no-cspf" || ".. .. .. .. no-cspf"))))";
                  junos:must-message "Non-active hold priority unsupported for no-cspf LSPs";
                  junos:must "((".. .. standby" || (".. .. .. standby" || ".. .. .. .. standby")))";
                  junos:must-message "Non-active hold priority supported only for standby path";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 7";
                    }
                  }
                  description
                    "Non-active hold priority value";
                }
              }  // container non-active-hold-priority
            }  // list secondary
    
            container policing {
              description
                "Traffic policing for this LSP";
              leaf filter {
                junos:must "(!("firewall family any filter $$ interface-specific"))";
                junos:must-message "LSP policing filter must not be interface-specific";
                junos:must "(("firewall family any filter $$" || (!("firewall") && ".. .. .. .. .. .. .. .. firewall family any filter $$")))";
                junos:must-message "referenced filter must be defined under firewall family any";
                type string {
                  junos:posix-pattern "!^((__.*)|(.{65,}))$";
                  junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                }
                description
                  "Name of filter to use for policing LSP traffic";
              }
    
              leaf no-auto-policing {
                type empty;
                description
                  "Turn off automatic policing for this LSP";
              }
            }  // container policing
    
            leaf lsp-external-controller {
              junos:must "(!(".. single-sided-associated-bidirectional"))";
              junos:must-message "Single-sided associated bidir LSP cannot be externally controlled";
              junos:must "(!(".. corouted-bidirectional"))";
              junos:must-message "Externally controlled LSP cannot be corouted bidirectional";
              junos:must "(!(".. corouted-bidirectional-passive"))";
              junos:must-message "Externally controlled LSP cannot be corouted bidirectional";
              junos:must "("protocols mpls lsp-external-controller $$")";
              junos:must-message "Referenced lsp-external-controller is not defined";
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of less than 64 characters";
              }
              description
                "Name of the external path computing entity";
            }
    
            leaf associate-backup-pe-groups {
              junos:must "(".. oam bfd-liveness-detection")";
              junos:must-message "bfd-liveness-detection must be configured for this feature.";
              type empty;
              description
                "Associate this LSP with backup-pe groups";
            }
    
            leaf egress-protection {
              junos:must "(!(".. install"))";
              junos:must-message "Cannot install routes for an egress protection LSP";
              type empty;
              description
                "Use this LSP for egress protection data transport";
            }
    
            leaf transport-class {
              junos:must "("routing-options transport-class name $$")";
              junos:must-message "Referenced transport class is not defined";
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of less than 64 characters";
              }
              description
                "Transport class this LSP belongs to";
            }
          }  // list label-switched-path
    
          container deselect-on-bandwidth-failure {
            presence
              "enable deselect-on-bandwidth-failure";
            description
              "Deselect active path if it cannot meet the bandwidth constraint";
            uses apply-advanced;
    
            leaf tear-lsp {
              type empty;
              description
                "Bring down active path when all paths fail to reserve required bandwidth";
            }
          }  // container deselect-on-bandwidth-failure
    
          container track-igp-metric {
            description
              "Track IGP metric for LSP install prefixes";
            uses apply-advanced;
    
            leaf install-v4-prefixes {
              type empty;
              description
                "Track IGP metric for IPV4 prefixes";
            }
    
            leaf install-v6-prefixes {
              type empty;
              description
                "Track IGP metric for IPV6 prefixes";
            }
          }  // container track-igp-metric
    
          list container-label-switched-path {
            key "name";
            ordered-by user;
            leaf name {
              junos:must "(!(".. .. label-switched-path $$"))";
              junos:must-message "The Container LSP name is the same as an existing LSP name";
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "Name of container-lsp";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable MPLS container-label-switched path";
              }
            }  // choice enable-disable
    
            leaf description {
              type string {
                length "1 .. 80";
              }
              description
                "Text description of label-switched path";
            }
    
            container label-switched-path-template {
              description
                "Template for dynamic point-to-point LSP parameters";
              uses apply-advanced;
    
              choice dynamic-template {
                leaf template-name {
                  junos:must "(!("protocols mpls label-switched-path $$ egress-protection"))";
                  junos:must-message "Referenced point-to-point LSP template cannot have egress-protection";
                  junos:must "(!("protocols mpls label-switched-path $$ p2mp"))";
                  junos:must-message "Referenced point-to-point LSP template cannot be p2mp sub LSP";
                  junos:must "(!("protocols mpls label-switched-path $$ bandwidth"))";
                  junos:must-message "Referenced point-to-point LSP template cannot have static bandwidth";
                  junos:must "(!("protocols mpls label-swithced-path $$ policing"))";
                  junos:must-message "Referenced point-to-point LSP template cannot have policing";
                  junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ no-cspf"))))";
                  junos:must-message "Referenced point-to-point LSP template cannot have no-cspf";
                  junos:must "(("protocols mpls label-switched-path $$" && "protocols mpls label-switched-path $$ template"))";
                  junos:must-message "Referenced point-to-point LSP template does not exist";
                  type string {
                    junos:posix-pattern "![*<>]";
                    junos:pattern-message "Template name should not contain '*' and angle brackets";
                    length "1 .. 64";
                  }
                  description
                    "Name of point-to-point LSP template";
                }
                leaf default-template {
                  type empty;
                  description
                    "Use default parameters";
                }
              }  // choice dynamic-template
            }  // container label-switched-path-template
    
            leaf to {
              type jt:ipv4addr;
              description
                "Address of egress router";
            }
    
            leaf suffix {
              type string {
                length "1 .. 64";
              }
              description
                "Suffix to generate names of members of container LSP";
            }
    
            container splitting-merging {
              description
                "Do splitting and merging";
              uses apply-advanced;
    
              leaf maximum-member-lsps {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "1 .. 64";
                  }
                }
                description
                  "Maximum number of LSPs";
              }
    
              leaf minimum-member-lsps {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "1 .. 64";
                  }
                }
                description
                  "Minimum number of LSPs";
              }
    
              leaf splitting-bandwidth {
                type string;
                units "bps";
                description
                  "Maximum bandwidth threshold for splitting";
              }
    
              leaf merging-bandwidth {
                type string;
                units "bps";
                description
                  "Minimum bandwidth threshold for merging";
              }
    
              leaf maximum-signaling-bandwidth {
                type string;
                units "bps";
                description
                  "Maximum bandwidth for signaling during normalization";
              }
    
              leaf minimum-signaling-bandwidth {
                type string;
                units "bps";
                description
                  "Minimum bandwidth for signaling during normalization";
              }
    
              leaf splitting-merging-threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 100";
                  }
                }
                units "percent";
                default "10";
                description
                  "Change in aggregate LSP utilization to trigger splitting or merging";
              }
    
              container normalization {
                description "Do normalization";
                uses apply-advanced;
    
                leaf normalize-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "300 .. 315360000";
                    }
                  }
                  units "seconds";
                  default "86400";
                  description
                    "Time to normalize container LSP";
                }
    
                leaf failover-normalization {
                  type empty;
                  description
                    "Do pre-mature normalization in case some LSPs go down before next normalization";
                }
    
                leaf no-incremental-normalize {
                  type empty;
                  description
                    "Do not normalize unless all LSPs are successfully signaled";
                }
    
                leaf normalization-retry-duration {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 86400";
                    }
                  }
                  units "seconds";
                  description
                    "Time before retrying the container LSP normalization";
                }
    
                leaf normalization-retry-limits {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1000";
                    }
                  }
                  description
                    "Maximum number of times to retry container LSP normalization";
                }
              }  // container normalization
    
              container sampling {
                description
                  "Sampling information";
                uses apply-advanced;
    
                leaf cut-off-threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 100";
                    }
                  }
                  default "0";
                  description
                    "Cut-off percentile to remove outliers from aggregate samples";
                }
    
                choice sampling-mode {
                  leaf use-average-aggregate {
                    type empty;
                    description
                      "Use average of the samples";
                  }
                  leaf use-percentile {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 100";
                      }
                    }
                    default "100";
                    description
                      "Use a percentile of the samples";
                  }
                }  // choice sampling-mode
              }  // container sampling
            }  // container splitting-merging
    
            leaf lsp-external-controller {
              junos:must "("protocols mpls lsp-external-controller $$")";
              junos:must-message "Referenced lsp-external-controller is not defined";
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of less than 64 characters";
              }
              description
                "Name of the external path computing entity";
            }
          }  // list container-label-switched-path
    
          list transit-lsp-association {
            key "name";
            ordered-by user;
            description
              "Transit label switch path assoication";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "Name of transit assocation LSP group";
            }
    
            uses apply-advanced;
    
            leaf lsp-name-1 {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "Name of assocation LSP 1";
            }
    
            leaf from-1 {
              type jt:ipv4addr;
              description
                "Address of associated LSP 1";
            }
    
            leaf lsp-name-2 {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "Name of assocation LSP 2";
            }
    
            leaf from-2 {
              type jt:ipv4addr;
              description
                "Address of associated LSP 2";
            }
          }  // list transit-lsp-association
    
          list path {
            key "name";
            ordered-by user;
            description
              "Route of a label-switched path";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of less than 64 characters";
              }
              description
                "Name of label-switched path";
            }
    
            uses apply-advanced;
    
            list path-list {
              key "name";
              ordered-by user;
              description
                "List of routers in the label-switched path";
              leaf name {
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of less than 64 characters";
                }
                description
                  "Address of next system in path";
              }
    
              leaf abstract {
                junos:must "(".. .. .. abstract-hop ${path-list}")";
                junos:must-message "Referenced abstart hop must be configured";
                type empty;
                description
                  "Next system in path is abstract";
              }
    
              choice loose_strict_none {
                leaf loose {
                  type empty;
                  description
                    "Next hop might not be adjacent";
                }
                leaf loose-link {
                  type empty;
                  description
                    "Next hop link might not be adjacent";
                }
                leaf strict {
                  type empty;
                  description
                    "Next hop must be adjacent";
                }
              }  // choice loose_strict_none
            }  // list path-list
          }  // list path
    
          list constituent-list {
            key "name";
            ordered-by user;
            description
              "MPLS constituent list for abstract hops";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description
                "Constituent list name";
            }
    
            uses apply-advanced;
    
            leaf-list srlg {
              type string;
              max-elements 16;
              ordered-by user;
              description "SRLG Name";
            }
    
            leaf-list admin-group {
              type string;
              max-elements 16;
              ordered-by user;
              description
                "Administrative groups";
            }
    
            leaf-list admin-group-extended {
              type string;
              max-elements 16;
              ordered-by user;
              description
                "Extended administrative groups";
            }
          }  // list constituent-list
    
          list abstract-hop {
            key "name";
            ordered-by user;
            description "MPLS abstract hop";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,64}$";
                junos:pattern-message "Must be a string of 64 characters or less";
              }
              description "Abstract hop name";
            }
    
            uses apply-advanced;
    
            leaf operator {
              type enumeration {
                enum "AND" {
                  value 0;
                  description "AND";
                }
                enum "OR" {
                  value 1;
                  description "OR";
                }
              }
              description
                "Operation among constituent lists";
            }
    
            list constituent-list {
              key "name";
              ordered-by user;
              description
                "Building abstract hop using constituent lists";
              leaf name {
                junos:must "("protocols mpls constituent-list $$")";
                junos:must-message "Referenced constituent list does not exist";
                type string {
                  length "1 .. 64";
                }
                description
                  "Constituent list name";
              }
    
              uses apply-advanced;
    
              choice list-type {
                leaf include-any-list {
                  type empty;
                  description "Include any";
                }
                leaf include-all-list {
                  type empty;
                  description "Include all";
                }
                leaf exclude-any-list {
                  type empty;
                  description "Exclude any";
                }
                leaf exclude-all-list {
                  type empty;
                  description "Exclude all";
                }
              }  // choice list-type
            }  // list constituent-list
          }  // list abstract-hop
    
          container egress-protection {
            description
              "Egress router protection";
            uses apply-advanced;
    
            list context-identifier {
              key "name";
              description "Context identifier";
              leaf name {
                type jt:ipv4addr;
                description "IP address";
              }
    
              uses apply-advanced;
    
              choice context-type {
                leaf primary {
                  type empty;
                  description "Primary";
                }
                leaf protector {
                  type empty;
                  description "Protector";
                }
              }  // choice context-type
    
              leaf metric {
                junos:must "(!(" .. advertise-mode stub-alias"))";
                junos:must-message "Metric configuration is not supported with stub-alias mode";
                junos:must "(".. protector")";
                junos:must-message "Configurable only for protector context identifiers";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 16777215";
                  }
                }
                description "IGP metric";
              }
    
              leaf advertise-mode {
                type enumeration {
                  enum "stub-proxy" {
                    value 0;
                    description "Proxy";
                  }
                  enum "stub-alias" {
                    value 1;
                    description "Alias";
                  }
                }
                description "Advertise mode";
              }
    
              leaf-list admin-group {
                junos:must "((".. protector" && ".. advertise-mode stub-proxy"))";
                junos:must-message "Configurable only for protector with proxy mode";
                type string;
                ordered-by user;
                description
                  "Administrative groups";
              }
            }  // list context-identifier
    
            container traceoptions {
              description
                "Trace options for egress-protection";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "state" {
                      value 0;
                      description
                        "Trace state transitions";
                    }
                    enum "route" {
                      value 1;
                      description
                        "Trace route transitions";
                    }
                    enum "error" {
                      value 2;
                      description
                        "Trace error conditions";
                    }
                    enum "all" {
                      value 3;
                      description
                        "Trace everything";
                    }
                  }
                }
              }  // list flag
            }  // container traceoptions
          }  // container egress-protection
    
          container label-range {
            description "MPLS labels ranges";
            uses apply-advanced;
    
            list lsi-label-range {
              key "name";
              ordered-by user;
              description "LSI-label-range";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_start";
              }
    
              leaf range-end {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_end";
              }
            }  // list lsi-label-range
    
            list dynamic-label-range {
              key "name";
              ordered-by user;
              description "Dynamic-label-range";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_start";
              }
    
              leaf range-end {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_end";
              }
            }  // list dynamic-label-range
    
            list block-label-range {
              key "name";
              ordered-by user;
              description "Block-label-range";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_start";
              }
    
              leaf range-end {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_end";
              }
            }  // list block-label-range
    
            list srgb-label-range {
              key "name";
              max-elements 1;
              ordered-by user;
              description "SRGB-label-range";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_start";
              }
    
              leaf range-end {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_end";
              }
            }  // list srgb-label-range
    
            leaf label-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Limit for the number of concurrent active labels";
            }
    
            list static-label-range {
              key "name";
              ordered-by user;
              description "Static-label-range";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_start";
              }
    
              leaf range-end {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "16 .. 1048575";
                  }
                }
                description "Label_range_end";
              }
            }  // list static-label-range
          }  // container label-range
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable MPLS";
            }
          }  // choice enable-disable
    
          container label-history {
            presence "enable label-history";
            description
              "MPLS label history recording";
            uses apply-advanced;
    
            leaf max-entries {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Limit for the number of history entry per label";
            }
          }  // container label-history
    
          container traceoptions {
            description "Trace options for MPLS";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "connection" {
                    value 0;
                    description
                      "Trace CCC activity";
                  }
                  enum "connection-detail" {
                    value 1;
                    description
                      "Trace CCC activity in detail";
                  }
                  enum "cspf" {
                    value 2;
                    description
                      "Trace CSPF computation";
                  }
                  enum "cspf-node" {
                    value 3;
                    description
                      "Trace nodes visited during CSPF";
                  }
                  enum "cspf-link" {
                    value 4;
                    description
                      "Trace links visited during CSPF";
                  }
                  enum "cspf-abstract" {
                    value 5;
                    description
                      "Trace abstract hop based CSPF details";
                  }
                  enum "state" {
                    value 6;
                    description
                      "Trace state transitions";
                  }
                  enum "error" {
                    value 7;
                    description
                      "Trace error conditions";
                  }
                  enum "lsping" {
                    value 8;
                    description
                      "Trace LSP ping packets received";
                  }
                  enum "graceful-restart" {
                    value 9;
                    description
                      "Trace graceful-restart-related events";
                  }
                  enum "nsr-synchronization" {
                    value 10;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum
                    "nsr-synchronization-detail" {
                    value 11;
                    description
                      "Trace NSR synchronization events in detail";
                  }
                  enum "static" {
                    value 12;
                    description
                      "Trace static label-switched path";
                  }
                  enum "egress-protection" {
                    value 13;
                    description
                      "Trace egress protection events";
                  }
                  enum "all" {
                    value 14;
                    description
                      "Trace everything";
                  }
                  enum "autobw-state" {
                    value 15;
                    description
                      "Trace autobandwidth events in mpls trace";
                  }
                  enum
                    "externally-controlled-lsp" {
                    value 16;
                    description
                      "Trace externally controlled LSP events in mpls trace";
                  }
                  enum "ted-import" {
                    value 17;
                    description
                      "Trace leaking TED entries into lsdist.0 table";
                  }
                  enum "ted-export" {
                    value 18;
                    description
                      "Trace leaking of entries from lsdist.0 table into TED";
                  }
                  enum "lsp-history" {
                    value 19;
                    description
                      "Trace LSP history events";
                  }
                  enum "abstract-hop" {
                    value 20;
                    description
                      "Trace abstract hop related events";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
    
          leaf ipv6-tunneling {
            type empty;
            description
              "Allow MPLS LSPs to be used for tunneling IPv6 traffic";
          }
    
          list interface {
            key "name";
            ordered-by user;
            description "MPLS interface options";
            uses juniper-protocols-mpls-interface;
          }  // list interface
    
          list static-label-switched-path {
            key "name";
            ordered-by user;
            description
              "Static label-switched path";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description "Name of path";
            }
    
            uses apply-advanced;
    
            choice lsp-type {
              container bypass {
                description
                  "Bypass ingress label-switched path";
                uses apply-advanced;
    
                leaf bandwidth {
                  type string;
                  units "bps";
                  description
                    "Bandwidth to reserve";
                }
    
                leaf description {
                  type string {
                    length "1 .. 80";
                  }
                  description
                    "Text description of label-switched path";
                }
    
                leaf next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "IPv4 or IPv6 address or interface of next-hop router";
                }
    
                leaf next-table {
                  type string;
                  description
                    "Next-table for lookup";
                }
    
                leaf push {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 1048575";
                    }
                  }
                  description "Label to push";
                }
    
                leaf to {
                  type jt:ipaddr;
                  description
                    "Address of egress router";
                }
              }  // container bypass
              list transit {
                key "name";
                ordered-by user;
                description
                  "Transit label-switched path";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "16 .. 1048575";
                    }
                  }
                  description
                    "Incoming label value";
                }
    
                uses apply-advanced;
    
                leaf bandwidth {
                  type string;
                  units "bps";
                  description
                    "Bandwidth to reserve";
                }
    
                leaf description {
                  type string {
                    length "1 .. 80";
                  }
                  description
                    "Text description of label-switched path";
                }
    
                container link-protection {
                  description
                    "Bypass link protection";
                  leaf bypass-name {
                    type string {
                      length "1 .. 64";
                    }
                    description
                      "Bypass label-switched path name";
                  }
                }  // container link-protection
    
                leaf next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "IPv4 or IPv6 address or interface of next-hop router";
                }
    
                leaf member-interface {
                  type union {
                    type jt:interface-unit;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "AE member interface name";
                }
    
                container node-protection {
                  description
                    "Bypass node protection";
                  leaf bypass-name {
                    type string {
                      length "1 .. 64";
                    }
                    description
                      "Bypass label-switched path name";
                  }
    
                  leaf next-next-label {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1048575";
                      }
                    }
                    description
                      "Label expected by next-next-hop";
                  }
                }  // container node-protection
    
                choice label-action {
                  leaf swap {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1048575";
                      }
                    }
                    description
                      "Swap top label with this label";
                  }
                  leaf pop {
                    type empty;
                    description
                      "Pop the top label";
                  }
                  leaf stitch {
                    junos:must "(!((".. link-protection" || ".. node-protection")))";
                    junos:must-message "Link-protection and node-protection are invalid for LSP stitching";
                    type empty;
                    description
                      "Swap top label with the resolved LSP";
                  }
                }  // choice label-action
              }  // list transit
              container ingress {
                description
                  "Ingress LSR configuration for a static LSP";
                uses apply-advanced;
    
                leaf bandwidth {
                  type string;
                  units "bps";
                  description
                    "Bandwidth to reserve";
                }
    
                leaf class-of-service {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "0 .. 7";
                    }
                  }
                  description
                    "Class-of-service value";
                }
    
                leaf description {
                  type string {
                    length "1 .. 80";
                  }
                  description
                    "Text description of label-switched path";
                }
    
                list install {
                  key "name";
                  ordered-by user;
                  description "Install prefix";
                  leaf name {
                    type jt:ipv4prefix;
                    description
                      "Destination prefix";
                  }
    
                  leaf active {
                    type empty;
                    description
                      "Install prefix into forwarding table";
                  }
                }  // list install
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  description "Metric value";
                }
    
                leaf next-hop {
                  type union {
                    type jt:ipv4addr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "IPv4 address or interface of next-hop router";
                }
    
                container link-protection {
                  description
                    "Bypass link protection";
                  leaf bypass-name {
                    type string {
                      length "1 .. 64";
                    }
                    description
                      "Bypass label-switched path name";
                  }
                }  // container link-protection
    
                container node-protection {
                  description
                    "Bypass node protection";
                  leaf bypass-name {
                    type string {
                      length "1 .. 64";
                    }
                    description
                      "Bypass label-switched path name";
                  }
    
                  leaf next-next-label {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1048575";
                      }
                    }
                    description
                      "Label expected by next-next-hop";
                  }
                }  // container node-protection
    
                leaf no-install-to-address {
                  type empty;
                  description
                    "Don't install host route 'to' address into routing tables";
                }
    
                container policing {
                  description
                    "Traffic policing for this LSP";
                  leaf filter {
                    junos:must "(!("firewall family any filter $$ interface-specific"))";
                    junos:must-message "LSP policing filter must not be interface-specific";
                    junos:must "(("firewall family any filter $$" || (!("firewall") && ".. .. .. .. .. .. .. .. firewall family any filter $$")))";
                    junos:must-message "referenced filter must be defined under firewall family any";
                    type string {
                      junos:posix-pattern "!^((__.*)|(.{65,}))$";
                      junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                    }
                    description
                      "Name of filter to use for policing LSP traffic";
                  }
    
                  leaf no-auto-policing {
                    type empty;
                    description
                      "Turn off automatic policing for this LSP";
                  }
                }  // container policing
    
                leaf preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Preference value";
                }
    
                leaf to {
                  type jt:ipv4addr;
                  description
                    "Address of egress router";
                }
    
                leaf push {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 1048575";
                    }
                  }
                  description "Label to push";
                }
    
                leaf entropy-label {
                  type empty;
                  description
                    "Enable entropy label";
                }
              }  // container ingress
              container segment {
                description
                  "Segment for segment routing";
                uses apply-advanced;
    
                leaf sid-label {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "16 .. 1048575";
                    }
                  }
                  description
                    "Segment identifier (SID) label";
                }
    
                leaf description {
                  type string {
                    length "1 .. 80";
                  }
                  description
                    "Text description of label-switched path";
                }
    
                leaf next-hop {
                  type union {
                    type jt:ipv4addr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "IPv4 address or interface of next-hop router";
                }
    
                choice label-action {
                  leaf swap {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 1048575";
                      }
                    }
                    description
                      "Swap the SID label to this label";
                  }
                  leaf pop {
                    type empty;
                    description
                      "Pop the SID label";
                  }
                }  // choice label-action
              }  // container segment
            }  // choice lsp-type
          }  // list static-label-switched-path
        }  // grouping juniper-protocols-mpls
    
        grouping admin_group_include_exclude {
          uses apply-advanced;
    
          choice include-any-choice {
            leaf-list include-any {
              type string;
              ordered-by user;
              description
                "Groups, one or more of which must be present";
            }
          }  // choice include-any-choice
    
          choice include-all-choice {
            leaf-list include-all {
              type string;
              ordered-by user;
              description
                "Groups, all of which must be present";
            }
          }  // choice include-all-choice
    
          choice exclude-choice {
            leaf-list exclude {
              type string;
              ordered-by user;
              description
                "Groups, all of which must be absent";
            }
          }  // choice exclude-choice
        }  // grouping admin_group_include_exclude
    
        grouping bandwidth-type {
          uses apply-advanced;
    
          leaf per-traffic-class-bandwidth {
            type string;
            units "bps";
            description "Bandwidth to reserve";
          }
    
          leaf ct0 {
            type string;
            units "bps";
            description
              "Bandwidth from traffic class 0";
          }
    
          leaf ct1 {
            type string;
            units "bps";
            description
              "Bandwidth from traffic class 1";
          }
    
          leaf ct2 {
            type string;
            units "bps";
            description
              "Bandwidth from traffic class 2";
          }
    
          leaf ct3 {
            type string;
            units "bps";
            description
              "Bandwidth from traffic class 3";
          }
        }  // grouping bandwidth-type
    
        grouping juniper-protocols-mpls-interface {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Interface name";
          }
    
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable MPLS on this interface";
            }
          }  // choice enable-disable
    
          leaf-list srlg {
            type string;
            max-elements 64;
            ordered-by user;
            description "SRLG Name";
          }
    
          leaf always-mark-connection-protection-tlv {
            type empty;
            description
              "Mark connection protection tlv on this interface";
          }
    
          leaf switch-away-lsps {
            type empty;
            description
              "Switch away protected LSPs to their bypass LSPs";
          }
    
          leaf-list admin-group {
            type string;
            ordered-by user;
            description "Administrative groups";
          }
    
          leaf-list admin-group-extended {
            type string;
            ordered-by user;
            description
              "Extended administrative groups";
          }
    
          container static {
            description
              "Static label-switch path related configurations";
            uses apply-advanced;
    
            leaf protection-revert-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "FRR revert wait time, 0 means disable";
            }
          }  // container static
        }  // grouping juniper-protocols-mpls-interface
    
        grouping juniper-protocols-msdp {
          uses apply-advanced;
    
          leaf data-encapsulation {
            type enumeration {
              enum "disable" {
                value 0;
                description
                  "Disable data encapsulation";
              }
              enum "enable" {
                value 1;
                description
                  "Enable data encapsulation";
              }
            }
            description
              "Set encapsulation of data packets";
          }
    
          container rib-group {
            description "Routing table group";
            uses rib_group_inet_type;
          }  // container rib-group
    
          container active-source-limit {
            description
              "Limit the number of active sources accepted";
            uses apply-advanced;
    
            leaf maximum {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000000";
                }
              }
              default "25000";
              description
                "Maximum number of active sources accepted";
            }
    
            leaf threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000000";
                }
              }
              default "24000";
              description
                "RED threshold for active source acceptance";
            }
    
            leaf log-warning {
              junos:must "(".. maximum")";
              junos:must-message "Maximum must be configured to configure log-warning";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              default "100";
              description
                "Percentage of maximum at which to start generating warnings";
            }
    
            leaf log-interval {
              junos:must "(".. maximum")";
              junos:must-message "Maximum must be configured to configure log-interval";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "6 .. 32767";
                }
              }
              description
                "Time between log messages";
            }
          }  // container active-source-limit
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable MSDP";
            }
          }  // choice enable-disable
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf local-address {
            type jt:ipv4addr;
            description "Local address";
          }
    
          container traceoptions {
            description "Trace options for MSDP";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all MSDP packets";
                  }
                  enum "route" {
                    value 1;
                    description
                      "Trace routing information";
                  }
                  enum "nsr-synchronization" {
                    value 2;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "source-active" {
                    value 3;
                    description
                      "Trace source-active messages";
                  }
                  enum "source-active-request" {
                    value 4;
                    description
                      "Trace source-active request messages";
                  }
                  enum "source-active-response" {
                    value 5;
                    description
                      "Trace source-active response messages";
                  }
                  enum "keepalive" {
                    value 6;
                    description
                      "Trace keepalive messages";
                  }
                  enum "normal" {
                    value 7;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 8;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 9;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 10;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 11;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 12;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 13;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          list peer {
            key "name";
            ordered-by user;
            description "Configure an MSDP peer";
            leaf name {
              type jt:ipv4addr;
              description "Peer address";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description "Disable MSDP";
              }
            }  // choice enable-disable
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
    
            leaf local-address {
              type jt:ipv4addr;
              description "Local address";
            }
    
            container traceoptions {
              description
                "Trace options for MSDP";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "packets" {
                      value 0;
                      description
                        "Trace all MSDP packets";
                    }
                    enum "route" {
                      value 1;
                      description
                        "Trace routing information";
                    }
                    enum "nsr-synchronization" {
                      value 2;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "source-active" {
                      value 3;
                      description
                        "Trace source-active messages";
                    }
                    enum "source-active-request" {
                      value 4;
                      description
                        "Trace source-active request messages";
                    }
                    enum
                      "source-active-response" {
                      value 5;
                      description
                        "Trace source-active response messages";
                    }
                    enum "keepalive" {
                      value 6;
                      description
                        "Trace keepalive messages";
                    }
                    enum "normal" {
                      value 7;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 8;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 9;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 10;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 11;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 12;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 13;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            container active-source-limit {
              description
                "Limit the number of active sources accepted";
              uses apply-advanced;
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1000000";
                  }
                }
                default "25000";
                description
                  "Maximum number of active sources accepted";
              }
    
              leaf threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1000000";
                  }
                }
                default "24000";
                description
                  "RED threshold for active source acceptance";
              }
    
              leaf log-warning {
                junos:must "(".. maximum")";
                junos:must-message "Maximum must be configured to configure log-warning";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                default "100";
                description
                  "Percentage of maximum at which to start generating warnings";
              }
    
              leaf log-interval {
                junos:must "(".. maximum")";
                junos:must-message "Maximum must be configured to configure log-interval";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "6 .. 32767";
                  }
                }
                description
                  "Time between log messages";
              }
            }  // container active-source-limit
    
            leaf keep-alive {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "10 .. 60";
                }
              }
              units "seconds";
              description
                "Time limit for sending out periodic keep alive to peer";
            }
    
            leaf hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "15 .. 150";
                }
              }
              units "seconds";
              description
                "Max time to terminating a peer for having not received any message from ";
            }
    
            leaf sa-hold-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "75 .. 300";
                }
              }
              units "seconds";
              description
                "Max time for holding a sa message before timing out";
            }
    
            leaf default-peer {
              type empty;
              description "Default RPF peer";
            }
    
            leaf authentication-key {
              type string {
                length "1 .. 126";
              }
              description
                "MD5 authentication key";
            }
          }  // list peer
    
          leaf keep-alive {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 60";
              }
            }
            units "seconds";
            description
              "Time limit for sending out periodic keep alive to peer";
          }
    
          leaf hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 150";
              }
            }
            units "seconds";
            description
              "Max time to terminating a peer for having not received any message from ";
          }
    
          leaf sa-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "75 .. 300";
              }
            }
            units "seconds";
            description
              "Max time for holding a sa message before timing out";
          }
    
          list source {
            key "name";
            ordered-by user;
            description
              "Configure parameters for each source";
            leaf name {
              type jt:ipprefix;
              description
                "Source address or prefix";
            }
    
            uses apply-advanced;
    
            container active-source-limit {
              description
                "Limit the number of active sources accepted";
              uses apply-advanced;
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1000000";
                  }
                }
                default "25000";
                description
                  "Maximum number of active sources accepted";
              }
    
              leaf threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1000000";
                  }
                }
                default "24000";
                description
                  "RED threshold for active source acceptance";
              }
    
              leaf log-warning {
                junos:must "(".. maximum")";
                junos:must-message "Maximum must be configured to configure log-warning";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                default "100";
                description
                  "Percentage of maximum at which to start generating warnings";
              }
    
              leaf log-interval {
                junos:must "(".. maximum")";
                junos:must-message "Maximum must be configured to configure log-interval";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "6 .. 32767";
                  }
                }
                description
                  "Time between log messages";
              }
            }  // container active-source-limit
          }  // list source
    
          list group {
            key "name";
            ordered-by user;
            description
              "Configure MSDP peer groups";
            leaf name {
              type string;
              description "MSDP peer group name";
            }
    
            uses apply-advanced;
    
            leaf mode {
              type enumeration {
                enum "standard" {
                  value 0;
                  description
                    "Use standard MSDP source-active flooding rules";
                }
                enum "mesh-group" {
                  value 1;
                  description
                    "Group peers are mesh group members";
                }
              }
              default "standard";
              description
                "MSDP group source-active flooding mode";
            }
    
            choice enable-disable {
              leaf disable {
                type empty;
                description "Disable MSDP";
              }
            }  // choice enable-disable
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
    
            leaf local-address {
              type jt:ipv4addr;
              description "Local address";
            }
    
            container traceoptions {
              description
                "Trace options for MSDP";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "packets" {
                      value 0;
                      description
                        "Trace all MSDP packets";
                    }
                    enum "route" {
                      value 1;
                      description
                        "Trace routing information";
                    }
                    enum "nsr-synchronization" {
                      value 2;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "source-active" {
                      value 3;
                      description
                        "Trace source-active messages";
                    }
                    enum "source-active-request" {
                      value 4;
                      description
                        "Trace source-active request messages";
                    }
                    enum
                      "source-active-response" {
                      value 5;
                      description
                        "Trace source-active response messages";
                    }
                    enum "keepalive" {
                      value 6;
                      description
                        "Trace keepalive messages";
                    }
                    enum "normal" {
                      value 7;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 8;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 9;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 10;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 11;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 12;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 13;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            list peer {
              key "name";
              ordered-by user;
              description
                "Configure an MSDP peer";
              leaf name {
                type jt:ipv4addr;
                description "Peer address";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description "Disable MSDP";
                }
              }  // choice enable-disable
    
              leaf-list export {
                type jt:policy-algebra;
                ordered-by user;
                description "Export policy";
              }
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
    
              leaf local-address {
                type jt:ipv4addr;
                description "Local address";
              }
    
              container traceoptions {
                description
                  "Trace options for MSDP";
                uses apply-advanced;
    
                container file {
                  description
                    "Trace file options";
                  leaf filename {
                    type string {
                      junos:posix-pattern "![/ %]";
                      junos:pattern-message "Must not contain '/', % or a space";
                      length "1 .. 1024";
                    }
                    description
                      "Name of file in which to write trace information";
                  }
    
                  leaf replace {
                    type empty;
                    status deprecated;
                    description
                      "Replace trace file rather than appending to it";
                  }
    
                  leaf size {
                    type string;
                    description
                      "Maximum trace file size";
                  }
    
                  leaf files {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 1000";
                      }
                    }
                    default "10";
                    description
                      "Maximum number of trace files";
                  }
    
                  leaf no-stamp {
                    type empty;
                    status deprecated;
                    description
                      "Do not timestamp trace file";
                  }
    
                  choice world-readable-choice {
                    leaf world-readable {
                      type empty;
                      description
                        "Allow any user to read the log file";
                    }
                    leaf no-world-readable {
                      type empty;
                      description
                        "Don't allow any user to read the log file";
                    }
                  }  // choice world-readable-choice
                }  // container file
    
                list flag {
                  key "name";
                  ordered-by user;
                  description
                    "Tracing parameters";
                  leaf name {
                    type enumeration {
                      enum "packets" {
                        value 0;
                        description
                          "Trace all MSDP packets";
                      }
                      enum "route" {
                        value 1;
                        description
                          "Trace routing information";
                      }
                      enum "nsr-synchronization" {
                        value 2;
                        description
                          "Trace NSR synchronization events";
                      }
                      enum "source-active" {
                        value 3;
                        description
                          "Trace source-active messages";
                      }
                      enum
                        "source-active-request" {
                        value 4;
                        description
                          "Trace source-active request messages";
                      }
                      enum
                        "source-active-response" {
                        value 5;
                        description
                          "Trace source-active response messages";
                      }
                      enum "keepalive" {
                        value 6;
                        description
                          "Trace keepalive messages";
                      }
                      enum "normal" {
                        value 7;
                        description
                          "Trace normal events";
                      }
                      enum "general" {
                        value 8;
                        description
                          "Trace general events";
                      }
                      enum "state" {
                        value 9;
                        description
                          "Trace state transitions";
                      }
                      enum "policy" {
                        value 10;
                        description
                          "Trace policy processing";
                      }
                      enum "task" {
                        value 11;
                        description
                          "Trace routing protocol task processing";
                      }
                      enum "timer" {
                        value 12;
                        description
                          "Trace routing protocol timer processing";
                      }
                      enum "all" {
                        value 13;
                        description
                          "Trace everything";
                      }
                    }
                  }
    
                  leaf send {
                    type empty;
                    description
                      "Trace transmitted packets";
                  }
    
                  leaf receive {
                    type empty;
                    description
                      "Trace received packets";
                  }
    
                  leaf detail {
                    type empty;
                    description
                      "Trace detailed information";
                  }
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this trace flag";
                  }
                }  // list flag
              }  // container traceoptions
    
              container active-source-limit {
                description
                  "Limit the number of active sources accepted";
                uses apply-advanced;
    
                leaf maximum {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1000000";
                    }
                  }
                  default "25000";
                  description
                    "Maximum number of active sources accepted";
                }
    
                leaf threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1000000";
                    }
                  }
                  default "24000";
                  description
                    "RED threshold for active source acceptance";
                }
    
                leaf log-warning {
                  junos:must "(".. maximum")";
                  junos:must-message "Maximum must be configured to configure log-warning";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  default "100";
                  description
                    "Percentage of maximum at which to start generating warnings";
                }
    
                leaf log-interval {
                  junos:must "(".. maximum")";
                  junos:must-message "Maximum must be configured to configure log-interval";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "6 .. 32767";
                    }
                  }
                  description
                    "Time between log messages";
                }
              }  // container active-source-limit
    
              leaf keep-alive {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 60";
                  }
                }
                units "seconds";
                description
                  "Time limit for sending out periodic keep alive to peer";
              }
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "15 .. 150";
                  }
                }
                units "seconds";
                description
                  "Max time to terminating a peer for having not received any message from ";
              }
    
              leaf sa-hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "75 .. 300";
                  }
                }
                units "seconds";
                description
                  "Max time for holding a sa message before timing out";
              }
    
              leaf default-peer {
                type empty;
                description "Default RPF peer";
              }
    
              leaf authentication-key {
                type string {
                  length "1 .. 126";
                }
                description
                  "MD5 authentication key";
              }
            }  // list peer
          }  // list group
        }  // grouping juniper-protocols-msdp
    
        grouping juniper-protocols-mstp {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable MSTP";
            }
          }  // choice enable-disable
    
          leaf bpdu-destination-mac-address {
            type enumeration {
              enum "provider-bridge-group" {
                value 0;
                description
                  "802.1ad provider bridge group address";
              }
            }
            description
              "Destination MAC address in the spanning tree BPDUs";
          }
    
          leaf configuration-name {
            type string {
              length "1 .. 32";
            }
            description
              "Configuration name (part of MST configuration identifier)";
          }
    
          leaf revision-level {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Revision level (part of MST configuration identifier)";
          }
    
          leaf max-hops {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 255";
              }
            }
            description "Maximum number of hops";
          }
    
          leaf max-age {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "6 .. 40";
              }
            }
            units "seconds";
            description
              "Maximum age of received protocol bpdu";
          }
    
          leaf hello-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 10";
              }
            }
            units "seconds";
            description
              "Time interval between configuration BPDUs";
          }
    
          leaf forward-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "4 .. 30";
              }
            }
            units "seconds";
            description
              "Time spent in listening or learning state";
          }
    
          leaf system-identifier {
            type jt:mac-unicast;
            description
              "Sytem identifier to represent this node";
          }
    
          container traceoptions {
            description
              "Tracing options for debugging protocol operation";
            uses stp-trace-options;
          }  // container traceoptions
    
          leaf bridge-priority {
            type string {
              junos:posix-pattern "^(0|4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
              junos:pattern-message "Must be a multiple of 4096";
            }
            description
              "Priority of the bridge (in increments of 4k - 0,4k,8k,..60k)";
          }
    
          leaf backup-bridge-priority {
            type string {
              junos:posix-pattern "^(4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
              junos:pattern-message "Must be a multiple of 4096";
            }
            description
              "Priority of the bridge (in increments of 4k - 4k,8k,..60k)";
          }
    
          leaf bpdu-block-on-edge {
            type empty;
            description
              "Block BPDU on all interfaces configured as edge (BPDU Protect)";
          }
    
          leaf vpls-flush-on-topology-change {
            type empty;
            description
              "Enable VPLS MAC flush on root protected CE interface receving topology change";
          }
    
          leaf priority-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 255";
              }
            }
            units "seconds";
            description
              "Hold time before switching to primary priority when core domain becomes up";
          }
    
          list system-id {
            key "name";
            ordered-by user;
            description
              "System ID to IP mapping";
            uses system-id-ip-map;
          }  // list system-id
    
          list interface {
            key "name";
            description "Interface options";
            uses mstp-interface;
          }  // list interface
    
          list msti {
            key "name";
            description "Per-MSTI options";
            leaf name {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 64";
                }
              }
            }
    
            uses apply-advanced;
    
            leaf bridge-priority {
              type string {
                junos:posix-pattern "^(0|4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                junos:pattern-message "Must be a multiple of 4096";
              }
              description
                "Priority of the bridge (in increments of 4k - 0,4k,8k,..60k)";
            }
    
            leaf backup-bridge-priority {
              type string {
                junos:posix-pattern "^(4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                junos:pattern-message "Must be a multiple of 4096";
              }
              description
                "Priority of the bridge (in increments of 4k - 4k,8k,..60k)";
            }
    
            leaf-list vlan {
              type string;
              ordered-by user;
              description
                "VLAN ID or VLAN ID range [1..4094]";
            }
    
            list interface {
              key "name";
              description "Interface options";
              uses mstp-interface;
            }  // list interface
          }  // list msti
        }  // grouping juniper-protocols-mstp
    
        grouping juniper-protocols-mvpn {
          description "BGP-MVPN configuration";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for BGP-MVPN";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "error" {
                    value 0;
                    description "Trace errors";
                  }
                  enum "nlri" {
                    value 1;
                    description
                      "Trace MVPN advertisements";
                  }
                  enum "topology" {
                    value 2;
                    description
                      "Trace MVPN topology changes";
                  }
                  enum "tunnel" {
                    value 3;
                    description
                      "Trace provider tunnel events";
                  }
                  enum "umh" {
                    value 4;
                    description
                      "Trace Upstream Multicast Hop (UMH) events";
                  }
                  enum "intra-as-ad" {
                    value 5;
                    description
                      "Trace MVPN intra-AS auto discovery routes";
                  }
                  enum "inter-as-ad" {
                    value 6;
                    description
                      "Trace MVPN inter-AS auto discovery routes";
                  }
                  enum "spmsi-ad" {
                    value 7;
                    description
                      "Trace MVPN SPMSI auto discovery routes";
                  }
                  enum "leaf-ad" {
                    value 8;
                    description
                      "Trace MVPN leaf auto discovery routes";
                  }
                  enum "source-active" {
                    value 9;
                    description
                      "Trace MVPN source active routes";
                  }
                  enum "cmcast-join" {
                    value 10;
                    description
                      "Trace MVPN c-multicast join routes";
                  }
                  enum "mdt-safi-ad" {
                    value 11;
                    description
                      "Trace MVPN MDT SAFI auto discovery routes";
                  }
                  enum "mvpn-limit" {
                    value 12;
                    description
                      "Trace MVPN spmsi and cmcast limit events";
                  }
                  enum "nsr-synchronization" {
                    value 13;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "route" {
                    value 14;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 15;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 16;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 17;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 18;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 19;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 20;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 21;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container autodiscovery-only {
            junos:must "(!(".. route-target"))";
            junos:must-message "MVPN autodiscovery-only mode cannot be used with route-target";
            junos:must "(!(".. sender-site"))";
            junos:must-message "MVPN autodiscovery-only mode cannot be used with sender-site";
            junos:must "(!(".. receiver-site"))";
            junos:must-message "MVPN autodiscovery-only mode cannot be used with receiver-site";
            junos:must "(".. .. .. protocols pim mvpn")";
            junos:must-message "MVPN autodiscovery-only mode requires protocols pim mvpn configuration for the instance.";
            junos:must "(!(".. .. .. provider-tunnel family inet pim-asm"))";
            junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
            junos:must "((".. .. .. provider-tunnel pim-ssm" || ".. .. .. provider-tunnel family inet pim-ssm"))";
            junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
            status deprecated;
            description
              "Use MVPN exclusively for PE router autodiscovery";
            uses apply-advanced;
    
            container intra-as {
              description
                "Intra-AS autodiscovery options";
              uses apply-advanced;
    
              leaf inclusive {
                type empty;
                description
                  "Inclusive provider tunnel autodiscovery";
              }
            }  // container intra-as
          }  // container autodiscovery-only
    
          container family {
            description
              "BGP-MVPN address family";
            uses apply-advanced;
    
            container any {
              presence "enable any";
              description
                "BGP-MVPN properties for all families";
              uses apply-advanced;
    
              leaf disable {
                type empty;
                description
                  "Disable all families";
              }
            }  // container any
    
            container inet {
              description
                "IPv4 BGP-MVPN properties";
              uses apply-advanced;
    
              container autodiscovery-only {
                junos:must "(!(".. .. .. route-target"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with route-target";
                junos:must "(!(".. .. .. sender-site"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with sender-site";
                junos:must "(!(".. .. .. receiver-site"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with receiver-site";
                junos:must "(".. .. .. .. .. protocols pim mvpn")";
                junos:must-message "MVPN autodiscovery-only mode requires protocols pim mvpn configuration for the instance.";
                junos:must "(!(".. .. .. .. .. provider-tunnel family inet pim-asm"))";
                junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
                junos:must "((".. .. .. .. .. provider-tunnel pim-ssm" || ".. .. .. .. .. provider-tunnel family inet pim-ssm"))";
                junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
                description
                  "Use MVPN exclusively for PE router autodiscovery";
                uses apply-advanced;
    
                container intra-as {
                  description
                    "Intra-AS autodiscovery options";
                  uses apply-advanced;
    
                  leaf inclusive {
                    type empty;
                    description
                      "Inclusive provider tunnel autodiscovery";
                  }
                }  // container intra-as
              }  // container autodiscovery-only
    
              leaf disable {
                type empty;
                description
                  "Disable family IPv4";
              }
            }  // container inet
    
            container inet6 {
              presence "enable inet6";
              description
                "IPv6 BGP-MVPN properties";
              uses apply-advanced;
    
              container autodiscovery-only {
                junos:must "(!(".. .. .. route-target"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with route-target";
                junos:must "(!(".. .. .. sender-site"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with sender-site";
                junos:must "(!(".. .. .. receiver-site"))";
                junos:must-message "MVPN autodiscovery-only mode cannot be used with receiver-site";
                junos:must "(".. .. .. .. .. protocols pim mvpn")";
                junos:must-message "MVPN autodiscovery-only mode requires protocols pim mvpn configuration for the instance.";
                junos:must "(!(".. .. .. .. .. provider-tunnel family inet pim-asm"))";
                junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
                junos:must "((".. .. .. .. .. provider-tunnel pim-ssm" || ".. .. .. .. .. provider-tunnel family inet pim-ssm"))";
                junos:must-message "MVPN autodiscovery-only mode requires a PIM-SSM provider-tunnel root address.";
                description
                  "Use MVPN exclusively for PE router autodiscovery";
                uses apply-advanced;
    
                container intra-as {
                  description
                    "Intra-AS autodiscovery options";
                  uses apply-advanced;
    
                  leaf inclusive {
                    type empty;
                    description
                      "Inclusive provider tunnel autodiscovery";
                  }
                }  // container intra-as
              }  // container autodiscovery-only
    
              leaf disable {
                type empty;
                description
                  "Disable family IPv6";
              }
            }  // container inet6
          }  // container family
    
          choice sender-receiver-site-choice {
            leaf receiver-site {
              junos:must "(!(".. .. .. provider-tunnel"))";
              junos:must-message "MVPN instance with only receiver sites cannot be the root of a provider-tunnel";
              type empty;
              description
                "MVPN instance has sites only with multicast receivers";
            }
            leaf sender-site {
              junos:must "(".. .. .. provider-tunnel")";
              junos:must-message "MVPN instance with sources must be the root of a provider-tunnel";
              type empty;
              description
                "MVPN instance has sites only with multicast sources";
            }
          }  // choice sender-receiver-site-choice
    
          leaf unicast-umh-election {
            junos:must "(!(".. mvpn-join-load-balance"))";
            junos:must-message "UMH election based on unicast route cannot be configured with mvpn-join-load-balance";
            junos:must "(!(".. .. .. .. .. protocols bgp path-selection cisco-non-deterministic"))";
            junos:must-message "Upstream Multicast Hop election cannot be used with 'protocols bgp path-selection cisco-non-deterministic'";
            type empty;
            description
              "Upstream Multicast Hop election based on unicast route preference";
          }
    
          container static-umh {
            description
              "Upstream Multicast Hop election based on static configuration";
            uses apply-advanced;
    
            leaf primary {
              type jt:ipv4addr;
              description
                "Primary Upstream Multicast Hop";
            }
    
            leaf backup {
              type jt:ipv4addr;
              description
                "Secondary Upstream Multicast Hop";
            }
    
            choice source-tree_choice {
              leaf source-tree {
                type empty;
                description
                  "Mandatory attribute - static-umh applies only to MVPN source-tree c-multicast joins";
              }
            }  // choice source-tree_choice
          }  // container static-umh
    
          leaf cmcast-joins-limit-inet {
            junos:must "(".. mvpn-mode rpt-spt")";
            junos:must-message "Cmcast limit can only be configured for MVPN rpt-spt mode";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 15000";
              }
            }
            description
              "Maximum number of cmcast entries for v4";
          }
    
          leaf cmcast-joins-limit-inet6 {
            junos:must "(".. mvpn-mode rpt-spt")";
            junos:must-message "Cmcastv6 limit can only be configured for MVPN rpt-spt mode";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 15000";
              }
            }
            description
              "Maximum number of cmcast entries for v6";
          }
    
          container mvpn-mode {
            description "MVPN mode of operation";
            uses apply-advanced;
    
            choice mode {
              container rpt-spt {
                presence "enable rpt-spt";
                description
                  "MVPN works in multicast RPT and SPT mode";
                uses apply-advanced;
    
                leaf spt-switch-timer {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 60";
                    }
                  }
                  units "seconds";
                  description
                    "Timeout before a PE router switches between RPT and SPT";
                }
              }  // container rpt-spt
              container spt-only {
                presence "enable spt-only";
                description
                  "MVPN works in multicast SPT only mode (default mode)";
                uses apply-advanced;
    
                container source-active-advertisement {
                  description
                    "Attributes associated with advertising Source-Active A-D routes";
                  uses apply-advanced;
    
                  leaf dampen {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 30";
                      }
                    }
                    units "minutes";
                    description
                      "Time to wait before re-advertising source-active route";
                  }
    
                  leaf min-rate {
                    type string;
                    units "bits per second";
                    description
                      "Minimum traffic rate required to advertise Source-Active route";
                  }
                }  // container source-active-advertisement
    
                leaf convert-sa-to-msdp {
                  type empty;
                  description
                    "Turn on MVPN SA route to MSDP SA conversion";
                }
              }  // container spt-only
            }  // choice mode
          }  // container mvpn-mode
    
          container route-target {
            description
              "Configure route-targets for MVPN routes";
            uses apply-advanced;
    
            container import-target {
              description
                "Target communities used when importing routes";
              uses apply-advanced;
    
              container unicast {
                presence "enable unicast";
                description
                  "Use the same target community as configured for unicast";
                choice receiver-sender-target-choice {
                  leaf receiver {
                    junos:must "(!(".. .. .. .. receiver-site"))";
                    junos:must-message "MVPN instance with only receivers must not import routes from other receiver only sites";
                    type empty;
                    description
                      "Target community used when importing receiver site routes";
                  }
                  leaf sender {
                    junos:must "(!(".. .. .. .. sender-site"))";
                    junos:must-message "MVPN instance with only sources must not import routes from other sender only sites";
                    type empty;
                    description
                      "Target community used when importing sender site routes";
                  }
                }  // choice receiver-sender-target-choice
              }  // container unicast
    
              container target {
                presence "enable target";
                description "Target community";
                leaf target-value {
                  type string {
                    junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                    junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                  }
                }
    
                choice receiver-sender-target-choice {
                  leaf receiver {
                    junos:must "(!(".. .. .. .. receiver-site"))";
                    junos:must-message "MVPN instance with only receivers must not import routes from other receiver only sites";
                    type empty;
                    description
                      "Target community used when importing receiver site routes";
                  }
                  leaf sender {
                    junos:must "(!(".. .. .. .. sender-site"))";
                    junos:must-message "MVPN instance with only sources must not import routes from other sender only sites";
                    type empty;
                    description
                      "Target community used when importing sender site routes";
                  }
                }  // choice receiver-sender-target-choice
              }  // container target
            }  // container import-target
    
            container export-target {
              description
                "Target communities used when exporting routes";
              uses apply-advanced;
    
              leaf unicast {
                type empty;
                description
                  "Use the same target community as configured for unicast";
              }
    
              leaf target {
                type string {
                  junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
                  junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
                }
                description "Target community";
              }
            }  // container export-target
          }  // container route-target
    
          container mvpn-join-load-balance {
            junos:must "(!(".. unicast-umh-election"))";
            junos:must-message "MVPN join load balancing cannot be configured with unicast-umh-election";
            description
              "MVPN Join Load Balancing Algorithm";
            uses apply-advanced;
    
            choice algorithm {
              container bytewise-xor-hash {
                presence
                  "enable bytewise-xor-hash";
                description
                  "Upstream selection using bytewise XOR hash";
              }  // container bytewise-xor-hash
            }  // choice algorithm
          }  // container mvpn-join-load-balance
    
          leaf install-discard {
            type empty;
            description
              "Install MVPN discard forwarding entries";
          }
    
          leaf sender-based-rpf {
            type empty;
            description
              "Forward multicast traffic only from a selected sender PE";
          }
    
          container hot-root-standby {
            junos:must "(!(".. .. .. instance-type mpls-internet-multicast"))";
            junos:must-message "MVPN live-live - hot-root-standby cannot be configured in mpls-internet-multicast vrf";
            junos:must "(".. sender-based-rpf")";
            junos:must-message "MVPN live-live - hot-root-standby configuration needs sender-based-rpf configuration";
            description
              "MVPN live-live - hot root standby";
            uses apply-advanced;
    
            choice tree {
              container source-tree {
                presence "enable source-tree";
                description
                  "MVPN live-live - hot root standby for source tree";
              }  // container source-tree
            }  // choice tree
    
            container min-rate {
              junos:must "(".. .. hot-root-standby source-tree")";
              junos:must-message "MVPN live-live - min-rate can be configured only if hot-root-standby source-tree is configured";
              description
                "Minimum traffic rate for the provider tunnel below which switchover is initiated (in bps)";
              uses apply-advanced;
    
              leaf rate {
                type string;
                units "bits per second";
                description
                  "Minium traffic rate for the provider tunnel below which switchover is initiated (in bps)";
              }
    
              leaf revert-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 20";
                  }
                }
                units "seconds";
                description
                  "Time to delay updating of multicast routes to allow for multicast convergence";
              }
            }  // container min-rate
          }  // container hot-root-standby
    
          leaf hierarchical-nexthop {
            type empty;
            description
              "Enable hierarchical nexthop usage";
          }
    
          leaf no-nexthop-sharing-for-selective-tunnel {
            junos:must "("hierarchical-nexthop")";
            junos:must-message "Disable tunnel nexthop sharing can be configured only when hierarchical-nexthop is set";
            junos:must "((".. .. .. provider-tunnel ingress-replication" || (".. .. .. provider-tunnel inter-as" || ".. .. .. provider-tunnel inter-region")))";
            junos:must-message "Disable tunnel nexthop sharing can be configured only for ingress-replication provider tunnels";
            type empty;
            description
              "Disable Tunnel nexthops from getting shared for selective tunnel";
          }
    
          container inter-region-template {
            description
              "MVPN inter-region tunnel mapping template";
            uses apply-advanced;
    
            list template {
              key "name";
              ordered-by user;
              description
                "Define a inter-region template";
              leaf name {
                type string;
                description "MVPN Template Name";
              }
    
              uses apply-advanced;
    
              list region {
                key "name";
                ordered-by user;
                description
                  "BGP peer group names used as region";
                leaf name {
                  junos:must "("protocols bgp group $$")";
                  junos:must-message "BGP group must be present";
                  type string;
                  description "Region name";
                }
    
                uses apply-advanced;
    
                choice tunnel-type {
                  container rsvp-te {
                    junos:must "("protocols rsvp")";
                    junos:must-message "RSVP must be configured in the master instance";
                    description
                      "RSVP-TE point-to-multipoint LSP for flooding";
                    uses apply-advanced;
    
                    choice static-or-dynamic {
                      leaf static-lsp {
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-multipoint LSP";
                      }
                      container label-switched-path-template {
                        description
                          "Template for dynamic point-to-multipoint LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                            junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-multipoint LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // choice static-or-dynamic
                  }  // container rsvp-te
                  container ldp-p2mp {
                    junos:must "("protocols ldp p2mp")";
                    junos:must-message "LDP P2MP must be configured in the master instance";
                    presence "enable ldp-p2mp";
                    description
                      "LDP point-to-multipoint LSP for flooding";
                  }  // container ldp-p2mp
                  container ingress-replication {
                    description
                      "Ingress replication tunnel";
                    uses apply-advanced;
    
                    leaf create-new-ucast-tunnel {
                      junos:must "(".. label-switched-path label-switched-path-template")";
                      junos:must-message "label-switched-path-template must be defined";
                      type empty;
                      description
                        "Create new unicast tunnel for ingress replication";
                    }
    
                    container label-switched-path {
                      presence
                        "enable label-switched-path";
                      description
                        "Point-to-point LSP unicast tunnel";
                      uses apply-advanced;
    
                      container label-switched-path-template {
                        junos:must "(".. .. create-new-ucast-tunnel")";
                        junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                        description
                          "Template for dynamic point-to-point LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                            junos:must-message "Referenced point-to-point LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-point LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // container label-switched-path
                  }  // container ingress-replication
                  leaf incoming {
                    type empty;
                    description
                      "Same as incoming provider tunnel";
                  }
                }  // choice tunnel-type
              }  // list region
    
              container all-regions {
                description
                  "Used for all regions not specified";
                uses apply-advanced;
    
                choice tunnel-type {
                  container rsvp-te {
                    junos:must "("protocols rsvp")";
                    junos:must-message "RSVP must be configured in the master instance";
                    description
                      "RSVP-TE point-to-multipoint LSP for flooding";
                    uses apply-advanced;
    
                    choice static-or-dynamic {
                      leaf static-lsp {
                        type string {
                          junos:posix-pattern "^.{1,32}$";
                          junos:pattern-message "Must be a string of 32 characters or less";
                        }
                        description
                          "Name of point-to-multipoint LSP";
                      }
                      container label-switched-path-template {
                        description
                          "Template for dynamic point-to-multipoint LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && "protocols mpls label-switched-path $$ p2mp")))";
                            junos:must-message "Referenced point-to-multipoint LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-multipoint LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // choice static-or-dynamic
                  }  // container rsvp-te
                  container ldp-p2mp {
                    junos:must "("protocols ldp p2mp")";
                    junos:must-message "LDP P2MP must be configured in the master instance";
                    presence "enable ldp-p2mp";
                    description
                      "LDP point-to-multipoint LSP for flooding";
                  }  // container ldp-p2mp
                  container ingress-replication {
                    description
                      "Ingress replication tunnel";
                    uses apply-advanced;
    
                    leaf create-new-ucast-tunnel {
                      junos:must "(".. label-switched-path label-switched-path-template")";
                      junos:must-message "label-switched-path-template must be defined";
                      type empty;
                      description
                        "Create new unicast tunnel for ingress replication";
                    }
    
                    container label-switched-path {
                      presence
                        "enable label-switched-path";
                      description
                        "Point-to-point LSP unicast tunnel";
                      uses apply-advanced;
    
                      container label-switched-path-template {
                        junos:must "(".. .. create-new-ucast-tunnel")";
                        junos:must-message "Templates must be specified when and only when create-new-ucast-tunnel is defined";
                        description
                          "Template for dynamic point-to-point LSP parameters";
                        uses apply-advanced;
    
                        choice dynamic-template {
                          leaf template-name {
                            junos:must "(("protocols mpls label-switched-path $$" && ("protocols mpls label-switched-path $$ template" && !("protocols mpls label-switched-path $$ p2mp"))))";
                            junos:must-message "Referenced point-to-point LSP template does not exist";
                            type string {
                              junos:posix-pattern "^.{1,32}$";
                              junos:pattern-message "Must be a string of 32 characters or less";
                            }
                            description
                              "Name of point-to-point LSP template";
                          }
                          leaf default-template {
                            type empty;
                            description
                              "Use default parameters";
                          }
                        }  // choice dynamic-template
                      }  // container label-switched-path-template
                    }  // container label-switched-path
                  }  // container ingress-replication
                  leaf incoming {
                    type empty;
                    description
                      "Same as incoming provider tunnel";
                  }
                }  // choice tunnel-type
              }  // container all-regions
            }  // list template
          }  // container inter-region-template
    
          leaf source-redundancy {
            type empty;
            description
              "Assume all the sources for a particular group is sending same data";
          }
    
          container umh-selection-additional-input {
            description
              "Additional parameters to consider during UMH";
            uses apply-advanced;
    
            leaf source-active-preference {
              junos:must "(!(".. .. mvpn-mode rpt-spt"))";
              junos:must-message "Source active preference can be configured only for spt only mode";
              type empty;
              description
                "Use the preference set in the source active route";
            }
    
            leaf tunnel-status {
              type empty;
              description
                "Use the RSVP tunnel status";
            }
          }  // container umh-selection-additional-input
        }  // grouping juniper-protocols-mvpn
    
        grouping juniper-protocols-mvrp {
          description "MVRP Configuration";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Tracing options for MVRP";
            uses mrp-trace-options;
          }  // container traceoptions
    
          leaf join-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "100 .. 500";
              }
            }
            units "milliseconds";
            default "200";
            description "Join timer interval";
          }
    
          leaf leave-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "300 .. 1000";
              }
            }
            units "milliseconds";
            default "800";
            description "Leave timer interval";
          }
    
          leaf leaveall-timer {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "10 .. 60";
              }
            }
            units "seconds";
            default "10";
            description
              "Leaveall timer interval";
          }
    
          leaf no-dynamic-vlan {
            type empty;
            description
              "Disable dynamic VLAN creation";
          }
    
          leaf no-attribute-length-in-pdu {
            type empty;
            description
              "No attribute length while sending pdu ";
          }
    
          leaf bpdu-destination-mac-address {
            type enumeration {
              enum "provider-bridge-group" {
                value 0;
                description
                  "802.1ad provider bridge group address";
              }
            }
            description
              "Destination MAC address in the MVRP BPDUs";
          }
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Configure interface options";
            leaf name {
              junos:must "((((".. .. .. rstp interface $$" || ".. .. .. rstp interface all") && !(".. .. .. rstp interface $$ disable")) || ((".. .. .. mstp interface $$" || ".. .. .. mstp interface all") && !(".. .. .. mstp interface $$ disable"))))";
              junos:must-message "rstp/mstp is not enabled on the interface, mvrp is not allowed";
              junos:must "((!("interfaces $$ flexible-vlan-tagging") && (!("interfaces $$ vlan-tagging") && !("interfaces $$ stacked-vlan-tagging"))))";
              junos:must-message "mvrp is not supported on interfaces if flexible-vlan-tagging/vlan-tagging/stacked-vlan-tagging enabled";
              junos:must "(("interfaces $$ unit $$={0} family ethernet-switching interface-mode trunk" || "interfaces $$ unit $$={0} family bridge interface-mode trunk"))";
              junos:must-message "mvrp can be enabled only on interfaces with interface-mode trunk";
              type union {
                type jt:interface-device;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf join-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "100 .. 500";
                }
              }
              units "milliseconds";
              description "Join timer interval";
            }
    
            leaf leave-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "300 .. 1000";
                }
              }
              units "milliseconds";
              description "Leave timer interval";
            }
    
            leaf leaveall-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "10 .. 60";
                }
              }
              units "seconds";
              description
                "Leaveall timer interval";
            }
    
            leaf point-to-point {
              type empty;
              description
                "Port is point to point";
            }
    
            leaf registration {
              type enumeration {
                enum "normal" {
                  value 0;
                  description
                    "Normal registration mode";
                }
                enum "restricted" {
                  value 1;
                  description
                    "Restricted registration mode";
                }
                enum "forbidden" {
                  value 2;
                  description
                    "Forbidden registration mode";
                }
              }
              default "normal";
              description "Registration mode";
            }
          }  // list interface
        }  // grouping juniper-protocols-mvrp
    
        grouping juniper-protocols-ospf {
          uses apply-advanced;
    
          list topology {
            key "name";
            ordered-by user;
            description "Topology parameters";
            leaf name {
              type string;
              description "Topology name";
            }
    
            uses apply-advanced;
    
            leaf disable {
              type empty;
              description
                "Disable this topology";
            }
    
            leaf topology-id {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "32 .. 127";
                }
              }
              description "Topology identifier";
            }
    
            leaf overload {
              type empty;
              description
                "Set the overload mode (repel transit traffic)";
            }
    
            leaf rib-group {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-group must be defined";
              type string;
              description
                "Routing table group for importing routes";
            }
    
            container spf-options {
              description
                "Configure options for SPF";
              uses apply-advanced;
    
              leaf delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "50 .. 8000";
                  }
                }
                units "milliseconds";
                description
                  "Time to wait before running an SPF";
              }
    
              leaf holddown {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2000 .. 20000";
                  }
                }
                units "milliseconds";
                description
                  "Time to hold down before running an SPF";
              }
    
              leaf rapid-runs {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Number of maximum rapid SPF runs before holddown";
              }
    
              leaf no-ignore-our-externals {
                type empty;
                description
                  "Do not ignore self-generated external and NSSA LSAs";
              }
            }  // container spf-options
    
            container backup-spf-options {
              description
                "Configure options for backup SPF";
              uses apply-advanced;
    
              container remote-backup-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable remote-backup-calculation";
                description
                  "Calculate Remote LFA backup nexthops";
                uses apply-advanced;
    
                container pq-nodes-nearest-to-source {
                  description
                    "PQ nodes selection based upon nearest to source";
                  uses apply-advanced;
    
                  leaf percent {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "10 .. 100";
                      }
                    }
                    description
                      "Selection percentage for nearest to source";
                  }
                }  // container pq-nodes-nearest-to-source
              }  // container remote-backup-calculation
    
              container use-post-convergence-lfa {
                junos:must "("protocols ospf source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                presence
                  "enable use-post-convergence-lfa";
                description
                  "Calculate post-convergence backup paths";
                uses apply-advanced;
    
                leaf maximum-labels {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 8";
                    }
                  }
                  description
                    "Maximum number of labels installed for post-convergence paths";
                }
    
                leaf maximum-backup-paths {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 8";
                    }
                  }
                  description
                    "Maximum number of equal-cost post-convergence paths installed";
                }
              }  // container use-post-convergence-lfa
    
              leaf use-source-packet-routing {
                junos:must "(".. .. source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                junos:must "(!(".. remote-backup-calculation"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
                type empty;
                description
                  "Use spring backup paths for inet.0 routes";
              }
    
              leaf disable {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Do not run backup SPF";
              }
    
              leaf no-install {
                type empty;
                description
                  "Do not install backup nexthops into the RIB";
              }
    
              leaf downstream-paths-only {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Use only downstream backup paths";
              }
    
              container per-prefix-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                description
                  "Calculate backup nexthops for non-best prefix originators";
                uses apply-advanced;
    
                leaf stubs {
                  type empty;
                  description
                    "Per prefix calculation for stubs only";
                }
    
                leaf summary {
                  type empty;
                  description
                    "Per prefix calculation for summary originators only";
                }
    
                leaf externals {
                  type empty;
                  description
                    "Per prefix calculation for externals";
                }
    
                leaf all {
                  type empty;
                  description
                    "Per prefix calculation for all";
                }
              }  // container per-prefix-calculation
    
              leaf node-link-degradation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Degrade to link protection when nodelink protection not available";
              }
            }  // container backup-spf-options
    
            leaf prefix-export-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Maximum number of prefixes that can be exported";
            }
          }  // list topology
    
          container backup-spf-options {
            description
              "Configure options for backup SPF";
            uses apply-advanced;
    
            container remote-backup-calculation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              presence
                "enable remote-backup-calculation";
              description
                "Calculate Remote LFA backup nexthops";
              uses apply-advanced;
    
              container pq-nodes-nearest-to-source {
                description
                  "PQ nodes selection based upon nearest to source";
                uses apply-advanced;
    
                leaf percent {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "10 .. 100";
                    }
                  }
                  description
                    "Selection percentage for nearest to source";
                }
              }  // container pq-nodes-nearest-to-source
            }  // container remote-backup-calculation
    
            container use-post-convergence-lfa {
              junos:must "("protocols ospf source-packet-routing")";
              junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
              presence
                "enable use-post-convergence-lfa";
              description
                "Calculate post-convergence backup paths";
              uses apply-advanced;
    
              leaf maximum-labels {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 8";
                  }
                }
                description
                  "Maximum number of labels installed for post-convergence paths";
              }
    
              leaf maximum-backup-paths {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 8";
                  }
                }
                description
                  "Maximum number of equal-cost post-convergence paths installed";
              }
            }  // container use-post-convergence-lfa
    
            leaf use-source-packet-routing {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
              junos:must "(!(".. remote-backup-calculation"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
              type empty;
              description
                "Use spring backup paths for inet.0 routes";
            }
    
            leaf disable {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Do not run backup SPF";
            }
    
            leaf no-install {
              type empty;
              description
                "Do not install backup nexthops into the RIB";
            }
    
            leaf downstream-paths-only {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Use only downstream backup paths";
            }
    
            container per-prefix-calculation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              description
                "Calculate backup nexthops for non-best prefix originators";
              uses apply-advanced;
    
              leaf stubs {
                type empty;
                description
                  "Per prefix calculation for stubs only";
              }
    
              leaf summary {
                type empty;
                description
                  "Per prefix calculation for summary originators only";
              }
    
              leaf externals {
                type empty;
                description
                  "Per prefix calculation for externals";
              }
    
              leaf all {
                type empty;
                description
                  "Per prefix calculation for all";
              }
            }  // container per-prefix-calculation
    
            leaf node-link-degradation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Degrade to link protection when nodelink protection not available";
            }
          }  // container backup-spf-options
    
          container traffic-engineering {
            presence
              "enable traffic-engineering";
            description
              "Configure traffic engineering attributes";
            uses apply-advanced;
    
            leaf no-topology {
              type empty;
              description
                "Disable dissemination of TE link-state topology information";
            }
    
            leaf multicast-rpf-routes {
              junos:must "(!(".. .. topology $$={ipv4-multicast}"))";
              junos:must-message "multicast-rpf-routes cannot be used with topology ipv4-multicast";
              junos:must "(".. shortcuts")";
              junos:must-message "multicast-rpf-routes cannot be used without shortcuts";
              type empty;
              description
                "Install routes for multicast RPF checks into inet.2";
            }
    
            leaf l3-unicast-topology {
              type empty;
              description
                "Download IGP topology into TED";
            }
    
            container ignore-lsp-metrics {
              presence
                "enable ignore-lsp-metrics";
              description
                "Ignore label-switched path metrics when doing shortcuts";
              uses apply-advanced;
    
              leaf unconfigured-only {
                type empty;
                description
                  "Ignore lsp metrics for unconfigured only";
              }
            }  // container ignore-lsp-metrics
    
            container shortcuts {
              presence "enable shortcuts";
              description
                "Use label-switched paths as next hops, if possible";
              uses apply-advanced;
    
              leaf ignore-lsp-metrics {
                type empty;
                status deprecated;
                description
                  "Ignore label-switched path metrics when doing shortcuts";
              }
    
              leaf lsp-metric-into-summary {
                type empty;
                description
                  "Advertise LSP metric into summary LSAs";
              }
    
              list family {
                key "name";
                ordered-by user;
                description
                  "Address family specific traffic-engineering attributes";
                leaf name {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet-mpls" {
                      value 1;
                      description
                        "IPv4-MPLS family";
                    }
                  }
                }
    
                uses apply-advanced;
              }  // list family
            }  // container shortcuts
    
            leaf advertise-unnumbered-interfaces {
              type empty;
              description
                "Advertise unnumbered interfaces";
            }
    
            leaf credibility-protocol-preference {
              type empty;
              description
                "TED protocol credibility follows protocol preference";
            }
    
            container advertisement {
              description
                "Advertise TE parameters even if RSVP is not turned on";
              uses apply-advanced;
    
              leaf always {
                type empty;
                description
                  "Advertise TE parameters in TE LSAs";
              }
            }  // container advertisement
          }  // container traffic-engineering
    
          container source-packet-routing {
            junos:must "(!(".. .. .. protocols mpls disable"))";
            junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
            junos:must "(".. .. .. protocols mpls ")";
            junos:must-message "SPRING configuration is not allowed without 'protocols mpls'";
            presence
              "enable source-packet-routing";
            description
              "Enable source packet routing (SPRING)";
            uses apply-advanced;
    
            container adjacency-segment {
              description
                "Attributes for adjacency segments in spring";
              uses apply-advanced;
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "180000 .. 900000";
                  }
                }
                description
                  "Retain time of Adjacency segment after isolating from an interface";
              }
            }  // container adjacency-segment
    
            leaf-list prefix-segment {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Prefix Segment policy";
            }
    
            leaf explicit-null {
              type empty;
              description
                "Set E and P bits in all Prefix SID advertisements";
            }
    
            container node-segment {
              presence "enable node-segment";
              description
                "Enable support for Node segments in SPRING";
              uses apply-advanced;
    
              leaf ipv4-index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set ipv4 node segment index";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "32 .. 16385";
                  }
                }
                description
                  "Set range of node segment indices allowed";
              }
            }  // container node-segment
    
            container srgb {
              junos:must "(!(".. node-segment index-range"))";
              junos:must-message "Can not be configured with node-segment index-range";
              description
                "Set the SRGB global block in SPRING";
              leaf start-label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Start range for SRGB label block";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Index to the SRGB start label block";
              }
            }  // container srgb
    
            leaf mapping-server {
              junos:must "(".. node-segment")";
              junos:must-message "protocols ospf source-packet-routing node-segment must be defined";
              junos:must "("routing-options source-packet-routing mapping-server-entry $$")";
              junos:must-message "Referenced source-packet-routing mapping-server-entry must be defined";
              type string;
              description "Mapping server name";
            }
    
            leaf install-prefix-sid-for-best-route {
              type empty;
              description
                "For best route install a exact prefix sid route";
            }
    
            leaf ldp-stitching {
              type empty;
              description
                "Enable SR to LDP stitching";
            }
    
            leaf-list flex-algorithm {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "128 .. 255";
                }
              }
              max-elements 16;
              description
                "Flex-algorithms we would like to participate in";
            }
          }  // container source-packet-routing
    
          list area {
            key "name";
            ordered-by user;
            description "Configure an OSPF area";
            leaf name {
              type jt:areaid;
              description "Area ID";
            }
    
            uses apply-advanced;
    
            choice stub-option {
              container stub {
                presence "enable stub";
                description
                  "Configure a stub area";
                leaf default-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  description
                    "Metric for the default route in this stub area";
                }
    
                choice summaries-choice {
                  leaf summaries {
                    type empty;
                    description
                      "Flood summary LSAs into this stub area";
                  }
                  leaf no-summaries {
                    type empty;
                    description
                      "Don't flood summary LSAs into this stub area";
                  }
                }  // choice summaries-choice
              }  // container stub
              container nssa {
                presence "enable nssa";
                description
                  "Configure a not-so-stubby area";
                uses apply-advanced;
    
                container default-lsa {
                  presence "enable default-lsa";
                  description
                    "Configure a default LSA";
                  uses apply-advanced;
    
                  leaf default-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16777215";
                      }
                    }
                    description
                      "Metric for the default route in this area";
                  }
    
                  leaf metric-type {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 2";
                      }
                    }
                    description
                      "External metric type for the default type 7 LSA";
                  }
    
                  leaf type-7 {
                    type empty;
                    description
                      "Flood type 7 default LSA if no-summaries is configured";
                  }
                }  // container default-lsa
    
                leaf default-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  status deprecated;
                  description
                    "Metric for the default route in this area";
                }
    
                leaf metric-type {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 2";
                    }
                  }
                  status deprecated;
                  description
                    "External metric type for the default type 7 LSA";
                }
    
                choice summaries-choice {
                  leaf summaries {
                    type empty;
                    description
                      "Flood summary LSAs into this NSSA area";
                  }
                  leaf no-summaries {
                    type empty;
                    description
                      "Don't flood summary LSAs into this NSSA area";
                  }
                }  // choice summaries-choice
    
                list area-range {
                  key "name";
                  ordered-by user;
                  description
                    "Configure NSSA area ranges";
                  leaf name {
                    type jt:ipprefix;
                    description
                      "Range to summarize NSSA routes in this area";
                  }
    
                  uses apply-advanced;
    
                  leaf restrict {
                    type empty;
                    description
                      "Restrict advertisement of this area range";
                  }
    
                  leaf exact {
                    type empty;
                    description
                      "Enforce exact match for advertisement of this area range";
                  }
    
                  container override-metric {
                    presence
                      "enable override-metric";
                    description
                      "Override the dynamic metric for this area-range";
                    uses apply-advanced;
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 16777215";
                        }
                      }
                      description "Metric value";
                    }
    
                    leaf metric-type {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 2";
                        }
                      }
                      default "1";
                      description
                        "Set the metric type for the override metric";
                    }
                  }  // container override-metric
                }  // list area-range
              }  // container nssa
            }  // choice stub-option
    
            list area-range {
              key "name";
              ordered-by user;
              description
                "Configure area ranges";
              leaf name {
                type jt:ipprefix;
                description
                  "Range to summarize routes in this area";
              }
    
              uses apply-advanced;
    
              leaf restrict {
                type empty;
                description
                  "Restrict advertisement of this area range";
              }
    
              leaf exact {
                type empty;
                description
                  "Enforce exact match for advertisement of this area range";
              }
    
              leaf override-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16777215";
                  }
                }
                description
                  "Override the dynamic metric for this area-range";
              }
            }  // list area-range
    
            leaf-list network-summary-export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Export policy for Type 3 Summary LSAs";
            }
    
            leaf-list network-summary-import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy for Type 3 Summary LSAs";
            }
    
            leaf-list inter-area-prefix-export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Export policy for Inter Area Prefix LSAs";
            }
    
            leaf-list inter-area-prefix-import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy for Inter Area Prefix LSAs";
            }
    
            leaf authentication-type {
              type enumeration {
                enum "none" {
                  value 0;
                  status deprecated;
                  description
                    "No authentication";
                }
                enum "simple" {
                  value 1;
                  status deprecated;
                  description
                    "Simple password authentication";
                }
                enum "md5" {
                  value 2;
                  status deprecated;
                  description
                    "MD5 authentication";
                }
              }
              status deprecated;
              description "Authentication type";
            }
    
            list virtual-link {
              junos:must "(".. .. area $$={0.0.0.0}")";
              junos:must-message "virtual link can be configured only under backbone area";
              key "neighbor-id transit-area";
              ordered-by user;
              description
                "Configure virtual links";
              leaf neighbor-id {
                type jt:ipv4addr;
                description
                  "Router ID of a virtual neighbor";
              }
    
              leaf transit-area {
                type jt:areaid;
                description
                  "Transit area in common with virtual neighbor";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable this virtual link";
                }
              }  // choice enable-disable
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list virtual-link
    
            list sham-link-remote {
              key "name";
              ordered-by user;
              description
                "Configure parameters for remote sham link endpoint";
              leaf name {
                junos:must "(!(".. .. .. sham-link local $$"))";
                junos:must-message "Local and remote sham link endpoint addresses must be different";
                junos:must "(".. .. .. sham-link local")";
                junos:must-message "Local sham link endpoint must be configured";
                type jt:ipaddr;
                description
                  "Remote sham link endpoint address";
              }
    
              uses apply-advanced;
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Sham link metric";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list sham-link-remote
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Include an interface in this area";
              leaf name {
                junos:must "((!(".. interface-type nbma") || (!(("interfaces $$" || any "logical-systems <*> interfaces $$")) || (any "interfaces $$-IFL family inet address <*>" || any "logical-systems <*> interfaces $$-IFL family inet address <*>"))))";
                junos:must-message "IPv4 address must be configured on the interface for nbma mode";
                type union {
                  type jt:ipv4addr-or-interface;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this interface";
                }
              }  // choice enable-disable
    
              leaf interface-type {
                type enumeration {
                  enum "nbma" {
                    value 0;
                    description
                      "Nonbroadcast multiaccess";
                  }
                  enum "p2mp" {
                    value 1;
                    description
                      "Point-to-multipoint NBMA";
                  }
                  enum "p2p" {
                    value 2;
                    description "Point-to-point";
                  }
                  enum "p2mp-over-lan" {
                    value 3;
                    description
                      "Point-to-multipoint over LAN mode";
                  }
                }
                description "Type of interface";
              }
    
              choice protection-type {
                leaf link-protection {
                  type empty;
                  description
                    "Protect interface from link faults only";
                }
                leaf node-link-protection {
                  type empty;
                  description
                    "Protect interface from both link and node faults";
                }
              }  // choice protection-type
    
              leaf no-eligible-backup {
                type empty;
                description
                  "Not eligible to backup traffic from protected interfaces";
              }
    
              leaf no-eligible-remote-backup {
                type empty;
                description
                  "Not eligible for Remote-LFA backup traffic from protected interfaces";
              }
    
              container passive {
                presence "enable passive";
                description
                  "Do not run OSPF, but advertise it";
                uses apply-advanced;
    
                container traffic-engineering {
                  description
                    "Advertise TE link information";
                  uses apply-advanced;
    
                  leaf remote-node-id {
                    type jt:ipaddr;
                    description
                      "Remote address of the link";
                  }
    
                  leaf remote-node-router-id {
                    junos:must "(".. remote-node-id")";
                    junos:must-message "remote-node-id must be configured";
                    type jt:ipv4addr;
                    description
                      "TE Router-ID of the remote node";
                  }
                }  // container traffic-engineering
              }  // container passive
    
              leaf secondary {
                junos:must "(!(" .. ipsec-sa"))";
                junos:must-message "secondary interface cannot have ipsec-sa configured";
                junos:must "(!(" .. dynamic-neighbors"))";
                junos:must-message "secondary interface cannot have dynamic-neighbors configured";
                junos:must "(!(" .. neighbor"))";
                junos:must-message "secondary interface cannot have configured neighbors";
                junos:must "(!(" .. interface-type p2mp"))";
                junos:must-message "secondary interface cannot be set as type p2mp";
                junos:must "(!(" .. interface-type nbma"))";
                junos:must-message "secondary interface cannot be set as type nbma";
                junos:must "(!(" .. passive"))";
                junos:must-message "secondary interface cannot be configured passive";
                type empty;
                description
                  "Treat interface as secondary";
              }
    
              leaf own-router-lsa {
                type empty;
                description
                  "Generate a separate router LSA for this interface";
              }
    
              container bandwidth-based-metrics {
                junos:must "(".. metric")";
                junos:must-message "Metric must be configured";
                description
                  "Configure bandwidth based metrics";
                uses apply-advanced;
    
                list bandwidth {
                  key "name";
                  description
                    "Bandwidth threshold";
                  leaf name {
                    type string;
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Metric associated with specified bandwidth";
                  }
                }  // list bandwidth
              }  // container bandwidth-based-metrics
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Interface metric";
              }
    
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Designated router priority";
              }
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
    
              leaf transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                status deprecated;
                description
                  "OSPF packet transmit interval (milliseconds)";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
    
                leaf full-neighbors-only {
                  type empty;
                  description
                    "Setup BFD sessions only to Full neighbors";
                }
    
                leaf holddown-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold the session-UP notification to the client";
                }
              }  // container bfd-liveness-detection
    
              leaf dynamic-neighbors {
                junos:must "(" .. interface-type p2mp")";
                junos:must-message "dynamic-neighbors option can be set only if the interface type is p2mp";
                type empty;
                description
                  "Learn neighbors dynamically on a p2mp interface";
              }
    
              leaf no-advertise-adjacency-segment {
                type empty;
                description
                  "Do not advertise an adjacency segment for this interface";
              }
    
              list neighbor {
                junos:must "(!(" .. dynamic-neighbors"))";
                junos:must-message "Neighbors cannot be specified manually if dynamic-neighbors is set";
                key "name";
                ordered-by user;
                description "NBMA neighbor";
                leaf name {
                  type jt:ipaddr;
                  description
                    "Address of neighbor";
                }
    
                leaf eligible {
                  type empty;
                  description
                    "Eligible to be DR on an NBMA network";
                }
              }  // list neighbor
    
              leaf poll-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Poll interval for NBMA interfaces";
              }
    
              leaf no-interface-state-traps {
                type empty;
                description
                  "Do not send interface state change traps";
              }
    
              leaf strict-bfd {
                junos:must "(" .. bfd-liveness-detection")";
                junos:must-message "strict bfd cannot be configured without bfd.";
                junos:must "(!(" .. bfd-liveness-detection full-neighbors-only"))";
                junos:must-message "full-neighbors-only and strict-bfd cannot be configured together";
                type empty;
                description
                  "Enable strict bfd over this interface";
              }
    
              container post-convergence-lfa {
                junos:must "("protocols ospf backup-spf-options use-post-convergence-lfa")";
                junos:must-message "Not allowed without 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable post-convergence-lfa";
                description
                  "Protect interface using post-convergence backup path";
                uses apply-advanced;
    
                container node-protection {
                  presence
                    "enable node-protection";
                  description
                    "Compute backup path assuming node failure";
                  uses apply-advanced;
    
                  leaf cost {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Cost for node protection";
                  }
                }  // container node-protection
    
                leaf srlg-protection {
                  type empty;
                  description
                    "Compute backup path assuming SRLG failure";
                }
    
                leaf fate-sharing-protection {
                  type empty;
                  description
                    "Compute backup path assuming fate-sharing group failure";
                }
              }  // container post-convergence-lfa
    
              leaf te-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Traffic engineering metric";
              }
    
              container ldp-synchronization {
                presence
                  "enable ldp-synchronization";
                description
                  "Advertise maximum metric until LDP is operational";
                uses ldp-sync-obj;
              }  // container ldp-synchronization
    
              container ipv4-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv4 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv4-adjacency-segment
    
              list lan-neighbor {
                junos:must "(!(".. ipv4-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if ipv4-adjacency-segment is configured in the same interface";
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if no-advertise-adjacency-segment is configured in the same interface ";
                junos:must "(!(".. interface-type p2p"))";
                junos:must-message "lan-neighbor can't be configured for point-to-point interfaces";
                key "name";
                ordered-by user;
                description
                  "Configuration specific to a LAN neighbor";
                leaf name {
                  type jt:ipaddr;
                  description
                    "Address of neighbor";
                }
    
                uses apply-advanced;
    
                container ipv4-adjacency-segment {
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                  description
                    "Configure ipv4 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    description
                      "Adjacency SID is eligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container protected
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container unprotected
                }  // container ipv4-adjacency-segment
              }  // list lan-neighbor
            }  // list interface
    
            leaf no-context-identifier-advertisement {
              junos:must "(!(".. context-identifier"))";
              junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
              type empty;
              description
                "Disable context identifier advertisments in this area";
            }
    
            list peer-interface {
              key "name";
              ordered-by user;
              description
                "Configuration for peer interface";
              leaf name {
                type string;
                description
                  "Name of peer interface";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this control peer";
                }
              }  // choice enable-disable
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
            }  // list peer-interface
    
            leaf no-source-packet-routing {
              type empty;
              description
                "Disable SPRING in this area";
            }
    
            list context-identifier {
              junos:must "(!(".. no-context-identifier-advertisement"))";
              junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
              key "name";
              ordered-by user;
              description
                "Configure context identifier in support of edge protection";
              leaf name {
                type jt:ipv4addr;
                description "Context identifier";
              }
    
              uses apply-advanced;
            }  // list context-identifier
    
            list label-switched-path {
              junos:must "(!(".. .. traffic-engineering multicast-rpf-routes"))";
              junos:must-message "cannot advertise LSPs when using multicast-rpf-routes";
              key "name";
              ordered-by user;
              description
                "Configuration for advertisement of a label-switched path";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of label-switched path to be advertised";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this label-switched path";
                }
              }  // choice enable-disable
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Interface metric";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list label-switched-path
          }  // list area
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable OSPF";
            }
          }  // choice enable-disable
    
          container traceoptions {
            description "Trace options for OSPF";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "spf" {
                    value 0;
                    description
                      "Trace SPF calculations";
                  }
                  enum "error" {
                    value 1;
                    description
                      "Trace errored packets";
                  }
                  enum "event" {
                    value 2;
                    description
                      "Trace OSPF state machine events";
                  }
                  enum "packet-dump" {
                    value 3;
                    description
                      "Dump the contents of selected packet types";
                  }
                  enum "flooding" {
                    value 4;
                    description
                      "Trace LSA flooding";
                  }
                  enum "lsa-analysis" {
                    value 5;
                    description
                      "Trace LSA analysis";
                  }
                  enum "packets" {
                    value 6;
                    description
                      "Trace all OSPF packets";
                  }
                  enum "hello" {
                    value 7;
                    description
                      "Trace hello packets";
                  }
                  enum "database-description" {
                    value 8;
                    description
                      "Trace database description packets";
                  }
                  enum "lsa-request" {
                    value 9;
                    description
                      "Trace LSA request packets";
                  }
                  enum "lsa-update" {
                    value 10;
                    description
                      "Trace LSA update packets";
                  }
                  enum "lsa-ack" {
                    value 11;
                    description
                      "Trace LSA acknowledgment packets";
                  }
                  enum "ldp-synchronization" {
                    value 12;
                    description
                      "Trace synchronization between OSPF and LDP";
                  }
                  enum "on-demand" {
                    value 13;
                    description
                      "Trace demand circuit extensions";
                  }
                  enum "nsr-synchronization" {
                    value 14;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "graceful-restart" {
                    value 15;
                    description
                      "Trace graceful restart";
                  }
                  enum "restart-signaling" {
                    value 16;
                    description
                      "Trace restart signaling";
                  }
                  enum "backup-spf" {
                    value 17;
                    description
                      "Trace backup SPF (LFA) specific events";
                  }
                  enum "source-packet-routing" {
                    value 18;
                    description
                      "Trace source packet routing (SPRING) events";
                  }
                  enum "post-convergence-lfa" {
                    value 19;
                    description
                      "Trace post-convergence-lfa related events";
                  }
                  enum "flex-algorithm" {
                    value 20;
                    description
                      "Trace flex-algorithm related events";
                  }
                  enum "route" {
                    value 21;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 22;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 23;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 24;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 25;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 26;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 27;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 28;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container spf-options {
            description
              "Configure options for SPF";
            uses apply-advanced;
    
            leaf delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "50 .. 8000";
                }
              }
              units "milliseconds";
              description
                "Time to wait before running an SPF";
            }
    
            leaf holddown {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2000 .. 20000";
                }
              }
              units "milliseconds";
              description
                "Time to hold down before running an SPF";
            }
    
            leaf rapid-runs {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 10";
                }
              }
              description
                "Number of maximum rapid SPF runs before holddown";
            }
    
            leaf no-ignore-our-externals {
              type empty;
              description
                "Do not ignore self-generated external and NSSA LSAs";
            }
          }  // container spf-options
    
          leaf prefix-export-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4294967295";
              }
            }
            description
              "Maximum number of prefixes that can be exported";
          }
    
          container rib-groups {
            description
              "Routing table groups for importing OSPF routes";
            uses apply-advanced;
    
            leaf inet {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-groups must be defined";
              junos:must "(!(".. topology $$={default} rib-group"))";
              junos:must-message "rib-group cannot be used with topology default rib-group";
              type string;
              description
                "Name of the IPv4/v6 routing table group";
            }
    
            leaf inet3 {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-groups must be defined";
              junos:must "(!(".. topology $$={default} rib-group"))";
              junos:must-message "rib-group cannot be used with topology default rib-group";
              type string;
              description
                "Name of the IPv4/v6 inet.3 routing table group";
            }
          }  // container rib-groups
    
          leaf job-stats {
            type empty;
            description "Collect job statistics";
          }
    
          container overload {
            presence "enable overload";
            description
              "Set the overload mode (repel transit traffic)";
            uses apply-advanced;
    
            leaf timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 3600";
                }
              }
              units "seconds";
              description
                "Time after which overload mode is reset";
            }
    
            leaf allow-route-leaking {
              type empty;
              description
                "Allow routes to be leaked when overload is configured";
            }
    
            leaf stub-network {
              type empty;
              description
                "Advertise Stub Network with maximum metric";
            }
    
            leaf intra-area-prefix {
              type empty;
              description
                "Advertise Intra Area Prefix with maximum metric";
            }
    
            leaf as-external {
              type empty;
              description
                "Advertise As External with maximum usable metric";
            }
          }  // container overload
    
          container database-protection {
            presence
              "enable database-protection";
            description
              "Configure database protection attributes";
            uses apply-advanced;
    
            leaf maximum-lsa {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000000";
                }
              }
              description
                "Maximum allowed non self-generated LSAs";
            }
    
            leaf warning-only {
              type empty;
              description
                "Emit only a warning when LSA maximum limit is exceeded";
            }
    
            leaf warning-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "30 .. 100";
                }
              }
              units "percent";
              description
                "Percentage of LSA maximum above which to trigger warning";
            }
    
            leaf ignore-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 32";
                }
              }
              description
                "Maximum number of times to go into ignore state";
            }
    
            leaf ignore-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "30 .. 3600";
                }
              }
              units "seconds";
              description
                "Time to stay in ignore state and ignore all neighbors";
            }
    
            leaf reset-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 86400";
                }
              }
              units "seconds";
              description
                "Time after which the ignore count gets reset to zero";
            }
          }  // container database-protection
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable OSPF graceful restart capability";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              units "seconds";
              description
                "Time for all neighbors to become full";
            }
    
            leaf notify-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              units "seconds";
              description
                "Time to send all max-aged grace LSAs";
            }
    
            container helper-disable {
              presence "enable helper-disable";
              description
                "Disable graceful restart helper capability";
              uses apply-advanced;
    
              choice disable-choices {
                leaf standard {
                  type empty;
                  description
                    "Disable helper-mode for rfc3623 based GR";
                }
                leaf restart-signaling {
                  type empty;
                  description
                    "Disable helper mode for restart-signaling ";
                }
                leaf both {
                  type empty;
                  description
                    "Disable helper mode for both the types of GR";
                }
              }  // choice disable-choices
            }  // container helper-disable
    
            leaf no-strict-lsa-checking {
              junos:must "(!(".. helper-disable"))";
              junos:must-message "To configure no-strict-lsa-checking, helper-disable must not be set";
              type empty;
              description
                "Do not abort graceful helper mode upon LSA changes";
            }
          }  // container graceful-restart
    
          leaf route-type-community {
            type enumeration {
              enum "iana" {
                value 0;
                description
                  "BGP extended community value used is 0x0306";
              }
              enum "vendor" {
                value 1;
                description
                  "Vendor BGP extended community value used is 0x8000";
              }
            }
            description
              "Specify BGP extended community value to encode OSPF route type";
          }
    
          container domain-id {
            description "Configure domain ID";
            choice domain_id_or_disable {
              leaf domain-id {
                type string;
                description "Domain ID";
              }
              leaf disable {
                type empty;
                description "Disable domain ID";
              }
            }  // choice domain_id_or_disable
          }  // container domain-id
    
          choice domain_vpn_tag_or_disable {
            leaf domain-vpn-tag {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Domain VPN tag for external LSA";
            }
            leaf no-domain-vpn-tag {
              type empty;
              description
                "Disable domain VPN tag";
            }
          }  // choice domain_vpn_tag_or_disable
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of internal routes";
          }
    
          leaf external-preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of external routes";
          }
    
          leaf labeled-preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of labeled routes";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy (for external routes or setting priority)";
          }
    
          leaf reference-bandwidth {
            type string;
            description
              "Bandwidth for calculating metric defaults";
          }
    
          leaf lsa-refresh-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "25 .. 50";
              }
            }
            default "50";
            description
              "LSA refresh interval (minutes)";
          }
    
          leaf spf-delay {
            junos:must "(!(".. spf-options delay"))";
            junos:must-message "You can only configure either spf-delay or delay under spf-options";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "50 .. 8000";
              }
            }
            units "milliseconds";
            status deprecated;
            description
              "Time to wait before running an SPF";
          }
    
          leaf no-rfc-1583 {
            type empty;
            description
              "Disable RFC1583 compatibility";
          }
    
          leaf forwarding-address-to-broadcast {
            type empty;
            description
              "Set forwarding address in Type 5 LSA in broadcast network";
          }
    
          choice nssa-abr-option {
            leaf no-nssa-abr {
              type empty;
              description
                "Disable full NSSA functionality at ABR";
            }
          }  // choice nssa-abr-option
    
          container sham-link {
            presence "enable sham-link";
            description
              "Configure parameters for sham links";
            uses apply-advanced;
    
            leaf local {
              type jt:ipaddr;
              description
                "Local sham link endpoint address";
            }
    
            leaf no-advertise-local {
              type empty;
              status deprecated;
              description
                "Don't advertise local sham link endpoint as stub in router LSA";
            }
          }  // container sham-link
        }  // grouping juniper-protocols-ospf
    
        grouping juniper-ospf-authentication {
          description
            "Authentication information";
          uses apply-advanced;
    
          choice authentication-type {
            leaf simple-password {
              type jt:unreadable;
              description "Authentication key";
            }
            list md5 {
              key "name";
              ordered-by user;
              description
                "MD5 authentication key";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Key ID for MD5 authentication";
              }
    
              leaf key {
                type jt:unreadable;
                description
                  "MD5 authentication key value";
              }
    
              leaf start-time {
                type jt:time;
                description
                  "Start time for key transmission (YYYY-MM-DD.HH:MM)";
              }
            }  // list md5
          }  // choice authentication-type
        }  // grouping juniper-ospf-authentication
    
        grouping juniper-protocols-ospf3 {
          list realm {
            key "name";
            ordered-by user;
            description
              "OSPFv3 realm configuration";
            leaf name {
              type enumeration {
                enum "ipv6-unicast" {
                  value 0;
                  description
                    "IPv6 unicast realm";
                }
                enum "ipv6-multicast" {
                  value 1;
                  description
                    "IPv6 multicast realm";
                }
                enum "ipv4-unicast" {
                  value 2;
                  description
                    "IPv4 unicast realm";
                }
                enum "ipv4-multicast" {
                  value 3;
                  description
                    "IPv4 multicast realm";
                }
              }
              description "OSPFv3 realm name";
            }
    
            uses apply-advanced;
    
            list topology {
              key "name";
              ordered-by user;
              description "Topology parameters";
              leaf name {
                type string;
                description "Topology name";
              }
    
              uses apply-advanced;
    
              leaf disable {
                type empty;
                description
                  "Disable this topology";
              }
    
              leaf topology-id {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "32 .. 127";
                  }
                }
                description
                  "Topology identifier";
              }
    
              leaf overload {
                type empty;
                description
                  "Set the overload mode (repel transit traffic)";
              }
    
              leaf rib-group {
                junos:must "("routing-options rib-groups $$")";
                junos:must-message "Referenced rib-group must be defined";
                type string;
                description
                  "Routing table group for importing routes";
              }
    
              container spf-options {
                description
                  "Configure options for SPF";
                uses apply-advanced;
    
                leaf delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "50 .. 8000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to wait before running an SPF";
                }
    
                leaf holddown {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2000 .. 20000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold down before running an SPF";
                }
    
                leaf rapid-runs {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 10";
                    }
                  }
                  description
                    "Number of maximum rapid SPF runs before holddown";
                }
    
                leaf no-ignore-our-externals {
                  type empty;
                  description
                    "Do not ignore self-generated external and NSSA LSAs";
                }
              }  // container spf-options
    
              container backup-spf-options {
                description
                  "Configure options for backup SPF";
                uses apply-advanced;
    
                container remote-backup-calculation {
                  junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  presence
                    "enable remote-backup-calculation";
                  description
                    "Calculate Remote LFA backup nexthops";
                  uses apply-advanced;
    
                  container pq-nodes-nearest-to-source {
                    description
                      "PQ nodes selection based upon nearest to source";
                    uses apply-advanced;
    
                    leaf percent {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "10 .. 100";
                        }
                      }
                      description
                        "Selection percentage for nearest to source";
                    }
                  }  // container pq-nodes-nearest-to-source
                }  // container remote-backup-calculation
    
                container use-post-convergence-lfa {
                  junos:must "("protocols ospf source-packet-routing")";
                  junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                  presence
                    "enable use-post-convergence-lfa";
                  description
                    "Calculate post-convergence backup paths";
                  uses apply-advanced;
    
                  leaf maximum-labels {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 8";
                      }
                    }
                    description
                      "Maximum number of labels installed for post-convergence paths";
                  }
    
                  leaf maximum-backup-paths {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 8";
                      }
                    }
                    description
                      "Maximum number of equal-cost post-convergence paths installed";
                  }
                }  // container use-post-convergence-lfa
    
                leaf use-source-packet-routing {
                  junos:must "(".. .. source-packet-routing")";
                  junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                  junos:must "(!(".. remote-backup-calculation"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
                  type empty;
                  description
                    "Use spring backup paths for inet.0 routes";
                }
    
                leaf disable {
                  junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  type empty;
                  description
                    "Do not run backup SPF";
                }
    
                leaf no-install {
                  type empty;
                  description
                    "Do not install backup nexthops into the RIB";
                }
    
                leaf downstream-paths-only {
                  junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  type empty;
                  description
                    "Use only downstream backup paths";
                }
    
                container per-prefix-calculation {
                  junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  description
                    "Calculate backup nexthops for non-best prefix originators";
                  uses apply-advanced;
    
                  leaf stubs {
                    type empty;
                    description
                      "Per prefix calculation for stubs only";
                  }
    
                  leaf summary {
                    type empty;
                    description
                      "Per prefix calculation for summary originators only";
                  }
    
                  leaf externals {
                    type empty;
                    description
                      "Per prefix calculation for externals";
                  }
    
                  leaf all {
                    type empty;
                    description
                      "Per prefix calculation for all";
                  }
                }  // container per-prefix-calculation
    
                leaf node-link-degradation {
                  junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                  junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  type empty;
                  description
                    "Degrade to link protection when nodelink protection not available";
                }
              }  // container backup-spf-options
    
              leaf prefix-export-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                description
                  "Maximum number of prefixes that can be exported";
              }
            }  // list topology
    
            container backup-spf-options {
              description
                "Configure options for backup SPF";
              uses apply-advanced;
    
              container remote-backup-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable remote-backup-calculation";
                description
                  "Calculate Remote LFA backup nexthops";
                uses apply-advanced;
    
                container pq-nodes-nearest-to-source {
                  description
                    "PQ nodes selection based upon nearest to source";
                  uses apply-advanced;
    
                  leaf percent {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "10 .. 100";
                      }
                    }
                    description
                      "Selection percentage for nearest to source";
                  }
                }  // container pq-nodes-nearest-to-source
              }  // container remote-backup-calculation
    
              container use-post-convergence-lfa {
                junos:must "("protocols ospf source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                presence
                  "enable use-post-convergence-lfa";
                description
                  "Calculate post-convergence backup paths";
                uses apply-advanced;
    
                leaf maximum-labels {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 8";
                    }
                  }
                  description
                    "Maximum number of labels installed for post-convergence paths";
                }
    
                leaf maximum-backup-paths {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 8";
                    }
                  }
                  description
                    "Maximum number of equal-cost post-convergence paths installed";
                }
              }  // container use-post-convergence-lfa
    
              leaf use-source-packet-routing {
                junos:must "(".. .. source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                junos:must "(!(".. remote-backup-calculation"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
                type empty;
                description
                  "Use spring backup paths for inet.0 routes";
              }
    
              leaf disable {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Do not run backup SPF";
              }
    
              leaf no-install {
                type empty;
                description
                  "Do not install backup nexthops into the RIB";
              }
    
              leaf downstream-paths-only {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Use only downstream backup paths";
              }
    
              container per-prefix-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                description
                  "Calculate backup nexthops for non-best prefix originators";
                uses apply-advanced;
    
                leaf stubs {
                  type empty;
                  description
                    "Per prefix calculation for stubs only";
                }
    
                leaf summary {
                  type empty;
                  description
                    "Per prefix calculation for summary originators only";
                }
    
                leaf externals {
                  type empty;
                  description
                    "Per prefix calculation for externals";
                }
    
                leaf all {
                  type empty;
                  description
                    "Per prefix calculation for all";
                }
              }  // container per-prefix-calculation
    
              leaf node-link-degradation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Degrade to link protection when nodelink protection not available";
              }
            }  // container backup-spf-options
    
            container traffic-engineering {
              presence
                "enable traffic-engineering";
              description
                "Configure traffic engineering attributes";
              uses apply-advanced;
    
              leaf no-topology {
                type empty;
                description
                  "Disable dissemination of TE link-state topology information";
              }
    
              leaf multicast-rpf-routes {
                junos:must "(!(".. .. topology $$={ipv4-multicast}"))";
                junos:must-message "multicast-rpf-routes cannot be used with topology ipv4-multicast";
                junos:must "(".. shortcuts")";
                junos:must-message "multicast-rpf-routes cannot be used without shortcuts";
                type empty;
                description
                  "Install routes for multicast RPF checks into inet.2";
              }
    
              leaf l3-unicast-topology {
                type empty;
                description
                  "Download IGP topology into TED";
              }
    
              container ignore-lsp-metrics {
                presence
                  "enable ignore-lsp-metrics";
                description
                  "Ignore label-switched path metrics when doing shortcuts";
                uses apply-advanced;
    
                leaf unconfigured-only {
                  type empty;
                  description
                    "Ignore lsp metrics for unconfigured only";
                }
              }  // container ignore-lsp-metrics
    
              container shortcuts {
                presence "enable shortcuts";
                description
                  "Use label-switched paths as next hops, if possible";
                uses apply-advanced;
    
                leaf ignore-lsp-metrics {
                  type empty;
                  status deprecated;
                  description
                    "Ignore label-switched path metrics when doing shortcuts";
                }
    
                leaf lsp-metric-into-summary {
                  type empty;
                  description
                    "Advertise LSP metric into summary LSAs";
                }
    
                list family {
                  key "name";
                  ordered-by user;
                  description
                    "Address family specific traffic-engineering attributes";
                  leaf name {
                    type enumeration {
                      enum "inet" {
                        value 0;
                        description
                          "IPv4 family";
                      }
                      enum "inet-mpls" {
                        value 1;
                        description
                          "IPv4-MPLS family";
                      }
                    }
                  }
    
                  uses apply-advanced;
                }  // list family
              }  // container shortcuts
    
              leaf advertise-unnumbered-interfaces {
                type empty;
                description
                  "Advertise unnumbered interfaces";
              }
    
              leaf credibility-protocol-preference {
                type empty;
                description
                  "TED protocol credibility follows protocol preference";
              }
    
              container advertisement {
                description
                  "Advertise TE parameters even if RSVP is not turned on";
                uses apply-advanced;
    
                leaf always {
                  type empty;
                  description
                    "Advertise TE parameters in TE LSAs";
                }
              }  // container advertisement
            }  // container traffic-engineering
    
            container source-packet-routing {
              junos:must "(!(".. .. .. protocols mpls disable"))";
              junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
              junos:must "(".. .. .. protocols mpls ")";
              junos:must-message "SPRING configuration is not allowed without 'protocols mpls'";
              presence
                "enable source-packet-routing";
              description
                "Enable source packet routing (SPRING)";
              uses apply-advanced;
    
              container adjacency-segment {
                description
                  "Attributes for adjacency segments in spring";
                uses apply-advanced;
    
                leaf hold-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "180000 .. 900000";
                    }
                  }
                  description
                    "Retain time of Adjacency segment after isolating from an interface";
                }
              }  // container adjacency-segment
    
              leaf-list prefix-segment {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Prefix Segment policy";
              }
    
              leaf explicit-null {
                type empty;
                description
                  "Set E and P bits in all Prefix SID advertisements";
              }
    
              container node-segment {
                presence "enable node-segment";
                description
                  "Enable support for Node segments in SPRING";
                uses apply-advanced;
    
                leaf ipv4-index {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 199999";
                    }
                  }
                  description
                    "Set ipv4 node segment index";
                }
    
                leaf index-range {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "32 .. 16385";
                    }
                  }
                  description
                    "Set range of node segment indices allowed";
                }
              }  // container node-segment
    
              container srgb {
                junos:must "(!(".. node-segment index-range"))";
                junos:must-message "Can not be configured with node-segment index-range";
                description
                  "Set the SRGB global block in SPRING";
                leaf start-label {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32;
                  }
                  description
                    "Start range for SRGB label block";
                }
    
                leaf index-range {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32;
                  }
                  description
                    "Index to the SRGB start label block";
                }
              }  // container srgb
    
              leaf mapping-server {
                junos:must "(".. node-segment")";
                junos:must-message "protocols ospf source-packet-routing node-segment must be defined";
                junos:must "("routing-options source-packet-routing mapping-server-entry $$")";
                junos:must-message "Referenced source-packet-routing mapping-server-entry must be defined";
                type string;
                description
                  "Mapping server name";
              }
    
              leaf install-prefix-sid-for-best-route {
                type empty;
                description
                  "For best route install a exact prefix sid route";
              }
    
              leaf ldp-stitching {
                type empty;
                description
                  "Enable SR to LDP stitching";
              }
    
              leaf-list flex-algorithm {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 255";
                  }
                }
                max-elements 16;
                description
                  "Flex-algorithms we would like to participate in";
              }
            }  // container source-packet-routing
    
            list area {
              key "name";
              ordered-by user;
              description
                "Configure an OSPF area";
              leaf name {
                type jt:areaid;
                description "Area ID";
              }
    
              uses apply-advanced;
    
              choice stub-option {
                container stub {
                  presence "enable stub";
                  description
                    "Configure a stub area";
                  leaf default-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16777215";
                      }
                    }
                    description
                      "Metric for the default route in this stub area";
                  }
    
                  choice summaries-choice {
                    leaf summaries {
                      type empty;
                      description
                        "Flood summary LSAs into this stub area";
                    }
                    leaf no-summaries {
                      type empty;
                      description
                        "Don't flood summary LSAs into this stub area";
                    }
                  }  // choice summaries-choice
                }  // container stub
                container nssa {
                  presence "enable nssa";
                  description
                    "Configure a not-so-stubby area";
                  uses apply-advanced;
    
                  container default-lsa {
                    presence
                      "enable default-lsa";
                    description
                      "Configure a default LSA";
                    uses apply-advanced;
    
                    leaf default-metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 16777215";
                        }
                      }
                      description
                        "Metric for the default route in this area";
                    }
    
                    leaf metric-type {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 2";
                        }
                      }
                      description
                        "External metric type for the default type 7 LSA";
                    }
    
                    leaf type-7 {
                      type empty;
                      description
                        "Flood type 7 default LSA if no-summaries is configured";
                    }
                  }  // container default-lsa
    
                  leaf default-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16777215";
                      }
                    }
                    status deprecated;
                    description
                      "Metric for the default route in this area";
                  }
    
                  leaf metric-type {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 2";
                      }
                    }
                    status deprecated;
                    description
                      "External metric type for the default type 7 LSA";
                  }
    
                  choice summaries-choice {
                    leaf summaries {
                      type empty;
                      description
                        "Flood summary LSAs into this NSSA area";
                    }
                    leaf no-summaries {
                      type empty;
                      description
                        "Don't flood summary LSAs into this NSSA area";
                    }
                  }  // choice summaries-choice
    
                  list area-range {
                    key "name";
                    ordered-by user;
                    description
                      "Configure NSSA area ranges";
                    leaf name {
                      type jt:ipprefix;
                      description
                        "Range to summarize NSSA routes in this area";
                    }
    
                    uses apply-advanced;
    
                    leaf restrict {
                      type empty;
                      description
                        "Restrict advertisement of this area range";
                    }
    
                    leaf exact {
                      type empty;
                      description
                        "Enforce exact match for advertisement of this area range";
                    }
    
                    container override-metric {
                      presence
                        "enable override-metric";
                      description
                        "Override the dynamic metric for this area-range";
                      uses apply-advanced;
    
                      leaf metric {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "1 .. 16777215";
                          }
                        }
                        description
                          "Metric value";
                      }
    
                      leaf metric-type {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "1 .. 2";
                          }
                        }
                        default "1";
                        description
                          "Set the metric type for the override metric";
                      }
                    }  // container override-metric
                  }  // list area-range
                }  // container nssa
              }  // choice stub-option
    
              list area-range {
                key "name";
                ordered-by user;
                description
                  "Configure area ranges";
                leaf name {
                  type jt:ipprefix;
                  description
                    "Range to summarize routes in this area";
                }
    
                uses apply-advanced;
    
                leaf restrict {
                  type empty;
                  description
                    "Restrict advertisement of this area range";
                }
    
                leaf exact {
                  type empty;
                  description
                    "Enforce exact match for advertisement of this area range";
                }
    
                leaf override-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  description
                    "Override the dynamic metric for this area-range";
                }
              }  // list area-range
    
              leaf-list network-summary-export {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Export policy for Type 3 Summary LSAs";
              }
    
              leaf-list network-summary-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for Type 3 Summary LSAs";
              }
    
              leaf-list inter-area-prefix-export {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Export policy for Inter Area Prefix LSAs";
              }
    
              leaf-list inter-area-prefix-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for Inter Area Prefix LSAs";
              }
    
              leaf authentication-type {
                type enumeration {
                  enum "none" {
                    value 0;
                    status deprecated;
                    description
                      "No authentication";
                  }
                  enum "simple" {
                    value 1;
                    status deprecated;
                    description
                      "Simple password authentication";
                  }
                  enum "md5" {
                    value 2;
                    status deprecated;
                    description
                      "MD5 authentication";
                  }
                }
                status deprecated;
                description
                  "Authentication type";
              }
    
              list virtual-link {
                junos:must "(".. .. area $$={0.0.0.0}")";
                junos:must-message "virtual link can be configured only under backbone area";
                key "neighbor-id transit-area";
                ordered-by user;
                description
                  "Configure virtual links";
                leaf neighbor-id {
                  type jt:ipv4addr;
                  description
                    "Router ID of a virtual neighbor";
                }
    
                leaf transit-area {
                  type jt:areaid;
                  description
                    "Transit area in common with virtual neighbor";
                }
    
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable this virtual link";
                  }
                }  // choice enable-disable
    
                leaf retransmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Retransmission interval (seconds)";
                }
    
                leaf transit-delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Transit delay (seconds)";
                }
    
                leaf hello-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Hello interval (seconds)";
                }
    
                leaf dead-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Dead interval (seconds)";
                }
    
                leaf mtu {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "128 .. 65535";
                    }
                  }
                  description
                    "Maximum OSPF packet size";
                }
    
                choice auth {
                  container authentication {
                    uses juniper-ospf-authentication;
                  }  // container authentication
                  container authentication-key {
                    status deprecated;
                    description
                      "Authentication key";
                    leaf keyname {
                      type jt:unreadable;
                      description
                        "Authentication key value";
                    }
    
                    leaf key-id {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 255";
                        }
                      }
                      description
                        "Key ID for MD5 authentication";
                    }
                  }  // container authentication-key
                }  // choice auth
    
                leaf demand-circuit {
                  type empty;
                  description
                    "Interface functions as a demand circuit";
                }
    
                leaf flood-reduction {
                  type empty;
                  description
                    "Enable flood reduction";
                }
    
                leaf no-neighbor-down-notification {
                  type empty;
                  description
                    "Don't inform other protocols about neighbor down events";
                }
    
                leaf ipsec-sa {
                  junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                  junos:must-message "Must not configure ipsec-sa for st0 interface";
                  junos:must "("security ipsec security-association $$ manual")";
                  junos:must-message "Referenced IPSec security association must be a manual SA";
                  junos:must "("security ipsec security-association $$ mode transport")";
                  junos:must-message "Referenced IPSec security association must be in transport mode";
                  junos:must "("security ipsec security-association $$")";
                  junos:must-message "Referenced IPSec security association must be defined";
                  type string {
                    length "1 .. 32";
                  }
                  description
                    "IPSec security association name";
                }
    
                list topology {
                  key "name";
                  ordered-by user;
                  description
                    "Topology specific attributes";
                  leaf name {
                    type string;
                    description "Topology name";
                  }
    
                  uses apply-advanced;
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this topology";
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Topology metric";
                  }
    
                  container bandwidth-based-metrics {
                    junos:must "(".. metric")";
                    junos:must-message "Metric must be configured";
                    description
                      "Configure bandwidth based metrics";
                    uses apply-advanced;
    
                    list bandwidth {
                      key "name";
                      description
                        "Bandwidth threshold";
                      leaf name {
                        type string;
                      }
    
                      leaf metric {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint16 {
                            range "1 .. 65535";
                          }
                        }
                        description
                          "Metric associated with specified bandwidth";
                      }
                    }  // list bandwidth
                  }  // container bandwidth-based-metrics
                }  // list topology
              }  // list virtual-link
    
              list sham-link-remote {
                key "name";
                ordered-by user;
                description
                  "Configure parameters for remote sham link endpoint";
                leaf name {
                  junos:must "(!(".. .. .. sham-link local $$"))";
                  junos:must-message "Local and remote sham link endpoint addresses must be different";
                  junos:must "(".. .. .. sham-link local")";
                  junos:must-message "Local sham link endpoint must be configured";
                  type jt:ipaddr;
                  description
                    "Remote sham link endpoint address";
                }
    
                uses apply-advanced;
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Sham link metric";
                }
    
                leaf ipsec-sa {
                  junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                  junos:must-message "Must not configure ipsec-sa for st0 interface";
                  junos:must "("security ipsec security-association $$ manual")";
                  junos:must-message "Referenced IPSec security association must be a manual SA";
                  junos:must "("security ipsec security-association $$ mode transport")";
                  junos:must-message "Referenced IPSec security association must be in transport mode";
                  junos:must "("security ipsec security-association $$")";
                  junos:must-message "Referenced IPSec security association must be defined";
                  type string {
                    length "1 .. 32";
                  }
                  description
                    "IPSec security association name";
                }
    
                leaf demand-circuit {
                  type empty;
                  description
                    "Interface functions as a demand circuit";
                }
    
                leaf flood-reduction {
                  type empty;
                  description
                    "Enable flood reduction";
                }
    
                list topology {
                  key "name";
                  ordered-by user;
                  description
                    "Topology specific attributes";
                  leaf name {
                    type string;
                    description "Topology name";
                  }
    
                  uses apply-advanced;
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this topology";
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Topology metric";
                  }
    
                  container bandwidth-based-metrics {
                    junos:must "(".. metric")";
                    junos:must-message "Metric must be configured";
                    description
                      "Configure bandwidth based metrics";
                    uses apply-advanced;
    
                    list bandwidth {
                      key "name";
                      description
                        "Bandwidth threshold";
                      leaf name {
                        type string;
                      }
    
                      leaf metric {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint16 {
                            range "1 .. 65535";
                          }
                        }
                        description
                          "Metric associated with specified bandwidth";
                      }
                    }  // list bandwidth
                  }  // container bandwidth-based-metrics
                }  // list topology
              }  // list sham-link-remote
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Include an interface in this area";
                leaf name {
                  junos:must "((!(".. interface-type nbma") || (!(("interfaces $$" || any "logical-systems <*> interfaces $$")) || (any "interfaces $$-IFL family inet address <*>" || any "logical-systems <*> interfaces $$-IFL family inet address <*>"))))";
                  junos:must-message "IPv4 address must be configured on the interface for nbma mode";
                  type union {
                    type jt:ipv4addr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable OSPF on this interface";
                  }
                }  // choice enable-disable
    
                leaf interface-type {
                  type enumeration {
                    enum "nbma" {
                      value 0;
                      description
                        "Nonbroadcast multiaccess";
                    }
                    enum "p2mp" {
                      value 1;
                      description
                        "Point-to-multipoint NBMA";
                    }
                    enum "p2p" {
                      value 2;
                      description
                        "Point-to-point";
                    }
                    enum "p2mp-over-lan" {
                      value 3;
                      description
                        "Point-to-multipoint over LAN mode";
                    }
                  }
                  description
                    "Type of interface";
                }
    
                choice protection-type {
                  leaf link-protection {
                    type empty;
                    description
                      "Protect interface from link faults only";
                  }
                  leaf node-link-protection {
                    type empty;
                    description
                      "Protect interface from both link and node faults";
                  }
                }  // choice protection-type
    
                leaf no-eligible-backup {
                  type empty;
                  description
                    "Not eligible to backup traffic from protected interfaces";
                }
    
                leaf no-eligible-remote-backup {
                  type empty;
                  description
                    "Not eligible for Remote-LFA backup traffic from protected interfaces";
                }
    
                container passive {
                  presence "enable passive";
                  description
                    "Do not run OSPF, but advertise it";
                  uses apply-advanced;
    
                  container traffic-engineering {
                    description
                      "Advertise TE link information";
                    uses apply-advanced;
    
                    leaf remote-node-id {
                      type jt:ipaddr;
                      description
                        "Remote address of the link";
                    }
    
                    leaf remote-node-router-id {
                      junos:must "(".. remote-node-id")";
                      junos:must-message "remote-node-id must be configured";
                      type jt:ipv4addr;
                      description
                        "TE Router-ID of the remote node";
                    }
                  }  // container traffic-engineering
                }  // container passive
    
                leaf secondary {
                  junos:must "(!(" .. ipsec-sa"))";
                  junos:must-message "secondary interface cannot have ipsec-sa configured";
                  junos:must "(!(" .. dynamic-neighbors"))";
                  junos:must-message "secondary interface cannot have dynamic-neighbors configured";
                  junos:must "(!(" .. neighbor"))";
                  junos:must-message "secondary interface cannot have configured neighbors";
                  junos:must "(!(" .. interface-type p2mp"))";
                  junos:must-message "secondary interface cannot be set as type p2mp";
                  junos:must "(!(" .. interface-type nbma"))";
                  junos:must-message "secondary interface cannot be set as type nbma";
                  junos:must "(!(" .. passive"))";
                  junos:must-message "secondary interface cannot be configured passive";
                  type empty;
                  description
                    "Treat interface as secondary";
                }
    
                leaf own-router-lsa {
                  type empty;
                  description
                    "Generate a separate router LSA for this interface";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Interface metric";
                }
    
                leaf priority {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255";
                    }
                  }
                  description
                    "Designated router priority";
                }
    
                leaf retransmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Retransmission interval (seconds)";
                }
    
                leaf transit-delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Transit delay (seconds)";
                }
    
                leaf hello-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Hello interval (seconds)";
                }
    
                leaf dead-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Dead interval (seconds)";
                }
    
                leaf mtu {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "128 .. 65535";
                    }
                  }
                  description
                    "Maximum OSPF packet size";
                }
    
                choice auth {
                  container authentication {
                    uses juniper-ospf-authentication;
                  }  // container authentication
                  container authentication-key {
                    status deprecated;
                    description
                      "Authentication key";
                    leaf keyname {
                      type jt:unreadable;
                      description
                        "Authentication key value";
                    }
    
                    leaf key-id {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 255";
                        }
                      }
                      description
                        "Key ID for MD5 authentication";
                    }
                  }  // container authentication-key
                }  // choice auth
    
                leaf demand-circuit {
                  type empty;
                  description
                    "Interface functions as a demand circuit";
                }
    
                leaf flood-reduction {
                  type empty;
                  description
                    "Enable flood reduction";
                }
    
                leaf no-neighbor-down-notification {
                  type empty;
                  description
                    "Don't inform other protocols about neighbor down events";
                }
    
                leaf ipsec-sa {
                  junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                  junos:must-message "Must not configure ipsec-sa for st0 interface";
                  junos:must "("security ipsec security-association $$ manual")";
                  junos:must-message "Referenced IPSec security association must be a manual SA";
                  junos:must "("security ipsec security-association $$ mode transport")";
                  junos:must-message "Referenced IPSec security association must be in transport mode";
                  junos:must "("security ipsec security-association $$")";
                  junos:must-message "Referenced IPSec security association must be defined";
                  type string {
                    length "1 .. 32";
                  }
                  description
                    "IPSec security association name";
                }
    
                list topology {
                  key "name";
                  ordered-by user;
                  description
                    "Topology specific attributes";
                  leaf name {
                    type string;
                    description "Topology name";
                  }
    
                  uses apply-advanced;
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this topology";
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Topology metric";
                  }
    
                  container bandwidth-based-metrics {
                    junos:must "(".. metric")";
                    junos:must-message "Metric must be configured";
                    description
                      "Configure bandwidth based metrics";
                    uses apply-advanced;
    
                    list bandwidth {
                      key "name";
                      description
                        "Bandwidth threshold";
                      leaf name {
                        type string;
                      }
    
                      leaf metric {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint16 {
                            range "1 .. 65535";
                          }
                        }
                        description
                          "Metric associated with specified bandwidth";
                      }
                    }  // list bandwidth
                  }  // container bandwidth-based-metrics
                }  // list topology
    
                leaf transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  status deprecated;
                  description
                    "OSPF packet transmit interval (milliseconds)";
                }
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  container authentication {
                    description
                      "Authentication options";
                    uses apply-advanced;
    
                    leaf key-chain {
                      junos:must "(".. algorithm")";
                      junos:must-message "May not be configured without algorithm";
                      junos:must "("security authentication-key-chains key-chain $$")";
                      junos:must-message "Referenced key-chain must be defined";
                      type string;
                      description
                        "Key chain name";
                    }
    
                    leaf algorithm {
                      junos:must "(".. key-chain")";
                      junos:must-message "May not be configured without key-chain";
                      type enumeration {
                        enum "simple-password" {
                          value 0;
                          description
                            "Simple password";
                        }
                        enum "keyed-md5" {
                          value 1;
                          description
                            "Keyed message Digest 5";
                        }
                        enum
                          "meticulous-keyed-md5" {
                          value 2;
                          description
                            "Meticulous keyed message Digest 5";
                        }
                        enum "keyed-sha-1" {
                          value 3;
                          description
                            "Keyed secure hash algorithm (SHA1) ";
                        }
                        enum
                          "meticulous-keyed-sha-1" {
                          value 4;
                          description
                            "Meticulous keyed secure hash algorithm (SHA1) ";
                        }
                      }
                      description
                        "Algorithm name";
                    }
    
                    leaf loose-check {
                      type empty;
                      description
                        "Verify authentication only if authentication is negotiated";
                    }
                  }  // container authentication
    
                  leaf full-neighbors-only {
                    type empty;
                    description
                      "Setup BFD sessions only to Full neighbors";
                  }
    
                  leaf holddown-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Time to hold the session-UP notification to the client";
                  }
                }  // container bfd-liveness-detection
    
                leaf dynamic-neighbors {
                  junos:must "(" .. interface-type p2mp")";
                  junos:must-message "dynamic-neighbors option can be set only if the interface type is p2mp";
                  type empty;
                  description
                    "Learn neighbors dynamically on a p2mp interface";
                }
    
                leaf no-advertise-adjacency-segment {
                  type empty;
                  description
                    "Do not advertise an adjacency segment for this interface";
                }
    
                list neighbor {
                  junos:must "(!(" .. dynamic-neighbors"))";
                  junos:must-message "Neighbors cannot be specified manually if dynamic-neighbors is set";
                  key "name";
                  ordered-by user;
                  description "NBMA neighbor";
                  leaf name {
                    type jt:ipaddr;
                    description
                      "Address of neighbor";
                  }
    
                  leaf eligible {
                    type empty;
                    description
                      "Eligible to be DR on an NBMA network";
                  }
                }  // list neighbor
    
                leaf poll-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Poll interval for NBMA interfaces";
                }
    
                leaf no-interface-state-traps {
                  type empty;
                  description
                    "Do not send interface state change traps";
                }
    
                leaf strict-bfd {
                  junos:must "(" .. bfd-liveness-detection")";
                  junos:must-message "strict bfd cannot be configured without bfd.";
                  junos:must "(!(" .. bfd-liveness-detection full-neighbors-only"))";
                  junos:must-message "full-neighbors-only and strict-bfd cannot be configured together";
                  type empty;
                  description
                    "Enable strict bfd over this interface";
                }
    
                container post-convergence-lfa {
                  junos:must "("protocols ospf backup-spf-options use-post-convergence-lfa")";
                  junos:must-message "Not allowed without 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                  presence
                    "enable post-convergence-lfa";
                  description
                    "Protect interface using post-convergence backup path";
                  uses apply-advanced;
    
                  container node-protection {
                    presence
                      "enable node-protection";
                    description
                      "Compute backup path assuming node failure";
                    uses apply-advanced;
    
                    leaf cost {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Cost for node protection";
                    }
                  }  // container node-protection
    
                  leaf srlg-protection {
                    type empty;
                    description
                      "Compute backup path assuming SRLG failure";
                  }
    
                  leaf fate-sharing-protection {
                    type empty;
                    description
                      "Compute backup path assuming fate-sharing group failure";
                  }
                }  // container post-convergence-lfa
    
                leaf te-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description
                    "Traffic engineering metric";
                }
    
                container ldp-synchronization {
                  presence
                    "enable ldp-synchronization";
                  description
                    "Advertise maximum metric until LDP is operational";
                  uses ldp-sync-obj;
                }  // container ldp-synchronization
    
                container ipv4-adjacency-segment {
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                  description
                    "Configure ipv4 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    description
                      "Adjacency SID is eligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container protected
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container unprotected
                }  // container ipv4-adjacency-segment
    
                list lan-neighbor {
                  junos:must "(!(".. ipv4-adjacency-segment"))";
                  junos:must-message "lan-neighbor can't be configured if ipv4-adjacency-segment is configured in the same interface";
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "lan-neighbor can't be configured if no-advertise-adjacency-segment is configured in the same interface ";
                  junos:must "(!(".. interface-type p2p"))";
                  junos:must-message "lan-neighbor can't be configured for point-to-point interfaces";
                  key "name";
                  ordered-by user;
                  description
                    "Configuration specific to a LAN neighbor";
                  leaf name {
                    type jt:ipaddr;
                    description
                      "Address of neighbor";
                  }
    
                  uses apply-advanced;
    
                  container ipv4-adjacency-segment {
                    junos:must "(!(".. no-advertise-adjacency-segment"))";
                    junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                    description
                      "Configure ipv4 adjacency segment";
                    uses apply-advanced;
    
                    container protected {
                      description
                        "Adjacency SID is eligible for protection";
                      choice adjsid-type {
                        container index {
                          description
                            "Adjacency SID indexed from SRGB";
                          leaf index-number {
                            type union {
                              type string {
                                pattern
                                  "<.*>|$.*";
                              }
                              type uint32 {
                                range
                                  "0 .. 199999";
                              }
                            }
                          }
                        }  // container index
                        leaf label {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "16 .. 1048575";
                            }
                          }
                          description
                            "Adjacency SID from static label pool";
                        }
                        leaf dynamic {
                          type empty;
                          description
                            "Dynamically allocate an adjacency segment";
                        }
                      }  // choice adjsid-type
                    }  // container protected
    
                    container unprotected {
                      description
                        "Adjacency SID uneligible for protection";
                      choice adjsid-type {
                        container index {
                          description
                            "Adjacency SID indexed from SRGB";
                          leaf index-number {
                            type union {
                              type string {
                                pattern
                                  "<.*>|$.*";
                              }
                              type uint32 {
                                range
                                  "0 .. 199999";
                              }
                            }
                          }
                        }  // container index
                        leaf label {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "16 .. 1048575";
                            }
                          }
                          description
                            "Adjacency SID from static label pool";
                        }
                        leaf dynamic {
                          type empty;
                          description
                            "Dynamically allocate an adjacency segment";
                        }
                      }  // choice adjsid-type
                    }  // container unprotected
                  }  // container ipv4-adjacency-segment
                }  // list lan-neighbor
              }  // list interface
    
              leaf no-context-identifier-advertisement {
                junos:must "(!(".. context-identifier"))";
                junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
                type empty;
                description
                  "Disable context identifier advertisments in this area";
              }
    
              list peer-interface {
                key "name";
                ordered-by user;
                description
                  "Configuration for peer interface";
                leaf name {
                  type string;
                  description
                    "Name of peer interface";
                }
    
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable OSPF on this control peer";
                  }
                }  // choice enable-disable
    
                leaf retransmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Retransmission interval (seconds)";
                }
    
                leaf transit-delay {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Transit delay (seconds)";
                }
    
                leaf hello-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Hello interval (seconds)";
                }
    
                leaf dead-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Dead interval (seconds)";
                }
    
                leaf mtu {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "128 .. 65535";
                    }
                  }
                  description
                    "Maximum OSPF packet size";
                }
    
                choice auth {
                  container authentication {
                    uses juniper-ospf-authentication;
                  }  // container authentication
                  container authentication-key {
                    status deprecated;
                    description
                      "Authentication key";
                    leaf keyname {
                      type jt:unreadable;
                      description
                        "Authentication key value";
                    }
    
                    leaf key-id {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "0 .. 255";
                        }
                      }
                      description
                        "Key ID for MD5 authentication";
                    }
                  }  // container authentication-key
                }  // choice auth
    
                leaf demand-circuit {
                  type empty;
                  description
                    "Interface functions as a demand circuit";
                }
    
                leaf flood-reduction {
                  type empty;
                  description
                    "Enable flood reduction";
                }
    
                leaf no-neighbor-down-notification {
                  type empty;
                  description
                    "Don't inform other protocols about neighbor down events";
                }
              }  // list peer-interface
    
              leaf no-source-packet-routing {
                type empty;
                description
                  "Disable SPRING in this area";
              }
    
              list context-identifier {
                junos:must "(!(".. no-context-identifier-advertisement"))";
                junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
                key "name";
                ordered-by user;
                description
                  "Configure context identifier in support of edge protection";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Context identifier";
                }
    
                uses apply-advanced;
              }  // list context-identifier
    
              list label-switched-path {
                junos:must "(!(".. .. traffic-engineering multicast-rpf-routes"))";
                junos:must-message "cannot advertise LSPs when using multicast-rpf-routes";
                key "name";
                ordered-by user;
                description
                  "Configuration for advertisement of a label-switched path";
                leaf name {
                  type string {
                    length "1 .. 64";
                  }
                  description
                    "Name of label-switched path to be advertised";
                }
    
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable OSPF on this label-switched path";
                  }
                }  // choice enable-disable
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Interface metric";
                }
    
                list topology {
                  key "name";
                  ordered-by user;
                  description
                    "Topology specific attributes";
                  leaf name {
                    type string;
                    description "Topology name";
                  }
    
                  uses apply-advanced;
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this topology";
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Topology metric";
                  }
    
                  container bandwidth-based-metrics {
                    junos:must "(".. metric")";
                    junos:must-message "Metric must be configured";
                    description
                      "Configure bandwidth based metrics";
                    uses apply-advanced;
    
                    list bandwidth {
                      key "name";
                      description
                        "Bandwidth threshold";
                      leaf name {
                        type string;
                      }
    
                      leaf metric {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint16 {
                            range "1 .. 65535";
                          }
                        }
                        description
                          "Metric associated with specified bandwidth";
                      }
                    }  // list bandwidth
                  }  // container bandwidth-based-metrics
                }  // list topology
              }  // list label-switched-path
            }  // list area
    
            choice enable-disable {
              leaf disable {
                type empty;
                description "Disable OSPF";
              }
            }  // choice enable-disable
    
            container traceoptions {
              description
                "Trace options for OSPF";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "spf" {
                      value 0;
                      description
                        "Trace SPF calculations";
                    }
                    enum "error" {
                      value 1;
                      description
                        "Trace errored packets";
                    }
                    enum "event" {
                      value 2;
                      description
                        "Trace OSPF state machine events";
                    }
                    enum "packet-dump" {
                      value 3;
                      description
                        "Dump the contents of selected packet types";
                    }
                    enum "flooding" {
                      value 4;
                      description
                        "Trace LSA flooding";
                    }
                    enum "lsa-analysis" {
                      value 5;
                      description
                        "Trace LSA analysis";
                    }
                    enum "packets" {
                      value 6;
                      description
                        "Trace all OSPF packets";
                    }
                    enum "hello" {
                      value 7;
                      description
                        "Trace hello packets";
                    }
                    enum "database-description" {
                      value 8;
                      description
                        "Trace database description packets";
                    }
                    enum "lsa-request" {
                      value 9;
                      description
                        "Trace LSA request packets";
                    }
                    enum "lsa-update" {
                      value 10;
                      description
                        "Trace LSA update packets";
                    }
                    enum "lsa-ack" {
                      value 11;
                      description
                        "Trace LSA acknowledgment packets";
                    }
                    enum "ldp-synchronization" {
                      value 12;
                      description
                        "Trace synchronization between OSPF and LDP";
                    }
                    enum "on-demand" {
                      value 13;
                      description
                        "Trace demand circuit extensions";
                    }
                    enum "nsr-synchronization" {
                      value 14;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "graceful-restart" {
                      value 15;
                      description
                        "Trace graceful restart";
                    }
                    enum "restart-signaling" {
                      value 16;
                      description
                        "Trace restart signaling";
                    }
                    enum "backup-spf" {
                      value 17;
                      description
                        "Trace backup SPF (LFA) specific events";
                    }
                    enum "source-packet-routing" {
                      value 18;
                      description
                        "Trace source packet routing (SPRING) events";
                    }
                    enum "post-convergence-lfa" {
                      value 19;
                      description
                        "Trace post-convergence-lfa related events";
                    }
                    enum "flex-algorithm" {
                      value 20;
                      description
                        "Trace flex-algorithm related events";
                    }
                    enum "route" {
                      value 21;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 22;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 23;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 24;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 25;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 26;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 27;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 28;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            container spf-options {
              description
                "Configure options for SPF";
              uses apply-advanced;
    
              leaf delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "50 .. 8000";
                  }
                }
                units "milliseconds";
                description
                  "Time to wait before running an SPF";
              }
    
              leaf holddown {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2000 .. 20000";
                  }
                }
                units "milliseconds";
                description
                  "Time to hold down before running an SPF";
              }
    
              leaf rapid-runs {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Number of maximum rapid SPF runs before holddown";
              }
    
              leaf no-ignore-our-externals {
                type empty;
                description
                  "Do not ignore self-generated external and NSSA LSAs";
              }
            }  // container spf-options
    
            leaf prefix-export-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Maximum number of prefixes that can be exported";
            }
    
            container rib-groups {
              description
                "Routing table groups for importing OSPF routes";
              uses apply-advanced;
    
              leaf inet {
                junos:must "("routing-options rib-groups $$")";
                junos:must-message "Referenced rib-groups must be defined";
                junos:must "(!(".. topology $$={default} rib-group"))";
                junos:must-message "rib-group cannot be used with topology default rib-group";
                type string;
                description
                  "Name of the IPv4/v6 routing table group";
              }
    
              leaf inet3 {
                junos:must "("routing-options rib-groups $$")";
                junos:must-message "Referenced rib-groups must be defined";
                junos:must "(!(".. topology $$={default} rib-group"))";
                junos:must-message "rib-group cannot be used with topology default rib-group";
                type string;
                description
                  "Name of the IPv4/v6 inet.3 routing table group";
              }
            }  // container rib-groups
    
            leaf job-stats {
              type empty;
              description
                "Collect job statistics";
            }
    
            container overload {
              presence "enable overload";
              description
                "Set the overload mode (repel transit traffic)";
              uses apply-advanced;
    
              leaf timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "60 .. 3600";
                  }
                }
                units "seconds";
                description
                  "Time after which overload mode is reset";
              }
    
              leaf allow-route-leaking {
                type empty;
                description
                  "Allow routes to be leaked when overload is configured";
              }
    
              leaf stub-network {
                type empty;
                description
                  "Advertise Stub Network with maximum metric";
              }
    
              leaf intra-area-prefix {
                type empty;
                description
                  "Advertise Intra Area Prefix with maximum metric";
              }
    
              leaf as-external {
                type empty;
                description
                  "Advertise As External with maximum usable metric";
              }
            }  // container overload
    
            container database-protection {
              presence
                "enable database-protection";
              description
                "Configure database protection attributes";
              uses apply-advanced;
    
              leaf maximum-lsa {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1000000";
                  }
                }
                description
                  "Maximum allowed non self-generated LSAs";
              }
    
              leaf warning-only {
                type empty;
                description
                  "Emit only a warning when LSA maximum limit is exceeded";
              }
    
              leaf warning-threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "30 .. 100";
                  }
                }
                units "percent";
                description
                  "Percentage of LSA maximum above which to trigger warning";
              }
    
              leaf ignore-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint8 {
                    range "1 .. 32";
                  }
                }
                description
                  "Maximum number of times to go into ignore state";
              }
    
              leaf ignore-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "30 .. 3600";
                  }
                }
                units "seconds";
                description
                  "Time to stay in ignore state and ignore all neighbors";
              }
    
              leaf reset-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "60 .. 86400";
                  }
                }
                units "seconds";
                description
                  "Time after which the ignore count gets reset to zero";
              }
            }  // container database-protection
    
            container graceful-restart {
              description
                "Configure graceful restart attributes";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF graceful restart capability";
                }
              }  // choice enable-disable
    
              leaf restart-duration {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 3600";
                  }
                }
                units "seconds";
                description
                  "Time for all neighbors to become full";
              }
    
              leaf notify-duration {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 3600";
                  }
                }
                units "seconds";
                description
                  "Time to send all max-aged grace LSAs";
              }
    
              container helper-disable {
                presence "enable helper-disable";
                description
                  "Disable graceful restart helper capability";
                uses apply-advanced;
    
                choice disable-choices {
                  leaf standard {
                    type empty;
                    description
                      "Disable helper-mode for rfc3623 based GR";
                  }
                  leaf restart-signaling {
                    type empty;
                    description
                      "Disable helper mode for restart-signaling ";
                  }
                  leaf both {
                    type empty;
                    description
                      "Disable helper mode for both the types of GR";
                  }
                }  // choice disable-choices
              }  // container helper-disable
    
              leaf no-strict-lsa-checking {
                junos:must "(!(".. helper-disable"))";
                junos:must-message "To configure no-strict-lsa-checking, helper-disable must not be set";
                type empty;
                description
                  "Do not abort graceful helper mode upon LSA changes";
              }
            }  // container graceful-restart
    
            leaf route-type-community {
              type enumeration {
                enum "iana" {
                  value 0;
                  description
                    "BGP extended community value used is 0x0306";
                }
                enum "vendor" {
                  value 1;
                  description
                    "Vendor BGP extended community value used is 0x8000";
                }
              }
              description
                "Specify BGP extended community value to encode OSPF route type";
            }
    
            container domain-id {
              description "Configure domain ID";
              choice domain_id_or_disable {
                leaf domain-id {
                  type string;
                  description "Domain ID";
                }
                leaf disable {
                  type empty;
                  description
                    "Disable domain ID";
                }
              }  // choice domain_id_or_disable
            }  // container domain-id
    
            choice domain_vpn_tag_or_disable {
              leaf domain-vpn-tag {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 4294967295";
                  }
                }
                description
                  "Domain VPN tag for external LSA";
              }
              leaf no-domain-vpn-tag {
                type empty;
                description
                  "Disable domain VPN tag";
              }
            }  // choice domain_vpn_tag_or_disable
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of internal routes";
            }
    
            leaf external-preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of external routes";
            }
    
            leaf labeled-preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of labeled routes";
            }
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy (for external routes or setting priority)";
            }
    
            leaf reference-bandwidth {
              type string;
              description
                "Bandwidth for calculating metric defaults";
            }
    
            leaf lsa-refresh-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "25 .. 50";
                }
              }
              default "50";
              description
                "LSA refresh interval (minutes)";
            }
    
            leaf spf-delay {
              junos:must "(!(".. spf-options delay"))";
              junos:must-message "You can only configure either spf-delay or delay under spf-options";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "50 .. 8000";
                }
              }
              units "milliseconds";
              status deprecated;
              description
                "Time to wait before running an SPF";
            }
    
            leaf no-rfc-1583 {
              type empty;
              description
                "Disable RFC1583 compatibility";
            }
    
            leaf forwarding-address-to-broadcast {
              type empty;
              description
                "Set forwarding address in Type 5 LSA in broadcast network";
            }
    
            choice nssa-abr-option {
              leaf no-nssa-abr {
                type empty;
                description
                  "Disable full NSSA functionality at ABR";
              }
            }  // choice nssa-abr-option
    
            container sham-link {
              presence "enable sham-link";
              description
                "Configure parameters for sham links";
              uses apply-advanced;
    
              leaf local {
                type jt:ipaddr;
                description
                  "Local sham link endpoint address";
              }
    
              leaf no-advertise-local {
                type empty;
                status deprecated;
                description
                  "Don't advertise local sham link endpoint as stub in router LSA";
              }
            }  // container sham-link
          }  // list realm
    
          uses apply-advanced;
    
          list topology {
            key "name";
            ordered-by user;
            description "Topology parameters";
            leaf name {
              type string;
              description "Topology name";
            }
    
            uses apply-advanced;
    
            leaf disable {
              type empty;
              description
                "Disable this topology";
            }
    
            leaf topology-id {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "32 .. 127";
                }
              }
              description "Topology identifier";
            }
    
            leaf overload {
              type empty;
              description
                "Set the overload mode (repel transit traffic)";
            }
    
            leaf rib-group {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-group must be defined";
              type string;
              description
                "Routing table group for importing routes";
            }
    
            container spf-options {
              description
                "Configure options for SPF";
              uses apply-advanced;
    
              leaf delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "50 .. 8000";
                  }
                }
                units "milliseconds";
                description
                  "Time to wait before running an SPF";
              }
    
              leaf holddown {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2000 .. 20000";
                  }
                }
                units "milliseconds";
                description
                  "Time to hold down before running an SPF";
              }
    
              leaf rapid-runs {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Number of maximum rapid SPF runs before holddown";
              }
    
              leaf no-ignore-our-externals {
                type empty;
                description
                  "Do not ignore self-generated external and NSSA LSAs";
              }
            }  // container spf-options
    
            container backup-spf-options {
              description
                "Configure options for backup SPF";
              uses apply-advanced;
    
              container remote-backup-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable remote-backup-calculation";
                description
                  "Calculate Remote LFA backup nexthops";
                uses apply-advanced;
    
                container pq-nodes-nearest-to-source {
                  description
                    "PQ nodes selection based upon nearest to source";
                  uses apply-advanced;
    
                  leaf percent {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "10 .. 100";
                      }
                    }
                    description
                      "Selection percentage for nearest to source";
                  }
                }  // container pq-nodes-nearest-to-source
              }  // container remote-backup-calculation
    
              container use-post-convergence-lfa {
                junos:must "("protocols ospf source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                presence
                  "enable use-post-convergence-lfa";
                description
                  "Calculate post-convergence backup paths";
                uses apply-advanced;
    
                leaf maximum-labels {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 8";
                    }
                  }
                  description
                    "Maximum number of labels installed for post-convergence paths";
                }
    
                leaf maximum-backup-paths {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 8";
                    }
                  }
                  description
                    "Maximum number of equal-cost post-convergence paths installed";
                }
              }  // container use-post-convergence-lfa
    
              leaf use-source-packet-routing {
                junos:must "(".. .. source-packet-routing")";
                junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
                junos:must "(!(".. remote-backup-calculation"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
                type empty;
                description
                  "Use spring backup paths for inet.0 routes";
              }
    
              leaf disable {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Do not run backup SPF";
              }
    
              leaf no-install {
                type empty;
                description
                  "Do not install backup nexthops into the RIB";
              }
    
              leaf downstream-paths-only {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Use only downstream backup paths";
              }
    
              container per-prefix-calculation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                description
                  "Calculate backup nexthops for non-best prefix originators";
                uses apply-advanced;
    
                leaf stubs {
                  type empty;
                  description
                    "Per prefix calculation for stubs only";
                }
    
                leaf summary {
                  type empty;
                  description
                    "Per prefix calculation for summary originators only";
                }
    
                leaf externals {
                  type empty;
                  description
                    "Per prefix calculation for externals";
                }
    
                leaf all {
                  type empty;
                  description
                    "Per prefix calculation for all";
                }
              }  // container per-prefix-calculation
    
              leaf node-link-degradation {
                junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
                junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                type empty;
                description
                  "Degrade to link protection when nodelink protection not available";
              }
            }  // container backup-spf-options
    
            leaf prefix-export-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Maximum number of prefixes that can be exported";
            }
          }  // list topology
    
          container backup-spf-options {
            description
              "Configure options for backup SPF";
            uses apply-advanced;
    
            container remote-backup-calculation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              presence
                "enable remote-backup-calculation";
              description
                "Calculate Remote LFA backup nexthops";
              uses apply-advanced;
    
              container pq-nodes-nearest-to-source {
                description
                  "PQ nodes selection based upon nearest to source";
                uses apply-advanced;
    
                leaf percent {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "10 .. 100";
                    }
                  }
                  description
                    "Selection percentage for nearest to source";
                }
              }  // container pq-nodes-nearest-to-source
            }  // container remote-backup-calculation
    
            container use-post-convergence-lfa {
              junos:must "("protocols ospf source-packet-routing")";
              junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
              presence
                "enable use-post-convergence-lfa";
              description
                "Calculate post-convergence backup paths";
              uses apply-advanced;
    
              leaf maximum-labels {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 8";
                  }
                }
                description
                  "Maximum number of labels installed for post-convergence paths";
              }
    
              leaf maximum-backup-paths {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 8";
                  }
                }
                description
                  "Maximum number of equal-cost post-convergence paths installed";
              }
            }  // container use-post-convergence-lfa
    
            leaf use-source-packet-routing {
              junos:must "(".. .. source-packet-routing")";
              junos:must-message "Configuration of 'protocols ospf source-packet-routing' is required";
              junos:must "(!(".. remote-backup-calculation"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options remote-backup-calculation'";
              type empty;
              description
                "Use spring backup paths for inet.0 routes";
            }
    
            leaf disable {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Do not run backup SPF";
            }
    
            leaf no-install {
              type empty;
              description
                "Do not install backup nexthops into the RIB";
            }
    
            leaf downstream-paths-only {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Use only downstream backup paths";
            }
    
            container per-prefix-calculation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              description
                "Calculate backup nexthops for non-best prefix originators";
              uses apply-advanced;
    
              leaf stubs {
                type empty;
                description
                  "Per prefix calculation for stubs only";
              }
    
              leaf summary {
                type empty;
                description
                  "Per prefix calculation for summary originators only";
              }
    
              leaf externals {
                type empty;
                description
                  "Per prefix calculation for externals";
              }
    
              leaf all {
                type empty;
                description
                  "Per prefix calculation for all";
              }
            }  // container per-prefix-calculation
    
            leaf node-link-degradation {
              junos:must "(!("protocols ospf backup-spf-options use-post-convergence-lfa"))";
              junos:must-message "Not allowed with 'protocols ospf backup-spf-options use-post-convergence-lfa'";
              type empty;
              description
                "Degrade to link protection when nodelink protection not available";
            }
          }  // container backup-spf-options
    
          container traffic-engineering {
            presence
              "enable traffic-engineering";
            description
              "Configure traffic engineering attributes";
            uses apply-advanced;
    
            leaf no-topology {
              type empty;
              description
                "Disable dissemination of TE link-state topology information";
            }
    
            leaf multicast-rpf-routes {
              junos:must "(!(".. .. topology $$={ipv4-multicast}"))";
              junos:must-message "multicast-rpf-routes cannot be used with topology ipv4-multicast";
              junos:must "(".. shortcuts")";
              junos:must-message "multicast-rpf-routes cannot be used without shortcuts";
              type empty;
              description
                "Install routes for multicast RPF checks into inet.2";
            }
    
            leaf l3-unicast-topology {
              type empty;
              description
                "Download IGP topology into TED";
            }
    
            container ignore-lsp-metrics {
              presence
                "enable ignore-lsp-metrics";
              description
                "Ignore label-switched path metrics when doing shortcuts";
              uses apply-advanced;
    
              leaf unconfigured-only {
                type empty;
                description
                  "Ignore lsp metrics for unconfigured only";
              }
            }  // container ignore-lsp-metrics
    
            container shortcuts {
              presence "enable shortcuts";
              description
                "Use label-switched paths as next hops, if possible";
              uses apply-advanced;
    
              leaf ignore-lsp-metrics {
                type empty;
                status deprecated;
                description
                  "Ignore label-switched path metrics when doing shortcuts";
              }
    
              leaf lsp-metric-into-summary {
                type empty;
                description
                  "Advertise LSP metric into summary LSAs";
              }
    
              list family {
                key "name";
                ordered-by user;
                description
                  "Address family specific traffic-engineering attributes";
                leaf name {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet-mpls" {
                      value 1;
                      description
                        "IPv4-MPLS family";
                    }
                  }
                }
    
                uses apply-advanced;
              }  // list family
            }  // container shortcuts
    
            leaf advertise-unnumbered-interfaces {
              type empty;
              description
                "Advertise unnumbered interfaces";
            }
    
            leaf credibility-protocol-preference {
              type empty;
              description
                "TED protocol credibility follows protocol preference";
            }
    
            container advertisement {
              description
                "Advertise TE parameters even if RSVP is not turned on";
              uses apply-advanced;
    
              leaf always {
                type empty;
                description
                  "Advertise TE parameters in TE LSAs";
              }
            }  // container advertisement
          }  // container traffic-engineering
    
          container source-packet-routing {
            junos:must "(!(".. .. .. protocols mpls disable"))";
            junos:must-message "SPRING configuration is not allowed with 'protocols mpls disable'";
            junos:must "(".. .. .. protocols mpls ")";
            junos:must-message "SPRING configuration is not allowed without 'protocols mpls'";
            presence
              "enable source-packet-routing";
            description
              "Enable source packet routing (SPRING)";
            uses apply-advanced;
    
            container adjacency-segment {
              description
                "Attributes for adjacency segments in spring";
              uses apply-advanced;
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "180000 .. 900000";
                  }
                }
                description
                  "Retain time of Adjacency segment after isolating from an interface";
              }
            }  // container adjacency-segment
    
            leaf-list prefix-segment {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Prefix Segment policy";
            }
    
            leaf explicit-null {
              type empty;
              description
                "Set E and P bits in all Prefix SID advertisements";
            }
    
            container node-segment {
              presence "enable node-segment";
              description
                "Enable support for Node segments in SPRING";
              uses apply-advanced;
    
              leaf ipv4-index {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 199999";
                  }
                }
                description
                  "Set ipv4 node segment index";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "32 .. 16385";
                  }
                }
                description
                  "Set range of node segment indices allowed";
              }
            }  // container node-segment
    
            container srgb {
              junos:must "(!(".. node-segment index-range"))";
              junos:must-message "Can not be configured with node-segment index-range";
              description
                "Set the SRGB global block in SPRING";
              leaf start-label {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Start range for SRGB label block";
              }
    
              leaf index-range {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Index to the SRGB start label block";
              }
            }  // container srgb
    
            leaf mapping-server {
              junos:must "(".. node-segment")";
              junos:must-message "protocols ospf source-packet-routing node-segment must be defined";
              junos:must "("routing-options source-packet-routing mapping-server-entry $$")";
              junos:must-message "Referenced source-packet-routing mapping-server-entry must be defined";
              type string;
              description "Mapping server name";
            }
    
            leaf install-prefix-sid-for-best-route {
              type empty;
              description
                "For best route install a exact prefix sid route";
            }
    
            leaf ldp-stitching {
              type empty;
              description
                "Enable SR to LDP stitching";
            }
    
            leaf-list flex-algorithm {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "128 .. 255";
                }
              }
              max-elements 16;
              description
                "Flex-algorithms we would like to participate in";
            }
          }  // container source-packet-routing
    
          list area {
            key "name";
            ordered-by user;
            description "Configure an OSPF area";
            leaf name {
              type jt:areaid;
              description "Area ID";
            }
    
            uses apply-advanced;
    
            choice stub-option {
              container stub {
                presence "enable stub";
                description
                  "Configure a stub area";
                leaf default-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  description
                    "Metric for the default route in this stub area";
                }
    
                choice summaries-choice {
                  leaf summaries {
                    type empty;
                    description
                      "Flood summary LSAs into this stub area";
                  }
                  leaf no-summaries {
                    type empty;
                    description
                      "Don't flood summary LSAs into this stub area";
                  }
                }  // choice summaries-choice
              }  // container stub
              container nssa {
                presence "enable nssa";
                description
                  "Configure a not-so-stubby area";
                uses apply-advanced;
    
                container default-lsa {
                  presence "enable default-lsa";
                  description
                    "Configure a default LSA";
                  uses apply-advanced;
    
                  leaf default-metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 16777215";
                      }
                    }
                    description
                      "Metric for the default route in this area";
                  }
    
                  leaf metric-type {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 2";
                      }
                    }
                    description
                      "External metric type for the default type 7 LSA";
                  }
    
                  leaf type-7 {
                    type empty;
                    description
                      "Flood type 7 default LSA if no-summaries is configured";
                  }
                }  // container default-lsa
    
                leaf default-metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 16777215";
                    }
                  }
                  status deprecated;
                  description
                    "Metric for the default route in this area";
                }
    
                leaf metric-type {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 2";
                    }
                  }
                  status deprecated;
                  description
                    "External metric type for the default type 7 LSA";
                }
    
                choice summaries-choice {
                  leaf summaries {
                    type empty;
                    description
                      "Flood summary LSAs into this NSSA area";
                  }
                  leaf no-summaries {
                    type empty;
                    description
                      "Don't flood summary LSAs into this NSSA area";
                  }
                }  // choice summaries-choice
    
                list area-range {
                  key "name";
                  ordered-by user;
                  description
                    "Configure NSSA area ranges";
                  leaf name {
                    type jt:ipprefix;
                    description
                      "Range to summarize NSSA routes in this area";
                  }
    
                  uses apply-advanced;
    
                  leaf restrict {
                    type empty;
                    description
                      "Restrict advertisement of this area range";
                  }
    
                  leaf exact {
                    type empty;
                    description
                      "Enforce exact match for advertisement of this area range";
                  }
    
                  container override-metric {
                    presence
                      "enable override-metric";
                    description
                      "Override the dynamic metric for this area-range";
                    uses apply-advanced;
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 16777215";
                        }
                      }
                      description "Metric value";
                    }
    
                    leaf metric-type {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 2";
                        }
                      }
                      default "1";
                      description
                        "Set the metric type for the override metric";
                    }
                  }  // container override-metric
                }  // list area-range
              }  // container nssa
            }  // choice stub-option
    
            list area-range {
              key "name";
              ordered-by user;
              description
                "Configure area ranges";
              leaf name {
                type jt:ipprefix;
                description
                  "Range to summarize routes in this area";
              }
    
              uses apply-advanced;
    
              leaf restrict {
                type empty;
                description
                  "Restrict advertisement of this area range";
              }
    
              leaf exact {
                type empty;
                description
                  "Enforce exact match for advertisement of this area range";
              }
    
              leaf override-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16777215";
                  }
                }
                description
                  "Override the dynamic metric for this area-range";
              }
            }  // list area-range
    
            leaf-list network-summary-export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Export policy for Type 3 Summary LSAs";
            }
    
            leaf-list network-summary-import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy for Type 3 Summary LSAs";
            }
    
            leaf-list inter-area-prefix-export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Export policy for Inter Area Prefix LSAs";
            }
    
            leaf-list inter-area-prefix-import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy for Inter Area Prefix LSAs";
            }
    
            leaf authentication-type {
              type enumeration {
                enum "none" {
                  value 0;
                  status deprecated;
                  description
                    "No authentication";
                }
                enum "simple" {
                  value 1;
                  status deprecated;
                  description
                    "Simple password authentication";
                }
                enum "md5" {
                  value 2;
                  status deprecated;
                  description
                    "MD5 authentication";
                }
              }
              status deprecated;
              description "Authentication type";
            }
    
            list virtual-link {
              junos:must "(".. .. area $$={0.0.0.0}")";
              junos:must-message "virtual link can be configured only under backbone area";
              key "neighbor-id transit-area";
              ordered-by user;
              description
                "Configure virtual links";
              leaf neighbor-id {
                type jt:ipv4addr;
                description
                  "Router ID of a virtual neighbor";
              }
    
              leaf transit-area {
                type jt:areaid;
                description
                  "Transit area in common with virtual neighbor";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable this virtual link";
                }
              }  // choice enable-disable
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list virtual-link
    
            list sham-link-remote {
              key "name";
              ordered-by user;
              description
                "Configure parameters for remote sham link endpoint";
              leaf name {
                junos:must "(!(".. .. .. sham-link local $$"))";
                junos:must-message "Local and remote sham link endpoint addresses must be different";
                junos:must "(".. .. .. sham-link local")";
                junos:must-message "Local sham link endpoint must be configured";
                type jt:ipaddr;
                description
                  "Remote sham link endpoint address";
              }
    
              uses apply-advanced;
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Sham link metric";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list sham-link-remote
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Include an interface in this area";
              leaf name {
                junos:must "((!(".. interface-type nbma") || (!(("interfaces $$" || any "logical-systems <*> interfaces $$")) || (any "interfaces $$-IFL family inet address <*>" || any "logical-systems <*> interfaces $$-IFL family inet address <*>"))))";
                junos:must-message "IPv4 address must be configured on the interface for nbma mode";
                type union {
                  type jt:ipv4addr-or-interface;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this interface";
                }
              }  // choice enable-disable
    
              leaf interface-type {
                type enumeration {
                  enum "nbma" {
                    value 0;
                    description
                      "Nonbroadcast multiaccess";
                  }
                  enum "p2mp" {
                    value 1;
                    description
                      "Point-to-multipoint NBMA";
                  }
                  enum "p2p" {
                    value 2;
                    description "Point-to-point";
                  }
                  enum "p2mp-over-lan" {
                    value 3;
                    description
                      "Point-to-multipoint over LAN mode";
                  }
                }
                description "Type of interface";
              }
    
              choice protection-type {
                leaf link-protection {
                  type empty;
                  description
                    "Protect interface from link faults only";
                }
                leaf node-link-protection {
                  type empty;
                  description
                    "Protect interface from both link and node faults";
                }
              }  // choice protection-type
    
              leaf no-eligible-backup {
                type empty;
                description
                  "Not eligible to backup traffic from protected interfaces";
              }
    
              leaf no-eligible-remote-backup {
                type empty;
                description
                  "Not eligible for Remote-LFA backup traffic from protected interfaces";
              }
    
              container passive {
                presence "enable passive";
                description
                  "Do not run OSPF, but advertise it";
                uses apply-advanced;
    
                container traffic-engineering {
                  description
                    "Advertise TE link information";
                  uses apply-advanced;
    
                  leaf remote-node-id {
                    type jt:ipaddr;
                    description
                      "Remote address of the link";
                  }
    
                  leaf remote-node-router-id {
                    junos:must "(".. remote-node-id")";
                    junos:must-message "remote-node-id must be configured";
                    type jt:ipv4addr;
                    description
                      "TE Router-ID of the remote node";
                  }
                }  // container traffic-engineering
              }  // container passive
    
              leaf secondary {
                junos:must "(!(" .. ipsec-sa"))";
                junos:must-message "secondary interface cannot have ipsec-sa configured";
                junos:must "(!(" .. dynamic-neighbors"))";
                junos:must-message "secondary interface cannot have dynamic-neighbors configured";
                junos:must "(!(" .. neighbor"))";
                junos:must-message "secondary interface cannot have configured neighbors";
                junos:must "(!(" .. interface-type p2mp"))";
                junos:must-message "secondary interface cannot be set as type p2mp";
                junos:must "(!(" .. interface-type nbma"))";
                junos:must-message "secondary interface cannot be set as type nbma";
                junos:must "(!(" .. passive"))";
                junos:must-message "secondary interface cannot be configured passive";
                type empty;
                description
                  "Treat interface as secondary";
              }
    
              leaf own-router-lsa {
                type empty;
                description
                  "Generate a separate router LSA for this interface";
              }
    
              container bandwidth-based-metrics {
                junos:must "(".. metric")";
                junos:must-message "Metric must be configured";
                description
                  "Configure bandwidth based metrics";
                uses apply-advanced;
    
                list bandwidth {
                  key "name";
                  description
                    "Bandwidth threshold";
                  leaf name {
                    type string;
                  }
    
                  leaf metric {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Metric associated with specified bandwidth";
                  }
                }  // list bandwidth
              }  // container bandwidth-based-metrics
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Interface metric";
              }
    
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Designated router priority";
              }
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
    
              leaf ipsec-sa {
                junos:must "(!(any ".. .. interface <st*> ipsec-sa $$"))";
                junos:must-message "Must not configure ipsec-sa for st0 interface";
                junos:must "("security ipsec security-association $$ manual")";
                junos:must-message "Referenced IPSec security association must be a manual SA";
                junos:must "("security ipsec security-association $$ mode transport")";
                junos:must-message "Referenced IPSec security association must be in transport mode";
                junos:must "("security ipsec security-association $$")";
                junos:must-message "Referenced IPSec security association must be defined";
                type string {
                  length "1 .. 32";
                }
                description
                  "IPSec security association name";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
    
              leaf transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                status deprecated;
                description
                  "OSPF packet transmit interval (milliseconds)";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
    
                leaf full-neighbors-only {
                  type empty;
                  description
                    "Setup BFD sessions only to Full neighbors";
                }
    
                leaf holddown-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold the session-UP notification to the client";
                }
              }  // container bfd-liveness-detection
    
              leaf dynamic-neighbors {
                junos:must "(" .. interface-type p2mp")";
                junos:must-message "dynamic-neighbors option can be set only if the interface type is p2mp";
                type empty;
                description
                  "Learn neighbors dynamically on a p2mp interface";
              }
    
              leaf no-advertise-adjacency-segment {
                type empty;
                description
                  "Do not advertise an adjacency segment for this interface";
              }
    
              list neighbor {
                junos:must "(!(" .. dynamic-neighbors"))";
                junos:must-message "Neighbors cannot be specified manually if dynamic-neighbors is set";
                key "name";
                ordered-by user;
                description "NBMA neighbor";
                leaf name {
                  type jt:ipaddr;
                  description
                    "Address of neighbor";
                }
    
                leaf eligible {
                  type empty;
                  description
                    "Eligible to be DR on an NBMA network";
                }
              }  // list neighbor
    
              leaf poll-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Poll interval for NBMA interfaces";
              }
    
              leaf no-interface-state-traps {
                type empty;
                description
                  "Do not send interface state change traps";
              }
    
              leaf strict-bfd {
                junos:must "(" .. bfd-liveness-detection")";
                junos:must-message "strict bfd cannot be configured without bfd.";
                junos:must "(!(" .. bfd-liveness-detection full-neighbors-only"))";
                junos:must-message "full-neighbors-only and strict-bfd cannot be configured together";
                type empty;
                description
                  "Enable strict bfd over this interface";
              }
    
              container post-convergence-lfa {
                junos:must "("protocols ospf backup-spf-options use-post-convergence-lfa")";
                junos:must-message "Not allowed without 'protocols ospf backup-spf-options use-post-convergence-lfa'";
                presence
                  "enable post-convergence-lfa";
                description
                  "Protect interface using post-convergence backup path";
                uses apply-advanced;
    
                container node-protection {
                  presence
                    "enable node-protection";
                  description
                    "Compute backup path assuming node failure";
                  uses apply-advanced;
    
                  leaf cost {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "Cost for node protection";
                  }
                }  // container node-protection
    
                leaf srlg-protection {
                  type empty;
                  description
                    "Compute backup path assuming SRLG failure";
                }
    
                leaf fate-sharing-protection {
                  type empty;
                  description
                    "Compute backup path assuming fate-sharing group failure";
                }
              }  // container post-convergence-lfa
    
              leaf te-metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Traffic engineering metric";
              }
    
              container ldp-synchronization {
                presence
                  "enable ldp-synchronization";
                description
                  "Advertise maximum metric until LDP is operational";
                uses ldp-sync-obj;
              }  // container ldp-synchronization
    
              container ipv4-adjacency-segment {
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                description
                  "Configure ipv4 adjacency segment";
                uses apply-advanced;
    
                container protected {
                  description
                    "Adjacency SID is eligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container protected
    
                container unprotected {
                  description
                    "Adjacency SID uneligible for protection";
                  choice adjsid-type {
                    container index {
                      description
                        "Adjacency SID indexed from SRGB";
                      leaf index-number {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range "0 .. 199999";
                          }
                        }
                      }
                    }  // container index
                    leaf label {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "16 .. 1048575";
                        }
                      }
                      description
                        "Adjacency SID from static label pool";
                    }
                    leaf dynamic {
                      type empty;
                      description
                        "Dynamically allocate an adjacency segment";
                    }
                  }  // choice adjsid-type
                }  // container unprotected
              }  // container ipv4-adjacency-segment
    
              list lan-neighbor {
                junos:must "(!(".. ipv4-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if ipv4-adjacency-segment is configured in the same interface";
                junos:must "(!(".. no-advertise-adjacency-segment"))";
                junos:must-message "lan-neighbor can't be configured if no-advertise-adjacency-segment is configured in the same interface ";
                junos:must "(!(".. interface-type p2p"))";
                junos:must-message "lan-neighbor can't be configured for point-to-point interfaces";
                key "name";
                ordered-by user;
                description
                  "Configuration specific to a LAN neighbor";
                leaf name {
                  type jt:ipaddr;
                  description
                    "Address of neighbor";
                }
    
                uses apply-advanced;
    
                container ipv4-adjacency-segment {
                  junos:must "(!(".. no-advertise-adjacency-segment"))";
                  junos:must-message "ipv4-adjacency-segment can't be configured if no-advertise-adjacency-segment is configured in the same interface";
                  description
                    "Configure ipv4 adjacency segment";
                  uses apply-advanced;
    
                  container protected {
                    description
                      "Adjacency SID is eligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container protected
    
                  container unprotected {
                    description
                      "Adjacency SID uneligible for protection";
                    choice adjsid-type {
                      container index {
                        description
                          "Adjacency SID indexed from SRGB";
                        leaf index-number {
                          type union {
                            type string {
                              pattern "<.*>|$.*";
                            }
                            type uint32 {
                              range
                                "0 .. 199999";
                            }
                          }
                        }
                      }  // container index
                      leaf label {
                        type union {
                          type string {
                            pattern "<.*>|$.*";
                          }
                          type uint32 {
                            range
                              "16 .. 1048575";
                          }
                        }
                        description
                          "Adjacency SID from static label pool";
                      }
                      leaf dynamic {
                        type empty;
                        description
                          "Dynamically allocate an adjacency segment";
                      }
                    }  // choice adjsid-type
                  }  // container unprotected
                }  // container ipv4-adjacency-segment
              }  // list lan-neighbor
            }  // list interface
    
            leaf no-context-identifier-advertisement {
              junos:must "(!(".. context-identifier"))";
              junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
              type empty;
              description
                "Disable context identifier advertisments in this area";
            }
    
            list peer-interface {
              key "name";
              ordered-by user;
              description
                "Configuration for peer interface";
              leaf name {
                type string;
                description
                  "Name of peer interface";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this control peer";
                }
              }  // choice enable-disable
    
              leaf retransmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Retransmission interval (seconds)";
              }
    
              leaf transit-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Transit delay (seconds)";
              }
    
              leaf hello-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description
                  "Hello interval (seconds)";
              }
    
              leaf dead-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Dead interval (seconds)";
              }
    
              leaf mtu {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "128 .. 65535";
                  }
                }
                description
                  "Maximum OSPF packet size";
              }
    
              choice auth {
                container authentication {
                  uses juniper-ospf-authentication;
                }  // container authentication
                container authentication-key {
                  status deprecated;
                  description
                    "Authentication key";
                  leaf keyname {
                    type jt:unreadable;
                    description
                      "Authentication key value";
                  }
    
                  leaf key-id {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
                }  // container authentication-key
              }  // choice auth
    
              leaf demand-circuit {
                type empty;
                description
                  "Interface functions as a demand circuit";
              }
    
              leaf flood-reduction {
                type empty;
                description
                  "Enable flood reduction";
              }
    
              leaf no-neighbor-down-notification {
                type empty;
                description
                  "Don't inform other protocols about neighbor down events";
              }
            }  // list peer-interface
    
            leaf no-source-packet-routing {
              type empty;
              description
                "Disable SPRING in this area";
            }
    
            list context-identifier {
              junos:must "(!(".. no-context-identifier-advertisement"))";
              junos:must-message "no-context-identifier-advertisement and context-identifier attributes are mutually exclusive";
              key "name";
              ordered-by user;
              description
                "Configure context identifier in support of edge protection";
              leaf name {
                type jt:ipv4addr;
                description "Context identifier";
              }
    
              uses apply-advanced;
            }  // list context-identifier
    
            list label-switched-path {
              junos:must "(!(".. .. traffic-engineering multicast-rpf-routes"))";
              junos:must-message "cannot advertise LSPs when using multicast-rpf-routes";
              key "name";
              ordered-by user;
              description
                "Configuration for advertisement of a label-switched path";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of label-switched path to be advertised";
              }
    
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable OSPF on this label-switched path";
                }
              }  // choice enable-disable
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description "Interface metric";
              }
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology specific attributes";
                leaf name {
                  type string;
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable this topology";
                }
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description "Topology metric";
                }
    
                container bandwidth-based-metrics {
                  junos:must "(".. metric")";
                  junos:must-message "Metric must be configured";
                  description
                    "Configure bandwidth based metrics";
                  uses apply-advanced;
    
                  list bandwidth {
                    key "name";
                    description
                      "Bandwidth threshold";
                    leaf name {
                      type string;
                    }
    
                    leaf metric {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint16 {
                          range "1 .. 65535";
                        }
                      }
                      description
                        "Metric associated with specified bandwidth";
                    }
                  }  // list bandwidth
                }  // container bandwidth-based-metrics
              }  // list topology
            }  // list label-switched-path
          }  // list area
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable OSPF";
            }
          }  // choice enable-disable
    
          container traceoptions {
            description "Trace options for OSPF";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "spf" {
                    value 0;
                    description
                      "Trace SPF calculations";
                  }
                  enum "error" {
                    value 1;
                    description
                      "Trace errored packets";
                  }
                  enum "event" {
                    value 2;
                    description
                      "Trace OSPF state machine events";
                  }
                  enum "packet-dump" {
                    value 3;
                    description
                      "Dump the contents of selected packet types";
                  }
                  enum "flooding" {
                    value 4;
                    description
                      "Trace LSA flooding";
                  }
                  enum "lsa-analysis" {
                    value 5;
                    description
                      "Trace LSA analysis";
                  }
                  enum "packets" {
                    value 6;
                    description
                      "Trace all OSPF packets";
                  }
                  enum "hello" {
                    value 7;
                    description
                      "Trace hello packets";
                  }
                  enum "database-description" {
                    value 8;
                    description
                      "Trace database description packets";
                  }
                  enum "lsa-request" {
                    value 9;
                    description
                      "Trace LSA request packets";
                  }
                  enum "lsa-update" {
                    value 10;
                    description
                      "Trace LSA update packets";
                  }
                  enum "lsa-ack" {
                    value 11;
                    description
                      "Trace LSA acknowledgment packets";
                  }
                  enum "ldp-synchronization" {
                    value 12;
                    description
                      "Trace synchronization between OSPF and LDP";
                  }
                  enum "on-demand" {
                    value 13;
                    description
                      "Trace demand circuit extensions";
                  }
                  enum "nsr-synchronization" {
                    value 14;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "graceful-restart" {
                    value 15;
                    description
                      "Trace graceful restart";
                  }
                  enum "restart-signaling" {
                    value 16;
                    description
                      "Trace restart signaling";
                  }
                  enum "backup-spf" {
                    value 17;
                    description
                      "Trace backup SPF (LFA) specific events";
                  }
                  enum "source-packet-routing" {
                    value 18;
                    description
                      "Trace source packet routing (SPRING) events";
                  }
                  enum "post-convergence-lfa" {
                    value 19;
                    description
                      "Trace post-convergence-lfa related events";
                  }
                  enum "flex-algorithm" {
                    value 20;
                    description
                      "Trace flex-algorithm related events";
                  }
                  enum "route" {
                    value 21;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 22;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 23;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 24;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 25;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 26;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 27;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 28;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container spf-options {
            description
              "Configure options for SPF";
            uses apply-advanced;
    
            leaf delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "50 .. 8000";
                }
              }
              units "milliseconds";
              description
                "Time to wait before running an SPF";
            }
    
            leaf holddown {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2000 .. 20000";
                }
              }
              units "milliseconds";
              description
                "Time to hold down before running an SPF";
            }
    
            leaf rapid-runs {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 10";
                }
              }
              description
                "Number of maximum rapid SPF runs before holddown";
            }
    
            leaf no-ignore-our-externals {
              type empty;
              description
                "Do not ignore self-generated external and NSSA LSAs";
            }
          }  // container spf-options
    
          leaf prefix-export-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 4294967295";
              }
            }
            description
              "Maximum number of prefixes that can be exported";
          }
    
          container rib-groups {
            description
              "Routing table groups for importing OSPF routes";
            uses apply-advanced;
    
            leaf inet {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-groups must be defined";
              junos:must "(!(".. topology $$={default} rib-group"))";
              junos:must-message "rib-group cannot be used with topology default rib-group";
              type string;
              description
                "Name of the IPv4/v6 routing table group";
            }
    
            leaf inet3 {
              junos:must "("routing-options rib-groups $$")";
              junos:must-message "Referenced rib-groups must be defined";
              junos:must "(!(".. topology $$={default} rib-group"))";
              junos:must-message "rib-group cannot be used with topology default rib-group";
              type string;
              description
                "Name of the IPv4/v6 inet.3 routing table group";
            }
          }  // container rib-groups
    
          leaf job-stats {
            type empty;
            description "Collect job statistics";
          }
    
          container overload {
            presence "enable overload";
            description
              "Set the overload mode (repel transit traffic)";
            uses apply-advanced;
    
            leaf timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 3600";
                }
              }
              units "seconds";
              description
                "Time after which overload mode is reset";
            }
    
            leaf allow-route-leaking {
              type empty;
              description
                "Allow routes to be leaked when overload is configured";
            }
    
            leaf stub-network {
              type empty;
              description
                "Advertise Stub Network with maximum metric";
            }
    
            leaf intra-area-prefix {
              type empty;
              description
                "Advertise Intra Area Prefix with maximum metric";
            }
    
            leaf as-external {
              type empty;
              description
                "Advertise As External with maximum usable metric";
            }
          }  // container overload
    
          container database-protection {
            presence
              "enable database-protection";
            description
              "Configure database protection attributes";
            uses apply-advanced;
    
            leaf maximum-lsa {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1000000";
                }
              }
              description
                "Maximum allowed non self-generated LSAs";
            }
    
            leaf warning-only {
              type empty;
              description
                "Emit only a warning when LSA maximum limit is exceeded";
            }
    
            leaf warning-threshold {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "30 .. 100";
                }
              }
              units "percent";
              description
                "Percentage of LSA maximum above which to trigger warning";
            }
    
            leaf ignore-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 32";
                }
              }
              description
                "Maximum number of times to go into ignore state";
            }
    
            leaf ignore-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "30 .. 3600";
                }
              }
              units "seconds";
              description
                "Time to stay in ignore state and ignore all neighbors";
            }
    
            leaf reset-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 86400";
                }
              }
              units "seconds";
              description
                "Time after which the ignore count gets reset to zero";
            }
          }  // container database-protection
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable OSPF graceful restart capability";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              units "seconds";
              description
                "Time for all neighbors to become full";
            }
    
            leaf notify-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              units "seconds";
              description
                "Time to send all max-aged grace LSAs";
            }
    
            container helper-disable {
              presence "enable helper-disable";
              description
                "Disable graceful restart helper capability";
              uses apply-advanced;
    
              choice disable-choices {
                leaf standard {
                  type empty;
                  description
                    "Disable helper-mode for rfc3623 based GR";
                }
                leaf restart-signaling {
                  type empty;
                  description
                    "Disable helper mode for restart-signaling ";
                }
                leaf both {
                  type empty;
                  description
                    "Disable helper mode for both the types of GR";
                }
              }  // choice disable-choices
            }  // container helper-disable
    
            leaf no-strict-lsa-checking {
              junos:must "(!(".. helper-disable"))";
              junos:must-message "To configure no-strict-lsa-checking, helper-disable must not be set";
              type empty;
              description
                "Do not abort graceful helper mode upon LSA changes";
            }
          }  // container graceful-restart
    
          leaf route-type-community {
            type enumeration {
              enum "iana" {
                value 0;
                description
                  "BGP extended community value used is 0x0306";
              }
              enum "vendor" {
                value 1;
                description
                  "Vendor BGP extended community value used is 0x8000";
              }
            }
            description
              "Specify BGP extended community value to encode OSPF route type";
          }
    
          container domain-id {
            description "Configure domain ID";
            choice domain_id_or_disable {
              leaf domain-id {
                type string;
                description "Domain ID";
              }
              leaf disable {
                type empty;
                description "Disable domain ID";
              }
            }  // choice domain_id_or_disable
          }  // container domain-id
    
          choice domain_vpn_tag_or_disable {
            leaf domain-vpn-tag {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Domain VPN tag for external LSA";
            }
            leaf no-domain-vpn-tag {
              type empty;
              description
                "Disable domain VPN tag";
            }
          }  // choice domain_vpn_tag_or_disable
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of internal routes";
          }
    
          leaf external-preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of external routes";
          }
    
          leaf labeled-preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of labeled routes";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy (for external routes or setting priority)";
          }
    
          leaf reference-bandwidth {
            type string;
            description
              "Bandwidth for calculating metric defaults";
          }
    
          leaf lsa-refresh-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "25 .. 50";
              }
            }
            default "50";
            description
              "LSA refresh interval (minutes)";
          }
    
          leaf spf-delay {
            junos:must "(!(".. spf-options delay"))";
            junos:must-message "You can only configure either spf-delay or delay under spf-options";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "50 .. 8000";
              }
            }
            units "milliseconds";
            status deprecated;
            description
              "Time to wait before running an SPF";
          }
    
          leaf no-rfc-1583 {
            type empty;
            description
              "Disable RFC1583 compatibility";
          }
    
          leaf forwarding-address-to-broadcast {
            type empty;
            description
              "Set forwarding address in Type 5 LSA in broadcast network";
          }
    
          choice nssa-abr-option {
            leaf no-nssa-abr {
              type empty;
              description
                "Disable full NSSA functionality at ABR";
            }
          }  // choice nssa-abr-option
    
          container sham-link {
            presence "enable sham-link";
            description
              "Configure parameters for sham links";
            uses apply-advanced;
    
            leaf local {
              type jt:ipaddr;
              description
                "Local sham link endpoint address";
            }
    
            leaf no-advertise-local {
              type empty;
              status deprecated;
              description
                "Don't advertise local sham link endpoint as stub in router LSA";
            }
          }  // container sham-link
        }  // grouping juniper-protocols-ospf3
    
        grouping juniper-protocols-pim {
          uses apply-advanced;
    
          container family {
            description "Local address family";
            container any {
              presence "enable any";
              description
                "Default properties for all address families";
              uses apply-advanced;
    
              leaf disable {
                type empty;
                description
                  "Disable all families";
              }
            }  // container any
    
            container inet {
              presence "enable inet";
              description
                "IPv4 specific properties";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable PIMv4 on all interfaces";
                }
              }  // choice enable-disable
            }  // container inet
    
            container inet6 {
              presence "enable inet6";
              description
                "IPv6 specific properties";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable PIMv6 on all interfaces";
                }
              }  // choice enable-disable
            }  // container inet6
          }  // container family
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable PIM";
            }
          }  // choice enable-disable
    
          container nonstop-routing {
            junos:must "("routing-options nonstop-routing")";
            junos:must-message "To disable PIM nonstop-routing, non-stop routing must be globally enabled.";
            description
              "Configure PIM nonstop-routing attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable non-stop routing for PIM";
              }
            }  // choice enable-disable
          }  // container nonstop-routing
    
          container traceoptions {
            description "Trace options for PIM";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "route" {
                    value 0;
                    description
                      "Trace routing information";
                  }
                  enum "packets" {
                    value 1;
                    description
                      "Trace all PIM packets";
                  }
                  enum "hello" {
                    value 2;
                    description
                      "Trace hello packets";
                  }
                  enum "register" {
                    value 3;
                    description
                      "Trace register/register-stop messages";
                  }
                  enum "join" {
                    value 4;
                    description
                      "Trace join/prune/graft/graft-ack messages";
                  }
                  enum "prune" {
                    value 5;
                    description
                      "Trace join/prune/graft/graft-ack messages";
                  }
                  enum "graft" {
                    value 6;
                    description
                      "Trace join/prune/graft/graft-ack messages";
                  }
                  enum "bootstrap" {
                    value 7;
                    description
                      "Trace bootstrap/RP/auto-RP messages";
                  }
                  enum "rp" {
                    value 8;
                    description
                      "Trace bootstrap/RP/auto-RP messages";
                  }
                  enum "autorp" {
                    value 9;
                    description
                      "Trace bootstrap/RP/auto-RP messages";
                  }
                  enum "assert" {
                    value 10;
                    description
                      "Trace assert messages";
                  }
                  enum "mdt" {
                    value 11;
                    description
                      "Trace messages related to multicast data tunnels";
                  }
                  enum "nsr-synchronization" {
                    value 12;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum
                    "bidirectional-df-election" {
                    value 13;
                    description
                      "Trace bidirectional PIM DF election events";
                  }
                  enum "mofrr" {
                    value 14;
                    description
                      "Trace Multicast only Fast Re-Route messages";
                  }
                  enum "normal" {
                    value 15;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 16;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 17;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 18;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 19;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 20;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 21;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
    
              container filter {
                presence "enable filter";
                description
                  "Filter to apply to this flag";
                uses pim_filter_obj;
              }  // container filter
            }  // list flag
          }  // container traceoptions
    
          container dense-groups {
            description
              "Dense mode groups for sparse-dense mode";
            uses apply-advanced;
    
            leaf dynamic-reject {
              type empty;
              description
                "Reject dynamic autorp negative dense-mode prefixes learnt from network";
            }
    
            list pim-dense-group-type {
              key "name";
              ordered-by user;
              leaf name {
                type jt:ipprefix;
                description
                  "Group address or range to forward in dense mode";
              }
    
              choice dense-group-flags {
                leaf reject {
                  type empty;
                  description
                    "Do not include prefix as dense mode; force sparse mode";
                }
                leaf announce {
                  type empty;
                  description
                    "Advertise as negative prefix in auto-RP announce messages";
                }
              }  // choice dense-group-flags
            }  // list pim-dense-group-type
          }  // container dense-groups
    
          leaf vpn-tunnel-source {
            type jt:ipv4addr;
            status deprecated;
            description
              "Source address for the provider space mGRE tunnel";
          }
    
          leaf vpn-group-address {
            junos:must "(!(".. .. .. provider-tunnel pim-ssm"))";
            junos:must-message "'provider-tunnel pim-ssm' can not be configured with 'pim vpn-group-address'. Please disable one of them.";
            junos:must "((!(".. .. .. provider-tunnel pim-asm") || ".. .. .. provider-tunnel pim-asm group-address $$"))";
            junos:must-message "MVPN inclusive provider-tunnel group-address must be same as 'vpn-group-address'";
            type jt:ipv4addr;
            status deprecated;
            description
              "Group address for the VPN in provider space";
          }
    
          leaf-list tunnel-devices {
            type union {
              type jt:interface-device;
              type string {
                pattern "<.*>|$.*";
              }
            }
            ordered-by user;
            description
              "Tunnel devices to be used for creating mt interfaces";
          }
    
          container rpf-selection {
            description "Select RPF neighbor";
            uses apply-advanced;
    
            list group {
              key "name";
              ordered-by user;
              description
                "IP prefix of multicast group";
              leaf name {
                type jt:ipprefix;
                description "IP prefix of group";
              }
    
              uses apply-advanced;
    
              container wildcard-source {
                presence
                  "enable wildcard-source";
                description
                  "Select RPF for (*,g) and unspecified (s,g) joins";
                uses apply-advanced;
    
                leaf next-hop {
                  type jt:ipaddr;
                  description "Next-hop address";
                }
              }  // container wildcard-source
    
              list source {
                key "name";
                ordered-by user;
                description
                  "IP prefix of one or more multicast sources";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP prefix of source";
                }
    
                uses apply-advanced;
    
                leaf next-hop {
                  type jt:ipaddr;
                  description "Next-hop address";
                }
              }  // list source
            }  // list group
    
            list prefix-list {
              key "name";
              ordered-by user;
              description
                "Multicast group prefix list";
              leaf name {
                junos:must "("policy-options prefix-list $$")";
                junos:must-message "This prefix-list must be configured in policy-options.";
                type string;
                description
                  "Name of prefix list to match against";
              }
    
              uses apply-advanced;
    
              container wildcard-source {
                presence
                  "enable wildcard-source";
                description
                  "Select RPF for (*,g) and unspecified (s,g) joins";
                uses apply-advanced;
    
                leaf next-hop {
                  type jt:ipaddr;
                  description "Next-hop address";
                }
              }  // container wildcard-source
    
              list source {
                key "name";
                ordered-by user;
                description
                  "IP prefix of one or more multicast sources";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP prefix of source";
                }
    
                uses apply-advanced;
    
                leaf next-hop {
                  type jt:ipaddr;
                  description "Next-hop address";
                }
              }  // list source
            }  // list prefix-list
          }  // container rpf-selection
    
          container mvpn {
            presence "enable mvpn";
            description
              "PIM MVPN control-plane options";
            uses apply-advanced;
    
            container autodiscovery {
              junos:must "(!(".. .. vpn-group-address"))";
              junos:must-message "PIM MVPN autodiscovery options cannot be configured with 'vpn-group-address'";
              junos:must "(".. .. .. mvpn")";
              junos:must-message "Autodiscovery for PIM MVPNs requires 'protocols mvpn'";
              junos:must "(!(".. .. mdt"))";
              junos:must-message "PIM MVPN auto-discovery cannot be configured with 'pim mdt'";
              status deprecated;
              description
                "PE router autodiscovery options for SSM MDTs";
              uses apply-advanced;
    
              leaf inet-mdt {
                type empty;
                description
                  "MDT-SAFI PE autodiscovery for SSM MDTs";
              }
            }  // container autodiscovery
    
            container family {
              description
                "PIM MVPN address family";
              uses apply-advanced;
    
              container inet {
                description
                  "IPv4 PIM MVPN specific properties";
                uses apply-advanced;
    
                leaf rosen-mvpn {
                  type empty;
                  status deprecated;
                }
    
                leaf ngen-mvpn {
                  junos:must "(".. .. .. .. .. mvpn")";
                  junos:must-message "Requires 'protocols mvpn'";
                  type empty;
                  status deprecated;
                }
    
                container autodiscovery {
                  junos:must "(!(".. .. .. .. vpn-group-address"))";
                  junos:must-message "PIM MVPN autodiscovery options cannot be configured with 'vpn-group-address'";
                  junos:must "(".. .. .. .. .. mvpn")";
                  junos:must-message "Autodiscovery for PIM MVPNs requires 'protocols mvpn'";
                  junos:must "(!(".. .. .. .. mdt"))";
                  junos:must-message "PIM MVPN auto-discovery cannot be configured with 'pim mdt'";
                  description
                    "PE router autodiscovery options for SSM MDTs";
                  uses apply-advanced;
    
                  leaf inet-mdt {
                    type empty;
                    description
                      "MDT-SAFI PE autodiscovery for SSM MDTs";
                  }
                }  // container autodiscovery
    
                leaf disable {
                  type empty;
                  description
                    "Disable family IPv4";
                }
              }  // container inet
    
              container inet6 {
                description
                  "IPv6 PIM MVPN specific properties";
                uses apply-advanced;
    
                leaf rosen-mvpn {
                  type empty;
                  status deprecated;
                }
    
                leaf ngen-mvpn {
                  junos:must "(".. .. .. .. .. mvpn")";
                  junos:must-message "Requires 'protocols mvpn'";
                  type empty;
                  status deprecated;
                }
    
                container autodiscovery {
                  junos:must "(!(".. .. .. .. vpn-group-address"))";
                  junos:must-message "PIM MVPN autodiscovery options cannot be configured with 'vpn-group-address'";
                  junos:must "(".. .. .. .. .. mvpn")";
                  junos:must-message "Autodiscovery for PIM MVPNs requires 'protocols mvpn'";
                  junos:must "(!(".. .. .. .. mdt"))";
                  junos:must-message "PIM MVPN auto-discovery cannot be configured with 'pim mdt'";
                  description
                    "PE router autodiscovery options for SSM MDTs";
                  uses apply-advanced;
    
                  leaf inet-mdt {
                    type empty;
                    description
                      "MDT-SAFI PE autodiscovery for SSM MDTs";
                  }
                }  // container autodiscovery
    
                leaf disable {
                  type empty;
                  description
                    "Disable family IPv6";
                }
              }  // container inet6
            }  // container family
          }  // container mvpn
    
          container rib-group {
            description "Routing table group";
            uses rib_group_type;
          }  // container rib-group
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "PIM sparse import join policy";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description
              "PIM sparse export join policy";
          }
    
          container mldp-inband-signalling {
            junos:must "(!("system processes routing bgp rib-sharding"))";
            junos:must-message "Can't be configured together with rib-sharding";
            presence
              "enable mldp-inband-signalling";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "PIM MLDP join translation filter policy";
            }
          }  // container mldp-inband-signalling
    
          container rpf-vector {
            description "RPF vector TLV";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "RPF vector TLV include policy";
            }
          }  // container rpf-vector
    
          leaf assert-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "5 .. 210";
              }
            }
            default "180";
            description "Set assert timeout";
          }
    
          leaf assert-robust-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 5";
              }
            }
            default "2";
            description
              "Number of assert messages an assert winner sends in one cycle";
          }
    
          leaf join-prune-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "210 .. 420";
              }
            }
            default "210";
            description "Set join/prune timeout";
          }
    
          container spt-threshold {
            description
              "Set shortest-path-tree threshold policy";
            uses apply-advanced;
    
            leaf-list infinity {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Apply policy to always remain on shared tree";
            }
          }  // container spt-threshold
    
          container sglimit {
            description
              "Set limit on number of (S,G) states ";
            uses apply-advanced;
    
            list family {
              junos:must "(!(".. maximum"))";
              junos:must-message "Family wise threshold cannot be configuredif global threshold is already configured";
              key "name";
              ordered-by user;
              description "Protocol family";
              leaf name {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet6" {
                    value 1;
                    description "IPv6 family";
                  }
                }
              }
    
              uses apply-advanced;
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum limit above which additional entries are not accepted";
              }
    
              leaf threshold {
                junos:must "(".. maximum")";
                junos:must-message "To configure threshold, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description
                  "Percentage of maximum at which to start generating warnings";
              }
    
              leaf log-interval {
                junos:must "(".. maximum")";
                junos:must-message "To configure log-interval, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Time between successive log messages";
              }
            }  // list family
    
            leaf maximum {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Maximum limit above which additional entries are not accepted";
            }
    
            leaf threshold {
              junos:must "(".. maximum")";
              junos:must-message "To configure threshold, maximum must be configured";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 100";
                }
              }
              description
                "Percentage of maximum at which to start generating warnings";
            }
    
            leaf log-interval {
              junos:must "(".. maximum")";
              junos:must-message "To configure log-interval, maximum must be configured";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Time between successive log messages";
            }
          }  // container sglimit
    
          container rp {
            junos:must "(!(" .. passive"))";
            junos:must-message "pim rp cannot be configured with pim passive";
            description
              "Router's rendezvous point properties";
            uses apply-advanced;
    
            leaf bootstrap-priority {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 255";
                }
              }
              description
                "Eligibility to be the bootstrap router (IPv4 only)";
            }
    
            leaf-list bootstrap-import {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Bootstrap import policy (IPv4 only)";
            }
    
            leaf-list bootstrap-export {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Bootstrap export policy (IPv4 only)";
            }
    
            container bootstrap {
              description "Bootstrap properties";
              uses apply-advanced;
    
              container family {
                description
                  "Bootstrap address family";
                container inet {
                  junos:must "(!((".. .. .. bootstrap-priority" || (".. .. .. bootstrap-import" || ".. .. .. bootstrap-export"))))";
                  junos:must-message "Duplicate IPv4 bootstrap configuration";
                  description
                    "IPv4 bootstrap properties";
                  uses pim_bootstrap_options_type;
                }  // container inet
    
                container inet6 {
                  description
                    "IPv6 bootstrap properties";
                  uses pim_bootstrap_options_type;
                }  // container inet6
              }  // container family
            }  // container bootstrap
    
            container register-limit {
              description
                "Set limit on incoming registers that create (S,G) state";
              uses apply-advanced;
    
              list family {
                junos:must "(!(".. maximum"))";
                junos:must-message "Family wise threshold cannot be configuredif global threshold is already configured";
                key "name";
                ordered-by user;
                description "Protocol family";
                leaf name {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet6" {
                      value 1;
                      description "IPv6 family";
                    }
                  }
                }
    
                uses apply-advanced;
    
                leaf maximum {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum limit above which additional entries are not accepted";
                }
    
                leaf threshold {
                  junos:must "(".. maximum")";
                  junos:must-message "To configure threshold, maximum must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of maximum at which to start generating warnings";
                }
    
                leaf log-interval {
                  junos:must "(".. maximum")";
                  junos:must-message "To configure log-interval, maximum must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Time between successive log messages";
                }
              }  // list family
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum limit above which additional entries are not accepted";
              }
    
              leaf threshold {
                junos:must "(".. maximum")";
                junos:must-message "To configure threshold, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description
                  "Percentage of maximum at which to start generating warnings";
              }
    
              leaf log-interval {
                junos:must "(".. maximum")";
                junos:must-message "To configure log-interval, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Time between successive log messages";
              }
            }  // container register-limit
    
            container group-rp-mapping {
              description "Group-rp-mapping";
              uses apply-advanced;
    
              list family {
                junos:must "(!(".. maximum"))";
                junos:must-message "Family wise threshold cannot be configuredif global threshold is already configured";
                key "name";
                ordered-by user;
                description "Protocol family";
                leaf name {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet6" {
                      value 1;
                      description "IPv6 family";
                    }
                  }
                }
    
                uses apply-advanced;
    
                leaf maximum {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum limit above which additional entries are not accepted";
                }
    
                leaf threshold {
                  junos:must "(".. maximum")";
                  junos:must-message "To configure threshold, maximum must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of maximum at which to start generating warnings";
                }
    
                leaf log-interval {
                  junos:must "(".. maximum")";
                  junos:must-message "To configure log-interval, maximum must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Time between successive log messages";
                }
              }  // list family
    
              leaf maximum {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum limit above which additional entries are not accepted";
              }
    
              leaf threshold {
                junos:must "(".. maximum")";
                junos:must-message "To configure threshold, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description
                  "Percentage of maximum at which to start generating warnings";
              }
    
              leaf log-interval {
                junos:must "(".. maximum")";
                junos:must-message "To configure log-interval, maximum must be configured";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Time between successive log messages";
              }
            }  // container group-rp-mapping
    
            leaf-list rp-register-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "RP policy applied to incoming register messages";
            }
    
            leaf-list dr-register-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "DR policy applied to outgoing register messages";
            }
    
            container local {
              description
                "Router's local RP properties";
              uses apply-advanced;
    
              leaf address {
                type jt:ipv4addr;
                description
                  "Local RP address (IPv4 only)";
              }
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable this RP (IPv4 only)";
                }
              }  // choice enable-disable
    
              leaf priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Router's priority for becoming an RP (IPv4 only)";
              }
    
              leaf hold-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "How long neighbor considers this router to be up, in seconds (IPv4 only)";
              }
    
              list group-ranges {
                key "name";
                ordered-by user;
                description
                  "Group address range for which this router can be an RP (IPv4 only)";
                leaf name {
                  type jt:ipv4prefix;
                }
    
                uses apply-advanced;
              }  // list group-ranges
    
              leaf override {
                type empty;
                description
                  "Static RP mapping will take precedence over dynamic";
              }
    
              leaf process-non-null-as-null-register {
                type empty;
                description
                  "Process incoming non null registers as null registers";
              }
    
              container family {
                description
                  "Local RP address family";
                container inet {
                  description
                    "IPv4 local RP properties";
                  uses apply-advanced;
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Local RP address";
                  }
    
                  choice enable-disable {
                    leaf disable {
                      type empty;
                      description
                        "Disable this RP";
                    }
                  }  // choice enable-disable
    
                  leaf priority {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Router's priority for becoming an RP";
                  }
    
                  leaf hold-time {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "How long neighbor considers this router to be up, in seconds";
                  }
    
                  list group-ranges {
                    key "name";
                    ordered-by user;
                    description
                      "Group address range for which this router can be an RP";
                    leaf name {
                      type jt:ipv4prefix;
                    }
    
                    uses apply-advanced;
                  }  // list group-ranges
    
                  leaf override {
                    type empty;
                    description
                      "Static RP mapping will take precedence over dynamic";
                  }
    
                  container anycast-pim {
                    description
                      "Attributes for IPv4 anycast PIM";
                    uses apply-advanced;
    
                    container rp-set {
                      description
                        "Rendezvous points belonging to anycast RP set";
                      uses apply-advanced;
    
                      list address {
                        key "name";
                        ordered-by user;
                        description
                          "IPv4 address of one or more remote anycast RPs";
                        leaf name {
                          type jt:ipaddr;
                          description
                            "IPv4 address of remote anycast RP";
                        }
    
                        uses apply-advanced;
    
                        leaf forward-msdp-sa {
                          type empty;
                          description
                            "Forward SAs learned from MSDP to this RP";
                        }
                      }  // list address
                    }  // container rp-set
    
                    leaf local-address {
                      type jt:ipaddr;
                      description
                        "Local address for replicating register messages to other RPs";
                    }
                  }  // container anycast-pim
                }  // container inet
    
                container inet6 {
                  description
                    "IPv6 local RP properties";
                  uses apply-advanced;
    
                  leaf address {
                    type jt:ipv6addr;
                    description
                      "Local RP address";
                  }
    
                  choice enable-disable {
                    leaf disable {
                      type empty;
                      description
                        "Disable this RP";
                    }
                  }  // choice enable-disable
    
                  leaf priority {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Router's priority for becoming an RP";
                  }
    
                  leaf hold-time {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 65535";
                      }
                    }
                    description
                      "How long neighbor considers this router to be up, in seconds";
                  }
    
                  list group-ranges {
                    key "name";
                    ordered-by user;
                    description
                      "Group address range for which this router can be an RP";
                    leaf name {
                      type jt:ipv6prefix;
                    }
    
                    uses apply-advanced;
                  }  // list group-ranges
    
                  leaf override {
                    type empty;
                    description
                      "Static RP mapping will take precedence over dynamic";
                  }
    
                  container anycast-pim {
                    description
                      "Attributes for IPv6 anycast PIM";
                    uses apply-advanced;
    
                    container rp-set {
                      description
                        "Rendezvous points belonging to anycast RP set";
                      uses apply-advanced;
    
                      list address {
                        key "name";
                        ordered-by user;
                        description
                          "IPv6 address of one or more remote anycast RPs";
                        leaf name {
                          type jt:ipv6addr;
                          description
                            "IPv6 address of remote anycast RP";
                        }
    
                        uses apply-advanced;
                      }  // list address
                    }  // container rp-set
    
                    leaf local-address {
                      type jt:ipv6addr;
                      description
                        "Local address for replicating register messages to other RPs";
                    }
                  }  // container anycast-pim
                }  // container inet6
              }  // container family
            }  // container local
    
            container embedded-rp {
              presence "enable embedded-rp";
              description
                "Set embedded-RP mode (IPv6 only)";
              uses apply-advanced;
    
              list group-ranges {
                key "name";
                ordered-by user;
                description
                  "Group address range of RP";
                uses pim_rp_group_range_type;
              }  // list group-ranges
    
              leaf maximum-rps {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 500";
                  }
                }
                default "100";
                description
                  "Maximum number of embedded RPs";
              }
            }  // container embedded-rp
    
            container auto-rp {
              description
                "Set auto-RP mode (IPv4 only)";
              uses apply-advanced;
    
              choice autorp-mode {
                leaf discovery {
                  type empty;
                  description
                    "Listen for auto-RP discovery messages";
                }
                leaf announce {
                  type empty;
                  description
                    "Transmit auto-RP announcement messages";
                }
                leaf mapping {
                  type empty;
                  description
                    "Transmit auto-RP mapping messages";
                }
              }  // choice autorp-mode
    
              choice mapping-agent-election-choice {
                leaf mapping-agent-election {
                  type empty;
                  description
                    "Consider higher-addressed mapping agents as authoritative";
                }
                leaf no-mapping-agent-election {
                  type empty;
                  description
                    "Don't consider higher-addressed mapping agents as authoritative";
                }
              }  // choice mapping-agent-election-choice
            }  // container auto-rp
    
            container static {
              description
                "Configure static PIM RPs";
              uses apply-advanced;
    
              list address {
                key "name";
                ordered-by user;
                description "RP address";
                leaf name {
                  type jt:ipaddr;
                  description "IP address of RP";
                }
    
                uses apply-advanced;
    
                leaf version {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 2";
                    }
                  }
                  status deprecated;
                  description
                    "PIM version of RP";
                }
    
                list group-ranges {
                  key "name";
                  ordered-by user;
                  description
                    "Group address range of RP";
                  uses pim_rp_group_range_type;
                }  // list group-ranges
    
                leaf override {
                  type empty;
                  description
                    "Static RP mapping will take precedence over dynamic";
                }
              }  // list address
            }  // container static
    
            container bidirectional {
              junos:must "((!(".. .. .. .. .. .. routing-instances") || any ".. .. .. .. .. .. routing-instances <*> instance-type virtual-router"))";
              junos:must-message "Only master instance and routing-instances of type virtual-router support PIM-BIDIR.";
              description
                "Configure PIM bidirectional-mode RPs";
              uses apply-advanced;
    
              list address {
                key "name";
                ordered-by user;
                description "RP address";
                leaf name {
                  type jt:ipaddr;
                  description "IP address of RP";
                }
    
                uses apply-advanced;
    
                leaf priority {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255";
                    }
                  }
                  description
                    "Router's priority for becoming an RP";
                }
    
                leaf hold-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 65535";
                    }
                  }
                  units "seconds";
                  description
                    "How long neighbor considers this router to be up";
                }
    
                list group-ranges {
                  key "name";
                  ordered-by user;
                  description
                    "Group address range of RP";
                  uses pim_rp_group_range_type;
                }  // list group-ranges
              }  // list address
            }  // container bidirectional
          }  // container rp
    
          leaf passive {
            junos:must "(!(any ".. interface <*> distributed-dr"))";
            junos:must-message "pim passive cannot be configured with pim distributed-dr";
            junos:must "(!(" .. rp"))";
            junos:must-message "pim passive cannot be configured with pim rp";
            type empty;
            description
              "Configure PIM protocol in passive mode";
          }
    
          list interface {
            key "name";
            ordered-by user;
            description "PIM interface options";
            leaf name {
              junos:must "(((("routing-options multicast interface $$ disable" || ("routing-options multicast interface $$ maximum-bandwidth" || ("routing-options multicast interface $$ nexthop-unicast-address" || ("routing-options multicast interface $$ reverse-oif-mapping" || ("routing-options multicast interface $$ subscriber-leave-timer" || "routing-options multicast interface $$ no-qos-adjust"))))) && !("routing-options multicast interface $$ enable")) || ("protocols pim interface $$ disable" || !(("routing-options multicast interface $$" || "routing-options multicast interface $$ enable")))))";
              junos:must-message "Multicast cannot be enabled on the same interface in the [edit routing-options] hierarchy";
              type string;
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container family {
              description "Local address family";
              container any {
                presence "enable any";
                description
                  "Default properties for all families";
                uses apply-advanced;
    
                leaf disable {
                  type empty;
                  description
                    "Disable all families";
                }
              }  // container any
    
              container inet {
                presence "enable inet";
                description
                  "IPv4 specific properties";
                uses apply-advanced;
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  container authentication {
                    description
                      "Authentication options";
                    uses apply-advanced;
    
                    leaf key-chain {
                      junos:must "(".. algorithm")";
                      junos:must-message "May not be configured without algorithm";
                      junos:must "("security authentication-key-chains key-chain $$")";
                      junos:must-message "Referenced key-chain must be defined";
                      type string;
                      description
                        "Key chain name";
                    }
    
                    leaf algorithm {
                      junos:must "(".. key-chain")";
                      junos:must-message "May not be configured without key-chain";
                      type enumeration {
                        enum "simple-password" {
                          value 0;
                          description
                            "Simple password";
                        }
                        enum "keyed-md5" {
                          value 1;
                          description
                            "Keyed message Digest 5";
                        }
                        enum
                          "meticulous-keyed-md5" {
                          value 2;
                          description
                            "Meticulous keyed message Digest 5";
                        }
                        enum "keyed-sha-1" {
                          value 3;
                          description
                            "Keyed secure hash algorithm (SHA1) ";
                        }
                        enum
                          "meticulous-keyed-sha-1" {
                          value 4;
                          description
                            "Meticulous keyed secure hash algorithm (SHA1) ";
                        }
                      }
                      description
                        "Algorithm name";
                    }
    
                    leaf loose-check {
                      type empty;
                      description
                        "Verify authentication only if authentication is negotiated";
                    }
                  }  // container authentication
                }  // container bfd-liveness-detection
    
                leaf mcae-mac-synchronize {
                  type empty;
                  description
                    "Mclag mac synchronization";
                }
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable PIMv4 on this interface";
                  }
                }  // choice enable-disable
              }  // container inet
    
              container inet6 {
                presence "enable inet6";
                description
                  "IPv6 specific properties";
                uses apply-advanced;
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  container authentication {
                    description
                      "Authentication options";
                    uses apply-advanced;
    
                    leaf key-chain {
                      junos:must "(".. algorithm")";
                      junos:must-message "May not be configured without algorithm";
                      junos:must "("security authentication-key-chains key-chain $$")";
                      junos:must-message "Referenced key-chain must be defined";
                      type string;
                      description
                        "Key chain name";
                    }
    
                    leaf algorithm {
                      junos:must "(".. key-chain")";
                      junos:must-message "May not be configured without key-chain";
                      type enumeration {
                        enum "simple-password" {
                          value 0;
                          description
                            "Simple password";
                        }
                        enum "keyed-md5" {
                          value 1;
                          description
                            "Keyed message Digest 5";
                        }
                        enum
                          "meticulous-keyed-md5" {
                          value 2;
                          description
                            "Meticulous keyed message Digest 5";
                        }
                        enum "keyed-sha-1" {
                          value 3;
                          description
                            "Keyed secure hash algorithm (SHA1) ";
                        }
                        enum
                          "meticulous-keyed-sha-1" {
                          value 4;
                          description
                            "Meticulous keyed secure hash algorithm (SHA1) ";
                        }
                      }
                      description
                        "Algorithm name";
                    }
    
                    leaf loose-check {
                      type empty;
                      description
                        "Verify authentication only if authentication is negotiated";
                    }
                  }  // container authentication
                }  // container bfd-liveness-detection
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable PIMv6 on this interface";
                  }
                }  // choice enable-disable
              }  // container inet6
            }  // container family
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable PIM on this interface";
              }
            }  // choice enable-disable
    
            container bidirectional {
              junos:must "((!(".. .. .. .. .. .. routing-instances") || any ".. .. .. .. .. .. routing-instances <*> instance-type virtual-router"))";
              junos:must-message "Only master instance and routing-instances of type virtual-router support PIM-BIDIR.";
              description
                "PIM bidirectional mode properties";
              uses apply-advanced;
    
              container df-election {
                description
                  "Bidir designated forwarder properties";
                uses apply-advanced;
    
                leaf robustness-count {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 10";
                    }
                  }
                  description
                    "Election robustness count";
                }
    
                leaf offer-period {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "100 .. 10000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Election offer message period";
                }
    
                leaf backoff-period {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "100 .. 65535";
                    }
                  }
                  units "milliseconds";
                  description
                    "Election backoff period";
                }
              }  // container df-election
            }  // container bidirectional
    
            leaf mode {
              type enumeration {
                enum "dense" {
                  value 0;
                  description "Dense mode";
                }
                enum "sparse" {
                  value 1;
                  description "Sparse mode";
                }
                enum "sparse-dense" {
                  value 2;
                  description
                    "Sparse-dense mode";
                }
                enum "bidirectional-sparse" {
                  junos:must "((!(".. .. .. .. .. .. routing-instances") || any ".. .. .. .. .. .. routing-instances <*> instance-type virtual-router"))";
                  junos:must-message "Only master instance and routing-instances of type virtual-router support PIM-BIDIR.";
                  junos:must "(!(".. version $$={1}"))";
                  junos:must-message "PIM Bidirectional is not supported by PIMv1.";
                  value 3;
                  description
                    "Bidirectional-sparse mode";
                }
                enum
                  "bidirectional-sparse-dense" {
                  junos:must "((!(".. .. .. .. .. .. routing-instances") || any ".. .. .. .. .. .. routing-instances <*> instance-type virtual-router"))";
                  junos:must-message "Only master instance and routing-instances of type virtual-router support PIM-BIDIR.";
                  junos:must "(!(".. version $$={1}"))";
                  junos:must-message "PIM Bidirectional is not supported by PIMv1.";
                  value 4;
                  description
                    "Bidirectional-sparse-dense mode";
                }
              }
              description "Mode of interface";
            }
    
            leaf priority {
              junos:must "((!(".. mode dense") || (".. mode dense" && "protocols igmp interface ${interface} version 1")))";
              junos:must-message "PIM DR Priority cannot be configured in Dense Mode unless IGMP V1 is configured";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Hello option DR priority";
            }
    
            container stickydr {
              presence "enable stickydr";
              description "Make DR sticky";
              uses apply-advanced;
            }  // container stickydr
    
            container multiple-triggered-joins {
              presence
                "enable multiple-triggered-joins";
              description
                "Send multiple pim triggered joins in quick intervals";
              uses apply-advanced;
    
              leaf count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "2 .. 15";
                  }
                }
                default "2";
                description
                  "Set number of triggered joins to be sent";
              }
    
              leaf interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "100 .. 1000";
                  }
                }
                default "100";
                description
                  "Set interval between multiple triggered joins to be sent in milliseconds";
              }
            }  // container multiple-triggered-joins
    
            leaf version {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 2";
                }
              }
              status deprecated;
              description "Force PIM version";
            }
    
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 255";
                }
              }
              units "seconds";
              description "Hello interval";
            }
    
            leaf-list neighbor-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "PIM neighbor policy applied to incoming hello messages";
            }
    
            leaf-list accept-join-always-from {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Accept pim join/prune messages based on the policy configured";
            }
    
            leaf accept-remote-source {
              type empty;
              description
                "Accept traffic from remote source";
            }
    
            container dual-dr {
              junos:must "(!(" .. distributed-dr"))";
              junos:must-message "pim dual-dr cannot be configured with pim distributed-dr";
              presence "enable dual-dr";
              description
                "Configure PIM Dual DR";
              uses apply-advanced;
    
              leaf enhanced {
                type empty;
                description
                  "Enable enhanced PIM Dual DR";
              }
            }  // container dual-dr
    
            leaf distributed-dr {
              junos:must "(!(".. .. .. passive"))";
              junos:must-message "pim distributed-dr cannot be configured with pim passive";
              junos:must "(!(" .. dual-dr"))";
              junos:must-message "pim distributed-dr cannot be configured with pim dual-dr";
              type empty;
              description "PIM Distributed DR";
            }
    
            leaf reset-tracking-bit {
              type empty;
              description
                "Clear tracking-bit in PIM Hello LAN Prune Delay Option";
            }
    
            leaf propagation-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "250 .. 2000";
                }
              }
              units "milliseconds";
              default "500";
              description
                "Propagation delay value";
            }
    
            leaf override-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "500 .. 6000";
                }
              }
              units "milliseconds";
              default "2000";
              description
                "Override interval value";
            }
    
            container bfd-liveness-detection {
              status deprecated;
              description
                "Bidirectional Forwarding Detection options (ipv4 only)";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
    
              container authentication {
                description
                  "Authentication options";
                uses apply-advanced;
    
                leaf key-chain {
                  junos:must "(".. algorithm")";
                  junos:must-message "May not be configured without algorithm";
                  junos:must "("security authentication-key-chains key-chain $$")";
                  junos:must-message "Referenced key-chain must be defined";
                  type string;
                  description "Key chain name";
                }
    
                leaf algorithm {
                  junos:must "(".. key-chain")";
                  junos:must-message "May not be configured without key-chain";
                  type enumeration {
                    enum "simple-password" {
                      value 0;
                      description
                        "Simple password";
                    }
                    enum "keyed-md5" {
                      value 1;
                      description
                        "Keyed message Digest 5";
                    }
                    enum "meticulous-keyed-md5" {
                      value 2;
                      description
                        "Meticulous keyed message Digest 5";
                    }
                    enum "keyed-sha-1" {
                      value 3;
                      description
                        "Keyed secure hash algorithm (SHA1) ";
                    }
                    enum
                      "meticulous-keyed-sha-1" {
                      value 4;
                      description
                        "Meticulous keyed secure hash algorithm (SHA1) ";
                    }
                  }
                  description "Algorithm name";
                }
    
                leaf loose-check {
                  type empty;
                  description
                    "Verify authentication only if authentication is negotiated";
                }
              }  // container authentication
            }  // container bfd-liveness-detection
          }  // list interface
    
          container mdt {
            junos:must "((!(" .. .. mvpn") || ".. mvpn family inet rosen-mvpn"))";
            junos:must-message "Data tunnels cannot be configured with 'protocols mvpn'";
            status deprecated;
            description
              "Configure multicast data tunnel parameters";
            uses apply-advanced;
    
            container threshold {
              description
                "Threshold for creation of multicast tunnels";
              uses apply-advanced;
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP prefix of multicast group";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP prefix of group";
                }
    
                uses apply-advanced;
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP prefix of one or more multicast sources ";
                  leaf name {
                    type jt:ipprefix;
                    description
                      "IP prefix of source";
                  }
    
                  uses apply-advanced;
    
                  leaf rate {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "10 .. 1000000";
                      }
                    }
                    units "kilobits";
                    description
                      "Data threshold to create new tunnel";
                  }
                }  // list source
              }  // list group
            }  // container threshold
    
            leaf data-mdt-reuse {
              type empty;
              description
                "Allow multiple customer streams to be transmitted over one data tunnel ";
            }
    
            leaf tunnel-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 8192";
                }
              }
              description
                "Maximum multicast data tunnels";
            }
    
            leaf group-range {
              type jt:ipprefix;
              description
                "Group address range for multicast data tunnels";
            }
          }  // container mdt
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable PIM graceful restart capability";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 300";
                }
              }
              units "seconds";
              description
                "Maximum time for graceful restart to finish (seconds)";
            }
    
            leaf no-bidirectional-mode {
              type empty;
              description
                "Disable PIM graceful restart for bidirectional mode";
            }
    
            leaf restart-complete-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "5 .. 300";
                }
              }
              units "seconds";
              description
                "Maximum time for graceful restart to complete (seconds)";
            }
          }  // container graceful-restart
    
          container join-load-balance {
            presence "enable join-load-balance";
            description
              "Configure PIM join load balancing";
            uses apply-advanced;
    
            leaf automatic {
              type empty;
              description
                "Enable automatic PIM join load balancing";
            }
          }  // container join-load-balance
    
          leaf standby-path-creation-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 300";
              }
            }
            units "seconds";
            description
              "Amount of time to wait before creating standby path";
          }
    
          leaf idle-standby-path-switchover-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 300";
              }
            }
            units "seconds";
            description
              "Amount of time to wait before switching over to idle standby path";
          }
    
          leaf dr-election-on-p2p {
            type empty;
            description
              "Enable DR election on Point-to-Point Interfaces";
          }
    
          leaf no-wildcard-register-stop {
            type empty;
            description
              "Disable sending of wildcard register stop message";
          }
    
          leaf nexthop-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1000";
              }
            }
            units "milliseconds";
            description
              "Nexthop hold time in milliseconds";
          }
    
          leaf mpls-internet-multicast {
            junos:must "(any "routing-instances <*> instance-type mpls-internet-multicast")";
            junos:must-message "The mpls-internet-multicast instance must be configured to support multicast over MPLS";
            type empty;
            description
              "Enable support for Internet Multicast over MPLS";
          }
    
          container join-make-before-break {
            description
              "Enable PIM Join Make-Before-Break during RPF neighbor change";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable Make-Before-Break for PIM RPF neighbor change";
              }
            }  // choice enable-disable
          }  // container join-make-before-break
    
          leaf reset-tracking-bit {
            type empty;
            description
              "Clear tracking-bit in PIM Hello LAN Prune Delay Option";
          }
    
          leaf propagation-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "250 .. 2000";
              }
            }
            units "milliseconds";
            default "500";
            description
              "Propagation delay value";
          }
    
          leaf override-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "500 .. 6000";
              }
            }
            units "milliseconds";
            default "2000";
            description
              "Override interval value";
          }
    
          container default-vpn-source {
            presence "enable default-vpn-source";
            description
              "Let all VRFs use master loopback address for mt interfaces";
            uses apply-advanced;
    
            leaf interface-name {
              junos:must "("interfaces $$-IFL family inet address")";
              junos:must-message "Family inet address should be configured on this loopback interface";
              type union {
                type jt:interface-unit;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Master loopback interface name";
            }
          }  // container default-vpn-source
        }  // grouping juniper-protocols-pim
    
        grouping juniper-protocols-pim-snooping {
          description "PIM snooping options";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for PIM Snooping";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all PIM packets";
                  }
                  enum "hello" {
                    value 1;
                    description
                      "Trace hello packets";
                  }
                  enum "join" {
                    value 2;
                    description
                      "Trace join messages";
                  }
                  enum "prune" {
                    value 3;
                    description
                      "Trace prune messages";
                  }
                  enum "route" {
                    value 4;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 5;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 6;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 7;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 8;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 9;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 10;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 11;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf no-dr-flood {
            type empty;
            description
              "Disable default flooding of multicast data on the PIM designated router port";
          }
    
          list vlan {
            key "name";
            ordered-by user;
            description "Vlan options";
            leaf name {
              junos:must "(".. .. .. .. vlan-id all")";
              junos:must-message "vlan specific configuration is allowed with qualified-learning only";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 1023";
                }
              }
              description
                "Vlan_id of the learning-domain";
            }
    
            uses apply-advanced;
    
            leaf no-dr-flood {
              type empty;
              description
                "Disable default flooding of multicast data on the PIM DR port";
            }
          }  // list vlan
        }  // grouping juniper-protocols-pim-snooping
    
        grouping juniper-protocols-rip {
          uses apply-advanced;
    
          container traceoptions {
            description "Trace options for RIP";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "auth" {
                    value 0;
                    description
                      "Trace RIP authentication";
                  }
                  enum "error" {
                    value 1;
                    description
                      "Trace RIP errors";
                  }
                  enum "expiration" {
                    value 2;
                    description
                      "Trace RIP route expiration processing";
                  }
                  enum "holddown" {
                    value 3;
                    description
                      "Trace RIP hold-down processing";
                  }
                  enum "packets" {
                    value 4;
                    description
                      "Trace all RIP packets";
                  }
                  enum "request" {
                    value 5;
                    description
                      "Trace RIP information packets";
                  }
                  enum "trigger" {
                    value 6;
                    description
                      "Trace RIP triggered updates";
                  }
                  enum "update" {
                    value 7;
                    description
                      "Trace RIP update packets";
                  }
                  enum "nsr-synchronization" {
                    value 8;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "route" {
                    value 9;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 10;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 11;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 12;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 13;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 14;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 15;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 16;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
    
              container filter {
                presence "enable filter";
                description
                  "Filter to apply to this flag";
                uses rip_filter_obj;
              }  // container filter
            }  // list flag
          }  // container traceoptions
    
          container rib-group {
            description
              "Routing table group for importing RIP routes";
            uses rib_group_inet_type;
          }  // container rib-group
    
          leaf metric-in {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 15";
              }
            }
            description
              "Metric value to add to incoming routes";
          }
    
          container send {
            description
              "Configure RIP send options";
            choice send-opts {
              leaf broadcast {
                type empty;
                description
                  "Broadcast RIPv2 packets (RIPv1 compatible)";
              }
              leaf multicast {
                type empty;
                description
                  "Multicast RIPv2 packets";
              }
              leaf none {
                type empty;
                description
                  "Do not send RIP updates";
              }
              leaf version-1 {
                type empty;
                description
                  "Broadcast RIPv1 packets";
              }
            }  // choice send-opts
          }  // container send
    
          container receive {
            description
              "Configure RIP receive options";
            choice receive-opts {
              leaf both {
                type empty;
                description
                  "Accept both RIPv1 and RIPv2 packets";
              }
              leaf none {
                type empty;
                description
                  "Do not receive RIP packets";
              }
              leaf version-1 {
                type empty;
                description
                  "Accept RIPv1 packets only";
              }
              leaf version-2 {
                type empty;
                description
                  "Accept only RIPv2 packets";
              }
            }  // choice receive-opts
          }  // container receive
    
          choice check-zero-choice {
            leaf check-zero {
              type empty;
              description
                "Check reserved fields on incoming RIPv2 packets";
            }
            leaf no-check-zero {
              type empty;
              description
                "Don't check reserved fields on incoming RIPv2 packets";
            }
          }  // choice check-zero-choice
    
          leaf message-size {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "25 .. 255";
              }
            }
            description
              "Number of route entries per update message";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf holddown {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 180";
              }
            }
            units "seconds";
            description "Hold-down time";
          }
    
          leaf route-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "30 .. 360";
              }
            }
            units "seconds";
            description
              "Delay before routes time out";
          }
    
          leaf update-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 60";
              }
            }
            units "seconds";
            description
              "Interval between regular route updates";
          }
    
          choice authentication {
            leaf authentication-type {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "No authentication";
                }
                enum "simple" {
                  value 1;
                  description
                    "Simple password authentication";
                }
                enum "md5" {
                  value 2;
                  description
                    "MD5 authentication";
                }
              }
            }
            list authentication-selective-md5 {
              key "name";
              ordered-by user;
              description
                "MD5 authentication with one or more keys";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Key ID for MD5 authentication";
              }
    
              leaf key {
                type jt:unreadable;
                description
                  "MD5 authentication key value";
              }
    
              leaf start-time {
                type jt:time;
                description
                  "Start time for key transmission (YYYY-MM-DD.HH:MM)";
              }
            }  // list authentication-selective-md5
          }  // choice authentication
    
          leaf authentication-key {
            junos:must "(!(".. authentication-selective-md5"))";
            junos:must-message "Key already provided for selective-md5";
            type jt:unreadable;
            description
              "Authentication key (password)";
          }
    
          list group {
            key "name";
            ordered-by user;
            description "Instance configuration";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,48}$";
                junos:pattern-message "Must be a string of at most 48 characters";
              }
              description "Group name";
            }
    
            uses apply-advanced;
    
            leaf route-timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 360";
                }
              }
              units "seconds";
              description
                "Delay before routes time out";
            }
    
            leaf update-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "10 .. 60";
                }
              }
              units "seconds";
              description
                "Interval between regular route updates";
            }
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of routes learned by this group";
            }
    
            leaf metric-out {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 15";
                }
              }
              description
                "Default metric of exported routes";
            }
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
    
            leaf demand-circuit {
              junos:must "(!(".. .. authentication-selective-md5"))";
              junos:must-message "selective-md5 isn't supported with demand-circuit,opt for 'authentication-type md5' instead";
              type empty;
              description
                "Enable demand circuit on this interface";
            }
    
            leaf max-retrans-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "5 .. 180";
                }
              }
              description
                "Maximum time to re-transmit a message in demand-circuit";
            }
    
            container bfd-liveness-detection {
              description
                "Bidirectional Forwarding Detection options";
              uses apply-advanced;
    
              leaf version {
                type enumeration {
                  enum "0" {
                    value 0;
                    description
                      "BFD version 0 (deprecated)";
                  }
                  enum "1" {
                    value 1;
                    description "BFD version 1";
                  }
                  enum "automatic" {
                    value 2;
                    description
                      "Choose BFD version automatically";
                  }
                }
                default "automatic";
                description
                  "BFD protocol version number";
              }
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit and receive interval";
              }
    
              leaf minimum-transmit-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                status deprecated;
                description
                  "Minimum transmit interval";
              }
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval";
              }
    
              leaf multiplier {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                default "3";
                description
                  "Detection time multiplier";
              }
    
              choice adaptation-choice {
                leaf no-adaptation {
                  type empty;
                  description
                    "Disable adaptation";
                }
              }  // choice adaptation-choice
    
              container transmit-interval {
                description
                  "Transmit-interval options";
                uses apply-advanced;
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit interval";
                }
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High transmit interval triggering a trap";
                }
              }  // container transmit-interval
    
              container detection-time {
                description
                  "Detection-time options";
                uses apply-advanced;
    
                leaf threshold {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  units "milliseconds";
                  description
                    "High detection-time triggering a trap";
                }
              }  // container detection-time
    
              container authentication {
                description
                  "Authentication options";
                uses apply-advanced;
    
                leaf key-chain {
                  junos:must "(".. algorithm")";
                  junos:must-message "May not be configured without algorithm";
                  junos:must "("security authentication-key-chains key-chain $$")";
                  junos:must-message "Referenced key-chain must be defined";
                  type string;
                  description "Key chain name";
                }
    
                leaf algorithm {
                  junos:must "(".. key-chain")";
                  junos:must-message "May not be configured without key-chain";
                  type enumeration {
                    enum "simple-password" {
                      value 0;
                      description
                        "Simple password";
                    }
                    enum "keyed-md5" {
                      value 1;
                      description
                        "Keyed message Digest 5";
                    }
                    enum "meticulous-keyed-md5" {
                      value 2;
                      description
                        "Meticulous keyed message Digest 5";
                    }
                    enum "keyed-sha-1" {
                      value 3;
                      description
                        "Keyed secure hash algorithm (SHA1) ";
                    }
                    enum
                      "meticulous-keyed-sha-1" {
                      value 4;
                      description
                        "Meticulous keyed secure hash algorithm (SHA1) ";
                    }
                  }
                  description "Algorithm name";
                }
    
                leaf loose-check {
                  type empty;
                  description
                    "Verify authentication only if authentication is negotiated";
                }
              }  // container authentication
            }  // container bfd-liveness-detection
    
            list neighbor {
              key "name";
              ordered-by user;
              description
                "Neighbor configuration";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf route-timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 360";
                  }
                }
                units "seconds";
                description
                  "Delay before routes time out";
              }
    
              leaf update-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 60";
                  }
                }
                units "seconds";
                description
                  "Interval between regular route updates";
              }
    
              leaf interface-type {
                type enumeration {
                  enum "p2mp" {
                    junos:must "(!(".. .. .. authentication-selective-md5"))";
                    junos:must-message "selective-md5 isn't supported with 'interface-type p2mp', opt for 'authentication-type md5' instead";
                    value 0;
                    description
                      "Point-to-multipoint link";
                  }
                }
                description
                  "Interface type for the neighbor";
              }
    
              leaf dynamic-peers {
                junos:must "(" .. interface-type p2mp")";
                junos:must-message "dynamic-peers option can be set only if the interface type is p2mp";
                type empty;
                description
                  "Learn peers dynamically on a p2mp interface";
              }
    
              list peer {
                junos:must "(" .. interface-type p2mp")";
                junos:must-message "Peer address can be set only if the interface type is p2mp";
                key "name";
                ordered-by user;
                description "P2MP peer";
                leaf name {
                  type jt:ipaddr;
                  description "Address of peer";
                }
              }  // list peer
    
              leaf metric-in {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 15";
                  }
                }
                description
                  "Metric value to add to incoming routes";
              }
    
              container send {
                description
                  "Configure RIP send options";
                choice send-opts {
                  leaf broadcast {
                    type empty;
                    description
                      "Broadcast RIPv2 packets (RIPv1 compatible)";
                  }
                  leaf multicast {
                    type empty;
                    description
                      "Multicast RIPv2 packets";
                  }
                  leaf none {
                    type empty;
                    description
                      "Do not send RIP updates";
                  }
                  leaf version-1 {
                    type empty;
                    description
                      "Broadcast RIPv1 packets";
                  }
                }  // choice send-opts
              }  // container send
    
              container receive {
                description
                  "Configure RIP receive options";
                choice receive-opts {
                  leaf both {
                    type empty;
                    description
                      "Accept both RIPv1 and RIPv2 packets";
                  }
                  leaf none {
                    type empty;
                    description
                      "Do not receive RIP packets";
                  }
                  leaf version-1 {
                    type empty;
                    description
                      "Accept RIPv1 packets only";
                  }
                  leaf version-2 {
                    type empty;
                    description
                      "Accept only RIPv2 packets";
                  }
                }  // choice receive-opts
              }  // container receive
    
              leaf demand-circuit {
                junos:must "(!(".. .. .. authentication-selective-md5"))";
                junos:must-message "selective-md5 isn't supported with demand-circuit, opt for 'authentication-type md5' instead";
                type empty;
                description
                  "Enable demand circuit on this interface";
              }
    
              leaf max-retrans-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "5 .. 180";
                  }
                }
                description
                  "Maximum time to re-transmit a msg in demand-circuit";
              }
    
              choice check-zero-choice {
                leaf check-zero {
                  type empty;
                  description
                    "Check reserved fields on incoming RIPv1 packets";
                }
                leaf no-check-zero {
                  type empty;
                  description
                    "Don't check reserved fields on incoming RIPv1 packets";
                }
              }  // choice check-zero-choice
    
              leaf any-sender {
                type empty;
                description
                  "Disable strict checks on sender address";
              }
    
              leaf message-size {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "25 .. 255";
                  }
                }
                description
                  "Number of route entries per update message";
              }
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
    
              choice authentication {
                leaf authentication-type {
                  type enumeration {
                    enum "none" {
                      value 0;
                      description
                        "No authentication";
                    }
                    enum "simple" {
                      value 1;
                      description
                        "Simple password authentication";
                    }
                    enum "md5" {
                      value 2;
                      description
                        "MD5 authentication";
                    }
                  }
                }
                list authentication-selective-md5 {
                  junos:must "(!("..  interface-type p2mp"))";
                  junos:must-message "selective-md5 isn't supported with '.. neighbor <> interface-type p2mp', opt for 'authentication-type md5' instead";
                  junos:must "(!("..  demand-circuit"))";
                  junos:must-message "selective-md5 isn't supported with '.. neighbor <> demand-circuit', opt for 'authentication-type md5' instead";
                  junos:must "(!(".. .. demand-circuit"))";
                  junos:must-message "selective-md5 isn't supported with '.. group <> demand-circuit', opt for 'authentication-type md5' instead";
                  key "name";
                  ordered-by user;
                  description
                    "MD5 authentication with one or more keys";
                  leaf name {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255";
                      }
                    }
                    description
                      "Key ID for MD5 authentication";
                  }
    
                  leaf key {
                    type jt:unreadable;
                    description
                      "MD5 authentication key value";
                  }
    
                  leaf start-time {
                    type jt:time;
                    description
                      "Start time for key transmission (YYYY-MM-DD.HH:MM)";
                  }
                }  // list authentication-selective-md5
              }  // choice authentication
    
              leaf authentication-key {
                junos:must "(!(".. authentication-selective-md5"))";
                junos:must-message "Key already provided for selective-md5";
                type jt:unreadable;
                description
                  "Authentication key (password)";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
              }  // container bfd-liveness-detection
            }  // list neighbor
          }  // list group
    
          container graceful-restart {
            presence "enable graceful-restart";
            description
              "RIP graceful restart options";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 600";
                }
              }
              description
                "Time after which RIP is declared out of restart";
            }
          }  // container graceful-restart
        }  // grouping juniper-protocols-rip
    
        grouping juniper-protocols-ripng {
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for RIPng";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "error" {
                    value 0;
                    description
                      "Trace RIPng errors";
                  }
                  enum "expiration" {
                    value 1;
                    description
                      "Trace RIPng route expiration processing";
                  }
                  enum "holddown" {
                    value 2;
                    description
                      "Trace RIPng hold-down processing";
                  }
                  enum "packets" {
                    value 3;
                    description
                      "Trace all RIPng packets";
                  }
                  enum "request" {
                    value 4;
                    description
                      "Trace RIPng information packets";
                  }
                  enum "trigger" {
                    value 5;
                    description
                      "Trace RIPng triggered updates";
                  }
                  enum "update" {
                    value 6;
                    description
                      "Trace RIPng update packets";
                  }
                  enum "nsr-synchronization" {
                    value 7;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "route" {
                    value 8;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 9;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 10;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 11;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 12;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 13;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 14;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 15;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf metric-in {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 15";
              }
            }
            description
              "Metric value to add to incoming routes";
          }
    
          container send {
            description
              "Configure RIPng send options";
            choice send-opts {
              leaf none {
                type empty;
                description
                  "Do not send RIPng updates";
              }
            }  // choice send-opts
          }  // container send
    
          container receive {
            description
              "Configure RIPng receive options";
            choice receive-opts {
              leaf none {
                type empty;
                description
                  "Do not receive RIPng packets";
              }
            }  // choice receive-opts
          }  // container receive
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
    
          leaf holddown {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 180";
              }
            }
            units "seconds";
            description "Hold-down time";
          }
    
          leaf route-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "30 .. 360";
              }
            }
            units "seconds";
            description
              "Delay before routes time out";
          }
    
          leaf update-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 60";
              }
            }
            units "seconds";
            description
              "Interval between regular route updates";
          }
    
          list group {
            key "name";
            ordered-by user;
            description "Instance configuration";
            leaf name {
              type string {
                junos:posix-pattern "^.{1,48}$";
                junos:pattern-message "Must be a string of at most 48 characters";
              }
              description "Group name";
            }
    
            uses apply-advanced;
    
            leaf route-timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 360";
                }
              }
              units "seconds";
              description
                "Delay before routes time out";
            }
    
            leaf update-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "10 .. 60";
                }
              }
              units "seconds";
              description
                "Interval between regular route updates";
            }
    
            leaf preference {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of routes learned by this group";
            }
    
            leaf metric-out {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 15";
                }
              }
              description
                "Default metric of exported routes";
            }
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
    
            list neighbor {
              key "name";
              ordered-by user;
              description
                "Neighbor configuration";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf route-timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 360";
                  }
                }
                units "seconds";
                description
                  "Delay before routes time out";
              }
    
              leaf update-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 60";
                  }
                }
                units "seconds";
                description
                  "Interval between regular route updates";
              }
    
              leaf metric-in {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 15";
                  }
                }
                description
                  "Metric value to add to incoming routes";
              }
    
              container send {
                description
                  "Configure RIPng send options";
                choice send-opts {
                  leaf none {
                    type empty;
                    description
                      "Do not send RIPng updates";
                  }
                }  // choice send-opts
              }  // container send
    
              container receive {
                description
                  "Configure RIPng receive options";
                choice receive-opts {
                  leaf none {
                    type empty;
                    description
                      "Do not receive RIPng packets";
                  }
                }  // choice receive-opts
              }  // container receive
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
            }  // list neighbor
          }  // list group
    
          container graceful-restart {
            presence "enable graceful-restart";
            description
              "RIPng graceful restart options";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 600";
                }
              }
              description
                "Time after which RIPng is declared out of restart";
            }
          }  // container graceful-restart
        }  // grouping juniper-protocols-ripng
    
        grouping juniper-protocols-router-discovery {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable router discovery";
            }
          }  // choice enable-disable
    
          container traceoptions {
            description
              "Trace options for router discovery";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "route" {
                    value 0;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 1;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 2;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 3;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 4;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 5;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 6;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 7;
                    description
                      "Trace everything";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interfaces on which to configure router discovery";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf max-advertisement-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "4 .. 1800";
                }
              }
              units "seconds";
              description
                "Maximum time before sending advertisements";
            }
    
            leaf min-advertisement-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "3 .. 1800";
                }
              }
              units "seconds";
              description
                "Minimum time before sending advertisements";
            }
    
            leaf lifetime {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "3 .. 9000";
                }
              }
              units "seconds";
              description
                "How long addresses in advertisements are valid";
            }
          }  // list interface
    
          list address {
            key "name";
            ordered-by user;
            description
              "IP addresses to include in advertisements";
            leaf name {
              type jt:ipv4addr;
              description
                "IP addresses to include in router advertisements";
            }
    
            uses apply-advanced;
    
            leaf advertise {
              type empty;
              description
                "Advertise the IP address in advertisements";
            }
    
            leaf ignore {
              type empty;
              description
                "Do not advertise the IP address in advertisements";
            }
    
            leaf broadcast {
              type empty;
              description
                "Include IP address only in broadcast advertisements";
            }
    
            leaf multicast {
              type empty;
              description
                "Include IP address only in multicast advertisements";
            }
    
            leaf ineligible {
              type empty;
              description
                "IP address can never become a default router";
            }
    
            leaf priority {
              type union {
                type int32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Preference of the address to become a default router";
            }
          }  // list address
        }  // grouping juniper-protocols-router-discovery
    
        grouping juniper-protocols-rsvp {
          description "RSVP options";
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable RSVP";
            }
          }  // choice enable-disable
    
          container graceful-restart {
            description
              "Configure graceful restart attributes";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable RSVP graceful restart capability";
              }
            }  // choice enable-disable
    
            leaf helper-disable {
              type empty;
              description
                "Disable graceful restart helper capability";
            }
    
            leaf maximum-helper-restart-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1800";
                }
              }
              units "seconds";
              default "20";
              description
                "Maximum wait time from down event to neighbor dead";
            }
    
            leaf maximum-helper-recovery-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 3600";
                }
              }
              units "seconds";
              default "180";
              description
                "Maximum time restarting neighbor states are kept";
            }
          }  // container graceful-restart
    
          container tunnel-services {
            presence "enable tunnel-services";
            description
              "Use tunnel services for P2MP LSP ultimate-hop popping";
            uses apply-advanced;
    
            leaf-list devices {
              type union {
                type jt:interface-device;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              ordered-by user;
              description
                "Tunnel services devices to use for P2MP LSPs";
            }
          }  // container tunnel-services
    
          leaf no-p2mp-sublsp {
            type empty;
            description
              "Disable P2MP sub-LSP object generation";
          }
    
          leaf no-node-id-subobject {
            type empty;
            description
              "Do not include the node-id sub-object in the RRO";
          }
    
          leaf no-interface-hello {
            type empty;
            description
              "Disble interface Hellos on all RSVP interfaces";
          }
    
          container pop-and-forward {
            description
              "RSVP pop-and-forward specific global parameters";
            uses apply-advanced;
    
            container application-label {
              description
                "Number of application labels under the RSVP transport";
              uses apply-advanced;
    
              leaf depth {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 3";
                  }
                }
                default "1";
                description
                  "Application label depth";
              }
            }  // container application-label
          }  // container pop-and-forward
    
          leaf hello-acknowledgements {
            type empty;
            description
              "Acknowledge Hellos on RSVP interfaces not having sessions";
          }
    
          leaf no-hello-acknowledgements {
            junos:must "(!("protocols rsvp hello-acknowledgements"))";
            junos:must-message "Config hello-acknowledgements should be removed";
            type empty;
            description
              "Do not ack Hellos on RSVP interfaces not having sessions";
          }
    
          container node-hello {
            presence "enable node-hello";
            description
              "Enable node-ID based Hellos on all RSVP interfaces";
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 60";
                }
              }
              units "seconds";
              default "9";
              description "Hello interval";
            }
          }  // container node-hello
    
          leaf no-node-hello {
            junos:must "(!("protocols rsvp node-hello"))";
            junos:must-message "Config node-hello should be removed";
            type empty;
            description
              "Disable node-ID based Hellos on the router";
          }
    
          leaf allow-bidirectional {
            type empty;
            status deprecated;
            description
              "Enable bidirectional support in RSVP";
          }
    
          leaf local-reversion {
            junos:must "(!("protocols rsvp no-local-reversion"))";
            junos:must-message "Config no-local-reversion should be removed";
            type empty;
            description
              "Enable local reversion at this Point of Local Repair";
          }
    
          leaf no-local-reversion {
            type empty;
            description
              "Disable local reversion at this Point of Local Repair";
          }
    
          leaf rfc6510-lsp-attributes {
            type empty;
            description
              "Use RFC6510 compliant LSP_ATTRIBUTES";
          }
    
          container fast-reroute {
            description
              "One-to-one fast-reroute protection mechanism";
            uses apply-advanced;
    
            leaf optimize-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Frequency of reoptimization for fast-reroute detour";
            }
          }  // container fast-reroute
    
          container load-balance {
            description
              "Per-packet load-balancing algorithm";
            uses apply-advanced;
    
            leaf bandwidth {
              type empty;
              description
                "Per-packet load balancing proportional to LSP bandwidth";
            }
          }  // container load-balance
    
          container traceoptions {
            description "Trace options for RSVP";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "io-event" {
                    value 0;
                    description
                      "Trace RSVP IO task related events";
                  }
                  enum "io-packets" {
                    value 1;
                    description
                      "Trace all RSVP periodic refresh activity";
                  }
                  enum "packets" {
                    value 2;
                    description
                      "Trace all RSVP trigger packets";
                  }
                  enum "path" {
                    value 3;
                    description
                      "Trace RSVP trigger path messages";
                  }
                  enum "resv" {
                    value 4;
                    description
                      "Trace RSVP trigger Resv messages";
                  }
                  enum "pathtear" {
                    value 5;
                    description
                      "Trace RSVP PathTear messages";
                  }
                  enum "resvtear" {
                    value 6;
                    description
                      "Trace RSVP ResvTear messages";
                  }
                  enum "state" {
                    value 7;
                    description
                      "Trace state transitions";
                  }
                  enum "error" {
                    value 8;
                    description
                      "Trace error conditions";
                  }
                  enum "route" {
                    value 9;
                    description
                      "Trace routing information";
                  }
                  enum "lmp" {
                    value 10;
                    description
                      "Trace RSVP-LMP related interactions";
                  }
                  enum "event" {
                    value 11;
                    description
                      "Trace RSVP related events";
                  }
                  enum "nsr-synchronization" {
                    value 12;
                    description
                      "Trace NSR synchronization events";
                  }
                  enum "lsp-prefix" {
                    value 13;
                    description
                      "Prefix the trace messages with LSP information";
                  }
                  enum "enhanced-frr" {
                    value 14;
                    description
                      "Enhanced FRR related information";
                  }
                  enum "all" {
                    value 15;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf refresh-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            default "1200";
            description
              "Refresh time in seconds";
          }
    
          leaf keep-multiplier {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 255";
              }
            }
            default "3";
            description "Keep multiplier";
          }
    
          leaf graceful-deletion-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 300";
              }
            }
            units "seconds";
            default "30";
            description
              "Time to complete graceful deletion signaling";
          }
    
          leaf setup-protection {
            type empty;
            description
              "Enable setup protection";
          }
    
          leaf no-p2mp-re-merge {
            type empty;
            description "Enable p2mp remerge";
          }
    
          leaf cross-credibility-cspf {
            type empty;
            description
              "Compute CSPF paths spanning protocols for bypass LSP, detour LSP and loose hop expansion";
          }
    
          container preemption {
            description
              "Set RSVP session preemption attributes";
            uses apply-advanced;
    
            choice preemption-type {
              leaf disabled {
                type empty;
                description
                  "No RSVP session preemption";
              }
              leaf normal {
                type empty;
                description
                  "Run RSVP session preemption to accommodate new sessions";
              }
              leaf aggressive {
                type empty;
                description
                  "Run RSVP session preemption whenever necessary";
              }
            }  // choice preemption-type
    
            container soft-preemption {
              description
                "Options for establishing new path before tearing down a preempted LSP";
              uses apply-advanced;
    
              leaf cleanup-timer {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 10800";
                  }
                }
                units "seconds";
                description
                  "Time a soft-preempted LSP will be maintained";
              }
            }  // container soft-preemption
          }  // container preemption
    
          leaf authentication-key {
            type jt:unreadable;
            description
              "Authentication password";
          }
    
          leaf no-authentication-check {
            type empty;
            description
              "Skip authentication check for received messages";
          }
    
          container associated-bidirectional-lsp {
            description
              "Set associated bidirectional LSP attributes";
            uses apply-advanced;
    
            leaf single-sided-provisioning {
              type empty;
              description
                "Enable unidirectional reverse LSP setup for single sided provisioned forward LSP";
            }
          }  // container associated-bidirectional-lsp
    
          leaf no-enhanced-frr-bypass {
            type empty;
            description
              "Disable enhanced facility backup FRR";
          }
    
          container expand-flood-reflector-hop {
            presence
              "enable expand-flood-reflector-hop";
            description
              "Control expansion of flood reflector ERO strict hops";
          }  // container expand-flood-reflector-hop
    
          list interface {
            key "name";
            ordered-by user;
            description "RSVP interface options";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable RSVP on this interface";
              }
            }  // choice enable-disable
    
            leaf authentication-key {
              type jt:unreadable;
              description
                "Authentication password";
            }
    
            choice aggregate-choice {
              leaf aggregate {
                type empty;
                status deprecated;
                description
                  "Permit refresh reduction extensions on the interface";
              }
              leaf no-aggregate {
                type empty;
                status deprecated;
                description
                  "Don't permit refresh reduction extensions on the interface";
              }
            }  // choice aggregate-choice
    
            choice reliable-choice {
              leaf reliable {
                type empty;
                description
                  "Permit reliable message delivery on the interface";
              }
              leaf no-reliable {
                type empty;
                description
                  "Don't permit reliable message delivery on the interface";
              }
            }  // choice reliable-choice
    
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 60";
                }
              }
              units "seconds";
              default "9";
              description "Hello interval";
            }
    
            container subscription {
              description
                "Link bandwidth percentage for RSVP reservation";
              uses subscription-type;
            }  // container subscription
    
            leaf bandwidth {
              type string;
              description
                "Available bandwidth for the interface units bps";
            }
    
            container update-threshold {
              description
                "Change in reserved bandwidth to trigger IGP update";
              uses apply-advanced;
    
              leaf threshold-percent {
                type decimal64 {
                  fraction-digits 9;
                  range "0.001 .. 20";
                }
                units "percent";
                default "10.0";
                description
                  "Percentage change in reserved bandwidth to trigger IGP update";
              }
    
              leaf threshold-value {
                type string;
                description
                  "Change in reserved bandwidth to trigger IGP update (will be capped at 20% of link BW)";
              }
            }  // container update-threshold
    
            container update-threshold-max-reservable {
              description
                "Change in non-rsvp bandwidth to trigger IGP update ";
              uses apply-advanced;
    
              leaf bandwidth {
                type string;
                description
                  "Change in non-rsvp bandwidth to trigger IGP update units bps";
              }
    
              leaf percent {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                units "percent";
                description
                  "Percentage change in max-reservable bandwidth to trigger IGP update";
              }
            }  // container update-threshold-max-reservable
    
            container non-rsvp-bandwdith {
              description
                "Config knobs relating to non-rsvp bandwidth";
              uses apply-advanced;
    
              leaf local-bw-override-threshold {
                type empty;
                description
                  "Overide threshold and update local bandwidth with non-rsvp bandwidth usage";
              }
            }  // container non-rsvp-bandwdith
    
            container link-protection {
              presence "enable link-protection";
              description
                "Protect traffic with a label-stacked LSP";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable link protection on this interface";
                }
              }  // choice enable-disable
    
              container bandwidth {
                description
                  "Bandwidth for each bypass";
                uses bandwidth-type;
              }  // container bandwidth
    
              leaf max-bypasses {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 99";
                  }
                }
                default "1";
                description
                  "Max number of bypasses permitted for protecting this interface";
              }
    
              leaf subscription {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                default "100";
                description
                  "Percent of bandwidth guaranteed when admitting protected LSPs into bypasses";
              }
    
              leaf no-node-protection {
                type empty;
                description
                  "Disallow node protection on this interface";
              }
    
              leaf optimize-timer {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 65535";
                  }
                }
                units "seconds";
                default "0";
                description
                  "Interval between bypass reoptimizations";
              }
    
              leaf class-of-service {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type int32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Class of service for the bypass LSP";
              }
    
              leaf hop-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 255";
                  }
                }
                description
                  "Maximum allowed router hops for bypass";
              }
    
              leaf no-cspf {
                junos:must "(".. path")";
                junos:must-message "The path of the bypass must be configured when using no-cspf";
                type empty;
                description
                  "Disable automatic path computation";
              }
    
              leaf exclude-srlg {
                type empty;
                description "Exclude SRLG links";
              }
    
              container priority {
                presence "enable priority";
                description
                  "Preemption priorities for the bypass LSP";
              }  // container priority
    
              leaf setup-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description "Set-up priority";
              }
    
              leaf reservation-priority {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Reservation priority";
              }
    
              list path {
                key "name";
                ordered-by user;
                description
                  "Explicit route of bypass path";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Address of next system in path";
                }
    
                choice loose_strict_none {
                  leaf loose {
                    type empty;
                    description
                      "Next hop might not be adjacent";
                  }
                  leaf strict {
                    type empty;
                    description
                      "Next hop must be adjacent";
                  }
                }  // choice loose_strict_none
              }  // list path
    
              container admin-group {
                description
                  "Administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group
    
              list bypass {
                key "name";
                ordered-by user;
                description
                  "Bypass with specific constraints";
                leaf name {
                  type string {
                    length "1 .. 64";
                  }
                  description "Name of bypass";
                }
    
                uses apply-advanced;
    
                leaf to {
                  type jt:ipv4addr;
                  description
                    "Address of egress router";
                }
    
                container bandwidth {
                  description
                    "Bandwidth for each bypass";
                  uses bandwidth-type;
                }  // container bandwidth
    
                container subscription {
                  presence "enable subscription";
                  description
                    "Bandwidth percent available on bypass for protected LSPs";
                  uses bypass-subscription-type;
                }  // container subscription
    
                leaf description {
                  type string {
                    length "1 .. 80";
                  }
                  description
                    "Text description of bypass";
                }
    
                container priority {
                  presence "enable priority";
                  description
                    "Preemption priorities for bypass";
                }  // container priority
    
                leaf setup-priority {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 7";
                    }
                  }
                  description "Set-up priority";
                }
    
                leaf reservation-priority {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 7";
                    }
                  }
                  description
                    "Reservation priority";
                }
    
                leaf class-of-service {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type int32 {
                      range "0 .. 7";
                    }
                  }
                  description
                    "Class of service for the bypass LSP";
                }
    
                leaf hop-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 255";
                    }
                  }
                  description
                    "Maximum allowed router hops for bypass";
                }
    
                leaf no-cspf {
                  junos:must "(".. path")";
                  junos:must-message "The path of the bypass must be configured when using no-cspf";
                  type empty;
                  description
                    "Disable automatic path computation";
                }
    
                leaf exclude-srlg {
                  type empty;
                  description
                    "Exclude SRLG links";
                }
    
                list path {
                  key "name";
                  ordered-by user;
                  description
                    "Explicit route of bypass path";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "Address of next system in path";
                  }
    
                  choice loose_strict_none {
                    leaf loose {
                      type empty;
                      description
                        "Next hop might not be adjacent";
                    }
                    leaf strict {
                      type empty;
                      description
                        "Next hop must be adjacent";
                    }
                  }  // choice loose_strict_none
                }  // list path
    
                container admin-group {
                  description
                    "Administrative group policy";
                  uses admin_group_include_exclude;
                }  // container admin-group
              }  // list bypass
            }  // container link-protection
          }  // list interface
    
          list peer-interface {
            key "name";
            ordered-by user;
            description
              "Configuration for peer interface";
            leaf name {
              type string;
              description
                "Name of peer interface";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable RSVP on this control peer";
              }
            }  // choice enable-disable
    
            leaf authentication-key {
              type jt:unreadable;
              description
                "Authentication password";
            }
    
            choice aggregate-choice {
              leaf aggregate {
                type empty;
                status deprecated;
                description
                  "Permit refresh reduction extensions on the interface";
              }
              leaf no-aggregate {
                type empty;
                status deprecated;
                description
                  "Don't permit refresh reduction extensions on the interface";
              }
            }  // choice aggregate-choice
    
            choice reliable-choice {
              leaf reliable {
                type empty;
                description
                  "Permit reliable message delivery on the interface";
              }
              leaf no-reliable {
                type empty;
                description
                  "Don't permit reliable message delivery on the interface";
              }
            }  // choice reliable-choice
    
            leaf hello-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 60";
                }
              }
              units "seconds";
              default "9";
              description "Hello interval";
            }
    
            container dynamic-bidirectional-transport {
              presence
                "enable dynamic-bidirectional-transport";
              description
                "Enable dynamic setup of bidirectional packet LSP for transporting non-packet GMPLS LSP";
              uses apply-advanced;
    
              leaf template {
                junos:must "(!("protocols mpls label-switched-path $$ p2mp"))";
                junos:must-message "Referenced template cannot be a p2mp template";
                junos:must "(("protocols mpls label-switched-path $$" && "protocols mpls label-switched-path $$ template"))";
                junos:must-message "Referenced LSP template does not exist";
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be a string of 64 characters or less";
                }
                description
                  "Template for the dynamic bidirectional packet LSP";
              }
            }  // container dynamic-bidirectional-transport
          }  // list peer-interface
    
          list lsp-set {
            key "name";
            ordered-by user;
            description
              "Configuration for lsp set";
            leaf name {
              type string;
              description "Name of lsp set";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable this lsp set";
              }
            }  // choice enable-disable
    
            container match-criteria {
              description
                "Match criteria for this lsp set";
              uses lsp-set-match-type;
            }  // container match-criteria
    
            container traceoptions {
              description
                "Trace options for this lsp set";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "io-event" {
                      value 0;
                      description
                        "Trace RSVP IO task related events";
                    }
                    enum "io-packets" {
                      value 1;
                      description
                        "Trace all RSVP periodic refresh activity";
                    }
                    enum "packets" {
                      value 2;
                      description
                        "Trace all RSVP packets";
                    }
                    enum "path" {
                      value 3;
                      description
                        "Trace RSVP path messages";
                    }
                    enum "resv" {
                      value 4;
                      description
                        "Trace RSVP Resv messages";
                    }
                    enum "pathtear" {
                      value 5;
                      description
                        "Trace RSVP PathTear messages";
                    }
                    enum "resvtear" {
                      value 6;
                      description
                        "Trace RSVP ResvTear messages";
                    }
                    enum "state" {
                      value 7;
                      description
                        "Trace state transitions";
                    }
                    enum "error" {
                      value 8;
                      description
                        "Trace error conditions";
                    }
                    enum "route" {
                      value 9;
                      description
                        "Trace routing information";
                    }
                    enum "lmp" {
                      value 10;
                      description
                        "Trace RSVP-LMP related interactions";
                    }
                    enum "event" {
                      value 11;
                      description
                        "Trace RSVP related events";
                    }
                    enum "nsr-synchronization" {
                      value 12;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "lsp-prefix" {
                      value 13;
                      description
                        "Prefix the trace messages with LSP information";
                    }
                    enum "enhanced-frr" {
                      value 14;
                      description
                        "Enhanced FRR related information";
                    }
                    enum "all" {
                      value 15;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
          }  // list lsp-set
        }  // grouping juniper-protocols-rsvp
    
        grouping bypass-subscription-type {
          uses apply-advanced;
    
          leaf subscription {
            type string;
            default "100";
            description
              "Subscription percentage for bandwidth protection";
          }
        }  // grouping bypass-subscription-type
    
        grouping juniper-protocols-stp {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable STP";
            }
          }  // choice enable-disable
    
          leaf bpdu-destination-mac-address {
            type enumeration {
              enum "provider-bridge-group" {
                value 0;
                description
                  "802.1ad provider bridge group address";
              }
            }
            description
              "Destination MAC address in the spanning tree BPDUs";
          }
    
          leaf bridge-priority {
            type string {
              junos:posix-pattern "^(0|4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
              junos:pattern-message "Must be a multiple of 4096";
            }
            description
              "Priority of the bridge (in increments of 4k - 0,4k,8k,..60k)";
          }
    
          leaf backup-bridge-priority {
            type string {
              junos:posix-pattern "^(4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
              junos:pattern-message "Must be a multiple of 4096";
            }
            description
              "Priority of the bridge (in increments of 4k - 4k,8k,..60k)";
          }
    
          leaf max-age {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "6 .. 40";
              }
            }
            units "seconds";
            description
              "Maximum age of received protocol bpdu";
          }
    
          leaf hello-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 10";
              }
            }
            units "seconds";
            description
              "Time interval between configuration BPDUs";
          }
    
          leaf forward-delay {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "4 .. 30";
              }
            }
            units "seconds";
            description
              "Time spent in listening or learning state";
          }
    
          leaf system-identifier {
            type jt:mac-unicast;
            description
              "Sytem identifier to represent this node";
          }
    
          container traceoptions {
            description
              "Tracing options for debugging protocol operation";
            uses stp-trace-options;
          }  // container traceoptions
    
          leaf vpls-flush-on-topology-change {
            type empty;
            description
              "Enable VPLS MAC flush on root protected CE interface receving topology change";
          }
    
          leaf priority-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 255";
              }
            }
            units "seconds";
            description
              "Hold time before switching to primary priority when core domain becomes up";
          }
    
          list system-id {
            key "name";
            ordered-by user;
            description
              "System ID to IP mapping";
            uses system-id-ip-map;
          }  // list system-id
    
          list interface {
            key "name";
            description "Interface options";
            uses stp-interface;
          }  // list interface
    
          leaf extended-system-id {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "0 .. 4095";
              }
            }
            description
              "Extended system identifier";
          }
    
          leaf force-version {
            type enumeration {
              enum "stp" {
                value 0;
                description
                  "Spanning tree protocol";
              }
            }
            description "Force protocol version";
          }
    
          leaf bpdu-block-on-edge {
            type empty;
            description
              "Block BPDU on all interfaces configured as edge (BPDU Protect)";
          }
        }  // grouping juniper-protocols-stp
    
        grouping juniper-protocols-vstp {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description "Disable VSTP";
            }
          }  // choice enable-disable
    
          leaf force-version {
            type enumeration {
              enum "stp" {
                value 0;
                description
                  "Spanning tree protocol";
              }
            }
            description "Force protocol version";
          }
    
          leaf bpdu-block-on-edge {
            type empty;
            description
              "Block BPDU on all interfaces configured as edge (BPDU Protect)";
          }
    
          leaf vpls-flush-on-topology-change {
            type empty;
            description
              "Enable VPLS MAC flush on root protected CE interface receving topology change";
          }
    
          leaf priority-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 255";
              }
            }
            units "seconds";
            description
              "Hold time before switching to primary priority when core domain becomes up";
          }
    
          list system-id {
            key "name";
            ordered-by user;
            description
              "System ID to IP mapping";
            uses system-id-ip-map;
          }  // list system-id
    
          list interface {
            key "name";
            description "Interface options";
            uses stp-interface;
          }  // list interface
    
          list vlan {
            key "name";
            description
              "VLAN spanning tree options";
            leaf name {
              type string;
              description "VLAN id or all";
            }
    
            uses apply-advanced;
    
            leaf bridge-priority {
              type string {
                junos:posix-pattern "^(0|4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                junos:pattern-message "Must be a multiple of 4096";
              }
              description
                "Priority of the bridge (in increments of 4k - 0,4k,8k,..60k)";
            }
    
            leaf backup-bridge-priority {
              type string {
                junos:posix-pattern "^(4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                junos:pattern-message "Must be a multiple of 4096";
              }
              description
                "Priority of the bridge (in increments of 4k - 4k,8k,..60k)";
            }
    
            leaf max-age {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "6 .. 40";
                }
              }
              units "seconds";
              description
                "Maximum age of received protocol bpdu";
            }
    
            leaf hello-time {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 10";
                }
              }
              units "seconds";
              description
                "Time interval between configuration BPDUs";
            }
    
            leaf forward-delay {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "4 .. 30";
                }
              }
              units "seconds";
              description
                "Time spent in listening or learning state";
            }
    
            leaf system-identifier {
              type jt:mac-unicast;
              description
                "Sytem identifier to represent this node";
            }
    
            container traceoptions {
              description
                "Tracing options for debugging protocol operation";
              uses stp-trace-options;
            }  // container traceoptions
    
            list interface {
              key "name";
              description "Interface options";
              uses stp-interface;
            }  // list interface
          }  // list vlan
    
          container vlan-group {
            presence "enable vlan-group";
            description
              "Spanning tree options for group of VLANs";
            uses apply-advanced;
    
            list group {
              key "name";
              ordered-by user;
              description "Name if VLAN group";
              leaf name {
                type string {
                  junos:posix-pattern "^[[:alpha:]][[:alnum:]_-]+$";
                  junos:pattern-message "Must be a string beginning with a letter and consisting of letters, numbers, dashes, and underscores";
                  length "1 .. 63";
                }
                description "VLAN group name";
              }
    
              uses apply-advanced;
    
              leaf-list vlan {
                type string;
                ordered-by user;
                description
                  "VLAN ID or VLAN ID range [1..4094]";
              }
    
              leaf bridge-priority {
                type string {
                  junos:posix-pattern "^(0|4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                  junos:pattern-message "Must be a multiple of 4096";
                }
                description
                  "Priority of the bridge (in increments of 4k - 0,4k,8k,..60k)";
              }
    
              leaf backup-bridge-priority {
                type string {
                  junos:posix-pattern "^(4k|4096|8k|8192|12k|12288|16k|16384|20k|20480|24k|24576|28k|28672|32k|32768|36k|36864|40k|40960|44k|45056|48k|49512|52k|53248|56k|57344|60k|61440)$";
                  junos:pattern-message "Must be a multiple of 4096";
                }
                description
                  "Priority of the bridge (in increments of 4k - 4k,8k,..60k)";
              }
    
              leaf max-age {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "6 .. 40";
                  }
                }
                units "seconds";
                description
                  "Maximum age of received protocol bpdu";
              }
    
              leaf hello-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 10";
                  }
                }
                units "seconds";
                description
                  "Time interval between configuration BPDUs";
              }
    
              leaf forward-delay {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "4 .. 30";
                  }
                }
                units "seconds";
                description
                  "Time spent in listening or learning state";
              }
    
              leaf system-identifier {
                type jt:mac-unicast;
                description
                  "Sytem identifier to represent this node";
              }
    
              container traceoptions {
                description
                  "Tracing options for debugging protocol operation";
                uses stp-trace-options;
              }  // container traceoptions
    
              list interface {
                key "name";
                description "Interface options";
                uses stp-interface;
              }  // list interface
            }  // list group
          }  // container vlan-group
        }  // grouping juniper-protocols-vstp
    
        grouping juniper-ri-protocols-bfd {
          uses apply-advanced;
    
          container sbfd {
            description
              "Seamless BFD parameters";
            uses apply-advanced;
    
            leaf-list pool {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "List of seamless BFD endpoints";
            }
    
            list local-discriminator {
              key "name";
              ordered-by user;
              description
                "Local discriminator for seamless BFD responder";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Local discriminator for seamless BFD responder";
              }
    
              uses apply-advanced;
    
              leaf minimum-receive-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum receive interval for seamless BFD responder";
              }
    
              leaf local-ip-address {
                type jt:ipv4addr;
                description
                  "IPv4 source address";
              }
            }  // list local-discriminator
          }  // container sbfd
        }  // grouping juniper-ri-protocols-bfd
    
        grouping juniper-ri-protocols-igmp-snooping {
          description "IGMP snooping options";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for IGMP Snooping";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all IGMP packets";
                  }
                  enum "query" {
                    value 1;
                    description
                      "Trace IGMP membership query messages";
                  }
                  enum "report" {
                    value 2;
                    description
                      "Trace membership report messages";
                  }
                  enum "leave" {
                    value 3;
                    description
                      "Trace leave group messages (IGMPv2 only)";
                  }
                  enum "group" {
                    value 4;
                    description
                      "Trace group operations";
                  }
                  enum "client-notification" {
                    value 5;
                    description
                      "Trace notifications";
                  }
                  enum "host-notification" {
                    value 6;
                    description
                      "Trace host notifications";
                  }
                  enum "route" {
                    value 7;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 8;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 9;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 10;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 11;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 12;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 13;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 14;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf query-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1024";
              }
            }
            units "seconds";
            default "125";
            description
              "When to send host query messages";
          }
    
          container l2-querier {
            description "Enable L2 querier mode";
            uses apply-advanced;
    
            leaf source-address {
              type jt:ipv4addr;
              description
                "Source IP address to use for L2 querier";
            }
          }  // container l2-querier
    
          leaf query-response-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "10";
            description
              "How long to wait for a host query response";
          }
    
          leaf query-last-member-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "1";
            description
              "When to send group query messages";
          }
    
          leaf robust-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "2 .. 10";
              }
            }
            default "2";
            description
              "Expected packet loss on a subnet";
          }
    
          leaf learn-pim-router {
            type empty;
            description
              "Learn PIM router interfaces from PIM hellos";
          }
    
          leaf immediate-leave {
            type empty;
            description
              "Enable immediate group leave on interfaces";
          }
    
          leaf evpn-ssm-reports-only {
            type empty;
            description
              "Accept and process only <s,g> reports of SSM groups";
          }
    
          container proxy {
            presence "enable proxy";
            description "Enable proxy mode";
            uses apply-advanced;
    
            leaf source-address {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "With qualified-learning source-address should be configured under Vlan options";
              type jt:ipv4addr;
              description
                "Source IP address to use for proxy";
            }
    
            leaf irb {
              type empty;
              description
                "Proxy IGMP reports to IRB";
            }
          }  // container proxy
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface options for IGMP";
            leaf name {
              junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
              junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
              junos:must "(!("interfaces $$-IFL vlan-id-range"))";
              junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
              junos:must "(".. .. .. .. interface $$")";
              junos:must-message "interface options can be specified for the interfaces in the routing-instance";
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            leaf host-only-interface {
              junos:must "(!(".. multicast-router-interface"))";
              junos:must-message "interface cannot be both host-only and multicast-router";
              type empty;
              description
                "Enable interfaces to be treated as host-side interfaces";
            }
    
            leaf group-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              description
                "Maximum number of (source,group) per interface";
            }
    
            container static {
              description
                "Static group or source membership";
              uses apply-advanced;
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP multicast group address";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "IP multicast group address";
                }
    
                uses apply-advanced;
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast source address";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "Source address of IP multicast data";
                  }
    
                  uses apply-advanced;
                }  // list source
              }  // list group
            }  // container static
          }  // list interface
    
          list pseudowire-remote-address {
            junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
            junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
            key "name";
            ordered-by user;
            description
              "Pseudowire interface options for IGMP";
            leaf name {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, pseudowire-remote-address should be configured only under vlan";
              type jt:ipv4addr;
              description
                "Pseudowire endpoint address";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
          }  // list pseudowire-remote-address
    
          list qualified-vlan {
            key "name";
            ordered-by user;
            description
              "VLAN options for qualified-learning";
            leaf name {
              junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
              junos:must-message "vlan specific configuration is allowed with qualified-learning only";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 1023";
                }
              }
              description
                "VLAN ID of the learning-domain";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                type jt:ipv4addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for IGMP";
              leaf name {
                junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for IGMP";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
          }  // list qualified-vlan
    
          list vlan {
            key "name";
            ordered-by user;
            description "Vlan options";
            leaf name {
              junos:must "(!(".. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Snooping cannot be enabled on secondary vlan";
              type string {
                length "1 .. 64";
              }
              description "VLAN name";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                type jt:ipv4addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for IGMP";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv4addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for IGMP";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
    
            list qualified-vlan {
              key "name";
              ordered-by user;
              description
                "VLAN options for qualified-learning";
              leaf name {
                junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
                junos:must-message "vlan specific configuration is allowed with qualified-learning only";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1023";
                  }
                }
                description
                  "VLAN ID of the learning-domain";
              }
    
              uses apply-advanced;
    
              leaf query-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1024";
                  }
                }
                units "seconds";
                description
                  "When to send host query messages";
              }
    
              leaf query-response-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "How long to wait for a host query response";
              }
    
              leaf query-last-member-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "When to send group query messages";
              }
    
              leaf robust-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 10";
                  }
                }
                description
                  "Expected packet loss on a subnet";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              container proxy {
                presence "enable proxy";
                description "Enable proxy mode";
                uses apply-advanced;
    
                leaf source-address {
                  type jt:ipv4addr;
                  description
                    "Source IP address to use for proxy";
                }
              }  // container proxy
    
              leaf evpn-ssm-reports-only {
                type empty;
                description
                  "Accept and process only <s,g> reports of SSM groups";
              }
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Interface options for IGMP";
                leaf name {
                  junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                  junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
    
                leaf host-only-interface {
                  junos:must "(!(".. multicast-router-interface"))";
                  junos:must-message "interface cannot be both host-only and multicast-router";
                  type empty;
                  description
                    "Enable interfaces to be treated as host-side interfaces";
                }
    
                leaf group-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum number of (source,group) per interface";
                }
    
                container static {
                  description
                    "Static group or source membership";
                  uses apply-advanced;
    
                  list group {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast group address";
                    leaf name {
                      type jt:ipv4addr;
                      description
                        "IP multicast group address";
                    }
    
                    uses apply-advanced;
    
                    list source {
                      key "name";
                      ordered-by user;
                      description
                        "IP multicast source address";
                      leaf name {
                        type jt:ipv4addr;
                        description
                          "Source address of IP multicast data";
                      }
    
                      uses apply-advanced;
                    }  // list source
                  }  // list group
                }  // container static
              }  // list interface
    
              list pseudowire-remote-address {
                junos:must "((" .. .. .. igmp-snooping-options snoop-pseudowires" || " .. .. .. .. igmp-snooping-options snoop-pseudowires"))";
                junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
                key "name";
                ordered-by user;
                description
                  "Pseudowire interface options for IGMP";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Pseudowire endpoint address";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
              }  // list pseudowire-remote-address
            }  // list qualified-vlan
          }  // list vlan
        }  // grouping juniper-ri-protocols-igmp-snooping
    
        grouping juniper-ri-protocols-mld-snooping {
          description "MLD snooping options";
          uses apply-advanced;
    
          container traceoptions {
            description
              "Trace options for MLD Snooping";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "packets" {
                    value 0;
                    description
                      "Trace all MLD packets";
                  }
                  enum "query" {
                    value 1;
                    description
                      "Trace MLD membership query messages";
                  }
                  enum "report" {
                    value 2;
                    description
                      "Trace membership report messages";
                  }
                  enum "leave" {
                    value 3;
                    description
                      "Trace leave group messages (MLDv2 only)";
                  }
                  enum "group" {
                    value 4;
                    description
                      "Trace group operations";
                  }
                  enum "client-notification" {
                    value 5;
                    description
                      "Trace notifications";
                  }
                  enum "host-notification" {
                    value 6;
                    description
                      "Trace host notifications";
                  }
                  enum "route" {
                    value 7;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 8;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 9;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 10;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 11;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 12;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 13;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 14;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf send {
                type empty;
                description
                  "Trace transmitted packets";
              }
    
              leaf receive {
                type empty;
                description
                  "Trace received packets";
              }
    
              leaf detail {
                type empty;
                description
                  "Trace detailed information";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          leaf query-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1024";
              }
            }
            units "seconds";
            default "125";
            description
              "When to send host query messages";
          }
    
          container l2-querier {
            description "Enable L2 querier mode";
            uses apply-advanced;
    
            leaf source-address {
              type jt:ipv6addr;
              description
                "Source IP address to use for L2 querier";
            }
          }  // container l2-querier
    
          leaf query-response-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "10";
            description
              "How long to wait for a host query response";
          }
    
          leaf query-last-member-interval {
            type string {
              junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
              junos:pattern-message "Up to 1 digit to right of decimal point";
            }
            units "seconds";
            default "1";
            description
              "When to send group query messages";
          }
    
          leaf robust-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "2 .. 10";
              }
            }
            default "2";
            description
              "Expected packet loss on a subnet";
          }
    
          leaf immediate-leave {
            type empty;
            description
              "Enable immediate group leave on interfaces";
          }
    
          leaf evpn-ssm-reports-only {
            type empty;
            description
              "Accept and process only <s,g> reports of SSM groups";
          }
    
          container proxy {
            presence "enable proxy";
            description "Enable proxy mode";
            uses apply-advanced;
    
            leaf source-address {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "With qualified-learning source-address should be configured under Vlan options";
              type jt:ipv6addr;
              description
                "Source IP address to use for proxy";
            }
    
            leaf irb {
              type empty;
              description
                "Proxy IGMP reports to IRB";
            }
          }  // container proxy
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface options for MLD";
            leaf name {
              junos:must "(!("interfaces $$-IFL vlan-tags inner-range"))";
              junos:must-message "interface with vlan-tags inner-range should be specified in a learning-domain only";
              junos:must "(!("interfaces $$-IFL vlan-id-range"))";
              junos:must-message "interface with vlan-id-range should be specified in a learning-domain only";
              junos:must "(".. .. .. .. interface $$")";
              junos:must-message "interface options can be specified for the interfaces in the routing-instance";
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, interface should be configured only under vlan";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            leaf host-only-interface {
              junos:must "(!(".. multicast-router-interface"))";
              junos:must-message "interface cannot be both host-only and multicast-router";
              type empty;
              description
                "Enable interfaces to be treated as host-side interfaces";
            }
    
            leaf group-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 65535";
                }
              }
              description
                "Maximum number of (source,group) per interface";
            }
    
            container static {
              description
                "Static group or source membership";
              uses apply-advanced;
    
              list group {
                key "name";
                ordered-by user;
                description
                  "IP multicast group address";
                leaf name {
                  type jt:ipv6addr;
                  description
                    "IP multicast group address";
                }
    
                uses apply-advanced;
    
                list source {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast source address";
                  leaf name {
                    type jt:ipv6addr;
                    description
                      "Source address of IP multicast data";
                  }
    
                  uses apply-advanced;
                }  // list source
              }  // list group
            }  // container static
          }  // list interface
    
          list pseudowire-remote-address {
            junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
            junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
            key "name";
            ordered-by user;
            description
              "Pseudowire interface options for MLD";
            leaf name {
              junos:must "(!(".. .. .. .. vlan-id all"))";
              junos:must-message "When 'vlan-id all' is configured, pseudowire-remote-address should be configured only under vlan";
              type jt:ipv4addr;
              description
                "Pseudowire endpoint address";
            }
    
            uses apply-advanced;
    
            leaf multicast-router-interface {
              type empty;
              description
                "Enabling multicast-router-interface on the interface";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
          }  // list pseudowire-remote-address
    
          list qualified-vlan {
            key "name";
            ordered-by user;
            description
              "VLAN options for qualified-learning";
            leaf name {
              junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
              junos:must-message "vlan specific configuration is allowed with qualified-learning only";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 1023";
                }
              }
              description
                "VLAN ID of the learning-domain";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                type jt:ipv6addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for MLD";
              leaf name {
                junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv6addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for MLD";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
          }  // list qualified-vlan
    
          list vlan {
            key "name";
            ordered-by user;
            description "Vlan options";
            leaf name {
              junos:must "(!(".. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Snooping cannot be enabled on secondary vlan";
              type string {
                length "1 .. 64";
              }
              description
                "Vlan of the bridge-domain";
            }
    
            uses apply-advanced;
    
            leaf query-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 1024";
                }
              }
              units "seconds";
              description
                "When to send host query messages";
            }
    
            leaf query-response-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "How long to wait for a host query response";
            }
    
            leaf query-last-member-interval {
              type string {
                junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                junos:pattern-message "Up to 1 digit to right of decimal point";
              }
              units "seconds";
              description
                "When to send group query messages";
            }
    
            leaf robust-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10";
                }
              }
              description
                "Expected packet loss on a subnet";
            }
    
            leaf immediate-leave {
              type empty;
              description
                "Enable immediate group leave on interfaces";
            }
    
            container proxy {
              presence "enable proxy";
              description "Enable proxy mode";
              uses apply-advanced;
    
              leaf source-address {
                type jt:ipv6addr;
                description
                  "Source IP address to use for proxy";
              }
            }  // container proxy
    
            leaf evpn-ssm-reports-only {
              type empty;
              description
                "Accept and process only <s,g> reports of SSM groups";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface options for MLD";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              leaf host-only-interface {
                junos:must "(!(".. multicast-router-interface"))";
                junos:must-message "interface cannot be both host-only and multicast-router";
                type empty;
                description
                  "Enable interfaces to be treated as host-side interfaces";
              }
    
              leaf group-limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Maximum number of (source,group) per interface";
              }
    
              container static {
                description
                  "Static group or source membership";
                uses apply-advanced;
    
                list group {
                  key "name";
                  ordered-by user;
                  description
                    "IP multicast group address";
                  leaf name {
                    type jt:ipv6addr;
                    description
                      "IP multicast group address";
                  }
    
                  uses apply-advanced;
    
                  list source {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast source address";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "Source address of IP multicast data";
                    }
    
                    uses apply-advanced;
                  }  // list source
                }  // list group
              }  // container static
            }  // list interface
    
            list pseudowire-remote-address {
              junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
              junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
              key "name";
              ordered-by user;
              description
                "Pseudowire interface options for MLD";
              leaf name {
                type jt:ipv4addr;
                description
                  "Pseudowire endpoint address";
              }
    
              uses apply-advanced;
    
              leaf multicast-router-interface {
                type empty;
                description
                  "Enabling multicast-router-interface on the interface";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
            }  // list pseudowire-remote-address
    
            list qualified-vlan {
              key "name";
              ordered-by user;
              description
                "VLAN options for qualified-learning";
              leaf name {
                junos:must "(".. .. .. .. .. vlans ${vlan} vlan-id all")";
                junos:must-message "vlan specific configuration is allowed with qualified-learning only";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 1023";
                  }
                }
                description
                  "VLAN ID of the learning-domain";
              }
    
              uses apply-advanced;
    
              leaf query-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 1024";
                  }
                }
                units "seconds";
                description
                  "When to send host query messages";
              }
    
              leaf query-response-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "How long to wait for a host query response";
              }
    
              leaf query-last-member-interval {
                type string {
                  junos:posix-pattern "^[0-9]{1,4}(.[0-9])?$";
                  junos:pattern-message "Up to 1 digit to right of decimal point";
                }
                units "seconds";
                description
                  "When to send group query messages";
              }
    
              leaf robust-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 10";
                  }
                }
                description
                  "Expected packet loss on a subnet";
              }
    
              leaf immediate-leave {
                type empty;
                description
                  "Enable immediate group leave on interfaces";
              }
    
              container proxy {
                presence "enable proxy";
                description "Enable proxy mode";
                uses apply-advanced;
    
                leaf source-address {
                  type jt:ipv6addr;
                  description
                    "Source IP address to use for proxy";
                }
              }  // container proxy
    
              leaf evpn-ssm-reports-only {
                type empty;
                description
                  "Accept and process only <s,g> reports of SSM groups";
              }
    
              list interface {
                key "name";
                ordered-by user;
                description
                  "Interface options for MLD";
                leaf name {
                  junos:must "(".. .. .. .. .. .. vlans ${vlan} interface $$")";
                  junos:must-message "interface options can be specified for the interfaces in the routing-instance";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
    
                leaf host-only-interface {
                  junos:must "(!(".. multicast-router-interface"))";
                  junos:must-message "interface cannot be both host-only and multicast-router";
                  type empty;
                  description
                    "Enable interfaces to be treated as host-side interfaces";
                }
    
                leaf group-limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Maximum number of (source,group) per interface";
                }
    
                container static {
                  description
                    "Static group or source membership";
                  uses apply-advanced;
    
                  list group {
                    key "name";
                    ordered-by user;
                    description
                      "IP multicast group address";
                    leaf name {
                      type jt:ipv6addr;
                      description
                        "IP multicast group address";
                    }
    
                    uses apply-advanced;
    
                    list source {
                      key "name";
                      ordered-by user;
                      description
                        "IP multicast source address";
                      leaf name {
                        type jt:ipv6addr;
                        description
                          "Source address of IP multicast data";
                      }
    
                      uses apply-advanced;
                    }  // list source
                  }  // list group
                }  // container static
              }  // list interface
    
              list pseudowire-remote-address {
                junos:must "((" .. .. .. mld-snooping-options snoop-pseudowires" || " .. .. .. .. mld-snooping-options snoop-pseudowires"))";
                junos:must-message "Configure pseudowire-remote-address only with snoop-pseudowires instance config";
                key "name";
                ordered-by user;
                description
                  "Pseudowire interface options for MLD";
                leaf name {
                  type jt:ipv4addr;
                  description
                    "Pseudowire endpoint address";
                }
    
                uses apply-advanced;
    
                leaf multicast-router-interface {
                  type empty;
                  description
                    "Enabling multicast-router-interface on the interface";
                }
    
                leaf immediate-leave {
                  type empty;
                  description
                    "Enable immediate group leave on interfaces";
                }
              }  // list pseudowire-remote-address
            }  // list qualified-vlan
          }  // list vlan
        }  // grouping juniper-ri-protocols-mld-snooping
    
        grouping juniper-routing-instance-pbb-options {
          description
            "PBB options for the routing instance";
          uses apply-advanced;
    
          leaf peer-instance {
            junos:must "((!("routing-instances $$ protocols evpn pbb-evpn-core") || !(any ".. .. service-groups <*> pbb-service-options mac-address")))";
            junos:must-message "mac-address should not be configured under service-groups pbb-service-options for PBB EVPN";
            junos:must "(!(any ".. vlan-id <*> isid-list <*>"))";
            junos:must-message "vlan-id isid-list mapping & peer-instance can not exist in same routing-instance";
            junos:must "("routing-instances $$")";
            junos:must-message "pbbn-peer routing instance must be configured";
            type string;
            description
              "Set the peer-pbbn routing instance";
          }
    
          list vlan-id {
            junos:must "(!(any ".. peer-instance <*>"))";
            junos:must-message "vlan-id isid-list mapping & peer-instance can not exist in same routing-instance";
            junos:must "(!(any ".. .. service-groups <*>"))";
            junos:must-message "vlan-id isid-list mapping & service-groups can not exist in same routing-instance";
            key "name";
            ordered-by user;
            description
              "Set B-VLAN to ISID mapping";
            leaf name {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 4094";
                }
              }
              description "Configure B-Vlan";
            }
    
            leaf-list isid-list {
              type string;
              ordered-by user;
              description
                "Configure ISID(Valid Range:256..16777214) for the B-VLAN";
            }
          }  // list vlan-id
    
          leaf default-bvlan {
            junos:must "(!(any ".. peer-instance <*>"))";
            junos:must-message "default-bvlan & peer-instance can not exist in same routing-instance";
            junos:must "(!(any ".. .. service-groups <*>"))";
            junos:must-message "default-bvlan mapping & service-groups can not exist in same routing-instance";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 4094";
              }
            }
            description
              "Default B-VLAN for all un-mapped ISIDs";
          }
        }  // grouping juniper-routing-instance-pbb-options
    
        grouping juniper-routing-instance-service-groups {
          description
            "Service-groups configuration";
          leaf name {
            junos:must "(any ".. .. pbb-options peer-instance <*>")";
            junos:must-message "peer pbbn instance must be there for service-groups configuration";
            type string;
            description "Service-group name";
          }
    
          uses apply-advanced;
    
          leaf service-type {
            type enumeration {
              enum "eline" {
                junos:must "(!(any ".. .. service-groups <*> service-type elan"))";
                junos:must-message "Elan and eline services can not exist in same routing instance";
                value 0;
                description
                  "Ethernet point-to-point";
              }
              enum "elan" {
                junos:must "(!(any ".. .. service-groups <*> service-type eline"))";
                junos:must-message "Elan and eline services can not exist in same routing instance";
                value 1;
                description
                  "Ethernet LAN service";
              }
            }
            description
              "Service type as ethernet LAN or point-to-point";
          }
    
          container pbb-service-options {
            presence
              "enable pbb-service-options";
            description
              "Provider backbone instance service options";
            uses apply-advanced;
    
            list isid {
              junos:must "(!(any ".. .. .. pbb-options vlan-id <*> isid-list <*>"))";
              junos:must-message "vlan-id to isid-list mapping is not allowed in PBN routing-instance";
              key "name";
              ordered-by user;
              description
                "ISID to S-VLAN configuration";
              leaf name {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "256 .. 16777214";
                  }
                }
                description "Configure ISID";
              }
    
              choice service-data {
                leaf-list vlan-id-list {
                  junos:must "(!(".. .. .. service-type eline"))";
                  junos:must-message "Vlan-id-list cannot be specified for eline service";
                  junos:must "(any ".. .. .. service-type <*>")";
                  junos:must-message "service-type must be specified";
                  type jt:vlan-range;
                  description "List of S-VLANs";
                }
                leaf interface {
                  junos:must "(!(".. .. .. service-type elan"))";
                  junos:must-message "Interface cannot be specified for elan service";
                  junos:must "(!(any ".. .. .. .. bridge-domains <*> interface $$"))";
                  junos:must-message "Sub interface is not allowed for PBB configuration";
                  junos:must "(any ".. .. .. service-type <*>")";
                  junos:must-message "service-type must be specified";
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description
                    "Point to point interface name";
                }
              }  // choice service-data
            }  // list isid
    
            leaf default-isid {
              junos:must "(!(any ".. isid <*> vlan-id-list <*>"))";
              junos:must-message "Default isid & explicit isid services not allowed in the same service-group";
              junos:must "(!(".. .. service-type eline"))";
              junos:must-message "Default-isid not valid for service-type eline";
              junos:must "(any ".. .. service-type <*>")";
              junos:must-message "service-type must be specified";
              junos:must "(!(any ".. .. .. pbb-options vlan-id <*> isid-list <*>"))";
              junos:must-message "vlan-id to isid-list mapping is not allowed in PBN routing-instance";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "256 .. 16777214";
                }
              }
              description
                "Default ISID for all un-mapped S-VLANs";
            }
    
            leaf mac-address {
              type jt:mac-addr;
              description
                "Unicast or multicast mac address";
            }
    
            leaf source-bmac {
              type jt:mac-addr;
              description
                "Unicast Source B Mac address";
            }
          }  // container pbb-service-options
        }  // grouping juniper-routing-instance-service-groups
    
        grouping juniper-routing-instance-switch-options {
          description
            "Bridge options for the routing instance";
          uses apply-advanced;
    
          container mac-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC address forwarding table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container mac-table-size
    
          container mac-ip-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-ip-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC+IP bindings table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings";
            }
          }  // container mac-ip-table-size
    
          container interface-mac-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC address learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses per interface";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
                enum "log" {
                  value 2;
                  description
                    "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                }
                enum "shutdown" {
                  value 3;
                  description
                    "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                }
                enum "drop-and-log" {
                  value 4;
                  description
                    "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container interface-mac-limit
    
          container interface-mac-ip-limit {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-ip-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC+IP bindings learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings per interface";
            }
          }  // container interface-mac-ip-limit
    
          container mac-notification {
            presence "enable mac-notification";
            description
              "MAC notification options";
            uses apply-advanced;
    
            leaf notification-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 60";
                }
              }
              units "seconds";
              default "30";
              description
                "Interval for sending MAC notifications";
            }
          }  // container mac-notification
    
          leaf mac-table-aging-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            units "seconds";
            description
              "Delay for discarding MAC address if no updates are received";
          }
    
          leaf no-mac-learning {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "no-mac-learning needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Disable dynamic MAC address learning";
          }
    
          leaf no-normalization {
            type empty;
            description
              "Disable vlan id normalization for interfaces";
          }
    
          leaf mac-statistics {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-statistics needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Enable MAC address statistics";
          }
    
          container mib {
            presence "enable mib";
            description "Snmp mib options";
            uses apply-advanced;
    
            container dot1q-mib {
              presence "enable dot1q-mib";
              description
                "Dot1q MIB configuration options";
              uses apply-advanced;
    
              leaf port-list {
                type enumeration {
                  enum "bit-map" {
                    value 0;
                    description
                      "Port list is represented in bit-map format";
                  }
                  enum "string" {
                    value 1;
                    description
                      "Port list is represented in string format";
                  }
                }
                description
                  "Port list for staticegressports and staticuntaggedports MIB";
              }
            }  // container dot1q-mib
          }  // container mib
    
          container static-rvtep-mac {
            description
              "Configure Static MAC and remote VxLAN tunnel endpoint entries";
            uses apply-advanced;
    
            list mac {
              key "mac_addr remote-vtep";
              description "Unicast MAC address";
              leaf mac_addr {
                type jt:mac-unicast;
              }
    
              leaf remote-vtep {
                type jt:ipaddr;
                description
                  "Configure static remote VXLAN tunnel endpoints";
              }
            }  // list mac
          }  // container static-rvtep-mac
    
          leaf service-id {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Service ID required if multi-chassis AE is part of a bridge-domain";
          }
    
          leaf ovsdb-managed {
            junos:must "(!("routing-instances ${instance} protocols evpn encapsulation vxlan"))";
            junos:must-message "Not valid with protocols evpn encapsulation vxlan";
            type empty;
            description
              "All vxlan bridge domains in routing instance are remote managed";
          }
    
          list interface {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface needs to be specified under switch-options for a virtual-switch instance";
            key "name";
            ordered-by user;
            description
              "Interface that connect this site to the VPN";
            leaf name {
              junos:must "((".. .. .. interface $$" || "FALSE"))";
              junos:must-message "Interface must be part of this routing instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container interface-mac-limit {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              description
                "Maximum number of MAC addresses learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC addresses per interface";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable interface for interface-mac-limit";
              }
    
              leaf packet-action {
                type enumeration {
                  enum "none" {
                    value 0;
                    description
                      "Forward the packet";
                  }
                  enum "drop" {
                    value 1;
                    description
                      "Drop packets and do not learn. Default is forward";
                  }
                  enum "log" {
                    value 2;
                    description
                      "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "shutdown" {
                    value 3;
                    description
                      "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "drop-and-log" {
                    value 4;
                    description
                      "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                  }
                }
                description
                  "Action when MAC limit is reached";
              }
            }  // container interface-mac-limit
    
            leaf action-priority {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 8";
                }
              }
              description
                "Blocking priority of this interface on mac move detection";
            }
    
            list static-mac {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              key "name";
              ordered-by user;
              description
                "Static MAC addresses assigned to this interface";
              leaf name {
                junos:must "((!("FALSE") || all ".. vlan-id <*>"))";
                junos:must-message " Specify vlan-id for qualified learning ";
                type jt:mac-addr;
                description "MAC address";
              }
    
              uses apply-advanced;
    
              list vlan-id {
                junos:must "("FALSE")";
                junos:must-message "'vlan-id all' has to be configured for the bridging domain";
                key "name";
                ordered-by user;
                description
                  "VLAN ID of learning VLAN";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4094";
                    }
                  }
                  description "Learning VLAN";
                }
    
                uses apply-advanced;
              }  // list vlan-id
            }  // list static-mac
    
            container interface-mac-ip-limit {
              description
                "Maximum number of MAC+IP bindings learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC+IP bindings per interface";
              }
            }  // container interface-mac-ip-limit
    
            leaf no-mac-learning {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              type empty;
              description
                "Disable dynamic MAC address learning";
            }
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            leaf persistent-learning {
              junos:must "(!("switch-options mac-table-aging-time "))";
              junos:must-message "Persistent learning can not co-exist with mac-table-aging-time";
              type empty;
              description
                "Enable persistent MAC learning on this interface";
            }
          }  // list interface
    
          container traceoptions {
            description
              "Layer 2 trace options for this routing instance";
            uses apply-advanced;
    
            leaf no-remote-trace {
              junos:must "("system tracing")";
              junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
              type empty;
              description
                "Disable remote tracing";
            }
    
            container file {
              description
                "Trace file information";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "3";
                description
                  "Maximum number of trace files";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
    
              leaf match {
                type jt:regular-expression;
                description
                  "Regular expression for lines to be logged";
              }
            }  // container file
    
            leaf level {
              type enumeration {
                enum "error" {
                  value 0;
                  description
                    "Match error conditions";
                }
                enum "warning" {
                  value 1;
                  description
                    "Match warning messages";
                }
                enum "notice" {
                  value 2;
                  description
                    "Match conditions that should be handled specially";
                }
                enum "info" {
                  value 3;
                  description
                    "Match informational messages";
                }
                enum "verbose" {
                  value 4;
                  description
                    "Match verbose messages";
                }
                enum "all" {
                  value 5;
                  description "Match all levels";
                }
              }
              default "error";
              description
                "Level of debugging output";
            }
    
            list flag {
              key "name";
              ordered-by user;
              description
                "Type of operation or event to include in trace";
              leaf name {
                type enumeration {
                  enum "configuration" {
                    value 0;
                    description
                      "Configuration operations";
                  }
                  enum "routing-socket" {
                    value 1;
                    description
                      "Routing socket operations";
                  }
                  enum "interface-device" {
                    value 2;
                    description
                      "Interface device operations";
                  }
                  enum "interface-logical" {
                    value 3;
                    description
                      "Logical interface operations";
                  }
                  enum "interface-family" {
                    value 4;
                    description
                      "Interface family operations";
                  }
                  enum "bridging-domain" {
                    value 5;
                    description
                      "Bridging domain operations";
                  }
                  enum "bridge-interface" {
                    value 6;
                    description
                      "Interface bridge operations";
                  }
                  enum "learning-domain" {
                    value 7;
                    description
                      "Learning domain operations";
                  }
                  enum "ipc" {
                    value 8;
                    description
                      "Inter-process communications operations";
                  }
                  enum "mac-learning" {
                    value 9;
                    description
                      "MAC address learning operations";
                  }
                  enum "initialization" {
                    value 10;
                    description
                      "Initialization operations";
                  }
                  enum "flood-next-hop" {
                    value 11;
                    description
                      "Flood next hop operations";
                  }
                  enum "irb" {
                    value 12;
                    description
                      "Integrated routing and bridging operations";
                  }
                  enum "vpls-ping" {
                    value 13;
                    description
                      "VPLS ping operations";
                  }
                  enum "vpls-loop-prev" {
                    value 14;
                    description
                      "VPLS loop prevention";
                  }
                  enum "storm-control" {
                    value 15;
                    description "Storm-control";
                  }
                  enum
                    "unknown-unicast-forwarding" {
                    value 16;
                    description
                      "Trace unknown unicast forwarding events";
                  }
                  enum "vxlan" {
                    value 17;
                    description "VXLAN";
                  }
                  enum "all" {
                    value 18;
                    description "All operations";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
    
          container voip {
            description
              "Voice-over-IP configuration";
            uses apply-advanced;
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Enable voice over IP on this port";
              leaf name {
                type string;
              }
    
              uses apply-advanced;
    
              leaf vlan {
                junos:must "(!("vlans $$ vlan-range "))";
                junos:must-message "Ranged vlan cannot be used by Voice-over-IP";
                type string;
                description
                  "VLAN for voice over IP";
              }
    
              leaf forwarding-class {
                type string {
                  junos:posix-pattern "^.{1,64}$";
                  junos:pattern-message "Must be string of 64 characters or less";
                }
                description "Forwarding class";
              }
            }  // list interface
          }  // container voip
    
          container unknown-unicast-forwarding {
            description
              "Set interface for forwarding of unknown unicast packets";
            uses apply-advanced;
    
            list vlan {
              key "name";
              description
                "VLAN for the unknown unicast packets";
              leaf name {
                type string;
                description
                  "VLAN name or VLAN Tag (1..4095)";
              }
    
              uses apply-advanced;
    
              leaf interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Interface to send unknown unicast packets for the VLAN";
              }
            }  // list vlan
          }  // container unknown-unicast-forwarding
    
          list authentication-whitelist {
            key "name";
            ordered-by user;
            description
              "MAC authentication-whitelist configuration needed to bypass Authentication";
            leaf name {
              junos:must "(any "services captive-portal interface <*> supplicant multiple")";
              junos:must-message "At least one interface must be configured with captive portal multiple supplicant mode";
              type jt:mac-addr-prefix;
              description
                "MAC addresses to bypass authentication";
            }
    
            uses apply-advanced;
    
            leaf vlan-assignment {
              junos:must "(!("vlans $$ vlan-range"))";
              junos:must-message "vlan with vlan-range not supported under static MAC vlan-assignment";
              junos:must "(("vlans $$" || any "vlans <*> vlan-id $$"))";
              junos:must-message "vlan assigned is not configured";
              type string;
              description
                "VLAN name or 802.1q tag for the MAC address";
            }
    
            leaf bridge-domain-assignment {
              junos:must "(!(".. .. .. bridge-domains $$ vlan-id-list"))";
              junos:must-message "Bridge-domain with vlan-id-list not supported under static MAC bridge-domain-assignment";
              junos:must "((".. .. .. bridge-domains $$" || any ".. .. .. bridge-domains <*> vlan-id $$"))";
              junos:must-message "Bridge-domain assigned is not configured";
              type string {
                junos:posix-pattern "^([[:alpha:]][[:alnum:]_.-]+)|^([1-9][0-9]{0,2}|[1-3][0-9]{3}|40[0-8][0-9]|409[0-4])$";
                junos:pattern-message "Must be a valid Bridge-domain or VLAN tag";
              }
              description
                "Bridge-domain name or 802.1q tag for the MAC address";
            }
    
            leaf interface {
              junos:must "((!(".. .. .. switch-options no-mac-learning") || !(any ".. .. .. bridge-domain <*> bridge-options interface $$ no-mac-learning")))";
              junos:must-message "Cannot configure authentication-whitelist on this interface since no-mac-learning is enabled on the same interface";
              junos:must "(!("interfaces $$-IFL family bridge interface-mode trunk"))";
              junos:must-message "Cannot configure whitelist on this interface since the interface-mode is defined as trunk";
              junos:must "(!("interfaces $$-IFL family ethernet-switching port-mode trunk"))";
              junos:must-message "Cannot configure whitelist on this interface since the port-mode is defined as trunk";
              junos:must "(("services captive-portal interface $$ supplicant multiple" || "services captive-portal interface all supplicant multiple"))";
              junos:must-message "authentication-whitelist MAC can be configured only on interface configured with captive portal multiple supplicant mode";
              junos:must "(("interfaces $$-IFL family ethernet-switching" || "interfaces $$-IFL family bridge"))";
              junos:must-message "Interface must be defined in the interfaces hierarchy with family ethernet-switching or family bridge";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Interface on which authentication is bypassed";
            }
          }  // list authentication-whitelist
    
          choice vstp-flooding-option {
          }  // choice vstp-flooding-option
    
          choice arp-trap-option {
          }  // choice arp-trap-option
    
          choice mstp-flooding-option {
          }  // choice mstp-flooding-option
    
          choice stp-flooding-option {
          }  // choice stp-flooding-option
        }  // grouping juniper-routing-instance-switch-options
    
        grouping juniper-routing-options {
          uses apply-advanced;
    
          container rpm-tracking {
            description
              "RPM static route tracking options";
            uses apply-advanced;
    
            list route {
              key "name";
              ordered-by user;
              description "Static Route";
              leaf name {
                type jt:ipprefix;
                description
                  "IP address of destination";
              }
    
              uses apply-advanced;
    
              list next-hop {
                key "name";
                ordered-by user;
                description
                  "Next hop to destination";
                uses rpm-next-hop;
              }  // list next-hop
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 16";
                  }
                }
                description "Metric value";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              leaf tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Tag value";
              }
    
              list rpm-probe {
                key "name";
                ordered-by user;
                leaf name {
                  junos:must "("services rpm probe $$")";
                  junos:must-message "Referenced RPM probe must be defined under 'services rpm probe'";
                  type string;
                  description
                    "RPM probe to track";
                }
    
                leaf rpm-test {
                  junos:must "("services rpm probe ${rpm-probe} test $$")";
                  junos:must-message "Referenced RPM test must be defined under 'services rpm probe <probe> test '";
                  type string;
                  description
                    "RPM test to track";
                }
              }  // list rpm-probe
            }  // list route
          }  // container rpm-tracking
    
          container logical-system-mux {
            description
              "Logical system control daemon information";
            uses apply-advanced;
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "debug" {
                      value 0;
                      description
                        "Trace debug-level lrmuxd activities";
                    }
                    enum "parse" {
                      value 1;
                      description
                        "Trace configuration parsing";
                    }
                    enum "route" {
                      value 2;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 3;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 4;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 5;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 6;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 7;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 8;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 9;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
          }  // container logical-system-mux
    
          container auto-bandwidth {
            presence "enable auto-bandwidth";
            description "Auto bandwidth";
            uses apply-advanced;
    
            list template {
              key "name";
              ordered-by user;
              description
                "Auto bandwidth template";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description
                  "Auto bandwidth template name (Maximum length 64)";
              }
    
              uses apply-advanced;
    
              leaf adjust-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 3600";
                  }
                }
                description "Adjust interval";
              }
    
              leaf adjust-threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 100";
                  }
                }
                description
                  "Percentage threshhold";
              }
    
              leaf statistic-collection-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "10 .. 300";
                  }
                }
                description
                  "Collection interval";
              }
    
              leaf auto-bandwidth-subscription {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 200";
                  }
                }
                description
                  "Percentage threshhold for subscription";
              }
            }  // list template
    
            container traceoptions {
              description
                "Trace options for sr stats";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "all" {
                      value 0;
                      description "Trace All";
                    }
                    enum "timer" {
                      value 1;
                      description
                        "Trace traffic recv by periodic timer";
                    }
                    enum "state" {
                      value 2;
                      description
                        "Trace state of sensor";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
          }  // container auto-bandwidth
    
          container backup-selection {
            presence "enable backup-selection";
            description
              "Backup selection options";
            uses apply-advanced;
    
            list destination {
              key "name";
              description
                "IP/IPv6 prefix for which backup selection policy is configured";
              leaf name {
                type jt:ipprefix-mandatory;
                description
                  "IP/IPv6 address (and optional prefix length)";
              }
    
              uses apply-advanced;
    
              list interface {
                key "name";
                description
                  "Primary nexthop interface for which backup selection policy is configured";
                leaf name {
                  type union {
                    type jt:interface-name;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Interface name";
                }
    
                uses apply-advanced;
    
                container admin-group {
                  description
                    "Administrative group policies for backup-selection";
                  uses apply-advanced;
    
                  leaf-list exclude {
                    type string;
                    description
                      "Do not use interface if any admin group available";
                  }
    
                  leaf-list include-all {
                    type string;
                    description
                      "Use interface if admin groups available entirely";
                  }
    
                  leaf-list include-any {
                    type string;
                    description
                      "Use interface if any admin group is available";
                  }
    
                  leaf-list preference {
                    type string;
                    ordered-by user;
                    description
                      "Administrative groups in descending preference order";
                  }
                }  // container admin-group
    
                leaf srlg {
                  type enumeration {
                    enum "loose" {
                      value 0;
                      description "Loose SRLG";
                    }
                    enum "strict" {
                      value 1;
                      description "Strict SRLG";
                    }
                  }
                  default "loose";
                  description
                    "Evaluate Shared Risk Link Group(SRLG) characteristics for backup selection";
                }
    
                leaf protection-type {
                  type enumeration {
                    enum "link" {
                      value 0;
                      description
                        "Protect the primary interface from link faults only";
                    }
                    enum "node" {
                      value 1;
                      description
                        "Protect the primary interface from node faults only";
                    }
                    enum "node-link" {
                      value 2;
                      description
                        "Protect the primary interface from either link or node faults; prefer node protection";
                    }
                  }
                  description
                    "Type of protection to be considered";
                }
    
                leaf downstream-paths-only {
                  type empty;
                  description
                    "Choose only the downstream nodes for backup";
                }
    
                leaf bandwidth-greater-equal-primary {
                  type empty;
                  description
                    "Use backup nexthop only if bandwidth is >= bandwidth of primary nexthop";
                }
    
                container backup-neighbor {
                  description
                    "Backup Neighbor ID based policies for backup selection";
                  uses apply-advanced;
    
                  leaf-list exclude {
                    type jt:ipv4addr;
                    description
                      "List of backup neighbors to be excluded";
                  }
    
                  leaf-list preference {
                    type jt:ipv4addr;
                    ordered-by user;
                    description
                      "List of backup neighbors in descending order preference";
                  }
                }  // container backup-neighbor
    
                container node {
                  description
                    "Node ID based policies for backup selection";
                  uses apply-advanced;
    
                  leaf-list exclude {
                    type jt:ipv4addr;
                    description
                      "List of nodes to be excluded";
                  }
    
                  leaf-list preference {
                    type jt:ipv4addr;
                    ordered-by user;
                    description
                      "List of nodes in the descending order of preference";
                  }
                }  // container node
    
                container node-tag {
                  description
                    "Node  tag policies";
                  uses apply-advanced;
    
                  leaf-list exclude {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    description
                      "The set of node tags to be excluded";
                  }
    
                  leaf-list preference {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "The set of node tags in the descending order of preference";
                  }
                }  // container node-tag
    
                leaf root-metric {
                  type enumeration {
                    enum "lowest" {
                      value 0;
                      description
                        "Choose lowest root metric";
                    }
                    enum "highest" {
                      value 1;
                      description
                        "Choose highest root metric";
                    }
                  }
                  description "Root metric";
                }
    
                leaf dest-metric {
                  type enumeration {
                    enum "lowest" {
                      value 0;
                      description
                        "Choose lowest destination metric";
                    }
                    enum "highest" {
                      value 1;
                      description
                        "Choose highest destination metric";
                    }
                  }
                  description
                    "Destination metric";
                }
    
                leaf-list metric-order {
                  type enumeration {
                    enum "root" {
                      value 0;
                    }
                    enum "dest" {
                      value 1;
                    }
                  }
                  max-elements 2;
                  ordered-by user;
                  description
                    "Metric evaluation order";
                }
    
                leaf-list evaluation-order {
                  type enumeration {
                    enum "admin-group" {
                      value 0;
                      description
                        "Administrative Group/Link Color";
                    }
                    enum "srlg" {
                      value 1;
                      description "SRLG";
                    }
                    enum "bandwidth" {
                      value 2;
                      description "Bandwidth";
                    }
                    enum "protection-type" {
                      value 3;
                      description
                        "Type of protection";
                    }
                    enum "backup-neighbor" {
                      value 4;
                      description
                        "Backup Neighbor";
                    }
                    enum "node" {
                      value 5;
                      description "Node";
                    }
                    enum "node-tag" {
                      value 6;
                      description "Node tag";
                    }
                    enum "metric" {
                      value 7;
                      description
                        "Metric related parameters";
                    }
                  }
                  ordered-by user;
                  description
                    "Interface policy criteria evaluation order";
                }
              }  // list interface
            }  // list destination
          }  // container backup-selection
    
          list flex-algorithm {
            key "name";
            description
              "Configure flex-algorithms supported by this node.";
            leaf name {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "128 .. 255";
                }
              }
              description "Algorithm id";
            }
    
            uses apply-advanced;
    
            container definition {
              description
                "Configure flex-algorithm definition.";
              uses apply-advanced;
    
              leaf metric-type {
                type enumeration {
                  enum "igp-metric" {
                    value 0;
                    description
                      "Metric configured to be used for IGP";
                  }
                  enum "te-metric" {
                    value 1;
                    description
                      "Traffic-engineering metric";
                  }
                  enum "delay-metric" {
                    value 2;
                    description
                      "Min unidirectional link delay metric";
                  }
                }
              }
    
              choice calculation-type {
                leaf spf {
                  type empty;
                  description
                    "Normal SPF of type 0";
                }
                leaf strict-spf {
                  type empty;
                  description "Strict SPF";
                }
              }  // choice calculation-type
    
              leaf use-flex-algorithm-prefix-metric {
                type empty;
                description
                  "Set M flag in the flex-algorithm definition flags";
              }
    
              leaf priority {
                junos:must "(!(".. no-advertise"))";
                junos:must-message "Priority is relevant only if fad is advertised.";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                description
                  "Priority of the flex-algorithm advertisement.";
              }
    
              container admin-group {
                description
                  "Administrative group policy";
                uses admin_group_include_exclude;
              }  // container admin-group
            }  // container definition
    
            leaf color {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Color to be associated with this flex-algorithm";
            }
    
            leaf use-transport-class {
              junos:must "("routing-options transport-class auto-create")";
              junos:must-message "Please enable auto-create under routing-options transport-class hierarchy";
              type empty;
              description
                "Install ingress routes via transport class RIBs";
            }
          }  // list flex-algorithm
    
          container source-packet-routing {
            description
              "Source packet routing (SPRING)";
            uses apply-advanced;
    
            list mapping-server-entry {
              key "name";
              ordered-by user;
              description "Mapping server entry";
              leaf name {
                type string {
                  length "1 .. 64";
                }
                description
                  "Mapping server entry name";
              }
    
              uses apply-advanced;
    
              list prefix-segment {
                key "name";
                max-elements 64;
                ordered-by user;
                description "Prefix segment";
                leaf name {
                  type jt:ipprefix;
                  description
                    "Prefix segment prefix";
                }
    
                uses apply-advanced;
    
                leaf index {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 199999";
                    }
                  }
                  description
                    "Prefix segment index";
                }
    
                leaf attached {
                  type empty;
                  description
                    "Set attached flag in IS-IS mapping server advertisement";
                }
    
                leaf domain-wide-flooding {
                  type empty;
                  description
                    "Set S-flag in IS-IS mapping server advertisement";
                }
    
                leaf no-node-segment {
                  type empty;
                  description
                    "Clear node segment flag in mapping server prefix segment";
                }
              }  // list prefix-segment
    
              list prefix-segment-range {
                key "name";
                max-elements 64;
                ordered-by user;
                description
                  "Prefix segment range";
                leaf name {
                  type string {
                    length "1 .. 64";
                  }
                  description
                    "Prefix segment range name";
                }
    
                uses apply-advanced;
    
                leaf start-prefix {
                  type jt:ipprefix;
                  description "Start prefix";
                }
    
                leaf start-index {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 199999";
                    }
                  }
                  description "Start index";
                }
    
                leaf size {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1024";
                    }
                  }
                  description
                    "Size of prefix segment range";
                }
    
                leaf attached {
                  type empty;
                  description
                    "Set attached flag in IS-IS mapping server advertisement";
                }
    
                leaf domain-wide-flooding {
                  type empty;
                  description
                    "Set S-flag in IS-IS mapping server advertisement";
                }
    
                leaf no-node-segment {
                  type empty;
                  description
                    "Clear node segment flag in mapping server prefix segment";
                }
              }  // list prefix-segment-range
            }  // list mapping-server-entry
    
            container srv6 {
              description
                "SRv6 source-packet-routing";
              uses apply-advanced;
    
              list locator {
                key "name";
                ordered-by user;
                leaf name {
                  type string {
                    length "1 .. 64";
                  }
                  description
                    "Locator entry name";
                }
    
                uses apply-advanced;
    
                leaf algorithm {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255";
                    }
                  }
                  description
                    "Algorithm associated with this locator";
                }
    
                leaf address {
                  type jt:ipv6prefix;
                  description
                    "Configure Locator Service for SRv6";
                }
              }  // list locator
    
              leaf no-reduced-srh {
                type empty;
                description
                  "SRv6 Encapsulation mode non reduced SRH";
              }
    
              leaf transit-srh-insert {
                type empty;
                description
                  "SRv6 SRH insert mode on transit";
              }
            }  // container srv6
          }  // container source-packet-routing
    
          leaf route-distinguisher-id {
            type jt:ipv4addr;
            description
              "Identifier used in route distinguishers for routing instances";
          }
    
          list rib {
            key "name";
            ordered-by user;
            description "Routing table options";
            leaf name {
              type string;
              description "Routing table name";
            }
    
            uses apply-advanced;
    
            container static {
              description "Static routes";
              uses apply-advanced;
    
              leaf rib-group {
                type string;
                description
                  "Routing table group";
              }
    
              container defaults {
                description
                  "Global route options";
                uses apply-advanced;
    
                choice retain-choice {
                  leaf retain {
                    junos:must "(!(".. resolve"))";
                    junos:must-message "Must not specify resolve with retain";
                    type empty;
                    description
                      "Always keep route in forwarding table";
                  }
                  leaf no-retain {
                    junos:must "(!(".. resolve"))";
                    junos:must-message "Must not specify resolve with retain";
                    type empty;
                    description
                      "Don't always keep route in forwarding table";
                  }
                }  // choice retain-choice
    
                choice install-choice {
                  leaf install {
                    type empty;
                    description
                      "Install route into forwarding table";
                  }
                  leaf no-install {
                    type empty;
                    description
                      "Don't install route into forwarding table";
                  }
                }  // choice install-choice
    
                choice readvertise-choice {
                  leaf readvertise {
                    type empty;
                    description
                      "Mark route as eligible to be readvertised";
                  }
                  leaf no-readvertise {
                    type empty;
                    description
                      "Don't mark route as eligible to be readvertised";
                  }
                }  // choice readvertise-choice
    
                choice resolve-choice {
                  leaf resolve {
                    type empty;
                    description
                      "Allow resolution of indirectly connected next hops";
                  }
                  leaf no-resolve {
                    type empty;
                    description
                      "Don't allow resolution of indirectly connected next hops";
                  }
                }  // choice resolve-choice
    
                choice longest-match-choice {
                  leaf longest-match {
                    junos:must "(".. resolve")";
                    junos:must-message "Requires resolve to be configured";
                    type empty;
                    description
                      "Always use longest prefix match to resolve next hops";
                  }
                  leaf no-longest-match {
                    junos:must "(".. resolve")";
                    junos:must-message "Requires resolve to be configured";
                    type empty;
                    description
                      "Don't always use longest prefix match to resolve next hops";
                  }
                }  // choice longest-match-choice
    
                choice passive_flag {
                  leaf active {
                    type empty;
                    description
                      "Remove inactive route from forwarding table";
                  }
                  leaf passive {
                    type empty;
                    description
                      "Retain inactive route in forwarding table";
                  }
                }  // choice passive_flag
    
                container metric {
                  presence "enable metric";
                  description "Metric value";
                  uses rib_static_metric_type;
                }  // container metric
    
                container metric2 {
                  presence "enable metric2";
                  description "Metric value 2";
                  uses rib_static_metric_type;
                }  // container metric2
    
                container metric3 {
                  presence "enable metric3";
                  description "Metric value 3";
                  uses rib_static_metric_type;
                }  // container metric3
    
                container metric4 {
                  presence "enable metric4";
                  description "Metric value 4";
                  uses rib_static_metric_type;
                }  // container metric4
    
                container tag {
                  presence "enable tag";
                  description "Tag string";
                  uses rib_static_metric_type;
                }  // container tag
    
                container tag2 {
                  presence "enable tag2";
                  description "Tag string 2";
                  uses rib_static_metric_type;
                }  // container tag2
    
                container preference {
                  presence "enable preference";
                  description "Preference value";
                  uses rib_static_metric_type;
                }  // container preference
    
                container preference2 {
                  presence "enable preference2";
                  description
                    "Preference value 2";
                  uses rib_static_metric_type;
                }  // container preference2
    
                container color {
                  presence "enable color";
                  description
                    "Color (preference) value";
                  uses rib_static_metric_type;
                }  // container color
    
                container color2 {
                  presence "enable color2";
                  description
                    "Color (preference) value 2";
                  uses rib_static_metric_type;
                }  // container color2
    
                leaf-list community {
                  type jt:community;
                  ordered-by user;
                  description
                    "BGP community identifier";
                }
    
                container as-path {
                  description
                    "Autonomous system path";
                  uses apply-advanced;
    
                  leaf path {
                    type string;
                    description
                      "Autonomous system path";
                  }
    
                  leaf origin {
                    type enumeration {
                      enum "igp" {
                        value 0;
                        description
                          "Path originated in the local IGP";
                      }
                      enum "egp" {
                        value 1;
                        description
                          "Path originated in another AS";
                      }
                      enum "incomplete" {
                        value 2;
                        description
                          "Path was learned by some other means";
                      }
                    }
                  }
    
                  leaf atomic-aggregate {
                    type empty;
                    description
                      "Add ATOMIC_AGGREGATE path attribute to route";
                  }
    
                  container aggregator {
                    presence "enable aggregator";
                    description
                      "Add AGGREGATOR path attribute to route";
                  }  // container aggregator
    
                  leaf as-number {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description
                      " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                  }
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Address of BGP system that formed the route";
                  }
                }  // container as-path
              }  // container defaults
    
              list route {
                key "name";
                ordered-by user;
                description "Static route";
                leaf name {
                  type jt:ipprefix;
                }
    
                uses apply-advanced;
    
                choice next_hop {
                  leaf-list next-hop {
                    type union {
                      type jt:ipaddr-or-interface;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Next hop to destination";
                  }
                  leaf reject {
                    type empty;
                    description
                      "Drop packets to destination; send ICMP unreachables";
                  }
                  leaf discard {
                    type empty;
                    description
                      "Drop packets to destination; send no ICMP unreachables";
                  }
                  leaf receive {
                    type empty;
                    description
                      "Install a receive route for the destination";
                  }
                  leaf next-table {
                    type string {
                      junos:posix-pattern "^(((.{0,128})[:](.{1,128})[.]|((.{1,128})[.]))?([a-z]|[0-9]|[-_])+[.]((1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5])))$";
                      junos:pattern-message "Must match the format [<instance-name>[:<topology-name>].]<family-name>.<rib-id>";
                    }
                    description
                      "Next hop to another table";
                  }
                }  // choice next_hop
    
                list qualified-next-hop {
                  key "name";
                  ordered-by user;
                  description
                    "Next hop with qualifiers";
                  uses qualified_nh_obj;
                }  // list qualified-next-hop
    
                leaf backup-pe-group {
                  junos:must "(".. p2mp-lsp-next-hop")";
                  junos:must-message "Backup groups only allowed for static routes with p2mp lsp next-hop";
                  type string;
                  description
                    "Multicast source redundancy group";
                }
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection (BFD) options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  container authentication {
                    description
                      "Authentication options";
                    uses apply-advanced;
    
                    leaf key-chain {
                      junos:must "(".. algorithm")";
                      junos:must-message "May not be configured without algorithm";
                      junos:must "("security authentication-key-chains key-chain $$")";
                      junos:must-message "Referenced key-chain must be defined";
                      type string;
                      description
                        "Key chain name";
                    }
    
                    leaf algorithm {
                      junos:must "(".. key-chain")";
                      junos:must-message "May not be configured without key-chain";
                      type enumeration {
                        enum "simple-password" {
                          value 0;
                          description
                            "Simple password";
                        }
                        enum "keyed-md5" {
                          value 1;
                          description
                            "Keyed message Digest 5";
                        }
                        enum
                          "meticulous-keyed-md5" {
                          value 2;
                          description
                            "Meticulous keyed message Digest 5";
                        }
                        enum "keyed-sha-1" {
                          value 3;
                          description
                            "Keyed secure hash algorithm (SHA1) ";
                        }
                        enum
                          "meticulous-keyed-sha-1" {
                          value 4;
                          description
                            "Meticulous keyed secure hash algorithm (SHA1) ";
                        }
                      }
                      description
                        "Algorithm name";
                    }
    
                    leaf loose-check {
                      type empty;
                      description
                        "Verify authentication only if authentication is negotiated";
                    }
                  }  // container authentication
    
                  leaf neighbor {
                    type jt:ipaddr;
                    description
                      "BFD neighbor address";
                  }
    
                  leaf local-address {
                    type jt:ipaddr;
                    description
                      "BFD local address (for multihop only)";
                  }
    
                  leaf holddown-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Time to hold the session-UP notification to the client";
                  }
    
                  leaf minimum-receive-ttl {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint8 {
                        range "1 .. 255";
                      }
                    }
                    description
                      "Minimum receive TTL below which to drop";
                  }
                }  // container bfd-liveness-detection
    
                choice retain-choice {
                  leaf retain {
                    junos:must "(!(".. resolve"))";
                    junos:must-message "Must not specify resolve with retain";
                    type empty;
                    description
                      "Always keep route in forwarding table";
                  }
                  leaf no-retain {
                    junos:must "(!(".. resolve"))";
                    junos:must-message "Must not specify resolve with retain";
                    type empty;
                    description
                      "Don't always keep route in forwarding table";
                  }
                }  // choice retain-choice
    
                choice install-choice {
                  leaf install {
                    type empty;
                    description
                      "Install route into forwarding table";
                  }
                  leaf no-install {
                    type empty;
                    description
                      "Don't install route into forwarding table";
                  }
                }  // choice install-choice
    
                choice readvertise-choice {
                  leaf readvertise {
                    type empty;
                    description
                      "Mark route as eligible to be readvertised";
                  }
                  leaf no-readvertise {
                    type empty;
                    description
                      "Don't mark route as eligible to be readvertised";
                  }
                }  // choice readvertise-choice
    
                choice resolve-choice {
                  leaf resolve {
                    type empty;
                    description
                      "Allow resolution of indirectly connected next hops";
                  }
                  leaf no-resolve {
                    type empty;
                    description
                      "Don't allow resolution of indirectly connected next hops";
                  }
                }  // choice resolve-choice
    
                choice longest-match-choice {
                  leaf longest-match {
                    junos:must "(".. resolve")";
                    junos:must-message "Requires resolve to be configured";
                    type empty;
                    description
                      "Always use longest prefix match to resolve next hops";
                  }
                  leaf no-longest-match {
                    junos:must "(".. resolve")";
                    junos:must-message "Requires resolve to be configured";
                    type empty;
                    description
                      "Don't always use longest prefix match to resolve next hops";
                  }
                }  // choice longest-match-choice
    
                choice passive_flag {
                  leaf active {
                    type empty;
                    description
                      "Remove inactive route from forwarding table";
                  }
                  leaf passive {
                    type empty;
                    description
                      "Retain inactive route in forwarding table";
                  }
                }  // choice passive_flag
    
                container metric {
                  presence "enable metric";
                  description "Metric value";
                  uses rib_static_metric_type;
                }  // container metric
    
                container metric2 {
                  presence "enable metric2";
                  description "Metric value 2";
                  uses rib_static_metric_type;
                }  // container metric2
    
                container metric3 {
                  presence "enable metric3";
                  description "Metric value 3";
                  uses rib_static_metric_type;
                }  // container metric3
    
                container metric4 {
                  presence "enable metric4";
                  description "Metric value 4";
                  uses rib_static_metric_type;
                }  // container metric4
    
                container tag {
                  presence "enable tag";
                  description "Tag string";
                  uses rib_static_metric_type;
                }  // container tag
    
                container tag2 {
                  presence "enable tag2";
                  description "Tag string 2";
                  uses rib_static_metric_type;
                }  // container tag2
    
                container preference {
                  presence "enable preference";
                  description "Preference value";
                  uses rib_static_metric_type;
                }  // container preference
    
                container preference2 {
                  presence "enable preference2";
                  description
                    "Preference value 2";
                  uses rib_static_metric_type;
                }  // container preference2
    
                container color {
                  presence "enable color";
                  description
                    "Color (preference) value";
                  uses rib_static_metric_type;
                }  // container color
    
                container color2 {
                  presence "enable color2";
                  description
                    "Color (preference) value 2";
                  uses rib_static_metric_type;
                }  // container color2
    
                leaf-list community {
                  type jt:community;
                  ordered-by user;
                  description
                    "BGP community identifier";
                }
    
                container as-path {
                  description
                    "Autonomous system path";
                  uses apply-advanced;
    
                  leaf path {
                    type string;
                    description
                      "Autonomous system path";
                  }
    
                  leaf origin {
                    type enumeration {
                      enum "igp" {
                        value 0;
                        description
                          "Path originated in the local IGP";
                      }
                      enum "egp" {
                        value 1;
                        description
                          "Path originated in another AS";
                      }
                      enum "incomplete" {
                        value 2;
                        description
                          "Path was learned by some other means";
                      }
                    }
                  }
    
                  leaf atomic-aggregate {
                    type empty;
                    description
                      "Add ATOMIC_AGGREGATE path attribute to route";
                  }
    
                  container aggregator {
                    presence "enable aggregator";
                    description
                      "Add AGGREGATOR path attribute to route";
                  }  // container aggregator
    
                  leaf as-number {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description
                      " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                  }
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Address of BGP system that formed the route";
                  }
                }  // container as-path
    
                list lsp-next-hop {
                  key "name";
                  ordered-by user;
                  description "LSP next hop";
                  uses lsp_nh_obj;
                }  // list lsp-next-hop
    
                list p2mp-lsp-next-hop {
                  key "name";
                  max-elements 1;
                  ordered-by user;
                  description
                    "Point-to-multipoint LSP next hop";
                  uses lsp_nh_obj;
                }  // list p2mp-lsp-next-hop
    
                container spring-te-lsp-next-hop {
                  junos:must "("protocols source-packet-routing tunnel-tracking")";
                  junos:must-message "Please enable the tunnel-tracking  under 'protocols source-packet-routing' hierarchy";
                  description
                    "SPRING-TE LSP next hop";
                  uses springte_lsp_nh_obj;
                }  // container spring-te-lsp-next-hop
    
                container p2mp-ldp-next-hop {
                  description
                    "Point-to-multipoint LDP LSP next hop";
                  uses p2mp_ldp_lsp_nh_obj;
                }  // container p2mp-ldp-next-hop
    
                list static-lsp-next-hop {
                  key "name";
                  ordered-by user;
                  description
                    "Static LSP next hop";
                  uses lsp_nh_obj;
                }  // list static-lsp-next-hop
              }  // list route
    
              container static-route {
                description
                  "Static route Status";
                leaf bfd-admin-down {
                  type enumeration {
                    enum "active" {
                      value 0;
                      description
                        "Static route will be inactive on bfd-admin-down";
                    }
                    enum "passive" {
                      value 1;
                      description
                        "Static route will remain active on bfd-admin-down";
                    }
                  }
                  description
                    "Static route State on BFD ADMIN DOWN";
                }
              }  // container static-route
    
              list iso-route {
                key "name";
                ordered-by user;
                description
                  "ISO family static route";
                leaf name {
                  type jt:isoprefix;
                }
    
                uses apply-advanced;
    
                choice next_hop {
                  leaf-list next-hop {
                    type union {
                      type jt:ipaddr-or-interface;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    ordered-by user;
                    description
                      "Next hop to destination";
                  }
                  leaf reject {
                    type empty;
                    description
                      "Drop packets to destination; send ICMP unreachables";
                  }
                  leaf discard {
                    type empty;
                    description
                      "Drop packets to destination; send no ICMP unreachables";
                  }
                  leaf receive {
                    type empty;
                    description
                      "Install a receive route for the destination";
                  }
                  leaf next-table {
                    type string {
                      junos:posix-pattern "^(((.{0,128})[:](.{1,128})[.]|((.{1,128})[.]))?([a-z]|[0-9]|[-_])+[.]((1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5])))$";
                      junos:pattern-message "Must match the format [<instance-name>[:<topology-name>].]<family-name>.<rib-id>";
                    }
                    description
                      "Next hop to another table";
                  }
                }  // choice next_hop
    
                list qualified-next-hop {
                  key "name";
                  ordered-by user;
                  description
                    "Next hop with qualifiers";
                  uses qualified_nh_obj;
                }  // list qualified-next-hop
    
                leaf backup-pe-group {
                  junos:must "(".. p2mp-lsp-next-hop")";
                  junos:must-message "Backup groups only allowed for static routes with p2mp lsp next-hop";
                  type string;
                  description
                    "Multicast source redundancy group";
                }
    
                container bfd-liveness-detection {
                  description
                    "Bidirectional Forwarding Detection (BFD) options";
                  uses apply-advanced;
    
                  leaf version {
                    type enumeration {
                      enum "0" {
                        value 0;
                        description
                          "BFD version 0 (deprecated)";
                      }
                      enum "1" {
                        value 1;
                        description
                          "BFD version 1";
                      }
                      enum "automatic" {
                        value 2;
                        description
                          "Choose BFD version automatically";
                      }
                    }
                    default "automatic";
                    description
                      "BFD protocol version number";
                  }
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit and receive interval";
                  }
    
                  leaf minimum-transmit-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    status deprecated;
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf minimum-receive-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum receive interval";
                  }
    
                  leaf multiplier {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255";
                      }
                    }
                    default "3";
                    description
                      "Detection time multiplier";
                  }
    
                  choice adaptation-choice {
                    leaf no-adaptation {
                      type empty;
                      description
                        "Disable adaptation";
                    }
                  }  // choice adaptation-choice
    
                  container transmit-interval {
                    description
                      "Transmit-interval options";
                    uses apply-advanced;
    
                    leaf minimum-interval {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 255000";
                        }
                      }
                      units "milliseconds";
                      description
                        "Minimum transmit interval";
                    }
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High transmit interval triggering a trap";
                    }
                  }  // container transmit-interval
    
                  container detection-time {
                    description
                      "Detection-time options";
                    uses apply-advanced;
    
                    leaf threshold {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      units "milliseconds";
                      description
                        "High detection-time triggering a trap";
                    }
                  }  // container detection-time
    
                  container authentication {
                    description
                      "Authentication options";
                    uses apply-advanced;
    
                    leaf key-chain {
                      junos:must "(".. algorithm")";
                      junos:must-message "May not be configured without algorithm";
                      junos:must "("security authentication-key-chains key-chain $$")";
                      junos:must-message "Referenced key-chain must be defined";
                      type string;
                      description
                        "Key chain name";
                    }
    
                    leaf algorithm {
                      junos:must "(".. key-chain")";
                      junos:must-message "May not be configured without key-chain";
                      type enumeration {
                        enum "simple-password" {
                          value 0;
                          description
                            "Simple password";
                        }
                        enum "keyed-md5" {
                          value 1;
                          description
                            "Keyed message Digest 5";
                        }
                        enum
                          "meticulous-keyed-md5" {
                          value 2;
                          description
                            "Meticulous keyed message Digest 5";
                        }
                        enum "keyed-sha-1" {
                          value 3;
                          description
                            "Keyed secure hash algorithm (SHA1) ";
                        }
                        enum
                          "meticulous-keyed-sha-1" {
                          value 4;
                          description
                            "Meticulous keyed secure hash algorithm (SHA1) ";
                        }
                      }
                      description
                        "Algorithm name";
                    }
    
                    leaf loose-check {
                      type empty;
                      description
                        "Verify authentication only if authentication is negotiated";
                    }
                  }  // container authentication
    
                  leaf neighbor {
                    type jt:ipaddr;
                    description
                      "BFD neighbor address";
                  }
    
                  leaf local-address {
                    type jt:ipaddr;
                    description
                      "BFD local address (for multihop only)";
                  }
    
                  leaf holddown-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Time to hold the session-UP notification to the client";
                  }
    
                  leaf minimum-receive-ttl {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint8 {
                        range "1 .. 255";
                      }
                    }
                    description
                      "Minimum receive TTL below which to drop";
                  }
                }  // container bfd-liveness-detection
    
                choice retain-choice {
                  leaf retain {
                    junos:must "(!(".. resolve"))";
                    junos:must-message "Must not specify resolve with retain";
                    type empty;
                    description
                      "Always keep route in forwarding table";
                  }
                  leaf no-retain {
                    junos:must "(!(".. resolve"))";
                    junos:must-message "Must not specify resolve with retain";
                    type empty;
                    description
                      "Don't always keep route in forwarding table";
                  }
                }  // choice retain-choice
    
                choice install-choice {
                  leaf install {
                    type empty;
                    description
                      "Install route into forwarding table";
                  }
                  leaf no-install {
                    type empty;
                    description
                      "Don't install route into forwarding table";
                  }
                }  // choice install-choice
    
                choice readvertise-choice {
                  leaf readvertise {
                    type empty;
                    description
                      "Mark route as eligible to be readvertised";
                  }
                  leaf no-readvertise {
                    type empty;
                    description
                      "Don't mark route as eligible to be readvertised";
                  }
                }  // choice readvertise-choice
    
                choice resolve-choice {
                  leaf resolve {
                    type empty;
                    description
                      "Allow resolution of indirectly connected next hops";
                  }
                  leaf no-resolve {
                    type empty;
                    description
                      "Don't allow resolution of indirectly connected next hops";
                  }
                }  // choice resolve-choice
    
                choice longest-match-choice {
                  leaf longest-match {
                    junos:must "(".. resolve")";
                    junos:must-message "Requires resolve to be configured";
                    type empty;
                    description
                      "Always use longest prefix match to resolve next hops";
                  }
                  leaf no-longest-match {
                    junos:must "(".. resolve")";
                    junos:must-message "Requires resolve to be configured";
                    type empty;
                    description
                      "Don't always use longest prefix match to resolve next hops";
                  }
                }  // choice longest-match-choice
    
                choice passive_flag {
                  leaf active {
                    type empty;
                    description
                      "Remove inactive route from forwarding table";
                  }
                  leaf passive {
                    type empty;
                    description
                      "Retain inactive route in forwarding table";
                  }
                }  // choice passive_flag
    
                container metric {
                  presence "enable metric";
                  description "Metric value";
                  uses rib_static_metric_type;
                }  // container metric
    
                container metric2 {
                  presence "enable metric2";
                  description "Metric value 2";
                  uses rib_static_metric_type;
                }  // container metric2
    
                container metric3 {
                  presence "enable metric3";
                  description "Metric value 3";
                  uses rib_static_metric_type;
                }  // container metric3
    
                container metric4 {
                  presence "enable metric4";
                  description "Metric value 4";
                  uses rib_static_metric_type;
                }  // container metric4
    
                container tag {
                  presence "enable tag";
                  description "Tag string";
                  uses rib_static_metric_type;
                }  // container tag
    
                container tag2 {
                  presence "enable tag2";
                  description "Tag string 2";
                  uses rib_static_metric_type;
                }  // container tag2
    
                container preference {
                  presence "enable preference";
                  description "Preference value";
                  uses rib_static_metric_type;
                }  // container preference
    
                container preference2 {
                  presence "enable preference2";
                  description
                    "Preference value 2";
                  uses rib_static_metric_type;
                }  // container preference2
    
                container color {
                  presence "enable color";
                  description
                    "Color (preference) value";
                  uses rib_static_metric_type;
                }  // container color
    
                container color2 {
                  presence "enable color2";
                  description
                    "Color (preference) value 2";
                  uses rib_static_metric_type;
                }  // container color2
    
                leaf-list community {
                  type jt:community;
                  ordered-by user;
                  description
                    "BGP community identifier";
                }
    
                container as-path {
                  description
                    "Autonomous system path";
                  uses apply-advanced;
    
                  leaf path {
                    type string;
                    description
                      "Autonomous system path";
                  }
    
                  leaf origin {
                    type enumeration {
                      enum "igp" {
                        value 0;
                        description
                          "Path originated in the local IGP";
                      }
                      enum "egp" {
                        value 1;
                        description
                          "Path originated in another AS";
                      }
                      enum "incomplete" {
                        value 2;
                        description
                          "Path was learned by some other means";
                      }
                    }
                  }
    
                  leaf atomic-aggregate {
                    type empty;
                    description
                      "Add ATOMIC_AGGREGATE path attribute to route";
                  }
    
                  container aggregator {
                    presence "enable aggregator";
                    description
                      "Add AGGREGATOR path attribute to route";
                  }  // container aggregator
    
                  leaf as-number {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description
                      " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                  }
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Address of BGP system that formed the route";
                  }
                }  // container as-path
    
                list lsp-next-hop {
                  key "name";
                  ordered-by user;
                  description "LSP next hop";
                  uses lsp_nh_obj;
                }  // list lsp-next-hop
    
                list p2mp-lsp-next-hop {
                  key "name";
                  max-elements 1;
                  ordered-by user;
                  description
                    "Point-to-multipoint LSP next hop";
                  uses lsp_nh_obj;
                }  // list p2mp-lsp-next-hop
    
                container spring-te-lsp-next-hop {
                  junos:must "("protocols source-packet-routing tunnel-tracking")";
                  junos:must-message "Please enable the tunnel-tracking  under 'protocols source-packet-routing' hierarchy";
                  description
                    "SPRING-TE LSP next hop";
                  uses springte_lsp_nh_obj;
                }  // container spring-te-lsp-next-hop
    
                container p2mp-ldp-next-hop {
                  description
                    "Point-to-multipoint LDP LSP next hop";
                  uses p2mp_ldp_lsp_nh_obj;
                }  // container p2mp-ldp-next-hop
              }  // list iso-route
    
              list route-target-filter {
                key "name";
                ordered-by user;
                description
                  "Route-target-filter route";
                leaf name {
                  type string {
                    junos:posix-pattern "^[0-9.]{1,15}L?:[0-9]{1,10}/([0-9]|[2-5][0-9]|6[0-4])$";
                    junos:pattern-message "Use format 'x:y/len' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100 and len is a prefix length from 0 to 64";
                    length "1 .. 47";
                  }
                }
    
                uses apply-advanced;
    
                leaf-list neighbor {
                  type jt:ipaddr-scoped;
                  ordered-by user;
                  description
                    "BGP peers for filter";
                }
    
                leaf-list group {
                  type string;
                  ordered-by user;
                  description
                    "BGP groups for filter";
                }
    
                leaf local {
                  type empty;
                  description
                    "Locally originated filter";
                }
              }  // list route-target-filter
            }  // container static
    
            list martians {
              key "address choice-ident choice-value";
              ordered-by user;
              description "Invalid routes";
              uses martian_type;
            }  // list martians
    
            container aggregate {
              description "Coalesced routes";
              uses rib_aggregate_type;
            }  // container aggregate
    
            container generate {
              description "Route of last resort";
              uses rib_aggregate_type;
            }  // container generate
    
            choice maximum-paths-type {
              container maximum-routes {
                status deprecated;
                description
                  "Maximum number of routes";
                leaf limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description
                    "Maximum number of routes";
                }
    
                choice log_type {
                  leaf threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 100";
                      }
                    }
                    description
                      "Percentage of limit at which to start generating warnings";
                  }
                  leaf log-only {
                    type empty;
                    description
                      "Generate warning messages only";
                  }
                }  // choice log_type
    
                leaf log-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "5 .. 86400";
                    }
                  }
                  units "seconds";
                  description
                    "Minimum interval between log messages";
                }
              }  // container maximum-routes
              container maximum-paths {
                description
                  "Maximum number of paths";
                leaf limit {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 4294967295";
                    }
                  }
                  description
                    "Maximum number of paths";
                }
    
                choice log_type {
                  leaf threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 100";
                      }
                    }
                    description
                      "Percentage of limit at which to start generating warnings";
                  }
                  leaf log-only {
                    type empty;
                    description
                      "Generate warning messages only";
                  }
                }  // choice log_type
    
                leaf log-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "5 .. 86400";
                    }
                  }
                  units "seconds";
                  description
                    "Minimum interval between log messages";
                }
              }  // container maximum-paths
            }  // choice maximum-paths-type
    
            container maximum-prefixes {
              description
                "Maximum number of prefixes";
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Maximum number of prefixes";
              }
    
              choice log_type {
                leaf threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of limit at which to start generating warnings";
                }
                leaf log-only {
                  type empty;
                  description
                    "Generate warning messages only";
                }
              }  // choice log_type
    
              leaf log-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "5 .. 86400";
                  }
                }
                units "seconds";
                description
                  "Minimum interval between log messages";
              }
            }  // container maximum-prefixes
    
            container multipath {
              presence "enable multipath";
              description
                "Protocol-independent load balancing";
              uses apply-advanced;
    
              container vpn-unequal-cost {
                presence
                  "enable vpn-unequal-cost";
                description
                  "Include VPN routes with unequal IGP metrics";
                leaf equal-external-internal {
                  type empty;
                  description
                    "Include external and internal VPN routes";
                }
              }  // container vpn-unequal-cost
    
              leaf as-path-compare {
                type empty;
                description
                  "Compare AS path sequences in addition to AS path length";
              }
    
              leaf preserve-nexthop-hierarchy {
                type empty;
                description
                  "Force multipath to create List nexthop";
              }
            }  // container multipath
    
            container policy-multipath {
              description
                "Policy based multipath";
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy to create policy based multipath";
              }
    
              container traceoptions {
                description "Trace options";
                uses apply-advanced;
    
                container file {
                  description
                    "Trace file options";
                  leaf filename {
                    type string {
                      junos:posix-pattern "![/ %]";
                      junos:pattern-message "Must not contain '/', % or a space";
                      length "1 .. 1024";
                    }
                    description
                      "Name of file in which to write trace information";
                  }
    
                  leaf replace {
                    type empty;
                    status deprecated;
                    description
                      "Replace trace file rather than appending to it";
                  }
    
                  leaf size {
                    type string;
                    description
                      "Maximum trace file size";
                  }
    
                  leaf files {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 1000";
                      }
                    }
                    default "10";
                    description
                      "Maximum number of trace files";
                  }
    
                  leaf no-stamp {
                    type empty;
                    status deprecated;
                    description
                      "Do not timestamp trace file";
                  }
    
                  choice world-readable-choice {
                    leaf world-readable {
                      type empty;
                      description
                        "Allow any user to read the log file";
                    }
                    leaf no-world-readable {
                      type empty;
                      description
                        "Don't allow any user to read the log file";
                    }
                  }  // choice world-readable-choice
                }  // container file
    
                list flag {
                  key "name";
                  ordered-by user;
                  description
                    "Tracing parameters";
                  leaf name {
                    type enumeration {
                      enum "route" {
                        value 0;
                        description
                          "Policy-multipath route tracing.";
                      }
                    }
                  }
    
                  leaf send {
                    type empty;
                    description
                      "Trace transmitted packets";
                  }
    
                  leaf receive {
                    type empty;
                    description
                      "Trace received packets";
                  }
    
                  leaf detail {
                    type empty;
                    description
                      "Trace detailed information";
                  }
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this trace flag";
                  }
                }  // list flag
              }  // container traceoptions
            }  // container policy-multipath
    
            container protect {
              description
                "Protocol-independent protection";
              leaf core {
                type empty;
                description
                  "Protect against unreachability to service-edge router";
              }
            }  // container protect
    
            container access {
              description "Access routes";
              uses apply-advanced;
    
              list route {
                key "name";
                ordered-by user;
                description "Access route";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP address of destination";
                }
    
                uses apply-advanced;
    
                leaf-list next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description
                    "Next hop to destination";
                }
    
                list qualified-next-hop {
                  key "name";
                  ordered-by user;
                  description
                    "Next hop with qualifiers";
                  uses qualified_nh_obj;
                }  // list qualified-next-hop
    
                leaf metric {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description "Metric value";
                }
    
                leaf preference {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Preference value";
                }
    
                leaf tag {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Tag string";
                }
    
                leaf tag2 {
                  type union {
                    type uint32;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Tag2 string";
                }
              }  // list route
            }  // container access
    
            container access-internal {
              description
                "Access-internal routes";
              uses apply-advanced;
    
              list route {
                key "name";
                ordered-by user;
                description
                  "Access-internal route";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP address and optional prefix length of destination";
                }
    
                uses apply-advanced;
    
                leaf-list next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description
                    "Next hop to destination";
                }
    
                list qualified-next-hop {
                  key "name";
                  ordered-by user;
                  description
                    "Next hop with qualifiers";
                  uses qualified_nh_obj;
                }  // list qualified-next-hop
              }  // list route
            }  // container access-internal
    
            container bgp-static {
              description
                "Routes for BGP static advertisements";
              uses apply-advanced;
    
              list route {
                key "name";
                ordered-by user;
                description "BGP-static route";
                leaf name {
                  type jt:ipprefix;
                  description
                    "IP address and optional prefix length of destination";
                }
    
                uses apply-advanced;
    
                container metric {
                  presence "enable metric";
                  description "Metric value";
                  uses rib_static_metric_type;
                }  // container metric
    
                container metric2 {
                  presence "enable metric2";
                  description "Metric value 2";
                  uses rib_static_metric_type;
                }  // container metric2
    
                container metric3 {
                  presence "enable metric3";
                  description "Metric value 3";
                  uses rib_static_metric_type;
                }  // container metric3
    
                container metric4 {
                  presence "enable metric4";
                  description "Metric value 4";
                  uses rib_static_metric_type;
                }  // container metric4
    
                container tag {
                  presence "enable tag";
                  description "Tag string";
                  uses rib_static_metric_type;
                }  // container tag
    
                container tag2 {
                  presence "enable tag2";
                  description "Tag string 2";
                  uses rib_static_metric_type;
                }  // container tag2
    
                container preference {
                  presence "enable preference";
                  description "Preference value";
                  uses rib_static_metric_type;
                }  // container preference
    
                container preference2 {
                  presence "enable preference2";
                  description
                    "Preference value 2";
                  uses rib_static_metric_type;
                }  // container preference2
    
                container color {
                  presence "enable color";
                  description
                    "Color (preference) value";
                  uses rib_static_metric_type;
                }  // container color
    
                container color2 {
                  presence "enable color2";
                  description
                    "Color (preference) value 2";
                  uses rib_static_metric_type;
                }  // container color2
    
                leaf-list community {
                  type jt:community;
                  ordered-by user;
                  description
                    "BGP community identifier";
                }
    
                container as-path {
                  description
                    "Autonomous system path";
                  uses apply-advanced;
    
                  leaf path {
                    type string;
                    description
                      "Autonomous system path";
                  }
    
                  leaf origin {
                    type enumeration {
                      enum "igp" {
                        value 0;
                        description
                          "Path originated in the local IGP";
                      }
                      enum "egp" {
                        value 1;
                        description
                          "Path originated in another AS";
                      }
                      enum "incomplete" {
                        value 2;
                        description
                          "Path was learned by some other means";
                      }
                    }
                  }
    
                  leaf atomic-aggregate {
                    type empty;
                    description
                      "Add ATOMIC_AGGREGATE path attribute to route";
                  }
    
                  container aggregator {
                    presence "enable aggregator";
                    description
                      "Add AGGREGATOR path attribute to route";
                  }  // container aggregator
    
                  leaf as-number {
                    type string {
                      junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                      junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                    }
                    description
                      " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                  }
    
                  leaf address {
                    type jt:ipv4addr;
                    description
                      "Address of BGP system that formed the route";
                  }
                }  // container as-path
              }  // list route
            }  // container bgp-static
    
            container flow {
              description
                "Locally defined flow routing information";
              uses apply-advanced;
    
              container validation {
                presence "enable validation";
                description
                  "Flow route validation options";
                uses flow-validation;
              }  // container validation
    
              list route {
                key "name";
                ordered-by user;
                description "Flow route";
                uses flow-route-inet6;
              }  // list route
    
              list security-group {
                key "name";
                ordered-by user;
                description "Security groups";
                leaf name {
                  type string {
                    length "1 .. 16";
                  }
                  description
                    "Name of the security group";
                }
    
                uses apply-advanced;
    
                list rule {
                  key "name";
                  ordered-by user;
                  description "Flow route";
                  uses flow-rule-inet6;
                }  // list rule
              }  // list security-group
    
              container interface-group {
                description
                  "Interface-group for applying flow-spec filter";
                uses flow-interface-group;
              }  // container interface-group
    
              leaf discard-action-for-unresolved-redir-addr {
                type empty;
                description
                  "For action redirect IP if redirect address is unresolved install discard action filter";
              }
    
              choice per-route-accounting-choice {
                leaf per-route-accounting {
                  type empty;
                  description
                    "Enable traffic accounting per flowspec route";
                }
                leaf no-per-route-accounting {
                  type empty;
                  description
                    "Don't enable traffic accounting per flowspec route";
                }
              }  // choice per-route-accounting-choice
            }  // container flow
    
            container label {
              presence "enable label";
              description "Label processing";
              uses apply-advanced;
    
              leaf-list allocation {
                junos:must "(".. .. .. instance-type vrf")";
                junos:must-message "'allocation' policy is valid only for 'instance-type vrf'";
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Label allocation policy";
              }
    
              leaf-list substitution {
                junos:must "(".. .. .. instance-type vrf")";
                junos:must-message "'substitution' policy is valid only for 'instance-type vrf'";
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Label substitution policy";
              }
            }  // container label
          }  // list rib
    
          container label {
            presence "enable label";
            description "Label processing";
            uses apply-advanced;
    
            leaf-list allocation {
              junos:must "(".. .. .. instance-type vrf")";
              junos:must-message "'allocation' policy is valid only for 'instance-type vrf'";
              type jt:policy-algebra;
              ordered-by user;
              description
                "Label allocation policy";
            }
    
            leaf-list substitution {
              junos:must "(".. .. .. instance-type vrf")";
              junos:must-message "'substitution' policy is valid only for 'instance-type vrf'";
              type jt:policy-algebra;
              ordered-by user;
              description
                "Label substitution policy";
            }
          }  // container label
    
          container options {
            description "Miscellaneous options";
            uses apply-advanced;
    
            leaf no-send {
              type empty;
              status deprecated;
              description
                "Listen only; do not send protocol packets";
            }
    
            leaf no-resolve {
              type empty;
              status deprecated;
              description
                "Do not use DNS name resolution";
            }
    
            container syslog {
              description
                "Set system logging level";
              uses apply-advanced;
    
              container level {
                description "Logging level";
                leaf emergency {
                  type empty;
                  description "Emergency level";
                }
    
                leaf alert {
                  type empty;
                  description "Alert level";
                }
    
                leaf critical {
                  type empty;
                  description "Critical level";
                }
    
                leaf error {
                  type empty;
                  description "Error level";
                }
    
                leaf warning {
                  type empty;
                  description "Warning level";
                }
    
                leaf notice {
                  type empty;
                  description "Notice level";
                }
    
                leaf info {
                  type empty;
                  description
                    "Informational level";
                }
    
                leaf debug {
                  type empty;
                  description "Debugging level";
                }
              }  // container level
    
              leaf upto {
                type enumeration {
                  enum "emergency" {
                    value 0;
                    description
                      "Emergency level";
                  }
                  enum "alert" {
                    value 1;
                    description "Alert level";
                  }
                  enum "critical" {
                    value 2;
                    description "Critical level";
                  }
                  enum "error" {
                    value 3;
                    description "Error level";
                  }
                  enum "warning" {
                    value 4;
                    description "Warning level";
                  }
                  enum "notice" {
                    value 5;
                    description "Notice level";
                  }
                  enum "info" {
                    value 6;
                    description
                      "Informational level";
                  }
                  enum "debug" {
                    value 7;
                    description
                      "Debugging level";
                  }
                }
                description
                  "Log up to a particular logging level";
              }
            }  // container syslog
    
            leaf mark {
              type union {
                type int32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              units "seconds";
              description
                "Periodically mark the trace file";
            }
          }  // container options
    
          container resolution {
            presence "enable resolution";
            description
              "Route next-hop resolution options";
            uses apply-advanced;
    
            leaf-list tracefilter {
              type jt:policy-algebra;
              ordered-by user;
              description "Filter policy";
            }
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "event" {
                      value 0;
                      description
                        "Event processing";
                    }
                    enum "flash" {
                      value 1;
                      description
                        "Flash processing";
                    }
                    enum "kernel" {
                      value 2;
                      description
                        "Kernel communication";
                    }
                    enum "indirect" {
                      value 3;
                      description
                        "Indirect next-hop addition, change, or deletion";
                    }
                    enum "task" {
                      value 4;
                      description
                        "Task or job processing";
                    }
                    enum "igp-frr" {
                      value 5;
                      description
                        "IGP triggered FRR events";
                    }
                    enum "igp-frr-extensive" {
                      value 6;
                      description
                        "IGP triggered FRR Extensive events";
                    }
                    enum "tunnel" {
                      value 7;
                      description
                        "Resolver dynamic tunnel events";
                    }
                    enum "all" {
                      value 8;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            choice preserve-nexthop-hierarchy-choice {
              leaf preserve-nexthop-hierarchy {
                type empty;
                description
                  "Preserve nexthop hierarchy when installing nexthop to forwarding plane";
              }
              leaf no-preserve-nexthop-hierarchy {
                type empty;
                description
                  "Don't preserve nexthop hierarchy when installing nexthop to forwarding plane";
              }
            }  // choice preserve-nexthop-hierarchy-choice
    
            list rib {
              key "name";
              ordered-by user;
              description
                "Routing table resolution options";
              leaf name {
                type string;
                description "Routing table name";
              }
    
              uses apply-advanced;
    
              leaf-list resolution-family {
                type string;
                ordered-by user;
                description
                  "Family of resultion tree";
              }
    
              leaf-list resolution-ribs {
                type string;
                ordered-by user;
                description
                  "Routing tables to use for default routing table family resolution";
              }
    
              leaf-list inet-resolution-ribs {
                type string;
                ordered-by user;
                description
                  "Routing tables to use for ipv4 family protocol-next-hop resolution";
              }
    
              leaf-list inet6-resolution-ribs {
                type string;
                ordered-by user;
                description
                  "Routing tables to use for ipv6 family protocol-next-hop resolution";
              }
    
              leaf-list iso-resolution-ribs {
                type string;
                ordered-by user;
                description
                  "Routing tables to use for iso family protocol-next-hop resolution";
              }
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
    
              leaf-list inet-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for IPV4 family resolution tree";
              }
    
              leaf-list inet6-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for IPV6 family resolution tree";
              }
    
              leaf-list iso-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for ISO family resolution tree";
              }
    
              leaf-list inetcolor-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for INETCOLOR family resolution tree";
              }
    
              leaf-list inet6color-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for INET6COLOR family resolution tree";
              }
            }  // list rib
    
            choice prefer-recursive-primary-path-choice {
              leaf prefer-recursive-primary-path {
                type empty;
                description
                  "Prefer primary path to resolve nexthop during recursive-resolution";
              }
              leaf no-prefer-recursive-primary-path {
                type empty;
                description
                  "Don't prefer primary path to resolve nexthop during recursive-resolution";
              }
            }  // choice prefer-recursive-primary-path-choice
    
            list scheme {
              key "name";
              ordered-by user;
              description
                "Nexthop resolution fallback";
              leaf name {
                type string;
                description
                  "Name the resolution scheme";
              }
    
              uses apply-advanced;
    
              leaf-list resolution-ribs {
                junos:must "(!(".. transport-classes"))";
                junos:must-message "resolution-ribs and transport-classes are mutually exclusive options";
                type string;
                ordered-by user;
                description
                  "Routing tables to use for nexthop resolution, in fallback order";
              }
    
              leaf mapping-community {
                type jt:community;
                description
                  "Community on service-route that maps to this transport";
              }
            }  // list scheme
          }  // container resolution
    
          container interface-routes {
            description
              "Define routing table groups for interface routes";
            uses apply-advanced;
    
            container rib-group {
              description "Routing table group";
              uses rib_group_type;
            }  // container rib-group
    
            list family {
              key "name";
              ordered-by user;
              description "Address family";
              leaf name {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet6" {
                    value 1;
                    description "IPv6 family";
                  }
                }
              }
    
              uses apply-advanced;
    
              leaf-list import {
                type jt:policy-algebra;
                ordered-by user;
                description "Import policy";
              }
    
              container export {
                description
                  "Control exportability of local routes";
                uses apply-advanced;
    
                leaf point-to-point {
                  type empty;
                  description
                    "Make point-to-point routes exportable";
                }
    
                leaf lan {
                  type empty;
                  description
                    "Make LAN routes exportable";
                }
              }  // container export
            }  // list family
          }  // container interface-routes
    
          leaf loopback-strict-disable {
            type empty;
            description
              "Completely disable lo0 host prefix when in admin-down state";
          }
    
          container traceoptions {
            description
              "Global routing protocol trace options";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "parse" {
                    value 0;
                    description
                      "Trace configuration parsing";
                  }
                  enum "regex-parse" {
                    value 1;
                    description
                      "Trace regular-expression parsing";
                  }
                  enum "config-internal" {
                    value 2;
                    description
                      "Trace configuration internals";
                  }
                  enum "nsr-synchronization" {
                    value 3;
                    description
                      "Trace nonstop routing synchronization events";
                  }
                  enum "condition-manager" {
                    value 4;
                    description
                      "Trace condition manager events";
                  }
                  enum "graceful-restart" {
                    value 5;
                    description
                      "Trace Graceful Restart events";
                  }
                  enum "session" {
                    value 6;
                    description
                      "Trace Session ID allocations/deallocations";
                  }
                  enum "hfrr-fsm" {
                    value 7;
                    description
                      "Host FRR FSM events tracing";
                  }
                  enum "hfrr-route" {
                    value 8;
                    description
                      "Host FRR route events tracing";
                  }
                  enum "statistics-id-group" {
                    value 9;
                    description
                      "Trace Statistics ID Group operations";
                  }
                  enum "route-record" {
                    value 10;
                    description
                      "Trace route-record server-side events";
                  }
                  enum "jvision-lsp" {
                    value 11;
                    description
                      "Trace Jvision events and errors";
                  }
                  enum "dyn-nh-template" {
                    value 12;
                    description
                      "Dynamic nexthops template events tracing";
                  }
                  enum "read-route" {
                    value 13;
                    description
                      "Read route events tracing";
                  }
                  enum "route" {
                    value 14;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 15;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 16;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 17;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 18;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 19;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 20;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 21;
                    description
                      "Trace everything";
                  }
                }
              }
    
              leaf disable {
                type empty;
                description
                  "Disable this trace flag";
              }
            }  // list flag
          }  // container traceoptions
    
          container topologies {
            junos:must "(!("routing-options no-multi-topology-routing"))";
            junos:must-message "Multi topology routing is disabled";
            description
              "Define routing topologies";
            uses apply-advanced;
    
            list family {
              key "name";
              ordered-by user;
              description "Address family";
              leaf name {
                type enumeration {
                  enum "inet" {
                    value 0;
                    description "IPv4 family";
                  }
                  enum "inet6" {
                    value 1;
                    description "IPv6 family";
                  }
                }
              }
    
              uses apply-advanced;
    
              list topology {
                key "name";
                ordered-by user;
                description
                  "Topology information";
                leaf name {
                  type string {
                    junos:posix-pattern "!^((.*:.*)|(.{129,}))$";
                    junos:pattern-message "Must be a non-reserved string of 128 characters or less";
                  }
                  description "Topology name";
                }
    
                uses apply-advanced;
    
                leaf table-id {
                  junos:must "(unique ".. .. topology <*> table-id $$")";
                  junos:must-message "Table-id has to be unique among all topology names";
                  type union {
                    type uint16;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  description "Table-id";
                }
              }  // list topology
            }  // list family
          }  // container topologies
    
          leaf router-id {
            type jt:ipv4addr;
            description "Router identifier";
          }
    
          container autonomous-system {
            description
              "Autonomous system number";
            leaf as-number {
              type string {
                junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
              }
              description
                " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
            }
    
            leaf loops {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type int32 {
                  range "1 .. 10";
                }
              }
              description
                "Maximum number of times this AS can be in an AS path";
            }
    
            leaf asdot-notation {
              type empty;
              description
                "Use AS-Dot notation to display true 4 byte AS numbers";
            }
    
            container independent-domain {
              presence
                "enable independent-domain";
              description
                "Independent autonomous-system domain from master instance";
              container no-attrset {
                presence "enable no-attrset";
                description
                  "Do not tunnel ce bgp attributes across provider network";
              }  // container no-attrset
            }  // container independent-domain
          }  // container autonomous-system
    
          container confederation {
            description
              "Confederation autonomous system number";
            leaf confederation-as {
              type string {
                junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
              }
              description
                " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
            }
    
            leaf-list members {
              type string;
              ordered-by user;
              description
                " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
            }
          }  // container confederation
    
          leaf ipv6-router-id {
            type string;
            description "IPv6 router identifier";
          }
    
          container graceful-restart {
            junos:must "(!("routing-options nonstop-routing"))";
            junos:must-message "Graceful restart and Nonstop routing may not be enabled simultaneously";
            presence "enable graceful-restart";
            description
              "Graceful or hitless routing restart options";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable graceful restart";
              }
            }  // choice enable-disable
    
            leaf restart-duration {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "120 .. 10000";
                }
              }
              description
                "Maximum time for which router is in graceful restart";
            }
          }  // container graceful-restart
    
          container flow {
            description
              "Locally defined flow routing information";
            uses apply-advanced;
    
            leaf firewall-install-disable {
              type empty;
              description
                "Disable installing flowspec firewall filters in dfwd ";
            }
    
            choice per-route-accounting-choice {
              leaf per-route-accounting {
                type empty;
                description
                  "Enable traffic accounting per flowspec route";
              }
              leaf no-per-route-accounting {
                type empty;
                description
                  "Don't enable traffic accounting per flowspec route";
              }
            }  // choice per-route-accounting-choice
    
            container validation {
              presence "enable validation";
              description
                "Flow route validation options";
              uses flow-validation;
            }  // container validation
    
            container interface-group {
              description
                "Interface-group for applying flow-spec filter";
              uses flow-interface-group;
            }  // container interface-group
    
            list route {
              key "name";
              ordered-by user;
              description "Flow route";
              uses flow-route-inet;
            }  // list route
    
            leaf term-order {
              type enumeration {
                enum "legacy" {
                  value 0;
                  description
                    "Legacy term order (default)";
                }
                enum "standard" {
                  value 1;
                  description
                    "RFC compliant term order";
                }
              }
              description
                "Term evaluation order for flow routes";
            }
    
            leaf discard-action-for-unresolved-redir-addr {
              type empty;
              description
                "For action redirect IP if redirect address is unresolved install discard action filter";
            }
    
            list security-group {
              key "name";
              ordered-by user;
              description "Security groups";
              leaf name {
                type string {
                  length "1 .. 16";
                }
                description
                  "Name of the security group";
              }
    
              uses apply-advanced;
    
              list rule {
                key "name";
                ordered-by user;
                description "Flow route";
                uses flow-rule-inet;
              }  // list rule
            }  // list security-group
          }  // container flow
    
          leaf no-soft-core {
            type empty;
            description
              "Disable soft assert to generate core and just log the event";
          }
    
          leaf med-igp-update-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 600";
              }
            }
            description
              "Delay (in minutes) in updating MED IGP for bgp groups with 'delay-med-update' ";
          }
    
          container bmp {
            presence "enable bmp";
            description
              "BGP Monitoring Protocol (BMP) configuration";
            uses apply-advanced;
    
            leaf authentication-key {
              type string {
                length "1 .. 126";
              }
              description
                "MD5 authentication key";
            }
    
            leaf authentication-algorithm {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "md5" {
                  value 0;
                  description "Message Digest 5";
                }
                enum "hmac-sha-1-96" {
                  value 1;
                  description
                    "Hash-based Message Authentication Code (SHA1) (96 bits)";
                }
                enum "aes-128-cmac-96" {
                  value 2;
                  description
                    "Cipher-based Message Authentication Code (AES128) (96 bits)";
                }
                enum "ao" {
                  value 3;
                  description
                    "TCP Authentication Option";
                }
              }
              default "hmac-sha-1-96";
              description
                "Authentication algorithm name";
            }
    
            leaf tcpao-handling-with-digest-mismatch {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              type enumeration {
                enum "drop-if-no-tcpao" {
                  value 0;
                  description
                    "Drop the connection if Digest mismatched";
                }
                enum "allow-without-tcpao" {
                  value 1;
                  description
                    "Allow the connection establishment without TCP-AO";
                }
              }
              description
                "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
            }
    
            leaf authentication-key-chain {
              junos:must "(!(".. authentication-key"))";
              junos:must-message "May not be configured with authentication-key";
              junos:must "("security authentication-key-chains key-chain $$")";
              junos:must-message "Referenced key-chain must be defined";
              type string {
                length "1 .. 128";
              }
              description "Key chain name";
            }
    
            container hold-down {
              presence "enable hold-down";
              leaf hold-down-time {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Prevent re-establishment for this time";
              }
    
              leaf flaps {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 10";
                  }
                }
                description
                  "Number of flaps before damping";
              }
    
              leaf period {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "30 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Time period for flaps";
              }
            }  // container hold-down
    
            leaf initiation-message {
              type string {
                length "1 .. 255";
              }
              description
                "User string sent with the initiation message";
            }
    
            leaf local-address {
              type jt:ipaddr;
              description
                "Address of local end of BMP session";
            }
    
            leaf local-port {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1024 .. 65535";
                }
              }
              description
                "Local port for listening";
            }
    
            leaf connection-mode {
              type enumeration {
                enum "active" {
                  value 0;
                  description
                    "Initiate the connection";
                }
                enum "passive" {
                  value 1;
                  description
                    "Listen for the connection";
                }
              }
              description
                "Specify active or passive";
            }
    
            leaf priority {
              type enumeration {
                enum "low" {
                  value 0;
                  description "Lowest priority";
                }
                enum "medium" {
                  value 1;
                  description "Medium priority";
                }
                enum "high" {
                  value 2;
                  description "Highest priority";
                }
              }
              description
                "Relative dispatch priority";
            }
    
            leaf monitor {
              type enumeration {
                enum "enable" {
                  value 0;
                  description
                    "Enable monitoring of BGP peer(s)";
                }
                enum "disable" {
                  value 1;
                  description
                    "Disable monitoring of BGP peer(s)";
                }
              }
              description
                "Enable/Disable monitoring";
            }
    
            container route-monitoring {
              description
                "Control route monitoring settings";
              uses apply-advanced;
    
              leaf none {
                junos:must "((!(".. pre-policy") && (!(".. post-policy") && (!(".. rib-out") && !(".. loc-rib")))))";
                junos:must-message "May not be configured with pre-policy or post-policy or rib-out or loc-rib";
                type empty;
                description
                  "Do not send route monitoring messages";
              }
    
              leaf loc-rib {
                junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                junos:must-message "Update threading can't be configured alone with bmp loc-rib monitoring";
                type empty;
                description
                  "Send local-rib route monitoring messages";
              }
    
              container pre-policy {
                presence "enable pre-policy";
                description
                  "Send pre policy route monitoring messages";
                leaf exclude-non-feasible {
                  type empty;
                  description
                    "Exclude looped routes, etc";
                }
              }  // container pre-policy
    
              container post-policy {
                presence "enable post-policy";
                description
                  "Send post policy route monitoring messages";
                leaf exclude-non-eligible {
                  type empty;
                  description
                    "Exclude unresolved routes, etc.";
                }
              }  // container post-policy
    
              container rib-out {
                junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                junos:must-message "Update threading can't be configured alone with bmp rib-out monitoring";
                presence "enable rib-out";
                description
                  "Send adj-ribs-out route monitoring messages";
                leaf pre-policy {
                  type empty;
                  description
                    "Send pre-policy adj-ribs-out route monitoring messages";
                }
    
                leaf post-policy {
                  type empty;
                  description
                    "Send post-policy adj-ribs-out route monitoring messages";
                }
              }  // container rib-out
            }  // container route-monitoring
    
            leaf max-loc-rib-buffer-count {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 50";
                }
              }
              description
                "Max number of loc-rib outstanding buffers before blocking";
            }
    
            leaf station-address {
              type jt:ipaddr;
              description
                "Address/name of monitoring station";
            }
    
            leaf routing-instance {
              type string;
              description
                "Routing-instance through which BMP station is reachable";
            }
    
            leaf station-port {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Port of monitoring station";
            }
    
            leaf statistics-timeout {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 65535";
                }
              }
              units "seconds";
              description
                "Statistics message timer, 15-65535, or 0 for no messages";
            }
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description
                  "Trace flag information";
                leaf name {
                  type enumeration {
                    enum "packets" {
                      value 0;
                      description
                        "Trace all messages";
                    }
                    enum "up" {
                      value 1;
                      description
                        "Trace up messages";
                    }
                    enum "down" {
                      value 2;
                      description
                        "Trace down messages";
                    }
                    enum "statistics" {
                      value 3;
                      description
                        "Trace statistics messages";
                    }
                    enum "route-monitoring" {
                      value 4;
                      description
                        "Trace route monitoring messages";
                    }
                    enum "event" {
                      value 5;
                      description
                        "Trace major events, station establishment, errors, events";
                    }
                    enum "error" {
                      value 6;
                      description
                        "Trace error conditions";
                    }
                    enum "write" {
                      value 7;
                      description
                        "Trace writing of messages";
                    }
                    enum "route" {
                      value 8;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 9;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 10;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 11;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 12;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 13;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 14;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 15;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            list station {
              key "name";
              description "Define a BMP station";
              leaf name {
                type string;
                description "Station name";
              }
    
              uses apply-advanced;
    
              leaf authentication-key {
                type string {
                  length "1 .. 126";
                }
                description
                  "MD5 authentication key";
              }
    
              leaf authentication-algorithm {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "md5" {
                    value 0;
                    description
                      "Message Digest 5";
                  }
                  enum "hmac-sha-1-96" {
                    value 1;
                    description
                      "Hash-based Message Authentication Code (SHA1) (96 bits)";
                  }
                  enum "aes-128-cmac-96" {
                    value 2;
                    description
                      "Cipher-based Message Authentication Code (AES128) (96 bits)";
                  }
                  enum "ao" {
                    value 3;
                    description
                      "TCP Authentication Option";
                  }
                }
                description
                  "Authentication algorithm name";
              }
    
              leaf tcpao-handling-with-digest-mismatch {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "drop-if-no-tcpao" {
                    value 0;
                    description
                      "Drop the connection if Digest mismatched";
                  }
                  enum "allow-without-tcpao" {
                    value 1;
                    description
                      "Allow the connection establishment without TCP-AO";
                  }
                }
                description
                  "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
              }
    
              leaf authentication-key-chain {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string {
                  length "1 .. 128";
                }
                description "Key chain name";
              }
    
              container hold-down {
                presence "enable hold-down";
                leaf hold-down-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "30 .. 65535";
                    }
                  }
                  units "seconds";
                  description
                    "Prevent re-establishment for this time";
                }
    
                leaf flaps {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 10";
                    }
                  }
                  description
                    "Number of flaps before damping";
                }
    
                leaf period {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "30 .. 65535";
                    }
                  }
                  units "seconds";
                  description
                    "Time period for flaps";
                }
              }  // container hold-down
    
              leaf initiation-message {
                type string {
                  length "1 .. 255";
                }
                description
                  "User string sent with the initiation message";
              }
    
              leaf local-address {
                type jt:ipaddr;
                description
                  "Address of local end of BMP session";
              }
    
              leaf local-port {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1024 .. 65535";
                  }
                }
                description
                  "Local port for listening";
              }
    
              leaf connection-mode {
                type enumeration {
                  enum "active" {
                    value 0;
                    description
                      "Initiate the connection";
                  }
                  enum "passive" {
                    value 1;
                    description
                      "Listen for the connection";
                  }
                }
                description
                  "Specify active or passive";
              }
    
              leaf priority {
                type enumeration {
                  enum "low" {
                    value 0;
                    description
                      "Lowest priority";
                  }
                  enum "medium" {
                    value 1;
                    description
                      "Medium priority";
                  }
                  enum "high" {
                    value 2;
                    description
                      "Highest priority";
                  }
                }
                description
                  "Relative dispatch priority";
              }
    
              leaf monitor {
                type enumeration {
                  enum "enable" {
                    value 0;
                    description
                      "Enable monitoring of BGP peer(s)";
                  }
                  enum "disable" {
                    value 1;
                    description
                      "Disable monitoring of BGP peer(s)";
                  }
                }
                description
                  "Enable/Disable monitoring";
              }
    
              container route-monitoring {
                description
                  "Control route monitoring settings";
                uses apply-advanced;
    
                leaf none {
                  junos:must "((!(".. pre-policy") && (!(".. post-policy") && (!(".. rib-out") && !(".. loc-rib")))))";
                  junos:must-message "May not be configured with pre-policy or post-policy or rib-out or loc-rib";
                  type empty;
                  description
                    "Do not send route monitoring messages";
                }
    
                leaf loc-rib {
                  junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                  junos:must-message "Update threading can't be configured alone with bmp loc-rib monitoring";
                  type empty;
                  description
                    "Send local-rib route monitoring messages";
                }
    
                container pre-policy {
                  presence "enable pre-policy";
                  description
                    "Send pre policy route monitoring messages";
                  leaf exclude-non-feasible {
                    type empty;
                    description
                      "Exclude looped routes, etc";
                  }
                }  // container pre-policy
    
                container post-policy {
                  presence "enable post-policy";
                  description
                    "Send post policy route monitoring messages";
                  leaf exclude-non-eligible {
                    type empty;
                    description
                      "Exclude unresolved routes, etc.";
                  }
                }  // container post-policy
    
                container rib-out {
                  junos:must "((!("system processes routing bgp update-threading") || "system processes routing bgp rib-sharding"))";
                  junos:must-message "Update threading can't be configured alone with bmp rib-out monitoring";
                  presence "enable rib-out";
                  description
                    "Send adj-ribs-out route monitoring messages";
                  leaf pre-policy {
                    type empty;
                    description
                      "Send pre-policy adj-ribs-out route monitoring messages";
                  }
    
                  leaf post-policy {
                    type empty;
                    description
                      "Send post-policy adj-ribs-out route monitoring messages";
                  }
                }  // container rib-out
              }  // container route-monitoring
    
              leaf max-loc-rib-buffer-count {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 50";
                  }
                }
                description
                  "Max number of loc-rib outstanding buffers before blocking";
              }
    
              leaf station-address {
                type jt:ipaddr;
                description
                  "Address/name of monitoring station";
              }
    
              leaf routing-instance {
                type string;
                description
                  "Routing-instance through which BMP station is reachable";
              }
    
              leaf station-port {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description
                  "Port of monitoring station";
              }
    
              leaf statistics-timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Statistics message timer, 15-65535, or 0 for no messages";
              }
    
              container traceoptions {
                description "Trace options";
                uses apply-advanced;
    
                container file {
                  description
                    "Trace file options";
                  leaf filename {
                    type string {
                      junos:posix-pattern "![/ %]";
                      junos:pattern-message "Must not contain '/', % or a space";
                      length "1 .. 1024";
                    }
                    description
                      "Name of file in which to write trace information";
                  }
    
                  leaf replace {
                    type empty;
                    status deprecated;
                    description
                      "Replace trace file rather than appending to it";
                  }
    
                  leaf size {
                    type string;
                    description
                      "Maximum trace file size";
                  }
    
                  leaf files {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "2 .. 1000";
                      }
                    }
                    default "10";
                    description
                      "Maximum number of trace files";
                  }
    
                  leaf no-stamp {
                    type empty;
                    status deprecated;
                    description
                      "Do not timestamp trace file";
                  }
    
                  choice world-readable-choice {
                    leaf world-readable {
                      type empty;
                      description
                        "Allow any user to read the log file";
                    }
                    leaf no-world-readable {
                      type empty;
                      description
                        "Don't allow any user to read the log file";
                    }
                  }  // choice world-readable-choice
                }  // container file
    
                list flag {
                  key "name";
                  ordered-by user;
                  description
                    "Trace flag information";
                  leaf name {
                    type enumeration {
                      enum "packets" {
                        value 0;
                        description
                          "Trace all messages";
                      }
                      enum "up" {
                        value 1;
                        description
                          "Trace up messages";
                      }
                      enum "down" {
                        value 2;
                        description
                          "Trace down messages";
                      }
                      enum "statistics" {
                        value 3;
                        description
                          "Trace statistics messages";
                      }
                      enum "route-monitoring" {
                        value 4;
                        description
                          "Trace route monitoring messages";
                      }
                      enum "event" {
                        value 5;
                        description
                          "Trace major events, station establishment, errors, events";
                      }
                      enum "error" {
                        value 6;
                        description
                          "Trace error conditions";
                      }
                      enum "write" {
                        value 7;
                        description
                          "Trace writing of messages";
                      }
                      enum "route" {
                        value 8;
                        description
                          "Trace routing information";
                      }
                      enum "normal" {
                        value 9;
                        description
                          "Trace normal events";
                      }
                      enum "general" {
                        value 10;
                        description
                          "Trace general events";
                      }
                      enum "state" {
                        value 11;
                        description
                          "Trace state transitions";
                      }
                      enum "policy" {
                        value 12;
                        description
                          "Trace policy processing";
                      }
                      enum "task" {
                        value 13;
                        description
                          "Trace routing protocol task processing";
                      }
                      enum "timer" {
                        value 14;
                        description
                          "Trace routing protocol timer processing";
                      }
                      enum "all" {
                        value 15;
                        description
                          "Trace everything";
                      }
                    }
                  }
    
                  leaf send {
                    type empty;
                    description
                      "Trace transmitted packets";
                  }
    
                  leaf receive {
                    type empty;
                    description
                      "Trace received packets";
                  }
    
                  leaf detail {
                    type empty;
                    description
                      "Trace detailed information";
                  }
    
                  leaf disable {
                    type empty;
                    description
                      "Disable this trace flag";
                  }
                }  // list flag
              }  // container traceoptions
            }  // list station
          }  // container bmp
    
          leaf bgp-orf-cisco-mode {
            type empty;
            description
              "Using BGP ORF capability code 130 and Prefix ORF type 128";
          }
    
          leaf highwatermark-log-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "5 .. 1200";
              }
            }
            units "seconds";
            description
              "High watermark log interval (default 30 seconds)";
          }
    
          leaf time-averaged-watermark-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 15";
              }
            }
            units "days";
            description
              "For calculating average watermark";
          }
    
          container ppm {
            presence "enable ppm";
            description
              "Set periodic packet management properties";
            uses apply-advanced;
    
            leaf delegate-processing {
              type empty;
              status deprecated;
              description
                "Enable distribution of PPM sessions";
            }
    
            leaf no-delegate-processing {
              type empty;
              description
                "Disable PPM sessions distribution";
            }
    
            leaf redistribution-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 120";
                }
              }
              description
                "Time to wait after switchover before starting timers";
            }
          }  // container ppm
    
          leaf no-bfd-triggered-local-repair {
            type empty;
            description
              "Disable bfd triggered local repair";
          }
    
          leaf enable-sensors {
            type empty;
            description
              "Enable Sensor for MX/PTX/QFX/EX/ACX";
          }
    
          leaf maximum-ecmp {
            type enumeration {
              enum "16" {
                value 0;
                description
                  "Maximum 16 ECMP routes";
              }
              enum "32" {
                value 1;
                description
                  "Maximum 32 ECMP routes";
              }
              enum "64" {
                value 2;
                description
                  "Maximum 64 ECMP routes";
              }
              enum "96" {
                value 3;
                description
                  "Maximum 96 ECMP routes";
              }
              enum "128" {
                value 4;
                description
                  "Maximum 128 ECMP routes";
              }
              enum "160" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 5;
                description
                  "Maximum 160 ECMP routes";
              }
              enum "192" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 6;
                description
                  "Maximum 192 ECMP routes";
              }
              enum "224" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 7;
                description
                  "Maximum 224 ECMP routes";
              }
              enum "256" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 8;
                description
                  "Maximum 256 ECMP routes";
              }
              enum "288" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 9;
                description
                  "Maximum 288 ECMP routes";
              }
              enum "320" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 10;
                description
                  "Maximum 320 ECMP routes";
              }
              enum "352" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 11;
                description
                  "Maximum 352 ECMP routes";
              }
              enum "384" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 12;
                description
                  "Maximum 384 ECMP routes";
              }
              enum "416" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 13;
                description
                  "Maximum 416 ECMP routes";
              }
              enum "448" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 14;
                description
                  "Maximum 448 ECMP routes";
              }
              enum "480" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 15;
                description
                  "Maximum 480 ECMP routes";
              }
              enum "512" {
                junos:must "(!("system processes routing force-32-bit"))";
                junos:must-message "32-bit rpd doesn't support ecmp greater than 128";
                value 16;
                description
                  "Maximum 512 ECMP routes";
              }
            }
            description
              "Maximum ECMP limit for nexthops";
          }
    
          container static {
            description "Static routes";
            uses apply-advanced;
    
            leaf rib-group {
              type string;
              description "Routing table group";
            }
    
            container defaults {
              description "Global route options";
              uses apply-advanced;
    
              choice retain-choice {
                leaf retain {
                  junos:must "(!(".. resolve"))";
                  junos:must-message "Must not specify resolve with retain";
                  type empty;
                  description
                    "Always keep route in forwarding table";
                }
                leaf no-retain {
                  junos:must "(!(".. resolve"))";
                  junos:must-message "Must not specify resolve with retain";
                  type empty;
                  description
                    "Don't always keep route in forwarding table";
                }
              }  // choice retain-choice
    
              choice install-choice {
                leaf install {
                  type empty;
                  description
                    "Install route into forwarding table";
                }
                leaf no-install {
                  type empty;
                  description
                    "Don't install route into forwarding table";
                }
              }  // choice install-choice
    
              choice readvertise-choice {
                leaf readvertise {
                  type empty;
                  description
                    "Mark route as eligible to be readvertised";
                }
                leaf no-readvertise {
                  type empty;
                  description
                    "Don't mark route as eligible to be readvertised";
                }
              }  // choice readvertise-choice
    
              choice resolve-choice {
                leaf resolve {
                  type empty;
                  description
                    "Allow resolution of indirectly connected next hops";
                }
                leaf no-resolve {
                  type empty;
                  description
                    "Don't allow resolution of indirectly connected next hops";
                }
              }  // choice resolve-choice
    
              choice longest-match-choice {
                leaf longest-match {
                  junos:must "(".. resolve")";
                  junos:must-message "Requires resolve to be configured";
                  type empty;
                  description
                    "Always use longest prefix match to resolve next hops";
                }
                leaf no-longest-match {
                  junos:must "(".. resolve")";
                  junos:must-message "Requires resolve to be configured";
                  type empty;
                  description
                    "Don't always use longest prefix match to resolve next hops";
                }
              }  // choice longest-match-choice
    
              choice passive_flag {
                leaf active {
                  type empty;
                  description
                    "Remove inactive route from forwarding table";
                }
                leaf passive {
                  type empty;
                  description
                    "Retain inactive route in forwarding table";
                }
              }  // choice passive_flag
    
              container metric {
                presence "enable metric";
                description "Metric value";
                uses rib_static_metric_type;
              }  // container metric
    
              container metric2 {
                presence "enable metric2";
                description "Metric value 2";
                uses rib_static_metric_type;
              }  // container metric2
    
              container metric3 {
                presence "enable metric3";
                description "Metric value 3";
                uses rib_static_metric_type;
              }  // container metric3
    
              container metric4 {
                presence "enable metric4";
                description "Metric value 4";
                uses rib_static_metric_type;
              }  // container metric4
    
              container tag {
                presence "enable tag";
                description "Tag string";
                uses rib_static_metric_type;
              }  // container tag
    
              container tag2 {
                presence "enable tag2";
                description "Tag string 2";
                uses rib_static_metric_type;
              }  // container tag2
    
              container preference {
                presence "enable preference";
                description "Preference value";
                uses rib_static_metric_type;
              }  // container preference
    
              container preference2 {
                presence "enable preference2";
                description "Preference value 2";
                uses rib_static_metric_type;
              }  // container preference2
    
              container color {
                presence "enable color";
                description
                  "Color (preference) value";
                uses rib_static_metric_type;
              }  // container color
    
              container color2 {
                presence "enable color2";
                description
                  "Color (preference) value 2";
                uses rib_static_metric_type;
              }  // container color2
    
              leaf-list community {
                type jt:community;
                ordered-by user;
                description
                  "BGP community identifier";
              }
    
              container as-path {
                description
                  "Autonomous system path";
                uses apply-advanced;
    
                leaf path {
                  type string;
                  description
                    "Autonomous system path";
                }
    
                leaf origin {
                  type enumeration {
                    enum "igp" {
                      value 0;
                      description
                        "Path originated in the local IGP";
                    }
                    enum "egp" {
                      value 1;
                      description
                        "Path originated in another AS";
                    }
                    enum "incomplete" {
                      value 2;
                      description
                        "Path was learned by some other means";
                    }
                  }
                }
    
                leaf atomic-aggregate {
                  type empty;
                  description
                    "Add ATOMIC_AGGREGATE path attribute to route";
                }
    
                container aggregator {
                  presence "enable aggregator";
                  description
                    "Add AGGREGATOR path attribute to route";
                }  // container aggregator
    
                leaf as-number {
                  type string {
                    junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                    junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                  }
                  description
                    " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                }
    
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Address of BGP system that formed the route";
                }
              }  // container as-path
            }  // container defaults
    
            list route {
              key "name";
              ordered-by user;
              description "Static route";
              leaf name {
                type jt:ipprefix;
              }
    
              uses apply-advanced;
    
              choice next_hop {
                leaf-list next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description
                    "Next hop to destination";
                }
                leaf reject {
                  type empty;
                  description
                    "Drop packets to destination; send ICMP unreachables";
                }
                leaf discard {
                  type empty;
                  description
                    "Drop packets to destination; send no ICMP unreachables";
                }
                leaf receive {
                  type empty;
                  description
                    "Install a receive route for the destination";
                }
                leaf next-table {
                  type string {
                    junos:posix-pattern "^(((.{0,128})[:](.{1,128})[.]|((.{1,128})[.]))?([a-z]|[0-9]|[-_])+[.]((1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5])))$";
                    junos:pattern-message "Must match the format [<instance-name>[:<topology-name>].]<family-name>.<rib-id>";
                  }
                  description
                    "Next hop to another table";
                }
              }  // choice next_hop
    
              list qualified-next-hop {
                key "name";
                ordered-by user;
                description
                  "Next hop with qualifiers";
                uses qualified_nh_obj;
              }  // list qualified-next-hop
    
              leaf backup-pe-group {
                junos:must "(".. p2mp-lsp-next-hop")";
                junos:must-message "Backup groups only allowed for static routes with p2mp lsp next-hop";
                type string;
                description
                  "Multicast source redundancy group";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
    
                leaf neighbor {
                  type jt:ipaddr;
                  description
                    "BFD neighbor address";
                }
    
                leaf local-address {
                  type jt:ipaddr;
                  description
                    "BFD local address (for multihop only)";
                }
    
                leaf holddown-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold the session-UP notification to the client";
                }
    
                leaf minimum-receive-ttl {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Minimum receive TTL below which to drop";
                }
              }  // container bfd-liveness-detection
    
              choice retain-choice {
                leaf retain {
                  junos:must "(!(".. resolve"))";
                  junos:must-message "Must not specify resolve with retain";
                  type empty;
                  description
                    "Always keep route in forwarding table";
                }
                leaf no-retain {
                  junos:must "(!(".. resolve"))";
                  junos:must-message "Must not specify resolve with retain";
                  type empty;
                  description
                    "Don't always keep route in forwarding table";
                }
              }  // choice retain-choice
    
              choice install-choice {
                leaf install {
                  type empty;
                  description
                    "Install route into forwarding table";
                }
                leaf no-install {
                  type empty;
                  description
                    "Don't install route into forwarding table";
                }
              }  // choice install-choice
    
              choice readvertise-choice {
                leaf readvertise {
                  type empty;
                  description
                    "Mark route as eligible to be readvertised";
                }
                leaf no-readvertise {
                  type empty;
                  description
                    "Don't mark route as eligible to be readvertised";
                }
              }  // choice readvertise-choice
    
              choice resolve-choice {
                leaf resolve {
                  type empty;
                  description
                    "Allow resolution of indirectly connected next hops";
                }
                leaf no-resolve {
                  type empty;
                  description
                    "Don't allow resolution of indirectly connected next hops";
                }
              }  // choice resolve-choice
    
              choice longest-match-choice {
                leaf longest-match {
                  junos:must "(".. resolve")";
                  junos:must-message "Requires resolve to be configured";
                  type empty;
                  description
                    "Always use longest prefix match to resolve next hops";
                }
                leaf no-longest-match {
                  junos:must "(".. resolve")";
                  junos:must-message "Requires resolve to be configured";
                  type empty;
                  description
                    "Don't always use longest prefix match to resolve next hops";
                }
              }  // choice longest-match-choice
    
              choice passive_flag {
                leaf active {
                  type empty;
                  description
                    "Remove inactive route from forwarding table";
                }
                leaf passive {
                  type empty;
                  description
                    "Retain inactive route in forwarding table";
                }
              }  // choice passive_flag
    
              container metric {
                presence "enable metric";
                description "Metric value";
                uses rib_static_metric_type;
              }  // container metric
    
              container metric2 {
                presence "enable metric2";
                description "Metric value 2";
                uses rib_static_metric_type;
              }  // container metric2
    
              container metric3 {
                presence "enable metric3";
                description "Metric value 3";
                uses rib_static_metric_type;
              }  // container metric3
    
              container metric4 {
                presence "enable metric4";
                description "Metric value 4";
                uses rib_static_metric_type;
              }  // container metric4
    
              container tag {
                presence "enable tag";
                description "Tag string";
                uses rib_static_metric_type;
              }  // container tag
    
              container tag2 {
                presence "enable tag2";
                description "Tag string 2";
                uses rib_static_metric_type;
              }  // container tag2
    
              container preference {
                presence "enable preference";
                description "Preference value";
                uses rib_static_metric_type;
              }  // container preference
    
              container preference2 {
                presence "enable preference2";
                description "Preference value 2";
                uses rib_static_metric_type;
              }  // container preference2
    
              container color {
                presence "enable color";
                description
                  "Color (preference) value";
                uses rib_static_metric_type;
              }  // container color
    
              container color2 {
                presence "enable color2";
                description
                  "Color (preference) value 2";
                uses rib_static_metric_type;
              }  // container color2
    
              leaf-list community {
                type jt:community;
                ordered-by user;
                description
                  "BGP community identifier";
              }
    
              container as-path {
                description
                  "Autonomous system path";
                uses apply-advanced;
    
                leaf path {
                  type string;
                  description
                    "Autonomous system path";
                }
    
                leaf origin {
                  type enumeration {
                    enum "igp" {
                      value 0;
                      description
                        "Path originated in the local IGP";
                    }
                    enum "egp" {
                      value 1;
                      description
                        "Path originated in another AS";
                    }
                    enum "incomplete" {
                      value 2;
                      description
                        "Path was learned by some other means";
                    }
                  }
                }
    
                leaf atomic-aggregate {
                  type empty;
                  description
                    "Add ATOMIC_AGGREGATE path attribute to route";
                }
    
                container aggregator {
                  presence "enable aggregator";
                  description
                    "Add AGGREGATOR path attribute to route";
                }  // container aggregator
    
                leaf as-number {
                  type string {
                    junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                    junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                  }
                  description
                    " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                }
    
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Address of BGP system that formed the route";
                }
              }  // container as-path
    
              list lsp-next-hop {
                key "name";
                ordered-by user;
                description "LSP next hop";
                uses lsp_nh_obj;
              }  // list lsp-next-hop
    
              list p2mp-lsp-next-hop {
                key "name";
                max-elements 1;
                ordered-by user;
                description
                  "Point-to-multipoint LSP next hop";
                uses lsp_nh_obj;
              }  // list p2mp-lsp-next-hop
    
              container spring-te-lsp-next-hop {
                junos:must "("protocols source-packet-routing tunnel-tracking")";
                junos:must-message "Please enable the tunnel-tracking  under 'protocols source-packet-routing' hierarchy";
                description
                  "SPRING-TE LSP next hop";
                uses springte_lsp_nh_obj;
              }  // container spring-te-lsp-next-hop
    
              container p2mp-ldp-next-hop {
                description
                  "Point-to-multipoint LDP LSP next hop";
                uses p2mp_ldp_lsp_nh_obj;
              }  // container p2mp-ldp-next-hop
    
              list static-lsp-next-hop {
                key "name";
                ordered-by user;
                description
                  "Static LSP next hop";
                uses lsp_nh_obj;
              }  // list static-lsp-next-hop
            }  // list route
    
            container static-route {
              description "Static route Status";
              leaf bfd-admin-down {
                type enumeration {
                  enum "active" {
                    value 0;
                    description
                      "Static route will be inactive on bfd-admin-down";
                  }
                  enum "passive" {
                    value 1;
                    description
                      "Static route will remain active on bfd-admin-down";
                  }
                }
                description
                  "Static route State on BFD ADMIN DOWN";
              }
            }  // container static-route
    
            list iso-route {
              key "name";
              ordered-by user;
              description
                "ISO family static route";
              leaf name {
                type jt:isoprefix;
              }
    
              uses apply-advanced;
    
              choice next_hop {
                leaf-list next-hop {
                  type union {
                    type jt:ipaddr-or-interface;
                    type string {
                      pattern "<.*>|$.*";
                    }
                  }
                  ordered-by user;
                  description
                    "Next hop to destination";
                }
                leaf reject {
                  type empty;
                  description
                    "Drop packets to destination; send ICMP unreachables";
                }
                leaf discard {
                  type empty;
                  description
                    "Drop packets to destination; send no ICMP unreachables";
                }
                leaf receive {
                  type empty;
                  description
                    "Install a receive route for the destination";
                }
                leaf next-table {
                  type string {
                    junos:posix-pattern "^(((.{0,128})[:](.{1,128})[.]|((.{1,128})[.]))?([a-z]|[0-9]|[-_])+[.]((1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5])))$";
                    junos:pattern-message "Must match the format [<instance-name>[:<topology-name>].]<family-name>.<rib-id>";
                  }
                  description
                    "Next hop to another table";
                }
              }  // choice next_hop
    
              list qualified-next-hop {
                key "name";
                ordered-by user;
                description
                  "Next hop with qualifiers";
                uses qualified_nh_obj;
              }  // list qualified-next-hop
    
              leaf backup-pe-group {
                junos:must "(".. p2mp-lsp-next-hop")";
                junos:must-message "Backup groups only allowed for static routes with p2mp lsp next-hop";
                type string;
                description
                  "Multicast source redundancy group";
              }
    
              container bfd-liveness-detection {
                description
                  "Bidirectional Forwarding Detection (BFD) options";
                uses apply-advanced;
    
                leaf version {
                  type enumeration {
                    enum "0" {
                      value 0;
                      description
                        "BFD version 0 (deprecated)";
                    }
                    enum "1" {
                      value 1;
                      description
                        "BFD version 1";
                    }
                    enum "automatic" {
                      value 2;
                      description
                        "Choose BFD version automatically";
                    }
                  }
                  default "automatic";
                  description
                    "BFD protocol version number";
                }
    
                leaf minimum-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum transmit and receive interval";
                }
    
                leaf minimum-transmit-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  status deprecated;
                  description
                    "Minimum transmit interval";
                }
    
                leaf minimum-receive-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum receive interval";
                }
    
                leaf multiplier {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  default "3";
                  description
                    "Detection time multiplier";
                }
    
                choice adaptation-choice {
                  leaf no-adaptation {
                    type empty;
                    description
                      "Disable adaptation";
                  }
                }  // choice adaptation-choice
    
                container transmit-interval {
                  description
                    "Transmit-interval options";
                  uses apply-advanced;
    
                  leaf minimum-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 255000";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High transmit interval triggering a trap";
                  }
                }  // container transmit-interval
    
                container detection-time {
                  description
                    "Detection-time options";
                  uses apply-advanced;
    
                  leaf threshold {
                    type union {
                      type uint32;
                      type string {
                        pattern "<.*>|$.*";
                      }
                    }
                    units "milliseconds";
                    description
                      "High detection-time triggering a trap";
                  }
                }  // container detection-time
    
                container authentication {
                  description
                    "Authentication options";
                  uses apply-advanced;
    
                  leaf key-chain {
                    junos:must "(".. algorithm")";
                    junos:must-message "May not be configured without algorithm";
                    junos:must "("security authentication-key-chains key-chain $$")";
                    junos:must-message "Referenced key-chain must be defined";
                    type string;
                    description "Key chain name";
                  }
    
                  leaf algorithm {
                    junos:must "(".. key-chain")";
                    junos:must-message "May not be configured without key-chain";
                    type enumeration {
                      enum "simple-password" {
                        value 0;
                        description
                          "Simple password";
                      }
                      enum "keyed-md5" {
                        value 1;
                        description
                          "Keyed message Digest 5";
                      }
                      enum
                        "meticulous-keyed-md5" {
                        value 2;
                        description
                          "Meticulous keyed message Digest 5";
                      }
                      enum "keyed-sha-1" {
                        value 3;
                        description
                          "Keyed secure hash algorithm (SHA1) ";
                      }
                      enum
                        "meticulous-keyed-sha-1" {
                        value 4;
                        description
                          "Meticulous keyed secure hash algorithm (SHA1) ";
                      }
                    }
                    description "Algorithm name";
                  }
    
                  leaf loose-check {
                    type empty;
                    description
                      "Verify authentication only if authentication is negotiated";
                  }
                }  // container authentication
    
                leaf neighbor {
                  type jt:ipaddr;
                  description
                    "BFD neighbor address";
                }
    
                leaf local-address {
                  type jt:ipaddr;
                  description
                    "BFD local address (for multihop only)";
                }
    
                leaf holddown-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 255000";
                    }
                  }
                  units "milliseconds";
                  description
                    "Time to hold the session-UP notification to the client";
                }
    
                leaf minimum-receive-ttl {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint8 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Minimum receive TTL below which to drop";
                }
              }  // container bfd-liveness-detection
    
              choice retain-choice {
                leaf retain {
                  junos:must "(!(".. resolve"))";
                  junos:must-message "Must not specify resolve with retain";
                  type empty;
                  description
                    "Always keep route in forwarding table";
                }
                leaf no-retain {
                  junos:must "(!(".. resolve"))";
                  junos:must-message "Must not specify resolve with retain";
                  type empty;
                  description
                    "Don't always keep route in forwarding table";
                }
              }  // choice retain-choice
    
              choice install-choice {
                leaf install {
                  type empty;
                  description
                    "Install route into forwarding table";
                }
                leaf no-install {
                  type empty;
                  description
                    "Don't install route into forwarding table";
                }
              }  // choice install-choice
    
              choice readvertise-choice {
                leaf readvertise {
                  type empty;
                  description
                    "Mark route as eligible to be readvertised";
                }
                leaf no-readvertise {
                  type empty;
                  description
                    "Don't mark route as eligible to be readvertised";
                }
              }  // choice readvertise-choice
    
              choice resolve-choice {
                leaf resolve {
                  type empty;
                  description
                    "Allow resolution of indirectly connected next hops";
                }
                leaf no-resolve {
                  type empty;
                  description
                    "Don't allow resolution of indirectly connected next hops";
                }
              }  // choice resolve-choice
    
              choice longest-match-choice {
                leaf longest-match {
                  junos:must "(".. resolve")";
                  junos:must-message "Requires resolve to be configured";
                  type empty;
                  description
                    "Always use longest prefix match to resolve next hops";
                }
                leaf no-longest-match {
                  junos:must "(".. resolve")";
                  junos:must-message "Requires resolve to be configured";
                  type empty;
                  description
                    "Don't always use longest prefix match to resolve next hops";
                }
              }  // choice longest-match-choice
    
              choice passive_flag {
                leaf active {
                  type empty;
                  description
                    "Remove inactive route from forwarding table";
                }
                leaf passive {
                  type empty;
                  description
                    "Retain inactive route in forwarding table";
                }
              }  // choice passive_flag
    
              container metric {
                presence "enable metric";
                description "Metric value";
                uses rib_static_metric_type;
              }  // container metric
    
              container metric2 {
                presence "enable metric2";
                description "Metric value 2";
                uses rib_static_metric_type;
              }  // container metric2
    
              container metric3 {
                presence "enable metric3";
                description "Metric value 3";
                uses rib_static_metric_type;
              }  // container metric3
    
              container metric4 {
                presence "enable metric4";
                description "Metric value 4";
                uses rib_static_metric_type;
              }  // container metric4
    
              container tag {
                presence "enable tag";
                description "Tag string";
                uses rib_static_metric_type;
              }  // container tag
    
              container tag2 {
                presence "enable tag2";
                description "Tag string 2";
                uses rib_static_metric_type;
              }  // container tag2
    
              container preference {
                presence "enable preference";
                description "Preference value";
                uses rib_static_metric_type;
              }  // container preference
    
              container preference2 {
                presence "enable preference2";
                description "Preference value 2";
                uses rib_static_metric_type;
              }  // container preference2
    
              container color {
                presence "enable color";
                description
                  "Color (preference) value";
                uses rib_static_metric_type;
              }  // container color
    
              container color2 {
                presence "enable color2";
                description
                  "Color (preference) value 2";
                uses rib_static_metric_type;
              }  // container color2
    
              leaf-list community {
                type jt:community;
                ordered-by user;
                description
                  "BGP community identifier";
              }
    
              container as-path {
                description
                  "Autonomous system path";
                uses apply-advanced;
    
                leaf path {
                  type string;
                  description
                    "Autonomous system path";
                }
    
                leaf origin {
                  type enumeration {
                    enum "igp" {
                      value 0;
                      description
                        "Path originated in the local IGP";
                    }
                    enum "egp" {
                      value 1;
                      description
                        "Path originated in another AS";
                    }
                    enum "incomplete" {
                      value 2;
                      description
                        "Path was learned by some other means";
                    }
                  }
                }
    
                leaf atomic-aggregate {
                  type empty;
                  description
                    "Add ATOMIC_AGGREGATE path attribute to route";
                }
    
                container aggregator {
                  presence "enable aggregator";
                  description
                    "Add AGGREGATOR path attribute to route";
                }  // container aggregator
    
                leaf as-number {
                  type string {
                    junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                    junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                  }
                  description
                    " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                }
    
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Address of BGP system that formed the route";
                }
              }  // container as-path
    
              list lsp-next-hop {
                key "name";
                ordered-by user;
                description "LSP next hop";
                uses lsp_nh_obj;
              }  // list lsp-next-hop
    
              list p2mp-lsp-next-hop {
                key "name";
                max-elements 1;
                ordered-by user;
                description
                  "Point-to-multipoint LSP next hop";
                uses lsp_nh_obj;
              }  // list p2mp-lsp-next-hop
    
              container spring-te-lsp-next-hop {
                junos:must "("protocols source-packet-routing tunnel-tracking")";
                junos:must-message "Please enable the tunnel-tracking  under 'protocols source-packet-routing' hierarchy";
                description
                  "SPRING-TE LSP next hop";
                uses springte_lsp_nh_obj;
              }  // container spring-te-lsp-next-hop
    
              container p2mp-ldp-next-hop {
                description
                  "Point-to-multipoint LDP LSP next hop";
                uses p2mp_ldp_lsp_nh_obj;
              }  // container p2mp-ldp-next-hop
            }  // list iso-route
    
            list route-target-filter {
              key "name";
              ordered-by user;
              description
                "Route-target-filter route";
              leaf name {
                type string {
                  junos:posix-pattern "^[0-9.]{1,15}L?:[0-9]{1,10}/([0-9]|[2-5][0-9]|6[0-4])$";
                  junos:pattern-message "Use format 'x:y/len' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. 123456L:100 and len is a prefix length from 0 to 64";
                  length "1 .. 47";
                }
              }
    
              uses apply-advanced;
    
              leaf-list neighbor {
                type jt:ipaddr-scoped;
                ordered-by user;
                description
                  "BGP peers for filter";
              }
    
              leaf-list group {
                type string;
                ordered-by user;
                description
                  "BGP groups for filter";
              }
    
              leaf local {
                type empty;
                description
                  "Locally originated filter";
              }
            }  // list route-target-filter
          }  // container static
    
          list martians {
            key "address choice-ident choice-value";
            ordered-by user;
            description "Invalid routes";
            uses martian_type;
          }  // list martians
    
          container aggregate {
            description "Coalesced routes";
            uses rib_aggregate_type;
          }  // container aggregate
    
          container generate {
            description "Route of last resort";
            uses rib_aggregate_type;
          }  // container generate
    
          choice maximum-paths-type {
            container maximum-routes {
              status deprecated;
              description
                "Maximum number of routes";
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Maximum number of routes";
              }
    
              choice log_type {
                leaf threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of limit at which to start generating warnings";
                }
                leaf log-only {
                  type empty;
                  description
                    "Generate warning messages only";
                }
              }  // choice log_type
    
              leaf log-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "5 .. 86400";
                  }
                }
                units "seconds";
                description
                  "Minimum interval between log messages";
              }
            }  // container maximum-routes
            container maximum-paths {
              description
                "Maximum number of paths";
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "Maximum number of paths";
              }
    
              choice log_type {
                leaf threshold {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage of limit at which to start generating warnings";
                }
                leaf log-only {
                  type empty;
                  description
                    "Generate warning messages only";
                }
              }  // choice log_type
    
              leaf log-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "5 .. 86400";
                  }
                }
                units "seconds";
                description
                  "Minimum interval between log messages";
              }
            }  // container maximum-paths
          }  // choice maximum-paths-type
    
          container maximum-prefixes {
            description
              "Maximum number of prefixes";
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 4294967295";
                }
              }
              description
                "Maximum number of prefixes";
            }
    
            choice log_type {
              leaf threshold {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 100";
                  }
                }
                description
                  "Percentage of limit at which to start generating warnings";
              }
              leaf log-only {
                type empty;
                description
                  "Generate warning messages only";
              }
            }  // choice log_type
    
            leaf log-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "5 .. 86400";
                }
              }
              units "seconds";
              description
                "Minimum interval between log messages";
            }
          }  // container maximum-prefixes
    
          container multipath {
            presence "enable multipath";
            description
              "Protocol-independent load balancing";
            uses apply-advanced;
    
            container vpn-unequal-cost {
              presence "enable vpn-unequal-cost";
              description
                "Include VPN routes with unequal IGP metrics";
              leaf equal-external-internal {
                type empty;
                description
                  "Include external and internal VPN routes";
              }
            }  // container vpn-unequal-cost
    
            leaf as-path-compare {
              type empty;
              description
                "Compare AS path sequences in addition to AS path length";
            }
    
            leaf preserve-nexthop-hierarchy {
              type empty;
              description
                "Force multipath to create List nexthop";
            }
          }  // container multipath
    
          container policy-multipath {
            description "Policy based multipath";
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Import policy to create policy based multipath";
            }
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "route" {
                      value 0;
                      description
                        "Policy-multipath route tracing.";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
          }  // container policy-multipath
    
          container protect {
            description
              "Protocol-independent protection";
            leaf core {
              type empty;
              description
                "Protect against unreachability to service-edge router";
            }
          }  // container protect
    
          container access {
            description "Access routes";
            uses apply-advanced;
    
            list route {
              key "name";
              ordered-by user;
              description "Access route";
              leaf name {
                type jt:ipprefix;
                description
                  "IP address of destination";
              }
    
              uses apply-advanced;
    
              leaf-list next-hop {
                type union {
                  type jt:ipaddr-or-interface;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description
                  "Next hop to destination";
              }
    
              list qualified-next-hop {
                key "name";
                ordered-by user;
                description
                  "Next hop with qualifiers";
                uses qualified_nh_obj;
              }  // list qualified-next-hop
    
              leaf metric {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255";
                  }
                }
                description "Metric value";
              }
    
              leaf preference {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Preference value";
              }
    
              leaf tag {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Tag string";
              }
    
              leaf tag2 {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Tag2 string";
              }
            }  // list route
          }  // container access
    
          container access-internal {
            description "Access-internal routes";
            uses apply-advanced;
    
            list route {
              key "name";
              ordered-by user;
              description
                "Access-internal route";
              leaf name {
                type jt:ipprefix;
                description
                  "IP address and optional prefix length of destination";
              }
    
              uses apply-advanced;
    
              leaf-list next-hop {
                type union {
                  type jt:ipaddr-or-interface;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description
                  "Next hop to destination";
              }
    
              list qualified-next-hop {
                key "name";
                ordered-by user;
                description
                  "Next hop with qualifiers";
                uses qualified_nh_obj;
              }  // list qualified-next-hop
            }  // list route
          }  // container access-internal
    
          container bgp-static {
            description
              "Routes for BGP static advertisements";
            uses apply-advanced;
    
            list route {
              key "name";
              ordered-by user;
              description "BGP-static route";
              leaf name {
                type jt:ipprefix;
                description
                  "IP address and optional prefix length of destination";
              }
    
              uses apply-advanced;
    
              container metric {
                presence "enable metric";
                description "Metric value";
                uses rib_static_metric_type;
              }  // container metric
    
              container metric2 {
                presence "enable metric2";
                description "Metric value 2";
                uses rib_static_metric_type;
              }  // container metric2
    
              container metric3 {
                presence "enable metric3";
                description "Metric value 3";
                uses rib_static_metric_type;
              }  // container metric3
    
              container metric4 {
                presence "enable metric4";
                description "Metric value 4";
                uses rib_static_metric_type;
              }  // container metric4
    
              container tag {
                presence "enable tag";
                description "Tag string";
                uses rib_static_metric_type;
              }  // container tag
    
              container tag2 {
                presence "enable tag2";
                description "Tag string 2";
                uses rib_static_metric_type;
              }  // container tag2
    
              container preference {
                presence "enable preference";
                description "Preference value";
                uses rib_static_metric_type;
              }  // container preference
    
              container preference2 {
                presence "enable preference2";
                description "Preference value 2";
                uses rib_static_metric_type;
              }  // container preference2
    
              container color {
                presence "enable color";
                description
                  "Color (preference) value";
                uses rib_static_metric_type;
              }  // container color
    
              container color2 {
                presence "enable color2";
                description
                  "Color (preference) value 2";
                uses rib_static_metric_type;
              }  // container color2
    
              leaf-list community {
                type jt:community;
                ordered-by user;
                description
                  "BGP community identifier";
              }
    
              container as-path {
                description
                  "Autonomous system path";
                uses apply-advanced;
    
                leaf path {
                  type string;
                  description
                    "Autonomous system path";
                }
    
                leaf origin {
                  type enumeration {
                    enum "igp" {
                      value 0;
                      description
                        "Path originated in the local IGP";
                    }
                    enum "egp" {
                      value 1;
                      description
                        "Path originated in another AS";
                    }
                    enum "incomplete" {
                      value 2;
                      description
                        "Path was learned by some other means";
                    }
                  }
                }
    
                leaf atomic-aggregate {
                  type empty;
                  description
                    "Add ATOMIC_AGGREGATE path attribute to route";
                }
    
                container aggregator {
                  presence "enable aggregator";
                  description
                    "Add AGGREGATOR path attribute to route";
                }  // container aggregator
    
                leaf as-number {
                  type string {
                    junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                    junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                  }
                  description
                    " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
                }
    
                leaf address {
                  type jt:ipv4addr;
                  description
                    "Address of BGP system that formed the route";
                }
              }  // container as-path
            }  // list route
          }  // container bgp-static
    
          list rib-groups {
            key "name";
            ordered-by user;
            description
              "Group of routing tables";
            uses rpd_rib_group_type;
          }  // list rib-groups
    
          leaf route-record {
            type empty;
            description "Enable route recording";
          }
    
          container localized-fib {
            junos:must "(!(".. .. .. .. .. logical-systems"))";
            junos:must-message "localized-fib cannot be configured on logical systems";
            junos:must "(!("virtual-chassis"))";
            junos:must-message "localized-fib cannot be configured on virtual-chassis";
            junos:must "(any "chassis fpc <*> vpn-localization")";
            junos:must-message "To configure localized-fib, at least one core facing FPC must be configured at 'chassis fpc <*> vpn-localization'";
            junos:must "(".. .. instance-type vrf")";
            junos:must-message "localized-fib is valid only for instance-type vrf";
            presence "enable localized-fib";
            description
              "Localize vrf routing-instance routes to specific FPC hardware";
            uses apply-advanced;
    
            leaf-list fpc-slot {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              ordered-by user;
              description "Local FPC list";
            }
          }  // container localized-fib
    
          leaf-list instance-import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy for instance RIBs";
          }
    
          leaf-list instance-export {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Export policy for instance RIBs";
          }
    
          container auto-export {
            presence "enable auto-export";
            description
              "Export routes between routing instances";
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable auto-export";
              }
            }  // choice enable-disable
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "export" {
                      value 0;
                      description
                        "Export processing";
                    }
                    enum "route" {
                      value 1;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 2;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 3;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 4;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 5;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 6;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 7;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 8;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            container family {
              container inet {
                description "IPv4 parameters";
                uses export-af-obj;
              }  // container inet
    
              container inet6 {
                description "IPv6 parameters";
                uses export-af-obj;
              }  // container inet6
    
              container iso {
                description "ISO parameters";
                uses export-af-obj;
              }  // container iso
            }  // container family
          }  // container auto-export
    
          container transport-class {
            junos:must "("routing-options route-distinguisher-id")";
            junos:must-message "transport classes use auto-rd. Please configure route-distinguisher-id";
            presence "enable transport-class";
            description
              "Transport layer options";
            uses apply-advanced;
    
            leaf auto-create {
              type empty;
              description
                "Auto create on color discovery";
            }
    
            list name {
              key "name";
              ordered-by user;
              description
                "Transport layer collecting Tunnels with similar characteristics";
              leaf name {
                type string;
                description
                  "Transport class name";
              }
    
              uses apply-advanced;
    
              leaf color {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description
                  "Color(0..4294967295). This auto derives the Mapping Community and Route Target";
              }
            }  // list name
          }  // container transport-class
    
          container dynamic-tunnels {
            description
              "Dynamic tunnel definitions";
            uses apply-advanced;
    
            list tunnel-attributes {
              key "name";
              ordered-by user;
              description
                "Dynamic tunnel attributes definition";
              leaf name {
                type string {
                  junos:posix-pattern "![^a-zA-Z0-9_-]|(^(all|.{64,})$)";
                  junos:pattern-message "Tunnel attribute name is a string consisting of up to 63 letters, numbers, dashes, and underscores";
                }
                description
                  "Dynamic Tunnel attribute name";
              }
    
              uses apply-advanced;
    
              leaf dynamic-tunnel-source-prefix {
                junos:must "(".. dynamic-tunnel-type V4oV6")";
                junos:must-message "Tunnel source address, only valid for V4oV6 tunnel type";
                type jt:ipaddr;
                description
                  "Tunnel source address";
              }
    
              leaf dynamic-tunnel-type {
                type enumeration {
                  enum "GRE" {
                    value 0;
                    description
                      "Tunnel type GRE";
                  }
                  enum "V4oV6" {
                    value 1;
                    description
                      "Tunnel type is IPV4oIPV6";
                  }
                  enum "UDP" {
                    value 2;
                    description
                      "Tunnel type UDP";
                  }
                  enum "BGP-SIGNAL" {
                    value 3;
                    description
                      "Tunnel type BGP-SIGNAL";
                  }
                }
              }
    
              leaf dynamic-tunnel-mtu {
                junos:must "(".. dynamic-tunnel-type V4oV6")";
                junos:must-message "Only supported for tunnel type V4oV6";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "296 .. 9232";
                  }
                }
                description
                  "Dynamic Tunnel MTU value";
              }
    
              leaf dynamic-tunnel-gre-key {
                junos:must "(".. dynamic-tunnel-type GRE")";
                junos:must-message "Only supported for tunnel type GRE";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 4294967295";
                  }
                }
                description
                  "RFC 2890 Dynamic Tunnel GRE Key";
              }
    
              leaf dynamic-tunnel-anchor-pfe {
                type string {
                  junos:posix-pattern "^(pfe-)[1-9]?[0-9]/[1-9]?[0-9]/[1-9]?[0-9]$";
                  junos:pattern-message "Must be a PFE interface of form pfe-x/y/z";
                }
                description
                  "Dynamic Tunnel anchor PFE name of format pfe-x/y/z";
              }
    
              leaf dynamic-tunnel-anti-spoof {
                junos:must "(".. dynamic-tunnel-type V4oV6")";
                junos:must-message "Only supported for tunnel type V4oV6";
                type enumeration {
                  enum "on" {
                    value 0;
                    description
                      "Enable antispoofing check. Default is enabled";
                  }
                  enum "off" {
                    value 1;
                    description
                      "Disable antispoofing check";
                  }
                }
              }
    
              leaf dynamic-tunnel-reassembly {
                junos:must "(".. dynamic-tunnel-type V4oV6")";
                junos:must-message "Only supported for tunnel type V4oV6";
                type enumeration {
                  enum "on" {
                    value 0;
                    description
                      "Enable reassembly check. Default is disabled";
                  }
                  enum "off" {
                    value 1;
                    description
                      "Disable reassembly check";
                  }
                }
              }
            }  // list tunnel-attributes
    
            list forwarding-rib {
              key "name";
              ordered-by user;
              description
                "Forwarding routing table for dynamic-tunnel";
              leaf name {
                type string;
                description "Routing table name";
              }
    
              uses apply-advanced;
    
              leaf-list inet-import {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Import policy for V4 dynamic-tunnel";
              }
            }  // list forwarding-rib
    
            container statistics {
              description
                "Fetch traffic statistics for  dynamic tunnels";
              uses apply-advanced;
    
              leaf interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint16 {
                    range "1 .. 65535";
                  }
                }
                units "seconds";
                description
                  "Time after which statistics has to be fetched";
              }
            }  // container statistics
    
            container traceoptions {
              description "Trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "kernel" {
                      value 0;
                      description
                        "Trace kernel communication";
                    }
                    enum "tunnel" {
                      value 1;
                      description
                        "Trace tunnel addition, change, or deletion";
                    }
                    enum "task" {
                      value 2;
                      description
                        "Trace task or job processing";
                    }
                    enum "tunnel-event" {
                      value 3;
                      description
                        "Trace create, delete, up, down event for nh based tunnel";
                    }
                    enum "flash-event" {
                      value 4;
                      description
                        "Trace flash event for tunnel forwarding route";
                    }
                    enum "stats-job" {
                      value 5;
                      description
                        "Trace taffic statistics job related stuff";
                    }
                    enum "all" {
                      value 6;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            leaf v4ov6 {
              type enumeration {
                enum
                  "ipv6-anycast-source-duplication" {
                  value 0;
                  description
                    "Enable full resolved nh base source-tunnel";
                }
              }
              description
                "Enable dynamic tunnel V4oV6 mode";
            }
    
            leaf gre {
              type enumeration {
                enum "next-hop-based-tunnel" {
                  value 0;
                  description
                    "Enable nh base dynamic-tunnel";
                }
              }
              description
                "Enable dynamic gre tunnel mode";
            }
    
            container signal-tunnel-preference {
              presence
                "enable signal-tunnel-preference";
              description
                "Set tunnel preference for signalled tunnels";
              uses apply-advanced;
    
              leaf gre {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Preference of GRE signalled tunnels";
              }
    
              leaf udp {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Preference of UDP signalled tunnels";
              }
    
              leaf ipip {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 10";
                  }
                }
                description
                  "Preference of IPIP signalled tunnels";
              }
            }  // container signal-tunnel-preference
    
            list dynamic-tunnel {
              key "name";
              ordered-by user;
              uses dynamic_tunnel_type;
            }  // list dynamic-tunnel
          }  // container dynamic-tunnels
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Direct/Host route FRR protection";
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            leaf arp-prefix-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 10000";
                }
              }
              description
                "Max ARP/Host FRR routes allowed";
            }
    
            leaf supplementary-blackout-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 15";
                }
              }
              description
                "ARP plimit blackout timer = kernel ARP timeout + supplementary-blackout-timer minutes.";
            }
    
            choice protection-type {
              leaf link-protection {
                type empty;
                description
                  "Protect interface from link faults only";
              }
            }  // choice protection-type
          }  // list interface
    
          container host-fast-reroute {
            presence "enable host-fast-reroute";
            description
              "Host Fast Re-route global values. Applies to all host FRR profiles.";
            uses apply-advanced;
    
            leaf global-arp-prefix-limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 10000";
                }
              }
              description
                "Max ARP/Host FRR routes allowed per protected IFL";
            }
    
            leaf global-supplementary-blackout-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 15";
                }
              }
              description
                "ARP plimit global blackout timer = kernel ARP timeout + global-supplementary-blackout-timer minutes.";
            }
          }  // container host-fast-reroute
    
          leaf warm-standby {
            junos:must "(!("routing-options nonstop-routing"))";
            junos:must-message "Warm standby and Nonstop routing cannot be enabled simultaneously";
            junos:must "("system commit synchronize")";
            junos:must-message "Synchronized commits must be configured with warm-standby";
            junos:must "("chassis redundancy graceful-switchover")";
            junos:must-message "Graceful switchover needs to be configured";
            type empty;
            description "Enable warm-standby";
          }
    
          leaf nonstop-routing {
            junos:must "("system commit synchronize")";
            junos:must-message "Synchronized commits must be configured with nonstop-routing";
            junos:must "("chassis redundancy graceful-switchover")";
            junos:must-message "Graceful switchover needs to be configured";
            type empty;
            description "Enable nonstop routing";
          }
    
          container nonstop-routing-options {
            presence
              "enable nonstop-routing-options";
            description
              "Nonstop routing options";
            uses apply-advanced;
    
            leaf precision-timers-max-period {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 1800";
                }
              }
              description
                "Set Max period for precision timer support from kernel after switchover";
            }
          }  // container nonstop-routing-options
    
          leaf nsr-phantom-holdtime {
            junos:must "("routing-options nonstop-routing")";
            junos:must-message "Nonstop routing must be enabled";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 10000";
              }
            }
            description
              "Set NSR phantom route hold time";
          }
    
          list srlg {
            key "name";
            ordered-by user;
            description "SRLG configuration";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description "Group name";
            }
    
            uses apply-advanced;
    
            leaf srlg-value {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 4294967295";
                }
              }
              description "Group id";
            }
    
            leaf srlg-cost {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description "Cost value";
            }
          }  // list srlg
    
          container admin-groups-extended-range {
            description
              "Extended administrative groups range";
            uses apply-advanced;
    
            leaf minimum {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "32 .. 4294967295";
                }
              }
              description
                "Minimum value of the range for extended administrative groups";
            }
    
            leaf maximum {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "32 .. 4294967295";
                }
              }
              description
                "Maximum value of the range for extended administrative groups";
            }
          }  // container admin-groups-extended-range
    
          list admin-groups-extended {
            junos:must "(".. admin-groups-extended-range")";
            junos:must-message "admin-groups-extended-range must be configured with admin-groups-extended";
            key "name";
            ordered-by user;
            description
              "Extended administrative groups";
            leaf name {
              type string {
                length "1 .. 64";
              }
              description
                "Group name (Maximum length 64)";
            }
    
            uses apply-advanced;
    
            leaf group-value {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "32 .. 4294967295";
                }
              }
              description "Group id";
            }
          }  // list admin-groups-extended
    
          leaf lsp-telemetry {
            type empty;
            description
              "Turn on Jvision LSP telemetry";
          }
    
          container l3vpn-composite-nexthop {
            junos:must "(!(".. forwarding-table chained-composite-next-hop ingress l3vpn"))";
            junos:must-message "Deprecated/duplicate option configured; use [forwarding-table chained-composite-next-hop ingress l3vpn] only";
            presence
              "enable l3vpn-composite-nexthop";
            status deprecated;
            description
              "Enable composite nexthop for l3vpn";
            uses apply-advanced;
          }  // container l3vpn-composite-nexthop
    
          container source-routing {
            description "Source-routing options";
            uses apply-advanced;
    
            leaf ip {
              type empty;
              description
                "Enable IP Source Routing";
            }
    
            leaf ipv6 {
              type empty;
              description
                "Enable Type 0 RouteHeader processing";
            }
          }  // container source-routing
    
          container forwarding-table {
            uses forwarding-table-type;
          }  // container forwarding-table
    
          container fate-sharing {
            description
              "Fate-sharing links or nodes database";
            uses apply-advanced;
    
            list group {
              key "name";
              ordered-by user;
              description
                "Group of objects sharing common characteristics";
              leaf name {
                type string {
                  junos:posix-pattern "^.{1,32}$";
                  junos:pattern-message "Must be a string of <= 32 characters";
                }
                description
                  "Name of object groups sharing the same fate";
              }
    
              uses apply-advanced;
    
              leaf cost {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 65535";
                  }
                }
                description "Cost value";
              }
    
              leaf use-for-post-convergence-lfa {
                type empty;
                description
                  "Use this fate-sharing group as a constraint for post-convergence-lfa";
              }
    
              list from {
                key "name";
                uses fate_sharing_links;
              }  // list from
            }  // list group
          }  // container fate-sharing
    
          container multicast {
            description
              "Global multicast options";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Global multicast trace options";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "parse" {
                      value 0;
                      description
                        "Trace configuration parsing";
                    }
                    enum "config-internal" {
                      value 1;
                      description
                        "Trace configuration internals";
                    }
                    enum "route" {
                      value 2;
                      description
                        "Trace routing information";
                    }
                    enum "normal" {
                      value 3;
                      description
                        "Trace normal events";
                    }
                    enum "general" {
                      value 4;
                      description
                        "Trace general events";
                    }
                    enum "state" {
                      value 5;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 6;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 7;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 8;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "all" {
                      value 9;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            leaf rpf {
              type string;
              status deprecated;
            }
    
            list scope {
              key "name";
              ordered-by user;
              description
                "Multicast address scope";
              leaf name {
                type string;
                description
                  "Name to identify multicast address scope";
              }
    
              uses apply-advanced;
    
              leaf prefix {
                type jt:ipprefix;
                description
                  "Administratively scoped address";
              }
    
              leaf-list interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                ordered-by user;
                description
                  "Interface on which to configure scoping";
              }
            }  // list scope
    
            leaf-list scope-policy {
              type jt:policy-algebra;
              ordered-by user;
              description "Scoping policy";
            }
    
            list flow-map {
              key "name";
              ordered-by user;
              description
                "Multicast flow map configuration";
              leaf name {
                type string;
                description
                  "Name of the flow map";
              }
    
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Policy for matched flows";
              }
    
              container bandwidth {
                presence "enable bandwidth";
                description
                  "Bandwidth properties for matched flows";
                leaf bandwidth-value {
                  type string;
                  units "bps";
                  description
                    "Static or default bandwidth for the matched flows";
                }
    
                leaf adaptive {
                  type empty;
                  description
                    "Auto-sense bandwidth for matched flows";
                }
              }  // container bandwidth
    
              leaf-list redundant-sources {
                junos:must "(".. bandwidth adaptive")";
                junos:must-message "redundant-sources can only be configured together with 'bandwidth adaptive'";
                type jt:ipaddr;
                ordered-by user;
                description
                  "Redundant source addresses";
              }
    
              container forwarding-cache {
                description
                  "Forwarding cache properties for matched flows";
                uses apply-advanced;
    
                container timeout {
                  description
                    "Timeout properties for matched flows";
                  choice timeout_choice {
                    leaf timeout-value {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "1 .. 720";
                        }
                      }
                      units "minutes";
                      description
                        "Timeout for forwarding cache entry";
                    }
                    container never {
                      presence "enable never";
                      description
                        "Forwarding cache entries never time out";
                      uses apply-advanced;
    
                      leaf non-discard-entry-only {
                        type empty;
                        description
                          "Apply only to non-discard entries";
                      }
                    }  // container never
                  }  // choice timeout_choice
                }  // container timeout
              }  // container forwarding-cache
            }  // list flow-map
    
            leaf-list resolve-filter {
              type jt:policy-algebra;
              ordered-by user;
              status deprecated;
              description
                "Multicast resolve policy filter";
            }
    
            leaf-list ssm-groups {
              type jt:ipprefix;
              ordered-by user;
              description
                "Source-specific multicast group ranges";
            }
    
            leaf cont-stats-collection-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "60 .. 3600";
                }
              }
              default "300";
              description
                "IGMP/MLD continuous statistics collection interval";
            }
    
            leaf asm-override-ssm {
              type empty;
              description
                "Allow ASM state for SSM group ranges";
            }
    
            leaf-list rpf-check-policy {
              type jt:policy-algebra;
              ordered-by user;
              description
                "Disable RPF check for a source group pair";
            }
    
            container pim-to-igmp-proxy {
              description "PIM-to-IGMP proxy";
              uses apply-advanced;
    
              leaf-list upstream-interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                max-elements 2;
                ordered-by user;
                description
                  "Upstream interface list";
              }
            }  // container pim-to-igmp-proxy
    
            container pim-to-mld-proxy {
              description "PIM-to-MLD proxy";
              uses apply-advanced;
    
              leaf-list upstream-interface {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                max-elements 2;
                ordered-by user;
                description
                  "Upstream interface list";
              }
            }  // container pim-to-mld-proxy
    
            container forwarding-cache {
              description
                "Multicast forwarding cache";
              uses apply-advanced;
    
              leaf allow-maximum {
                type empty;
                description
                  "Allow maximum of global and family level threshold values for suppress and reuse";
              }
    
              list family {
                junos:must "((!(".. threshold") || ".. allow-maximum"))";
                junos:must-message "Family threshold cannot be configured if global threshold is already configured";
                key "name";
                ordered-by user;
                description "Protocol family";
                leaf name {
                  type enumeration {
                    enum "inet" {
                      value 0;
                      description "IPv4 family";
                    }
                    enum "inet6" {
                      value 1;
                      description "IPv6 family";
                    }
                  }
                  description "Protocol family";
                }
    
                uses apply-advanced;
    
                container threshold {
                  presence "enable threshold";
                  description
                    "Multicast forwarding cache suppress threshold";
                  uses apply-advanced;
    
                  leaf suppress {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 200000";
                      }
                    }
                    description
                      "Suppress threshold";
                  }
    
                  leaf reuse {
                    junos:must "(".. suppress")";
                    junos:must-message "To configure reuse, suppress must be configured";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 200000";
                      }
                    }
                    description
                      "Reuse threshold";
                  }
    
                  leaf mvpn-rpt-suppress {
                    junos:must "(".. suppress")";
                    junos:must-message "To configure mvpn-rpt-suppress, suppress must be configured";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 200000";
                      }
                    }
                    description
                      "MVPN RP tree entry suppress threshold";
                  }
    
                  leaf mvpn-rpt-reuse {
                    junos:must "(".. mvpn-rpt-suppress")";
                    junos:must-message "To configure mvpn-rpt-reuse, mvpn-rpt-suppress must be configured";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 200000";
                      }
                    }
                    description
                      "MVPN RP tree entry reuse threshold";
                  }
    
                  leaf log-warning {
                    junos:must "(".. suppress")";
                    junos:must-message "To configure log-warning, suppress must be configured";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 100";
                      }
                    }
                    description
                      "Percentage at which to start generating warnings";
                  }
                }  // container threshold
              }  // list family
    
              container threshold {
                junos:must "((!(".. family") || ".. allow-maximum"))";
                junos:must-message "Global threshold cannot be configured if family threshold is configured";
                description "Threshold";
                uses apply-advanced;
    
                leaf suppress {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 200000";
                    }
                  }
                  description
                    "Suppress threshold";
                }
    
                leaf reuse {
                  junos:must "(".. suppress")";
                  junos:must-message "To configure reuse, suppress must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 200000";
                    }
                  }
                  description "Reuse threshold";
                }
    
                leaf mvpn-rpt-suppress {
                  junos:must "(".. suppress")";
                  junos:must-message "To configure mvpn-rpt-suppress, suppress must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 200000";
                    }
                  }
                  description
                    "MVPN RP tree entry suppress threshold";
                }
    
                leaf mvpn-rpt-reuse {
                  junos:must "(".. mvpn-rpt-suppress")";
                  junos:must-message "To configure mvpn-rpt-reuse, mvpn-rpt-suppress must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 200000";
                    }
                  }
                  description
                    "MVPN RP tree entry reuse threshold";
                }
    
                leaf log-warning {
                  junos:must "(".. suppress")";
                  junos:must-message "To configure log-warning, suppress must be configured";
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 100";
                    }
                  }
                  description
                    "Percentage at which to start generating warnings";
                }
              }  // container threshold
    
              leaf timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 720";
                  }
                }
                description
                  "Forwarding cache entry timeout in minutes";
              }
            }  // container forwarding-cache
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Multicast interface options";
              uses multicast_interface_options_type;
            }  // list interface
    
            list ssm-map {
              key "name";
              ordered-by user;
              description "SSM map definitions";
              leaf name {
                type string;
                description "SSM map name";
              }
    
              uses apply-advanced;
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description
                  "Policy for matching group";
              }
    
              leaf-list source {
                type jt:ipaddr;
                ordered-by user;
                description
                  "One or more source addresses";
              }
            }  // list ssm-map
    
            container stream-protection {
              presence
                "enable stream-protection";
              description
                "Multicast only Fast Re-Route";
              uses apply-advanced;
    
              leaf mofrr-primary-path-selection-by-routing {
                type empty;
                description
                  "Multicast only Fast Re-Route primary path by Routing";
              }
    
              leaf mofrr-disjoint-upstream-only {
                type empty;
                description
                  "Multicast only Fast Re-Route disjoint upstream only";
              }
    
              leaf mofrr-no-backup-join {
                type empty;
                description
                  "Multicast only Fast Re-Route no backup join";
              }
    
              leaf mofrr-asm-starg {
                type empty;
                description
                  "Multicast only Fast Re-Route asm (*,G)";
              }
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description "MoFRR Policy";
              }
            }  // container stream-protection
    
            list backup-pe-group {
              key "name";
              ordered-by user;
              description
                "Backup PE group definitions";
              leaf name {
                type string;
                description "PE group name";
              }
    
              uses apply-advanced;
    
              leaf-list backups {
                type jt:ipaddr;
                max-elements 8;
                ordered-by user;
                description
                  "One or more IP addresses";
              }
    
              leaf local-address {
                type jt:ipaddr;
                description
                  "Address to be used as local-address for this group";
              }
            }  // list backup-pe-group
    
            leaf omit-wildcard-address {
              type empty;
              description
                "Omit wildcard source/group fields in SPMSI AD NLRI";
            }
    
            leaf local-address {
              type jt:ipv4addr;
              description
                "Local address for PIM and MVPN sessions";
            }
          }  // container multicast
    
          container programmable-rpd {
            description
              "RPD Server module management options";
            uses programmable-rpd-type;
          }  // container programmable-rpd
    
          container validation {
            description
              "Define Route validation";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Trace options for route validation";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "error" {
                      value 0;
                      description
                        "Trace errored packets";
                    }
                    enum "packets" {
                      value 1;
                      description
                        "Trace all I/O packets";
                    }
                    enum "keepalive" {
                      value 2;
                      description
                        "Trace keepalive packets";
                    }
                    enum "update" {
                      value 3;
                      description
                        "Trace update packets";
                    }
                    enum "nsr-synchronization" {
                      value 4;
                      description
                        "Trace NSR synchronization events";
                    }
                    enum "state" {
                      value 5;
                      description
                        "Trace state transitions";
                    }
                    enum "policy" {
                      value 6;
                      description
                        "Trace policy processing";
                    }
                    enum "task" {
                      value 7;
                      description
                        "Trace routing protocol task processing";
                    }
                    enum "timer" {
                      value 8;
                      description
                        "Trace routing protocol timer processing";
                    }
                    enum "client" {
                      value 9;
                      description
                        "Trace route validation client events";
                    }
                    enum "all" {
                      value 10;
                      description
                        "Trace everything";
                    }
                  }
                }
    
                leaf send {
                  type empty;
                  description
                    "Trace transmitted packets";
                }
    
                leaf receive {
                  type empty;
                  description
                    "Trace received packets";
                }
    
                leaf detail {
                  type empty;
                  description
                    "Trace detailed information";
                }
    
                leaf disable {
                  type empty;
                  description
                    "Disable this trace flag";
                }
              }  // list flag
            }  // container traceoptions
    
            leaf-list notification-rib {
              type string;
              ordered-by user;
              description
                "Define routing tables that get notified upon validation state change";
            }
    
            list group {
              key "name";
              description
                "Define a group of sessions";
              leaf name {
                type string;
                description "Group name";
              }
    
              uses apply-advanced;
    
              leaf authentication-key {
                type string {
                  length "1 .. 126";
                }
                description
                  "MD5 authentication key";
              }
    
              leaf authentication-algorithm {
                junos:must "(".. authentication-key-chain")";
                junos:must-message "May not be configured without authentication-key-chain";
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "md5" {
                    value 0;
                    description
                      "Message Digest 5";
                  }
                  enum "hmac-sha-1-96" {
                    value 1;
                    description
                      "Hash-based Message Authentication Code (SHA1) (96 bits)";
                  }
                  enum "aes-128-cmac-96" {
                    value 2;
                    description
                      "Cipher-based Message Authentication Code (AES128) (96 bits)";
                  }
                  enum "ao" {
                    value 3;
                    description
                      "TCP Authentication Option";
                  }
                }
                default "hmac-sha-1-96";
                description
                  "Authentication algorithm name";
              }
    
              leaf tcpao-handling-with-digest-mismatch {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                type enumeration {
                  enum "drop-if-no-tcpao" {
                    value 0;
                    description
                      "Drop the connection if Digest mismatched";
                  }
                  enum "allow-without-tcpao" {
                    value 1;
                    description
                      "Allow the connection establishment without TCP-AO";
                  }
                }
                description
                  "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
              }
    
              leaf authentication-key-chain {
                junos:must "(!(".. authentication-key"))";
                junos:must-message "May not be configured with authentication-key";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string {
                  length "1 .. 128";
                }
                description "Key chain name";
              }
    
              leaf max-sessions {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 63";
                  }
                }
                description
                  "Maximum connected session in this group";
              }
    
              list session {
                key "name";
                description
                  "Configure a session";
                leaf name {
                  type jt:ipaddr;
                }
    
                uses apply-advanced;
    
                container traceoptions {
                  description
                    "Trace options for route validation";
                  uses apply-advanced;
    
                  container file {
                    description
                      "Trace file options";
                    leaf filename {
                      type string {
                        junos:posix-pattern "![/ %]";
                        junos:pattern-message "Must not contain '/', % or a space";
                        length "1 .. 1024";
                      }
                      description
                        "Name of file in which to write trace information";
                    }
    
                    leaf replace {
                      type empty;
                      status deprecated;
                      description
                        "Replace trace file rather than appending to it";
                    }
    
                    leaf size {
                      type string;
                      description
                        "Maximum trace file size";
                    }
    
                    leaf files {
                      type union {
                        type string {
                          pattern "<.*>|$.*";
                        }
                        type uint32 {
                          range "2 .. 1000";
                        }
                      }
                      default "10";
                      description
                        "Maximum number of trace files";
                    }
    
                    leaf no-stamp {
                      type empty;
                      status deprecated;
                      description
                        "Do not timestamp trace file";
                    }
    
                    choice world-readable-choice {
                      leaf world-readable {
                        type empty;
                        description
                          "Allow any user to read the log file";
                      }
                      leaf no-world-readable {
                        type empty;
                        description
                          "Don't allow any user to read the log file";
                      }
                    }  // choice world-readable-choice
                  }  // container file
    
                  list flag {
                    key "name";
                    ordered-by user;
                    description
                      "Tracing parameters";
                    leaf name {
                      type enumeration {
                        enum "error" {
                          value 0;
                          description
                            "Trace errored packets";
                        }
                        enum "packets" {
                          value 1;
                          description
                            "Trace all I/O packets";
                        }
                        enum "keepalive" {
                          value 2;
                          description
                            "Trace keepalive packets";
                        }
                        enum "update" {
                          value 3;
                          description
                            "Trace update packets";
                        }
                        enum "state" {
                          value 4;
                          description
                            "Trace state transitions";
                        }
                        enum "task" {
                          value 5;
                          description
                            "Trace routing protocol task processing";
                        }
                        enum "timer" {
                          value 6;
                          description
                            "Trace routing protocol timer processing";
                        }
                        enum "all" {
                          value 7;
                          description
                            "Trace everything";
                        }
                      }
                    }
    
                    leaf send {
                      type empty;
                      description
                        "Trace transmitted packets";
                    }
    
                    leaf receive {
                      type empty;
                      description
                        "Trace received packets";
                    }
    
                    leaf detail {
                      type empty;
                      description
                        "Trace detailed information";
                    }
    
                    leaf disable {
                      type empty;
                      description
                        "Disable this trace flag";
                    }
                  }  // list flag
                }  // container traceoptions
    
                leaf authentication-key {
                  type string {
                    length "1 .. 126";
                  }
                  description
                    "MD5 authentication key";
                }
    
                leaf authentication-algorithm {
                  junos:must "(".. authentication-key-chain")";
                  junos:must-message "May not be configured without authentication-key-chain";
                  junos:must "(!(".. authentication-key"))";
                  junos:must-message "May not be configured with authentication-key";
                  type enumeration {
                    enum "md5" {
                      value 0;
                      description
                        "Message Digest 5";
                    }
                    enum "hmac-sha-1-96" {
                      value 1;
                      description
                        "Hash-based Message Authentication Code (SHA1) (96 bits)";
                    }
                    enum "aes-128-cmac-96" {
                      value 2;
                      description
                        "Cipher-based Message Authentication Code (AES128) (96 bits)";
                    }
                    enum "ao" {
                      value 3;
                      description
                        "TCP Authentication Option";
                    }
                  }
                  default "hmac-sha-1-96";
                  description
                    "Authentication algorithm name";
                }
    
                leaf tcpao-handling-with-digest-mismatch {
                  junos:must "(!(".. authentication-key"))";
                  junos:must-message "May not be configured with authentication-key";
                  type enumeration {
                    enum "drop-if-no-tcpao" {
                      value 0;
                      description
                        "Drop the connection if Digest mismatched";
                    }
                    enum "allow-without-tcpao" {
                      value 1;
                      description
                        "Allow the connection establishment without TCP-AO";
                    }
                  }
                  description
                    "Drop or continue without TCP-AO with digest mismatch with TCP-AO";
                }
    
                leaf authentication-key-chain {
                  junos:must "(!(".. authentication-key"))";
                  junos:must-message "May not be configured with authentication-key";
                  junos:must "("security authentication-key-chains key-chain $$")";
                  junos:must-message "Referenced key-chain must be defined";
                  type string {
                    length "1 .. 128";
                  }
                  description "Key chain name";
                }
    
                leaf refresh-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 1800";
                    }
                  }
                  units "seconds";
                  description
                    "Interval between keepalive packet transmissions";
                }
    
                leaf hold-time {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "10 .. 3600";
                    }
                  }
                  units "seconds";
                  description
                    "Time after which the session is declared down.";
                }
    
                leaf record-lifetime {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "60 .. 604800";
                    }
                  }
                  units "seconds";
                  description
                    "Lifetime of route validation records";
                }
    
                leaf preference {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1 .. 255";
                    }
                  }
                  description
                    "Preference for session establishment";
                }
    
                leaf port {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint16 {
                      range "1 .. 65535";
                    }
                  }
                  description
                    "Portnumber to connect";
                }
    
                leaf local-address {
                  type jt:ipaddr;
                }
              }  // list session
            }  // list group
    
            container static {
              description
                "Define static route validation record";
              uses apply-advanced;
    
              list record {
                key "name";
                description
                  "Static route validation record";
                leaf name {
                  type jt:ipprefix;
                }
    
                uses apply-advanced;
    
                list maximum-length {
                  key "name";
                  ordered-by user;
                  leaf name {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 128";
                      }
                    }
                    description
                      "Maximum prefix-length for route validation record";
                  }
    
                  uses apply-advanced;
    
                  list origin-autonomous-system {
                    key "name";
                    ordered-by user;
                    leaf name {
                      type union {
                        type uint32;
                        type string {
                          pattern "<.*>|$.*";
                        }
                      }
                      description
                        "Legitimate Origin Autonomous System";
                    }
    
                    uses apply-advanced;
    
                    leaf validation-state {
                      type enumeration {
                        enum "invalid" {
                          value 0;
                          description
                            "Invalid route validation state";
                        }
                        enum "valid" {
                          value 1;
                          description
                            "Valid route validation state";
                        }
                      }
                      description
                        "Validation state for route validation record";
                    }
                  }  // list origin-autonomous-system
                }  // list maximum-length
              }  // list record
            }  // container static
          }  // container validation
        }  // grouping juniper-routing-options
    
        grouping dynamic_tunnel_type {
          description
            "Dynamic tunnel definition";
          leaf name {
            type string {
              junos:posix-pattern "![^a-zA-Z0-9_-]|(^(all|.{64,})$)";
              junos:pattern-message "Tunnel name is a string consisting of up to 63 letters, numbers, dashes, and underscores";
            }
            description "Tunnel name";
          }
    
          uses apply-advanced;
    
          leaf source-address {
            junos:must "((".. gre" || (".. udp" || (".. bgp-signal" || ".. ipip"))))";
            junos:must-message "Tunnel type GRE, UDP or BGP-SIGNAL must be configured";
            type jt:ipaddr;
            description "Tunnel source address";
          }
    
          choice tunnel-type {
            list rsvp-te {
              key "name";
              ordered-by user;
              description
                "RSVP-TE point-to-point LSP";
              leaf name {
                type string;
                description
                  "Configure multiple entries for RSVP tunnel";
              }
    
              uses apply-advanced;
    
              container label-switched-path-template {
                description
                  "Template for dynamic point-to-point LSP parameters";
                uses apply-advanced;
    
                choice dynamic-template {
                  leaf template-name {
                    junos:must "(("protocols mpls label-switched-path $$" && "protocols mpls label-switched-path $$ template"))";
                    junos:must-message "Referenced point-to-point LSP template does not exist";
                    type string {
                      junos:posix-pattern "^.{1,32}$";
                      junos:pattern-message "Must be a string of 32 characters or less";
                    }
                    description
                      "Name of point-to-point LSP template";
                  }
                  leaf default-template {
                    type empty;
                    description
                      "Use default parameters";
                  }
                }  // choice dynamic-template
              }  // container label-switched-path-template
    
              list destination-networks {
                key "name";
                ordered-by user;
                description
                  "Create tunnels for routes in these destination networks";
                uses app_network_type;
              }  // list destination-networks
            }  // list rsvp-te
            container spring-te {
              description "SPRING-TE LSP's";
              uses apply-advanced;
    
              list source-routing-path-template {
                key "name";
                ordered-by user;
                description
                  "Template color mapping for SPRING-TE dynamic LSP parameters";
                uses spring-te-template-map;
              }  // list source-routing-path-template
    
              list destination-networks {
                key "name";
                ordered-by user;
                description
                  "Create tunnels for routes in these destination networks";
                uses app_network_type;
              }  // list destination-networks
            }  // container spring-te
            leaf gre {
              junos:must "((".. source-address" && ".. destination-networks"))";
              junos:must-message "Source address and Destination Networks must be configured for tunnel type GRE";
              type empty;
              description
                "Generic routing encapsulation type for IPv4";
            }
            leaf udp {
              junos:must "((".. source-address" && ".. destination-networks"))";
              junos:must-message "Source address and Destination Networks must be configured for tunnel type UDP";
              type empty;
              description
                "UDP encapsulation type for IPv4";
            }
            leaf bgp-signal {
              junos:must "((".. source-address" && ".. destination-networks"))";
              junos:must-message "Source address and Destination Networks must be configured for tunnel type BGP-Signal";
              type empty;
              description
                "BGP signals the encapsulation type for IPv4";
            }
            leaf ipip {
              junos:must "((".. source-address" && ".. destination-networks"))";
              junos:must-message "Source address and Destination Networks must be configured for tunnel type IPIP";
              type empty;
              description
                "IPIP encapsulation type for IPv4";
            }
          }  // choice tunnel-type
    
          list destination-networks {
            junos:must "(((".. gre" || (".. udp" || (".. bgp-signal" || ".. ipip"))) && (!(".. rsvp-te") && !(".. spring-te"))))";
            junos:must-message "Tunnel type GRE or UDP must be configured";
            key "name";
            ordered-by user;
            description
              "Create tunnels for routes in these destination networks";
            uses network_type;
          }  // list destination-networks
        }  // grouping dynamic_tunnel_type
    
        grouping app_network_type {
          leaf name {
            type jt:ipprefix;
            description "Network prefix";
          }
    
          uses apply-advanced;
        }  // grouping app_network_type
    
        grouping export-af-obj {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable auto-export for address family";
            }
          }  // choice enable-disable
    
          container unicast {
            presence "enable unicast";
            description
              "Unicast routing information";
            uses export-subaf-obj;
          }  // container unicast
    
          container multicast {
            presence "enable multicast";
            description
              "Multicast routing information";
            uses export-subaf-obj;
          }  // container multicast
    
          container flow {
            presence "enable flow";
            description
              "Flow routing information";
            uses export-subaf-obj;
          }  // container flow
        }  // grouping export-af-obj
    
        grouping export-subaf-obj {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable instance export";
            }
          }  // choice enable-disable
    
          leaf rib-group {
            type string;
            description
              "Auxiliary rib-group of additional RIBs to consider";
          }
        }  // grouping export-subaf-obj
    
        grouping fate_sharing_links {
          leaf name {
            type jt:ipv4addr;
            description
              "Router ID or LAN interface address";
          }
    
          leaf to {
            type jt:ipv4addr;
            description "Point-to-point links";
          }
        }  // grouping fate_sharing_links
    
        grouping flow-interface-group {
          leaf group {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 255";
              }
            }
            description
              "Interface group ID to match traffic";
          }
    
          leaf exclude {
            type empty;
            description
              "Don't apply flow-spec filter to traffic on this group";
          }
        }  // grouping flow-interface-group
    
        grouping flow-route-inet {
          leaf name {
            type string;
          }
    
          uses apply-advanced;
    
          leaf no-install {
            type empty;
            description
              "Don't install firewall filter in forwarding";
          }
    
          container match {
            description "Flow definition";
            uses flow-route-qualifier-inet;
          }  // container match
    
          container then {
            description
              "Actions to take for this flow";
            uses flow-route-op;
          }  // container then
        }  // grouping flow-route-inet
    
        grouping flow-route-inet6 {
          leaf name {
            type string;
          }
    
          uses apply-advanced;
    
          leaf no-install {
            type empty;
            description
              "Don't install firewall filter in forwarding";
          }
    
          container match {
            description "Flow definition";
            uses flow-route-qualifier-inet6;
          }  // container match
    
          container then {
            description
              "Actions to take for this flow";
            uses flow-route-op;
          }  // container then
        }  // grouping flow-route-inet6
    
        grouping flow-route-op {
          uses apply-advanced;
    
          leaf community {
            type string;
            description "Name of BGP community";
          }
    
          choice flow_op_action {
            leaf accept {
              type empty;
              description
                "Allow traffic through";
            }
            leaf discard {
              type empty;
              description
                "Discard all traffic for this flow";
            }
            leaf rate-limit {
              type string;
              description
                "Rate in bits/sec to limit the flow traffic";
            }
          }  // choice flow_op_action
    
          leaf routing-instance {
            type string {
              junos:posix-pattern "^[a-z]+:[0-9.]+L?:[0-9]+$";
              junos:pattern-message "Use format 'target:x:y' where 'x' is an AS number followed by an optional 'L' (To indicate 4 byte AS), or an IP address and 'y' is a number. e.g. target:123456L:100";
            }
            description
              "Redirect to instance identified via Route Target community";
          }
    
          leaf sample {
            type empty;
            description
              "Sample traffic that matches this flow";
          }
    
          leaf mark {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 63";
              }
            }
            description
              "Set DSCP value for traffic that matches this flow";
          }
    
          leaf next-term {
            type empty;
            description
              "Continue the filter evaluation after matching this flow";
          }
    
          choice redirect_op_action {
            leaf-list redirect {
              type jt:ipaddr;
              ordered-by user;
              description
                "Redirect(Tunnel) this flow's traffic to given next-hop address";
            }
          }  // choice redirect_op_action
        }  // grouping flow-route-op
    
        grouping flow-route-qualifier-inet {
          uses apply-advanced;
    
          leaf-list protocol {
            type string;
            ordered-by user;
            description "IP protocol value";
          }
    
          leaf-list port {
            type string;
            ordered-by user;
          }
    
          leaf-list destination-port {
            type string;
            ordered-by user;
          }
    
          leaf-list source-port {
            type string;
            ordered-by user;
          }
    
          leaf-list tcp-flags {
            type string;
            ordered-by user;
            description "TCP flags";
          }
    
          leaf-list packet-length {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Packet length (0-65535)";
          }
    
          leaf-list dscp {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Differentiated Services (DiffServ) code point (DSCP) (0-63)";
          }
    
          leaf-list fragment {
            type enumeration {
              enum "dont-fragment" {
                value 0;
                description
                  "Don't Fragment flag is set";
              }
              enum "not-a-fragment" {
                value 1;
                description "Not a fragment";
              }
              enum "is-fragment" {
                value 2;
                description "Fragmented packet";
              }
              enum "first-fragment" {
                value 3;
                description "First fragment";
              }
              enum "last-fragment" {
                value 4;
                description "Last fragment";
              }
            }
            ordered-by user;
          }
    
          leaf destination {
            type jt:ipv4prefix;
            description
              "Destination prefix for this traffic flow";
          }
    
          leaf source {
            type jt:ipv4prefix;
            description
              "Source prefix for this traffic flow";
          }
    
          leaf-list icmp-code {
            type string;
            ordered-by user;
            description "ICMP message code";
          }
    
          leaf-list icmp-type {
            type string;
            ordered-by user;
            description "ICMP message type";
          }
        }  // grouping flow-route-qualifier-inet
    
        grouping flow-route-qualifier-inet6 {
          uses apply-advanced;
    
          leaf-list protocol {
            type string;
            ordered-by user;
            description "IP protocol value";
          }
    
          leaf-list port {
            type string;
            ordered-by user;
          }
    
          leaf-list destination-port {
            type string;
            ordered-by user;
          }
    
          leaf-list source-port {
            type string;
            ordered-by user;
          }
    
          leaf-list tcp-flags {
            type string;
            ordered-by user;
            description "TCP flags";
          }
    
          leaf-list packet-length {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Packet length (0-65535)";
          }
    
          leaf-list dscp {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Differentiated Services (DiffServ) code point (DSCP) (0-63)";
          }
    
          leaf-list fragment {
            type enumeration {
              enum "dont-fragment" {
                value 0;
                description
                  "Don't Fragment flag is set";
              }
              enum "not-a-fragment" {
                value 1;
                description "Not a fragment";
              }
              enum "is-fragment" {
                value 2;
                description "Fragmented packet";
              }
              enum "first-fragment" {
                value 3;
                description "First fragment";
              }
              enum "last-fragment" {
                value 4;
                description "Last fragment";
              }
            }
            ordered-by user;
          }
    
          container destination {
            presence "enable destination";
            description
              "Destination prefix for this traffic flow";
            uses flow-prefix-with-offset;
          }  // container destination
    
          container source {
            presence "enable source";
            description
              "Source prefix for this traffic flow";
            uses flow-prefix-with-offset;
          }  // container source
    
          leaf-list icmp6-type {
            type string;
            ordered-by user;
            description "ICMP message type";
          }
    
          leaf-list icmp6-code {
            type string;
            ordered-by user;
            description "ICMP message code";
          }
    
          leaf-list flow-label {
            type jt:policy-algebra;
            ordered-by user;
            description "Flow-label (0-1048575)";
          }
        }  // grouping flow-route-qualifier-inet6
    
        grouping flow-prefix-with-offset {
          leaf prefix {
            type jt:ipv6prefix;
          }
    
          leaf prefix-offset {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Offset from where prefix match will start";
          }
        }  // grouping flow-prefix-with-offset
    
        grouping flow-rule-inet {
          leaf name {
            type string;
          }
    
          uses apply-advanced;
    
          leaf no-install {
            type empty;
            description
              "Don't install firewall filter in forwarding";
          }
    
          container match {
            description "Flow definition";
            uses flow-rule-qualifier-inet;
          }  // container match
    
          container then {
            description
              "Actions to take for this flow";
            uses flow-rule-op;
          }  // container then
        }  // grouping flow-rule-inet
    
        grouping flow-rule-inet6 {
          leaf name {
            type string;
          }
    
          uses apply-advanced;
    
          leaf no-install {
            type empty;
            description
              "Don't install firewall filter in forwarding";
          }
    
          container match {
            description "Flow definition";
            uses flow-rule-qualifier-inet6;
          }  // container match
    
          container then {
            description
              "Actions to take for this flow";
            uses flow-rule-op;
          }  // container then
        }  // grouping flow-rule-inet6
    
        grouping flow-rule-op {
          uses apply-advanced;
    
          choice flow_op_action {
            leaf accept {
              type empty;
              description
                "Allow traffic through";
            }
            leaf discard {
              type empty;
              description
                "Discard all traffic for this flow";
            }
            leaf rate-limit {
              type string;
              description
                "Rate in bits/sec to limit the flow traffic";
            }
          }  // choice flow_op_action
        }  // grouping flow-rule-op
    
        grouping flow-rule-qualifier-inet {
          uses apply-advanced;
    
          leaf-list protocol {
            type string;
            ordered-by user;
            description "IP protocol value";
          }
    
          leaf-list port {
            type string;
            ordered-by user;
          }
    
          leaf-list destination-port {
            type string;
            ordered-by user;
          }
    
          leaf-list source-port {
            type string;
            ordered-by user;
          }
    
          leaf destination {
            type jt:ipv4prefix;
            description
              "Destination prefix for this traffic flow";
          }
    
          leaf source {
            type jt:ipv4prefix;
            description
              "Source prefix for this traffic flow";
          }
        }  // grouping flow-rule-qualifier-inet
    
        grouping flow-rule-qualifier-inet6 {
          uses apply-advanced;
    
          leaf-list protocol {
            type string;
            ordered-by user;
            description "IP protocol value";
          }
    
          leaf-list port {
            type string;
            ordered-by user;
          }
    
          leaf-list destination-port {
            type string;
            ordered-by user;
          }
    
          leaf-list source-port {
            type string;
            ordered-by user;
          }
    
          container destination {
            presence "enable destination";
            description
              "Destination prefix for this traffic flow";
            uses flow-prefix-with-offset;
          }  // container destination
    
          container source {
            presence "enable source";
            description
              "Source prefix for this traffic flow";
            uses flow-prefix-with-offset;
          }  // container source
        }  // grouping flow-rule-qualifier-inet6
    
        grouping flow-validation {
          uses apply-advanced;
    
          container traceoptions {
            description "Trace options";
            uses flow-dep-traceoptions;
          }  // container traceoptions
        }  // grouping flow-validation
    
        grouping flow-dep-traceoptions {
          uses apply-advanced;
    
          container file {
            description "Trace file options";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf replace {
              type empty;
              status deprecated;
              description
                "Replace trace file rather than appending to it";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "10";
              description
                "Maximum number of trace files";
            }
    
            leaf no-stamp {
              type empty;
              status deprecated;
              description
                "Do not timestamp trace file";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
          }  // container file
    
          list flag {
            key "name";
            ordered-by user;
            description "Tracing parameters";
            leaf name {
              type enumeration {
                enum "resolution" {
                  value 0;
                  description
                    "Trace flow to unicast route resolution";
                }
                enum "flash" {
                  value 1;
                  description
                    "Trace flash processing";
                }
                enum "route" {
                  value 2;
                  description
                    "Trace routing information";
                }
                enum "normal" {
                  value 3;
                  description
                    "Trace normal events";
                }
                enum "general" {
                  value 4;
                  description
                    "Trace general events";
                }
                enum "state" {
                  value 5;
                  description
                    "Trace state transitions";
                }
                enum "policy" {
                  value 6;
                  description
                    "Trace policy processing";
                }
                enum "task" {
                  value 7;
                  description
                    "Trace routing protocol task processing";
                }
                enum "timer" {
                  value 8;
                  description
                    "Trace routing protocol timer processing";
                }
                enum "all" {
                  value 9;
                  description "Trace everything";
                }
              }
            }
    
            leaf send {
              type empty;
              description
                "Trace transmitted packets";
            }
    
            leaf receive {
              type empty;
              description
                "Trace received packets";
            }
    
            leaf detail {
              type empty;
              description
                "Trace detailed information";
            }
    
            leaf disable {
              type empty;
              description
                "Disable this trace flag";
            }
    
            container filter {
              presence "enable filter";
              description
                "Filter to apply to tracing";
              leaf match-on {
                type enumeration {
                  enum "prefix" {
                    value 0;
                    description
                      "Filter based on prefix";
                  }
                  enum "route-attribute" {
                    value 1;
                    description
                      "Filter based on route attributes";
                  }
                }
                description
                  "Argument on which to match";
              }
    
              leaf-list policy {
                type jt:policy-algebra;
                ordered-by user;
                description "Filter policy";
              }
            }  // container filter
          }  // list flag
        }  // grouping flow-dep-traceoptions
    
        grouping forwarding-table-type {
          description
            "Forwarding table management options";
          uses apply-advanced;
    
          leaf remnant-holdtime {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 10000";
              }
            }
            description
              "Time to hold inherited routes from FIB";
          }
    
          leaf chain-composite-max-label-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 16";
              }
            }
            description
              "Maximum labels inside chain composite for the platform.";
          }
    
          leaf krt-nexthop-ack-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 400";
              }
            }
            description
              "Kernel nexthop ack timeout interval";
          }
    
          leaf srv6-chain-merge {
            type empty;
            description
              "Enable merging of srv6 chain nexthops";
          }
    
          container consistency-checking {
            status deprecated;
            description
              "RIB/FIB consistency checking";
            uses apply-advanced;
    
            choice enable-disable {
              leaf enable {
                type empty;
                description
                  "Enable consistency checking";
              }
              leaf disable {
                type empty;
                description
                  "Disable consistency checking";
              }
            }  // choice enable-disable
    
            leaf period {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "30 .. 4294967295";
                }
              }
              description
                "Periodicity of scan in seconds";
            }
    
            leaf threshold {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Mismatch threshold until complaint";
            }
          }  // container consistency-checking
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description "Export policy";
          }
    
          leaf dynamic-list-next-hop {
            junos:must "(!(".. evpn-aliasing-optimize"))";
            junos:must-message "please disable evpn-aliasing-optimize";
            type empty;
            description
              "Dynamic next-hop mode for EVPN";
          }
    
          container evpn-egress-link-protection {
            presence
              "enable evpn-egress-link-protection";
            description
              "EVPN PE-CE egress link failure protection";
            uses apply-advanced;
          }  // container evpn-egress-link-protection
    
          container egress-chaining {
            description "Enable egress-chaining";
            uses apply-advanced;
    
            leaf spring-te {
              type empty;
              description
                "Enable egress-chaining for SPRING-TE routes";
            }
          }  // container egress-chaining
    
          leaf evpn-aliasing-optimize {
            junos:must "(!(".. evpn-egress-link-protection"))";
            junos:must-message "please disable evpn-egress-link-protection";
            junos:must "(!(".. dynamic-list-next-hop"))";
            junos:must-message "please disable dynamic-list-next-hop";
            type empty;
            description
              "EVPN Aliasing convergence improvement";
          }
    
          choice ecmp-fast-reroute-choice {
            leaf ecmp-fast-reroute {
              type empty;
              description
                "Enable fast reroute for ECMP next hops";
            }
            leaf no-ecmp-fast-reroute {
              type empty;
              description
                "Don't enable fast reroute for ECMP next hops";
            }
          }  // choice ecmp-fast-reroute-choice
    
          choice indirect-next-hop-choice {
            leaf indirect-next-hop {
              type empty;
              description
                "Install indirect next hops in Packet Forwarding Engine";
            }
            leaf no-indirect-next-hop {
              type empty;
              description
                "Don't install indirect next hops in Packet Forwarding Engine";
            }
          }  // choice indirect-next-hop-choice
    
          choice route-ack-converge-choice {
            leaf route-ack-converge {
              type empty;
              description
                "Enable the route ack convergence feature";
            }
            leaf no-route-ack-converge {
              type empty;
              description
                "Don't enable the route ack convergence feature";
            }
          }  // choice route-ack-converge-choice
    
          choice indirect-next-hop-change-acknowledgements-choice {
            leaf indirect-next-hop-change-acknowledgements {
              type empty;
              description
                "Request acknowledgements for Indirect next hop changes";
            }
            leaf no-indirect-next-hop-change-acknowledgements {
              type empty;
              description
                "Don't request acknowledgements for Indirect next hop changes";
            }
          }  // choice indirect-next-hop-change-acknowledgements-choice
    
          list rib {
            key "name";
            ordered-by user;
            status deprecated;
            leaf name {
              type string;
            }
          }  // list rib
    
          leaf unicast-reverse-path {
            type enumeration {
              enum "active-paths" {
                value 0;
                description
                  "Consider active paths when performing RP verification";
              }
              enum "feasible-paths" {
                value 1;
                description
                  "Consider all feasible paths for RP verification";
              }
            }
            description
              "Unicast reverse path (RP) verification";
          }
    
          container ip-tunnel-rpf-check {
            presence
              "enable ip-tunnel-rpf-check";
            description
              "IP tunnel Reverse Path Forwarding Check";
            uses apply-advanced;
    
            leaf mode {
              type enumeration {
                enum "strict" {
                  value 0;
                  description
                    "Strict mode for rpf-check(Default)";
                }
                enum "loose" {
                  value 1;
                  description
                    "Loose mode for rpf-check";
                }
              }
              default "strict";
            }
    
            leaf fail-filter {
              junos:must "(("firewall family any filter $$" || ((!("firewall") && ".. .. .. .. .. firewall family any filter $$") || ("firewall family inet filter $$" || ((!("firewall") && ".. .. .. .. .. firewall family inet filter $$") || ("firewall family inet6 filter $$" || (!("firewall") && ".. .. .. .. .. firewall family inet6 filter $$")))))))";
              junos:must-message "referenced filter must be defined under firewall family any|inet|inet6";
              type string {
                junos:posix-pattern "!^((__.*)|(.{65,}))$";
                junos:pattern-message "Must be a non-reserved string of 64 characters or less";
              }
              description
                "Fail filter name for RPF check(family inet|inet6|any)";
            }
          }  // container ip-tunnel-rpf-check
    
          list source-class {
            key "name";
            ordered-by user;
            description "Source class filters";
            uses source-class-filters;
          }  // list source-class
    
          list destination-class {
            key "name";
            ordered-by user;
            description
              "Destination class filters";
            uses destination-class-filters;
          }  // list destination-class
    
          leaf transit-lsp-statistics-from-route {
            type empty;
            description
              "Enable LSP statistics collection from the route";
          }
    
          container chained-composite-next-hop {
            description "Next-hop chaining mode";
            uses apply-advanced;
    
            container ingress {
              description
                "Ingress LSP nexthop settings";
              uses apply-advanced;
    
              choice l2vpn-choice {
                leaf l2vpn {
                  type empty;
                  description
                    "Create composite-chained nexthops for ingress l2vpn LSPs";
                }
                leaf no-l2vpn {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for ingress l2vpn LSPs";
                }
              }  // choice l2vpn-choice
    
              choice l2ckt-choice {
                leaf l2ckt {
                  type empty;
                  description
                    "Create composite-chained nexthops for ingress l2ckt LSPs";
                }
                leaf no-l2ckt {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for ingress l2ckt LSPs";
                }
              }  // choice l2ckt-choice
    
              choice fec129-vpws-choice {
                leaf fec129-vpws {
                  type empty;
                  description
                    "Create composite-chained nexthops for ingress fec129-vpws LSPs";
                }
                leaf no-fec129-vpws {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for ingress fec129-vpws LSPs";
                }
              }  // choice fec129-vpws-choice
    
              choice evpn-choice {
                leaf evpn {
                  type empty;
                  description
                    "Create composite-chained nexthops for ingress EVPN LSPs";
                }
                leaf no-evpn {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for ingress EVPN LSPs";
                }
              }  // choice evpn-choice
    
              container labeled-bgp {
                description
                  "Create composite-chained nexthops for ingress labeled-bgp LSPs";
                uses apply-advanced;
    
                choice inet-choice {
                  leaf inet {
                    type empty;
                    description
                      "Enable inet labeled-bgp composite nexthop creation";
                  }
                  leaf no-inet {
                    type empty;
                    description
                      "Don't enable inet labeled-bgp composite nexthop creation";
                  }
                }  // choice inet-choice
    
                choice inet6-choice {
                  leaf inet6 {
                    type empty;
                    description
                      "Enable inet6 labeled-bgp composite nexthop creation";
                  }
                  leaf no-inet6 {
                    type empty;
                    description
                      "Don't enable inet6 labeled-bgp composite nexthop creation";
                  }
                }  // choice inet6-choice
              }  // container labeled-bgp
    
              container l3vpn {
                junos:must "(!(".. .. .. .. l3vpn-composite-nexthop"))";
                junos:must-message "Equivalent options; only one may be configured; this way is preferred";
                presence "enable l3vpn";
                description
                  "Create composite-chained nexthops for ingress l3vpn LSPs";
                leaf extended-space {
                  junos:must "("chassis network-services enhanced-ip")";
                  junos:must-message "Network services mode must be Enhanced IP for extended space l3vpn";
                  type empty;
                  description
                    "Allocate in extended-space for scalability";
                }
              }  // container l3vpn
    
              choice ldp-choice {
                leaf ldp {
                  type empty;
                  description
                    "Create chained-composite nexthops to support segmentation LDP tunnels";
                }
                leaf no-ldp {
                  type empty;
                  description
                    "Don't create chained-composite nexthops to support segmentation LDP tunnels";
                }
              }  // choice ldp-choice
            }  // container ingress
    
            container transit {
              description
                "Transit LSP nexthops settings";
              uses apply-advanced;
    
              choice l2vpn-choice {
                leaf l2vpn {
                  type empty;
                  description
                    "Create composite-chained nexthops for transit l2vpn LSPs";
                }
                leaf no-l2vpn {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for transit l2vpn LSPs";
                }
              }  // choice l2vpn-choice
    
              choice l3vpn-choice {
                leaf l3vpn {
                  type empty;
                  description
                    "Create composite-chained nexthops for transit l3vpn LSPs";
                }
                leaf no-l3vpn {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for transit l3vpn LSPs";
                }
              }  // choice l3vpn-choice
    
              choice labeled-bgp-choice {
                leaf labeled-bgp {
                  type empty;
                  description
                    "Create composite-chained nexthops for transit labeled BGP routes";
                }
                leaf no-labeled-bgp {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for transit labeled BGP routes";
                }
              }  // choice labeled-bgp-choice
    
              choice static-choice {
                leaf static {
                  type empty;
                  description
                    "Create composite-chained nexthops for static LSPs";
                }
                leaf no-static {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for static LSPs";
                }
              }  // choice static-choice
    
              choice rsvp-choice {
                leaf rsvp {
                  type empty;
                  description
                    "Create composite-chained nexthops for RSVP LSPs";
                }
                leaf no-rsvp {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for RSVP LSPs";
                }
              }  // choice rsvp-choice
    
              choice rsvp-p2mp-choice {
                leaf rsvp-p2mp {
                  junos:must "(!("chassis network-services enhanced-ip"))";
                  junos:must-message "Transit rsvp-p2mp is not supported with enhanced-ip mode on MX platform";
                  type empty;
                  description
                    "Create composite-chained nexthops for RSVP p2mp LSPs";
                }
                leaf no-rsvp-p2mp {
                  junos:must "(!("chassis network-services enhanced-ip"))";
                  junos:must-message "Transit rsvp-p2mp is not supported with enhanced-ip mode on MX platform";
                  type empty;
                  description
                    "Don't create composite-chained nexthops for RSVP p2mp LSPs";
                }
              }  // choice rsvp-p2mp-choice
    
              choice express-segments-choice {
                leaf express-segments {
                  type empty;
                  description
                    "Create composite-chained nexthops for Express Segments";
                }
                leaf no-express-segments {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for Express Segments";
                }
              }  // choice express-segments-choice
    
              choice ldp-choice {
                leaf ldp {
                  type empty;
                  description
                    "Create composite-chained nexthops for LDP LSPs";
                }
                leaf no-ldp {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for LDP LSPs";
                }
              }  // choice ldp-choice
    
              choice ldp-p2mp-choice {
                leaf ldp-p2mp {
                  junos:must "(!("chassis network-services enhanced-ip"))";
                  junos:must-message "Transit ldp-p2mp is not supported with enhanced-ip mode on MX platform";
                  type empty;
                  description
                    "Create composite-chained nexthops for LDP P2MP LSPs";
                }
                leaf no-ldp-p2mp {
                  junos:must "(!("chassis network-services enhanced-ip"))";
                  junos:must-message "Transit ldp-p2mp is not supported with enhanced-ip mode on MX platform";
                  type empty;
                  description
                    "Don't create composite-chained nexthops for LDP P2MP LSPs";
                }
              }  // choice ldp-p2mp-choice
    
              choice labeled-isis-choice {
                leaf labeled-isis {
                  type empty;
                  description
                    "Create composite-chained nexthops for labeled ISIS routes";
                }
                leaf no-labeled-isis {
                  type empty;
                  description
                    "Don't create composite-chained nexthops for labeled ISIS routes";
                }
              }  // choice labeled-isis-choice
            }  // container transit
          }  // container chained-composite-next-hop
    
          container fib-next-hop-split {
            description
              "Split nexthop to chain nexthop when installing fom rib to fib";
            uses apply-advanced;
    
            leaf labeled-isis {
              type empty;
              description
                "Create composite-chained nexthops for labeled ISIS routes";
            }
          }  // container fib-next-hop-split
    
          container fib-agent {
            junos:must "(!("routing-options forwarding-table channel"))";
            junos:must-message "Can not be configured together with 'routing-options forwarding-table channel'";
            presence "enable fib-agent";
            description
              "Configure fib-agent parameters";
            uses apply-advanced;
    
            leaf address {
              type jt:ipaddr;
              default "127.0.0.1";
              description
                "IP address of the FIB agent";
            }
    
            leaf port {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              default "2620";
              description
                "TCP port of the FIB agent";
            }
    
            leaf protocol-id {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 255";
                }
              }
              default "22";
              description
                "Protocol ID to be used for programming routes";
            }
          }  // container fib-agent
    
          list channel {
            junos:must "(!("routing-options forwarding-table fib-agent"))";
            junos:must-message "Can not be configured together with 'routing-options forwarding-table fib-agent'";
            key "name";
            ordered-by user;
            description
              "Configure fib-channel parameters";
            leaf name {
              type string;
              description "FIB Channel Name";
            }
    
            uses apply-advanced;
    
            container protocol {
              presence "enable protocol";
              description
                "Configure fib-channel protocol";
              uses apply-advanced;
    
              leaf protocol-type {
                junos:must "((unique "routing-options forwarding-table channel <*> protocol protocol-type netlink-fpm" || unique "routing-options forwarding-table channel <*> protocol protocol-type gRPC"))";
                junos:must-message "protocol-type is already configured for a different channel";
                type enumeration {
                  enum "netlink-fpm" {
                    value 0;
                    description
                      "Configure SONiC FIB Channel";
                  }
                  enum "gRPC" {
                    value 1;
                    description
                      "Configure vRouter FIB channel.";
                  }
                }
              }
    
              leaf destination {
                type string;
                description
                  "Destination of the FIB";
              }
    
              leaf source-id {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 255";
                  }
                }
                default "22";
                description
                  "Source ID to be used for programming routes";
              }
            }  // container protocol
    
            leaf-list export {
              type jt:policy-algebra;
              ordered-by user;
              description "Export policy";
            }
          }  // list channel
        }  // grouping forwarding-table-type
    
        grouping destination-class-filters {
          leaf name {
            junos:must "((any "policy-options policy-statement <*> then destination-class $$" || (any "policy-options policy-statement <*> term <*> then destination-class $$" || (any "policy-options policy-statement <*> from route-filter <*> <*> destination-class $$" || (any "policy-options policy-statement <*> term <*> from route-filter <*> <*> destination-class $$" || (any "policy-options policy-statement <*> then forwarding-class $$" || (any "policy-options policy-statement <*> term <*> then forwarding-class $$" || (any "policy-options policy-statement <*> from route-filter <*> <*> forwarding-class $$" || (any "logical-systems <*> policy-options policy-statement <*> then destination-class $$" || (any "logical-systems <*> policy-options policy-statement <*> term <*> then destination-class $$" || (any "logical-systems <*> policy-options policy-statement <*> from route-filter <*> <*> destination-class $$" || (any "logical-systems <*> policy-options policy-statement <*> term <*> from route-filter <*> <*> destination-class $$" || (any "logical-systems <*> policy-options policy-statement <*> then forwarding-class $$" || (any "logical-systems <*> policy-options policy-statement <*> term <*> then forwarding-class $$" || any "logical-systems <*> policy-options policy-statement <*> from route-filter <*> <*> forwarding-class $$"))))))))))))))";
            junos:must-message "referenced destination-class must be defined";
            type string;
            description "Destination class name";
          }
    
          uses apply-advanced;
    
          container family {
            description "Protocol family";
            container inet {
              description
                "Protocol family IPv4 for firewall filter";
              uses apply-advanced;
    
              container filter {
                description "Packet filtering";
                uses apply-advanced;
    
                leaf filter-name {
                  type string;
                  description "Inet Filter name";
                }
              }  // container filter
            }  // container inet
    
            container inet6 {
              description
                "Protocol family IPv6 for firewall filter";
              uses apply-advanced;
    
              container filter {
                description "Packet filtering";
                uses apply-advanced;
    
                leaf filter-name {
                  type string;
                  description
                    "Inet6 Filter name";
                }
              }  // container filter
            }  // container inet6
          }  // container family
        }  // grouping destination-class-filters
    
        grouping juniper-sampling-options {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable global sampling instance";
            }
          }  // choice enable-disable
    
          container traceoptions {
            description
              "Traffic sampling trace options";
            uses sampling_traceoptions_type;
          }  // container traceoptions
    
          leaf sample-once {
            type empty;
            description
              "Sample the packet for active-monitoring only once";
          }
    
          leaf pre-rewrite-tos {
            type empty;
            description
              "Sample the packet retaining tos value before normalization";
          }
    
          container input {
            description
              "Traffic Sampling data acquisition";
            uses sampling_input_type;
          }  // container input
    
          container output {
            junos:must "(!(".. family"))";
            junos:must-message " 'sampling family <*> ' and 'sampling output' are mutually exclusive";
            junos:must "("forwarding-options sampling input")";
            junos:must-message "Sampling input configuration is not specified";
            status deprecated;
            description
              "Traffic sampling data disposition";
            uses sampling_output_type;
          }  // container output
    
          container family {
            description
              "Address family of packets to sample";
            container inet {
              description "Sample IPv4 packets";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable sampling family inet";
                }
              }  // choice enable-disable
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                description
                  "Settings for sampling of input packets";
                uses sampling_family_input_type;
              }  // container input
    
              container output {
                junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                junos:must-message "output configuration mismatch with old deprecated input configuration";
                junos:must "((".. .. .. input rate" || " .. input rate"))";
                junos:must-message "sampling input rate is not specified";
                junos:must "((".. .. .. input" || ".. input"))";
                junos:must-message "Sampling input configuration is not specified";
                description
                  "Traffic sampling data disposition";
                uses sampling_instance_inet_global_output_type;
              }  // container output
            }  // container inet
    
            container inet6 {
              description "Sample IPv6 packets";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable sampling family inet6";
                }
              }  // choice enable-disable
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                description
                  "Settings for sampling of input packets";
                uses sampling_family_input_type;
              }  // container input
    
              container output {
                junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                junos:must-message "output configuration mismatch with old deprecated input configuration";
                junos:must "((".. .. .. input" || ".. input"))";
                junos:must-message "Sampling input configuration is not specified";
                description
                  "Traffic sampling data disposition";
                uses sampling_family_inet6_output_type;
              }  // container output
            }  // container inet6
    
            container mpls {
              description "Sample mpls packets";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable sampling family mpls";
                }
              }  // choice enable-disable
    
              container input {
                junos:must "(!(".. .. .. input"))";
                junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                description
                  "Settings for sampling of input packets";
                uses sampling_family_input_type;
              }  // container input
    
              container output {
                junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                junos:must-message "output configuration mismatch with old deprecated input configuration";
                junos:must "((".. .. .. input" || ".. input"))";
                junos:must-message "Sampling input configuration is not specified";
                description
                  "Traffic sampling data disposition";
                uses sampling_global_mpls_output_type;
              }  // container output
            }  // container mpls
          }  // container family
    
          list instance {
            key "name";
            ordered-by user;
            description
              "Instance of sampling parameters";
            leaf name {
              junos:must "(!("forwarding-options port-mirroring instance $$"))";
              junos:must-message "Instance $$ is also defined under port-mirroring hierarchy";
              type string;
              description
                "Name for sampling instance";
            }
    
            uses apply-advanced;
    
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable sampling instance";
              }
            }  // choice enable-disable
    
            container input {
              description
                "Traffic Sampling data acquisition";
              uses sampling_instance_input_type;
            }  // container input
    
            container family {
              description
                "Address family of packets to sample";
              container inet {
                description
                  "Sample IPv4 packets";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    status deprecated;
                    description
                      "Disable instance family inet";
                  }
                }  // choice enable-disable
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                  description
                    "Settings for sampling of input packets";
                  uses sampling_family_input_type;
                }  // container input
    
                container output {
                  junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                  junos:must-message "output configuration mismatch with old deprecated input configuration";
                  junos:must "((".. .. .. input" || ".. input"))";
                  junos:must-message "Sampling input configuration is not specified";
                  description
                    "Traffic sampling data disposition";
                  uses sampling_instance_inet_output_type;
                }  // container output
              }  // container inet
    
              container inet6 {
                description
                  "Sample IPv6 packets";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    status deprecated;
                    description
                      "Disable instance family inet6";
                  }
                }  // choice enable-disable
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                  description
                    "Settings for sampling of input packets";
                  uses sampling_family_input_type;
                }  // container input
    
                container output {
                  junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                  junos:must-message "output configuration mismatch with old deprecated input configuration";
                  junos:must "((".. .. .. input" || ".. input"))";
                  junos:must-message "Sampling input configuration is not specified";
                  description
                    "Traffic sampling data disposition";
                  uses sampling_instance_inet6_output_type;
                }  // container output
              }  // container inet6
    
              container mpls {
                description
                  "Sample mpls packets";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    status deprecated;
                    description
                      "Disable instance family mpls";
                  }
                }  // choice enable-disable
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                  description
                    "Settings for sampling of input packets";
                  uses sampling_family_input_type;
                }  // container input
    
                container output {
                  junos:must "((!("forwarding-options sampling input family inet") && (!("forwarding-options sampling input family inet6") && !("forwarding-options sampling input family mpls"))))";
                  junos:must-message "output configuration mismatch with old deprecated input configuration";
                  junos:must "((".. .. .. input" || ".. input"))";
                  junos:must-message "Sampling input configuration is not specified";
                  description
                    "Traffic sampling data disposition";
                  uses sampling_instance_mpls_output_type;
                }  // container output
              }  // container mpls
    
              container vpls {
                status deprecated;
                description
                  "Sample vpls packets";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable instance family vpls";
                  }
                }  // choice enable-disable
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                  description
                    "Settings for sampling of input packets";
                  uses sampling_family_input_type;
                }  // container input
    
                container output {
                  junos:must "((".. .. .. input" || ".. input"))";
                  junos:must-message "Sampling input configuration is not specified";
                  description
                    "Traffic sampling data disposition";
                  uses sampling_instance_vpls_output_type;
                }  // container output
              }  // container vpls
    
              container bridge {
                junos:must "(!(".. .. family vpls"))";
                junos:must-message "bridge and vpls families are mutually exclusive";
                description
                  "Sample bridge packets";
                uses apply-advanced;
    
                choice enable-disable {
                  leaf disable {
                    type empty;
                    description
                      "Disable instance family bridge";
                  }
                }  // choice enable-disable
    
                container input {
                  junos:must "(!(".. .. .. input"))";
                  junos:must-message "instance <*> 'family <*> input' and 'instance <*> input' are mutually exclusive";
                  description
                    "Settings for sampling of input packets";
                  uses sampling_family_input_type;
                }  // container input
    
                container output {
                  junos:must "((".. .. .. input" || ".. input"))";
                  junos:must-message "Sampling input configuration is not specified";
                  description
                    "Traffic sampling data disposition";
                  uses sampling_instance_bridge_output_type;
                }  // container output
              }  // container bridge
            }  // container family
          }  // list instance
    
          container jflow-service {
            description
              "Jflow service configuration";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Jflow service trace options";
              uses jflow_service_traceoptions;
            }  // container traceoptions
          }  // container jflow-service
    
          container route-record {
            description
              "Sampling route record configuration";
            uses apply-advanced;
    
            container traceoptions {
              description
                "Sampling route record trace options";
              uses route_record_traceoptions;
            }  // container traceoptions
          }  // container route-record
        }  // grouping juniper-sampling-options
    
        grouping jflow_service_traceoptions {
          description
            "Traceoptions for jflow-service";
          uses apply-advanced;
    
          leaf no-remote-trace {
            junos:must "("system tracing")";
            junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
            type empty;
            description "Disable remote tracing";
          }
    
          container file {
            description "Trace file information";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "3";
              description
                "Maximum number of trace files";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
    
            leaf match {
              type jt:regular-expression;
              description
                "Regular expression for lines to be logged";
            }
          }  // container file
    
          leaf level {
            type enumeration {
              enum "error" {
                value 0;
                description
                  "Match error conditions";
              }
              enum "warning" {
                value 1;
                description
                  "Match warning messages";
              }
              enum "notice" {
                value 2;
                description
                  "Match conditions that should be handled specially";
              }
              enum "info" {
                value 3;
                description
                  "Match informational messages";
              }
              enum "verbose" {
                value 4;
                description
                  "Match verbose messages";
              }
              enum "all" {
                value 5;
                description "Match all levels";
              }
            }
            default "error";
            description
              "Level of debugging output";
          }
    
          list flag {
            key "name";
            ordered-by user;
            description
              "Area of jflow-service to enable debuging output";
            leaf name {
              type enumeration {
                enum "parse" {
                  value 0;
                  description
                    "Trace parsing code";
                }
                enum "rtsock" {
                  value 1;
                  description
                    "Trace rtsock code";
                }
                enum "sm" {
                  value 2;
                  description
                    "Trace State machine code";
                }
                enum "all" {
                  value 3;
                  description
                    "Trace all area of jflow-service code";
                }
              }
            }
          }  // list flag
        }  // grouping jflow_service_traceoptions
    
        grouping junos_hash_key {
          description
            "Select data used in the hash key";
          uses apply-advanced;
    
          container family {
            description "Protocol family";
            container fcoe {
              description "FCoE protocol family";
              uses apply-advanced;
    
              container ethernet-interfaces {
                description
                  "FCoE hash-key configuration on ethernet interfaces";
                uses apply-advanced;
    
                leaf oxid {
                  type enumeration {
                    enum "enable" {
                      value 0;
                      description
                        "Include Originator Exchange ID in the hash key";
                    }
                    enum "disable" {
                      value 1;
                      description
                        "Do not include Originator Exchange ID in the hash key";
                    }
                  }
                  description
                    "Originator Exchange ID";
                }
              }  // container ethernet-interfaces
    
              container fabric-interfaces {
                description
                  "FCoE hash-key configuration on fabric interfaces";
                uses apply-advanced;
    
                leaf oxid {
                  type enumeration {
                    enum "enable" {
                      value 0;
                      description
                        "Include Originator Exchange ID in the hash key";
                    }
                    enum "disable" {
                      value 1;
                      description
                        "Do not include Originator Exchange ID in the hash key";
                    }
                  }
                  description
                    "Originator Exchange ID";
                }
              }  // container fabric-interfaces
            }  // container fcoe
    
            container inet {
              description "IPv4 protocol family";
              uses apply-advanced;
    
              container layer-3 {
                presence "enable layer-3";
                description
                  "Include Layer 3 (IP) data in the hash key";
                uses apply-advanced;
    
                leaf destination-address {
                  type empty;
                  description
                    "Include IP destination address in the hash key";
                }
              }  // container layer-3
    
              container layer-4 {
                presence "enable layer-4";
                description
                  "Include Layer 4 (TCP or UDP) data in the hash key";
                uses apply-advanced;
    
                leaf gtp-tunnel-endpoint-identifier {
                  type empty;
                  description
                    "Include GTP TEID in the hash key";
                }
              }  // container layer-4
    
              container symmetric-hash {
                junos:must "(("forwarding-options hash-key family inet layer-3" || "forwarding-options hash-key family inet layer-4"))";
                junos:must-message "layer-3 and/or layer-4 to be configured for symmetric/complement Hash";
                presence "enable symmetric-hash";
                description
                  "Create symmetric hash-key with source & destination ports";
                uses apply-advanced;
    
                leaf complement {
                  type empty;
                  description
                    "Create complement of symmetric hash-key";
                }
              }  // container symmetric-hash
    
              leaf no-incoming-port {
                type empty;
                description
                  "Exclude incoming port from the hash key";
              }
            }  // container inet
    
            container inet6 {
              description "IPv6 protocol family";
              uses apply-advanced;
    
              container layer-3 {
                presence "enable layer-3";
                description
                  "Include Layer 3 (IP) data in the hash key";
                uses apply-advanced;
    
                leaf destination-address {
                  type empty;
                  description
                    "Include IP destination address in the hash key";
                }
    
                leaf incoming-interface-index {
                  type empty;
                  description
                    "Include incoming interface index in the hash key";
                }
    
                leaf next-header {
                  type empty;
                  description
                    "Include IP Next Header field in the hash key";
                }
    
                leaf source-address {
                  type empty;
                  description
                    "Include IP source address in the hash key";
                }
    
                leaf traffic-class {
                  type empty;
                  description
                    "Include Traffic Class field in the hash key";
                }
    
                leaf ipv6-flow-label {
                  type empty;
                  description
                    "Include IPV6 flow label field in the hash key";
                }
              }  // container layer-3
    
              container layer-4 {
                presence "enable layer-4";
                description
                  "Include Layer 4 (TCP or UDP) data in the hash key";
                uses apply-advanced;
    
                leaf destination-port {
                  type empty;
                  description
                    "Include IP destination port in the hash key";
                }
    
                leaf source-port {
                  type empty;
                  description
                    "Include IP source port in the hash key";
                }
    
                leaf gtp-tunnel-endpoint-identifier {
                  type empty;
                  description
                    "Include GTP TEID in the hash key";
                }
              }  // container layer-4
    
              leaf no-incoming-port {
                type empty;
                description
                  "Exclude incoming port from the hash key";
              }
            }  // container inet6
    
            container mpls {
              description "MPLS protocol family";
              uses apply-advanced;
    
              choice label {
                leaf label-1 {
                  type empty;
                  description
                    "Include the first MPLS label in the hash key";
                }
                leaf all-labels {
                  type empty;
                  description
                    "Include all MPLS labels in hash key";
                }
                leaf no-labels {
                  type empty;
                  description
                    "Exclude all MPLS labels from hash key";
                }
                leaf bottom-label-1 {
                  type empty;
                  description
                    "Include the first MPLS label from bottom-of-stack in the hash key";
                }
              }  // choice label
    
              leaf label-2 {
                junos:must "(".. label-1")";
                junos:must-message "Must also specify label 1;";
                type empty;
                description
                  "Include the second MPLS label in the hash key";
              }
    
              leaf label-3 {
                junos:must "(".. label-2")";
                junos:must-message "Must also specify label 2;";
                type empty;
                description
                  "Include the third MPLS label in the hash key";
              }
    
              leaf bottom-label-2 {
                junos:must "(".. bottom-label-1")";
                junos:must-message "Must also specify bottom-label-1. Cannot use top-of-stack labels.";
                type empty;
                description
                  "Include the second MPLS label from bottom-of-stack in the hash key";
              }
    
              leaf bottom-label-3 {
                junos:must "(".. bottom-label-2")";
                junos:must-message "Must also specify bottom-label-2. Cannot use top-of-stack labels.";
                type empty;
                description
                  "Include the third MPLS label from bottom-of-stack in the hash key";
              }
    
              leaf no-label-1-exp {
                junos:must "((".. label-1" || ".. no-labels"))";
                junos:must-message "Either label-1 or no-labels statement is mandatory";
                type empty;
                description
                  "Omit EXP bits of first MPLS label from the hash key";
              }
    
              container payload {
                junos:must "((".. label-1" || (".. no-labels" || (".. all-labels" || ".. bottom-label-1"))))";
                junos:must-message "Either label-1, bottom-label-1, all-labels or no-labels statement is mandatory";
                description
                  "Include payload data in the hash key";
                uses apply-advanced;
    
                container ether-pseudowire {
                  presence
                    "enable ether-pseudowire";
                  description
                    "Load-balance IP over ethernet PW";
                  uses apply-advanced;
    
                  leaf zero-control-word {
                    type empty;
                    description
                      "MPLS ether-pseudowire payload with zero-control-word preceding ethernet packet";
                  }
                }  // container ether-pseudowire
    
                container ip {
                  presence "enable ip";
                  description
                    "Include IPv4 or IPv6 payload data in the hash key";
                  uses apply-advanced;
    
                  choice layer-4-select {
                    choice ip-payload {
                      leaf layer-3-only {
                        type empty;
                        description
                          "Include only layer-3 IP information";
                      }
                      leaf enable {
                        type empty;
                        description
                          "Include layer3/4 IP payload in the hash key";
                      }
                      leaf disable {
                        type empty;
                        description
                          "Exclude layer3/4 IP payload in the hash key";
                      }
                    }  // choice ip-payload
                    container port-data {
                      presence
                        "enable port-data";
                      uses apply-advanced;
    
                      leaf source-msb {
                        type empty;
                        description
                          "Include the most significant byte of the source port";
                      }
    
                      leaf source-lsb {
                        type empty;
                        description
                          "Include the least significant byte of the source port";
                      }
    
                      leaf destination-msb {
                        type empty;
                        description
                          "Include the most significant byte of the destination port";
                      }
    
                      leaf destination-lsb {
                        type empty;
                        description
                          "Include the least significant byte of the destination port";
                      }
                    }  // container port-data
                  }  // choice layer-4-select
                }  // container ip
              }  // container payload
            }  // container mpls
    
            container multiservice {
              description
                "Multiservice protocol family";
              uses apply-advanced;
    
              leaf source-mac {
                type empty;
                description
                  "Include source MAC address in hash key";
              }
    
              leaf destination-mac {
                type empty;
                description
                  "Include destination MAC address in hash key";
              }
    
              leaf label-1 {
                type empty;
                description
                  "Include the first MPLS label in the hash key";
              }
    
              leaf label-2 {
                junos:must "(".. label-1")";
                junos:must-message "Must also specify label 1;";
                type empty;
                description
                  "Include the second MPLS label in the hash key";
              }
    
              container payload {
                description
                  "Include payload data in the hash key";
                uses apply-advanced;
    
                container ip {
                  description
                    "Include IPv4 payload data in the hash key";
                  uses apply-advanced;
    
                  container layer-3 {
                    presence "enable layer-3";
                    description
                      "Include layer-3 ip info for VPLS/Bridge";
                    uses apply-advanced;
    
                    choice layer-3-options {
                      leaf source-ip-only {
                        type empty;
                        description
                          "Include source IP only in hash-key";
                      }
                      leaf destination-ip-only {
                        type empty;
                        description
                          "Include desintation IP only in hash-key";
                      }
                    }  // choice layer-3-options
                  }  // container layer-3
    
                  leaf layer-4 {
                    type empty;
                    description
                      "Include layer-4 IP information for VPLS/Bridge";
                  }
    
                  leaf layer-3-only {
                    type empty;
                    description
                      "Include only layer-3 IP information";
                  }
                }  // container ip
              }  // container payload
    
              container symmetric-hash {
                junos:must "(("forwarding-options hash-key family multiservice payload" || ("forwarding-options hash-key family multiservice source-mac" || "forwarding-options hash-key family multiservice destination-mac")))";
                junos:must-message "Payload and/or source-MAC and/or destination-MAC to be configured for symmetric/complement Hash";
                presence "enable symmetric-hash";
                description
                  "Create a/symmetric hash-key with any attributes";
                uses apply-advanced;
    
                leaf complement {
                  type empty;
                  description
                    "Create complement of symmetric hash-key";
                }
              }  // container symmetric-hash
            }  // container multiservice
          }  // container family
    
          container resilient-hash-seed {
            presence
              "enable resilient-hash-seed";
            description "Resilient hash seed";
            uses apply-advanced;
    
            leaf resilient-seed-value {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 4294967295";
                }
              }
              description
                "Hash seed value for resilient ECMP and LAG";
            }
          }  // container resilient-hash-seed
        }  // grouping junos_hash_key
    
        grouping layer2_pm_family_output_type {
          uses apply-advanced;
    
          choice interface-or-next-hop-index {
            leaf interface {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Interface through which to send sampled traffic";
            }
            leaf next-hop-group {
              junos:must "(!(".. no-filter-check"))";
              junos:must-message "no-filter-check is not allowed with next-hop-group";
              junos:must "("forwarding-options next-hop-group $$ group-type layer-2")";
              junos:must-message "Referenced next-hop-group must be defined as layer-2 group";
              type string;
              description
                "Next-hop-group through which to send port-mirror traffic";
            }
            list routing-instance {
              key "name";
              max-elements 1;
              description "Routing instances";
              uses layer2_pm_output-routing-instance-type;
            }  // list routing-instance
            list vlan {
              key "name";
              max-elements 1;
              description
                "Outgoing VLAN for mirrored packets";
              uses pm-rspan-vlan;
            }  // list vlan
            list bridge-domain {
              key "name";
              max-elements 1;
              description
                "Outgoing bridge-domain for mirrored packets";
              uses pm-rspan-bridge-domain;
            }  // list bridge-domain
          }  // choice interface-or-next-hop-index
    
          leaf no-filter-check {
            type empty;
            description
              "Do not check for filters on port-mirroring interface";
          }
        }  // grouping layer2_pm_family_output_type
    
        grouping layer2_pm_output-routing-instance-type {
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          list vlan {
            key "name";
            max-elements 1;
            description
              "Outgoing VLAN for mirrored packets";
            uses pm-rspan-vlan;
          }  // list vlan
    
          list bridge-domain {
            key "name";
            max-elements 1;
            description
              "Outgoing bridge-domain for mirrored packets";
            uses pm-rspan-bridge-domain;
          }  // list bridge-domain
        }  // grouping layer2_pm_output-routing-instance-type
    
        grouping ldp-sync-obj {
          uses apply-advanced;
    
          choice enable-disable {
            leaf disable {
              type empty;
              description
                "Disable LDP synchronization";
            }
          }  // choice enable-disable
    
          leaf hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Time during which maximum metric is advertised";
          }
        }  // grouping ldp-sync-obj
    
        grouping ldp_filter_obj {
          description
            "Filter to apply to tracing";
          leaf match-on {
            type enumeration {
              enum "fec" {
                value 0;
                description
                  "Filter based on FEC associated to the traced object.";
              }
              enum "address" {
                value 1;
                description
                  "Filter based on packet source and destination addresses.";
              }
            }
            description
              "Argument on which to match";
          }
    
          leaf-list policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Filter policy";
          }
        }  // grouping ldp_filter_obj
    
        grouping lsp-set-match-type {
          uses apply-advanced;
    
          leaf lsp-name {
            junos:must "((!(".. lsp-regex") && (!(".. p2mp-name") && !(".. p2mp-regex"))))";
            junos:must-message "Can't configure lsp-name when lsp-regex or p2mp-name or p2mp-regex is configured";
            type string;
            description
              "LSP name that matches this string";
          }
    
          leaf lsp-regex {
            junos:must "((!(".. lsp-name") && (!(".. p2mp-name") && !(".. p2mp-regex"))))";
            junos:must-message "Can't configure lsp-regex when lsp-name or p2mp-name or p2mp-regex is configured";
            type string;
            description
              "All LSPs that match this regular expression pattern";
          }
    
          leaf p2mp-name {
            junos:must "((!(".. lsp-name") && (!(".. lsp-regex") && !(".. p2mp-regex"))))";
            junos:must-message "Can't configure p2mp-name when lsp-name or lsp-regex or p2mp-regex is configured";
            type string;
            description
              "P2MP names that match this string";
          }
    
          leaf p2mp-regex {
            junos:must "((!(".. lsp-name") && (!(".. lsp-regex") && !(".. p2mp-name"))))";
            junos:must-message "Can't configure p2mp-regex when lsp-name or lsp-regex or p2mp-name is configured";
            type string;
            description
              "P2MP names that match this regular expression pattern";
          }
    
          choice router-type {
            leaf egress {
              type empty;
              description
                "All LSPs for which this router is egress";
            }
            leaf ingress {
              type empty;
              description
                "All LSPs for which this router is ingress";
            }
            leaf transit {
              type empty;
              description
                "All LSPs for which this router is transit";
            }
          }  // choice router-type
        }  // grouping lsp-set-match-type
    
        grouping lsp_nh_obj {
          leaf name {
            type string;
            description
              "LSP to use to reach destination";
          }
    
          uses apply-advanced;
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of LSP next hop";
          }
    
          leaf metric {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Metric of LSP next hop";
          }
        }  // grouping lsp_nh_obj
    
        grouping macro-data-type {
          leaf name {
            type string;
            description
              "Keyword part of the keyword-value pair";
          }
    
          leaf value {
            type string;
            description
              "Value part of the keyword-value pair";
          }
        }  // grouping macro-data-type
    
        grouping martian_type {
          description "Invalid routes";
          leaf address {
            type jt:ipprefix;
            description "IP address or hostname";
          }
    
          leaf choice-ident {
            type enumeration {
              enum "exact" {
                value 0;
              }
              enum "longer" {
                value 1;
              }
              enum "orlonger" {
                value 2;
              }
              enum "upto" {
                value 3;
              }
              enum "through" {
                value 4;
              }
              enum "prefix-length-range" {
                value 5;
              }
              enum "allow" {
                value 6;
              }
            }
          }
    
          leaf choice-value {
            type string;
          }
    
          leaf allow {
            type empty;
          }
        }  // grouping martian_type
    
        grouping monitoring_input_type {
          uses apply-advanced;
    
          list interface {
            key "name";
            ordered-by user;
            leaf name {
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Interface which will be monitored";
            }
    
            uses apply-advanced;
          }  // list interface
        }  // grouping monitoring_input_type
    
        grouping monitoring_output_type {
          uses apply-advanced;
    
          leaf export-format {
            type enumeration {
              enum "cflowd-version-5" {
                value 0;
                description
                  "Export in cflowd version 5 format";
              }
            }
            description
              "Format for sending monitoring information";
          }
    
          leaf destination-address {
            type jt:ipv4addr;
            status deprecated;
            description
              "Address to which monitored packets will be sent";
          }
    
          leaf destination-port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            status deprecated;
            description
              "Port to which monitored packets will be sent";
          }
    
          leaf source-address {
            type jt:ipv4addr;
            status deprecated;
            description
              "Address to use for generating monitored packets";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-export-destination {
            type enumeration {
              enum "collector-pic" {
                value 0;
                description
                  "Send flow information to collector PIC";
              }
              enum "cflowd-collector" {
                value 1;
                description
                  "Send flow information to cflowd collector";
              }
            }
            description
              "Destination for flow export";
          }
    
          list cflowd {
            junos:must "(!(".. flow-export-destination collector-pic"))";
            junos:must-message "cflowd cannot be configured when flow collection mode is set";
            key "name";
            description
              "Collector destination where flow records are sent";
            uses cflowd_monitoring_type;
          }  // list cflowd
    
          list interface {
            key "name";
            description
              "Interfaces used to send monitored information";
            uses monitor_export_intf_type;
          }  // list interface
        }  // grouping monitoring_output_type
    
        grouping cflowd_monitoring_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
        }  // grouping cflowd_monitoring_type
    
        grouping monitor_export_intf_type {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface to be used for sending monitored information";
          }
    
          uses apply-advanced;
    
          leaf engine-id {
            type union {
              type uint8;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Identity (number) of this monitoring interface";
          }
    
          leaf engine-type {
            type union {
              type uint8;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Type (number) of this monitoring interface";
          }
    
          leaf input-interface-index {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "0";
            description
              "Input interface index for records from this interface";
          }
    
          leaf output-interface-index {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "0";
            description
              "Output interface index for records from this interface";
          }
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Address to use for generating monitored packets";
          }
        }  // grouping monitor_export_intf_type
    
        grouping mpls_pm_family_output_type {
          uses apply-advanced;
    
          leaf server-profile {
            junos:must "(("services hosted-services server-profile $$" && ("services hosted-services server-profile $$ server-address" && "services hosted-services server-profile $$ client-address")))";
            junos:must-message "Only complete server profiles configured under [services hosted-services server-profile] can be configured here";
            type string {
              length "3 .. 32";
            }
            description "Server profile name";
          }
        }  // grouping mpls_pm_family_output_type
    
        grouping mrp-trace-options {
          description
            "Trace options for MMRP Protocol";
          uses apply-advanced;
    
          container file {
            description "Trace file options";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf replace {
              type empty;
              status deprecated;
              description
                "Replace trace file rather than appending to it";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "10";
              description
                "Maximum number of trace files";
            }
    
            leaf no-stamp {
              type empty;
              status deprecated;
              description
                "Do not timestamp trace file";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
          }  // container file
    
          list flag {
            junos:must "(".. file")";
            junos:must-message "Trace file name required to enable tracing";
            key "name";
            ordered-by user;
            description "Tracing parameters";
            leaf name {
              type enumeration {
                enum "events" {
                  value 0;
                  description
                    "Trace events to the protocol state machine";
                }
                enum "pdu" {
                  value 1;
                  description
                    "Trace RAPS PDU reception and transmission";
                }
                enum "timers" {
                  value 2;
                  description
                    "Trace protocol timers";
                }
                enum "state-machine" {
                  value 3;
                  description
                    "Trace information of the state machine";
                }
                enum "socket" {
                  value 4;
                  description
                    "Trace soccket activity";
                }
                enum "error" {
                  value 5;
                  description
                    "Trace all failure conditions";
                }
                enum "all" {
                  value 6;
                  description "Trace all";
                }
              }
            }
    
            leaf disable {
              type empty;
              description
                "Disable this trace flag";
            }
          }  // list flag
        }  // grouping mrp-trace-options
    
        grouping mstp-interface {
          leaf name {
            type string;
          }
    
          uses apply-advanced;
    
          leaf priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "0 .. 255";
              }
            }
            description
              "Interface priority (in increments of 16 - 0,16,..240)";
          }
    
          leaf cost {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 200000000";
              }
            }
            description "Cost of the interface";
          }
    
          leaf mode {
            type enumeration {
              enum "point-to-point" {
                value 0;
                description
                  "Interface mode is point-to-point";
              }
              enum "shared" {
                value 1;
                description
                  "Interface mode is shared";
              }
            }
            description
              "Interface mode (P2P or shared)";
          }
    
          leaf edge {
            type empty;
            description "Port is an edge port";
          }
    
          leaf access-trunk {
            type empty;
            description
              "Send/Receive untagged RSTP BPDUs on this interface";
          }
    
          container bpdu-timeout-action {
            presence
              "enable bpdu-timeout-action";
            description
              "Define action on BPDU expiry (Loop Protect)";
            uses apply-advanced;
    
            leaf block {
              type empty;
              description "Block the interface";
            }
    
            leaf alarm {
              type empty;
              description "Generate an alarm";
            }
          }  // container bpdu-timeout-action
    
          leaf no-root-port {
            type empty;
            description
              "Do not allow the interface to become root (Root Protect)";
          }
    
          leaf disable {
            type empty;
            description
              "Disable Spanning Tree on port";
          }
        }  // grouping mstp-interface
    
        grouping multicast_interface_options_type {
          description
            "Multicast interface options";
          leaf name {
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Interface name";
          }
    
          uses apply-advanced;
    
          container maximum-bandwidth {
            presence "enable maximum-bandwidth";
            description
              "Maximum multicast bandwidth for the interface";
            leaf bandwidth-limit {
              type string;
              units "bps";
              description
                "Maximum multicast bandwidth on the interface";
            }
          }  // container maximum-bandwidth
    
          choice enable-disable {
            leaf enable {
              type empty;
              status deprecated;
              description "Enable Multicast";
            }
            leaf disable {
              type empty;
              status deprecated;
              description "Disable Multicast";
            }
          }  // choice enable-disable
    
          container reverse-oif-mapping {
            presence
              "enable reverse-oif-mapping";
            description
              "Enable reverse OIF mapping on the multicast interface";
            uses apply-advanced;
    
            leaf no-qos-adjust {
              type empty;
              description
                "Disable reverse OIF mapping QoS adjustment";
            }
          }  // container reverse-oif-mapping
    
          leaf subscriber-leave-timer {
            junos:must "(".. reverse-oif-mapping")";
            junos:must-message "reverse-oif-mapping must be set";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 30";
              }
            }
            units "seconds";
            description
              "Timeout in seconds to credit back the bandwidth on the subscriber interface";
          }
    
          leaf no-qos-adjust {
            type empty;
            description
              "Disable QoS adjustment for this interface";
          }
        }  // grouping multicast_interface_options_type
    
        grouping network_type {
          leaf name {
            type jt:ipprefix;
            description "Network prefix";
          }
    
          uses apply-advanced;
    
          leaf-list dyn-tunnel-attribute-policy {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Import policy for dynamic-tunnel under this destination network";
          }
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of tunnel route under this destination network";
          }
    
          leaf-list colors {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            ordered-by user;
            description
              "Set of color list that will be supported for tunnel creation";
          }
        }  // grouping network_type
    
        grouping next_hop_group_intf_type {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface through which to send sampled traffic";
          }
    
          uses apply-advanced;
    
          list next-hop {
            junos:must "((".. .. group-type inet" || ".. .. group-type inet6"))";
            junos:must-message "Next-hop can be specified only for group-type inet or inet6";
            key "name";
            ordered-by user;
            description
              "Address of next hop through which to send sampled traffic";
            uses next_hop_type;
          }  // list next-hop
        }  // grouping next_hop_group_intf_type
    
        grouping next_hop_subgroup_intf_type {
          leaf name {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface through which to send sampled traffic";
          }
    
          uses apply-advanced;
    
          list next-hop {
            junos:must "((".. .. .. group-type inet" || ".. .. .. group-type inet6"))";
            junos:must-message "Next-hop can be specified only for group-type inet or inet6";
            key "name";
            ordered-by user;
            description
              "Address of next hop through which to send sampled traffic";
            uses next_hop_type;
          }  // list next-hop
        }  // grouping next_hop_subgroup_intf_type
    
        grouping next_hop_type {
          description
            "Address of next hop through which to send sampled traffic";
          leaf name {
            type jt:ipaddr;
          }
    
          uses apply-advanced;
        }  // grouping next_hop_type
    
        grouping override-local-server-type {
          description "DHCP override processing";
          uses apply-advanced;
    
          leaf interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of clients allowed on an interface";
          }
    
          leaf no-arp {
            junos:must "((!(".. route-suppression destination") && !(".. route-suppression access-internal")))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            type empty;
            status deprecated;
            description
              "Disable DHCP ARP table population";
          }
    
          leaf bootp-support {
            type empty;
            description
              "Allow processing of bootp requests";
          }
    
          container client-discover-match {
            presence
              "enable client-discover-match";
            description
              "Use secondary match criteria for DISCOVER PDU";
            choice match-with {
              leaf option60-and-option82 {
                type empty;
                description
                  "Use option 60 and option 82";
              }
              leaf incoming-interface {
                type empty;
                description
                  "Use incoming interface";
              }
            }  // choice match-with
          }  // container client-discover-match
    
          container delay-offer {
            description
              "Filter options for dhcp-server";
            uses dhcpv4-filter-option;
          }  // container delay-offer
    
          container process-inform {
            presence "enable process-inform";
            description "Process INFORM PDUs";
            uses apply-advanced;
    
            leaf pool {
              type string {
                length "1 .. 64";
              }
              description
                "Pool name for family inet";
            }
          }  // container process-inform
    
          container include-option-82 {
            description
              "Include option-82 in reply packets";
            uses apply-advanced;
    
            leaf nak {
              type empty;
              description
                "Include option-82 in NAK";
            }
    
            leaf forcerenew {
              type empty;
              description
                "Include option-82 in FORCERENEW";
            }
          }  // container include-option-82
    
          leaf delete-binding-on-renegotiation {
            type empty;
            description
              "Delete binding on renegotiation";
          }
    
          leaf allow-no-end-option {
            type empty;
            description
              "Allow packets without end-of-option";
          }
    
          leaf asymmetric-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced lease time for the client. In seconds";
          }
    
          leaf protocol-attributes {
            type string {
              length "1 .. 64";
            }
            description
              "DHCPv4 attributes to use as defined under access protocol-attributes";
          }
    
          leaf dual-stack {
            type string {
              length "1 .. 64";
            }
            description
              "Dual stack group to use";
          }
        }  // grouping override-local-server-type
    
        grouping dhcpv4-filter-option {
          description
            "Generic DHCPv4 filter processing";
          uses apply-advanced;
    
          leaf delay-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 30";
              }
            }
            units "seconds";
            default "3";
            description
              "Time delay between discover and offer";
          }
    
          container based-on {
            description "Option number";
            uses apply-advanced;
    
            container option-82 {
              presence "enable option-82";
              description "Option 82";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-82
    
            container option-60 {
              presence "enable option-60";
              description "Option 60";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-60
    
            container option-77 {
              presence "enable option-77";
              description "Option 77";
              uses apply-advanced;
    
              container equals {
                description
                  "Generic option equals";
                uses server-v6-option-ascii-hex;
              }  // container equals
    
              container not-equals {
                description
                  "Generic option not equals";
                uses server-v6-option-ascii-hex;
              }  // container not-equals
    
              container starts-with {
                description
                  "Generic option starts-with";
                uses server-v6-option-ascii-hex;
              }  // container starts-with
            }  // container option-77
          }  // container based-on
        }  // grouping dhcpv4-filter-option
    
        grouping override-type {
          description "DHCP override processing";
          uses apply-advanced;
    
          leaf no-unicast-replies {
            junos:must "(!(".. layer2-unicast-replies"))";
            junos:must-message "no-unicast-replies cannot be configured with layer2-unicast-replies";
            type empty;
            description
              "Overwrite unicast bit in incoming packet, when present";
          }
    
          choice allow-snooped-clients-choice {
            leaf allow-snooped-clients {
              type empty;
              description
                "Allow client creation from snooped PDUs";
            }
            leaf no-allow-snooped-clients {
              type empty;
              description
                "Don't allow client creation from snooped PDUs";
            }
          }  // choice allow-snooped-clients-choice
    
          leaf allow-no-end-option {
            type empty;
            description
              "Allow packets without end-of-option";
          }
    
          leaf always-write-giaddr {
            type empty;
            description
              "Overwrite existing 'giaddr' field, when present";
          }
    
          container always-write-option-82 {
            presence
              "enable always-write-option-82";
            description
              "Overwrite existing value of option 82, when present";
            uses write-option-82-type;
          }  // container always-write-option-82
    
          leaf user-defined-option-82 {
            type string {
              length "1 .. 252";
            }
            description
              "Set user defined description for option-82";
          }
    
          leaf layer2-unicast-replies {
            junos:must "(!(".. no-unicast-replies"))";
            junos:must-message "layer2-unicast-replies cannot be configured with no-unicast-replies";
            type empty;
            description
              "Do not broadcast client responses";
          }
    
          leaf trust-option-82 {
            type empty;
            description
              "Trust options-82 option";
          }
    
          leaf delay-authentication {
            type empty;
            description
              "Delay subscriber authentication in DHCP protocol processing until request packet";
          }
    
          leaf disable-relay {
            type empty;
            description
              "Disable DHCP relay processing";
          }
    
          leaf no-bind-on-request {
            type empty;
            description
              "Do not bind if stray DHCP request is received";
          }
    
          leaf interface-client-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 500000";
              }
            }
            description
              "Limit the number of client allowed on an interface";
          }
    
          leaf no-arp {
            junos:must "((!(".. route-suppression destination") && !(".. route-suppression access-internal")))";
            junos:must-message "Cannot specify route-suppression with overrides no-arp";
            type empty;
            status deprecated;
            description
              "Disable DHCP ARP table population";
          }
    
          leaf bootp-support {
            type empty;
            description
              "Allows relay of bootp req and reply";
          }
    
          leaf dual-stack {
            type string {
              length "1 .. 64";
            }
            description
              "Dual stack group to use.";
          }
    
          container client-discover-match {
            presence
              "enable client-discover-match";
            description
              "Use secondary match criteria for DISCOVER PDU";
            choice match-with {
              leaf option60-and-option82 {
                type empty;
                description
                  "Use option 60 and option 82";
              }
              leaf incoming-interface {
                type empty;
                description
                  "Use incoming interface";
              }
            }  // choice match-with
          }  // container client-discover-match
    
          container proxy-mode {
            presence "enable proxy-mode";
            description
              "Put the relay in proxy mode";
          }  // container proxy-mode
    
          leaf asymmetric-lease-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "600 .. 86400";
              }
            }
            units "seconds";
            description
              "Use a reduced lease time for the client. In seconds";
          }
    
          container replace-ip-source-with {
            description
              "Replace IP source address in request and release packets";
            choice replacement-type {
              leaf giaddr {
                type empty;
                description
                  "Replace IP source address with giaddr";
              }
            }  // choice replacement-type
          }  // container replace-ip-source-with
    
          leaf send-release-on-delete {
            type empty;
            description
              "Always send RELEASE to the server when a binding is deleted";
          }
    
          leaf relay-source {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface for relay source";
          }
    
          leaf delete-binding-on-renegotiation {
            type empty;
            description
              "Delete binding on rengotiation";
          }
        }  // grouping override-type
    
        grouping p2mp_ldp_lsp_nh_obj {
          uses apply-advanced;
    
          list root-address {
            key "name";
            description
              "Configure the root address of P2MP LSP";
            leaf name {
              type jt:ipaddr;
              description
                "Root address of the P2MP LSP";
            }
    
            uses apply-advanced;
    
            leaf lsp-id {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 65535";
                }
              }
              description
                "Configure the generic LSP identifier";
            }
    
            list group-address {
              key "name";
              description
                "IPv4/Ipv6 group address for mLDP LSP";
              leaf name {
                type jt:ipaddr;
                description
                  "IPv4/Ipv6 group address";
              }
    
              uses apply-advanced;
    
              list source-address {
                key "name";
                description
                  "IPv4/Ipv6 source address";
                leaf name {
                  type jt:ipaddr;
                  description
                    "IPv4/Ipv6 source address for mLDP LSP";
                }
    
                uses apply-advanced;
              }  // list source-address
            }  // list group-address
          }  // list root-address
        }  // grouping p2mp_ldp_lsp_nh_obj
    
        grouping packet-capture-egress-intf-type {
          uses apply-advanced;
    
          list interface {
            key "name";
            description "Interface options";
            leaf name {
              type union {
                type jt:interface-device;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
          }  // list interface
        }  // grouping packet-capture-egress-intf-type
    
        grouping packet_accounting_output_type {
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list cflowd {
            junos:must "(all ".. interface <*> source-address")";
            junos:must-message "'forwarding-options accounting output interface source-address' must be specified with 'flow-server' and 'interface'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'forwarding-options accounting output interface' must be specified";
            key "name";
            description
              "Cflowd collector where flow records are sent";
            uses cflowd_packet_accounting_type;
          }  // list cflowd
    
          list interface {
            key "name";
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
        }  // grouping packet_accounting_output_type
    
        grouping cflowd_packet_accounting_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf version {
            type enumeration {
              enum "5" {
                value 0;
                description
                  "Export cflowd aggregates in version 5 format";
              }
              enum "8" {
                value 1;
                description
                  "Export cflowd aggregates in version 8 format";
              }
            }
            default "5";
            description
              "Format of exported cflowd aggregates";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
        }  // grouping cflowd_packet_accounting_type
    
        grouping aggregation_type {
          uses apply-advanced;
    
          leaf autonomous-system {
            type empty;
            description
              "Aggregate by autonomous system number";
          }
    
          leaf protocol-port {
            type empty;
            description
              "Aggregate by protocol and port number";
          }
    
          leaf source-prefix {
            type empty;
            description
              "Aggregate by source prefix";
          }
    
          leaf destination-prefix {
            type empty;
            description
              "Aggregate by destination prefix";
          }
    
          container source-destination-prefix {
            presence
              "enable source-destination-prefix";
            description
              "Aggregate by source and destination prefix";
            uses apply-advanced;
    
            leaf caida-compliant {
              type empty;
              description
                "Compatible with Caida record format for prefix aggregation (v8)";
            }
          }  // container source-destination-prefix
        }  // grouping aggregation_type
    
        grouping packet_export_intf_type {
          leaf name {
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interfaces used to send monitored information";
          }
    
          uses apply-advanced;
    
          leaf engine-id {
            type union {
              type uint8;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Identity (number) of this accounting interface";
          }
    
          leaf engine-type {
            type union {
              type uint8;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Type (number) of this accounting interface";
          }
    
          leaf source-address {
            type jt:ipaddr;
            description
              "Address to use for generating monitored packets";
          }
    
          container export-port {
            presence "enable export-port";
            description
              "Jflow export port configuration";
            uses export_port_address_type;
          }  // container export-port
        }  // grouping packet_export_intf_type
    
        grouping export_port_address_type {
          uses apply-advanced;
    
          leaf address {
            type jt:ipv4prefix;
            description
              "Address to use for jflow export port";
          }
    
          leaf gateway {
            type jt:ipv4addr;
            description
              "Gateway address to reach jflow server";
          }
        }  // grouping export_port_address_type
    
        grouping periodic_oam {
          uses apply-advanced;
    
          container mpls-tp-mode {
            presence "enable mpls-tp-mode";
            description
              "MPLS-TP Mode, Do not use IP addressing for OAM";
            uses apply-advanced;
    
            container lsping-channel-type {
              description
                "Supported Control-channel types for MPLS-TP mode....";
              uses apply-advanced;
    
              choice action-choice {
                leaf ipv4 {
                  type empty;
                  description
                    "Use channel-type IPv4(0x0021), With IP-UDP encapsulation";
                }
                leaf on-demand-cv {
                  type empty;
                  description
                    "Use channel-type On-Demand-CV(0x0025), Without IP-UDP encapsulation";
                }
              }  // choice action-choice
            }  // container lsping-channel-type
          }  // container mpls-tp-mode
    
          container bfd-port {
            description
              "Egress knob to select MHOP-BFD port for MPLS BFD";
            uses apply-advanced;
    
            leaf-list import {
              type jt:policy-algebra;
              ordered-by user;
              description "Import policy";
            }
          }  // container bfd-port
    
          container bfd-liveness-detection {
            description
              "Bidirectional Forwarding Detection options";
            uses apply-advanced;
    
            leaf version {
              type enumeration {
                enum "0" {
                  value 0;
                  description
                    "BFD version 0 (deprecated)";
                }
                enum "1" {
                  value 1;
                  description "BFD version 1";
                }
                enum "automatic" {
                  value 2;
                  description
                    "Choose BFD version automatically";
                }
              }
              default "automatic";
              description
                "BFD protocol version number";
            }
    
            leaf minimum-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum transmit and receive interval";
            }
    
            leaf minimum-transmit-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              status deprecated;
              description
                "Minimum transmit interval";
            }
    
            leaf minimum-receive-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum receive interval";
            }
    
            leaf multiplier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255";
                }
              }
              default "3";
              description
                "Detection time multiplier";
            }
    
            choice adaptation-choice {
              leaf no-adaptation {
                type empty;
                description "Disable adaptation";
              }
            }  // choice adaptation-choice
    
            container transmit-interval {
              description
                "Transmit-interval options";
              uses apply-advanced;
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit interval";
              }
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High transmit interval triggering a trap";
              }
            }  // container transmit-interval
    
            container detection-time {
              description
                "Detection-time options";
              uses apply-advanced;
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High detection-time triggering a trap";
              }
            }  // container detection-time
    
            container failure-action {
              description
                "Action to take when BFD session goes down";
              choice action-choice {
                leaf teardown {
                  type empty;
                  description
                    "Teardown label switched path and resignal";
                }
                container make-before-break {
                  presence
                    "enable make-before-break";
                  description
                    "Resignal the label switched path before teardown";
                  uses apply-advanced;
    
                  leaf teardown-timeout {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "0 .. 30";
                      }
                    }
                    units "seconds";
                    description
                      "Time to wait before teardown";
                  }
                }  // container make-before-break
              }  // choice action-choice
            }  // container failure-action
    
            leaf no-router-alert-option {
              type empty;
              description
                "Do not set Router-Alert options in IP header for MPLS-BFD";
            }
    
            leaf use-ip-ttl-1 {
              type empty;
              description
                "Set TTL value to 1 in IP header for MPLS-BFD";
            }
          }  // container bfd-liveness-detection
    
          container performance-monitoring {
            description
              "Performance monitoring options";
            uses apply-advanced;
    
            container traceoptions {
              description "Trace options for PM";
              uses apply-advanced;
    
              container file {
                description "Trace file options";
                leaf filename {
                  type string {
                    junos:posix-pattern "![/ %]";
                    junos:pattern-message "Must not contain '/', % or a space";
                    length "1 .. 1024";
                  }
                  description
                    "Name of file in which to write trace information";
                }
    
                leaf replace {
                  type empty;
                  status deprecated;
                  description
                    "Replace trace file rather than appending to it";
                }
    
                leaf size {
                  type string;
                  description
                    "Maximum trace file size";
                }
    
                leaf files {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "2 .. 1000";
                    }
                  }
                  default "10";
                  description
                    "Maximum number of trace files";
                }
    
                leaf no-stamp {
                  type empty;
                  status deprecated;
                  description
                    "Do not timestamp trace file";
                }
    
                choice world-readable-choice {
                  leaf world-readable {
                    type empty;
                    description
                      "Allow any user to read the log file";
                  }
                  leaf no-world-readable {
                    type empty;
                    description
                      "Don't allow any user to read the log file";
                  }
                }  // choice world-readable-choice
              }  // container file
    
              list flag {
                key "name";
                ordered-by user;
                description "Tracing parameters";
                leaf name {
                  type enumeration {
                    enum "init" {
                      value 0;
                      description
                        "Trace init commnad";
                    }
                    enum "error" {
                      value 1;
                      description
                        "Trace error conditions";
                    }
                    enum "event" {
                      value 2;
                      description
                        "Trace state machine events";
                    }
                    enum "general" {
                      value 3;
                      description
                        "Trace general events";
                    }
                    enum "packet" {
                      value 4;
                      description
                        "Trace various packets ";
                    }
                    enum "timer" {
                      value 5;
                      description
                        "Trace timer processing";
                    }
                    enum "all" {
                      value 6;
                      description
                        "Trace everything";
                    }
                  }
                }
              }  // list flag
            }  // container traceoptions
    
            container querier {
              junos:must "(".. .. .. ultimate-hop-popping")";
              junos:must-message "Performance monitoring can be configured only on ultimate-hop-popping LSPs";
              junos:must "(".. .. .. associate-lsp")";
              junos:must-message "Performance monitoring can be configured only for associated LSPs";
              description "Querier options";
              uses apply-advanced;
    
              container loss {
                description
                  "Loss measurement options";
                uses apply-advanced;
    
                list traffic-class {
                  key "name";
                  description
                    "Traffic class specific options";
                  leaf name {
                    type enumeration {
                      enum "tc-0" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 0;
                        description
                          "Traffic class 0";
                      }
                      enum "tc-1" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 1;
                        description
                          "Traffic class 1";
                      }
                      enum "tc-2" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 2;
                        description
                          "Traffic class 2";
                      }
                      enum "tc-3" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 3;
                        description
                          "Traffic class 3";
                      }
                      enum "tc-4" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 4;
                        description
                          "Traffic class 4";
                      }
                      enum "tc-5" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 5;
                        description
                          "Traffic class 5";
                      }
                      enum "tc-6" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 6;
                        description
                          "Traffic class 6";
                      }
                      enum "tc-7" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 7;
                        description
                          "Traffic class 7";
                      }
                      enum "all" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 8;
                        description
                          "All Traffic class";
                      }
                      enum "none" {
                        value 9;
                        description
                          "No Traffic class";
                      }
                    }
                    description
                      "Traffic class value";
                  }
    
                  uses apply-advanced;
    
                  leaf query-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range
                          "1000 .. 4294967295";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf measurement-quantity {
                    type enumeration {
                      enum "bytes" {
                        value 0;
                        description
                          "Byte loss measurement";
                      }
                      enum "packets" {
                        value 1;
                        description
                          "Packet loss measurement";
                      }
                    }
                    default "packets";
                    description
                      "Loss measurement quantity";
                  }
    
                  leaf average-sample-size {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 30";
                      }
                    }
                    description
                      "Number of samples used in average calculation";
                  }
    
                  leaf loss-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    description
                      "Loss threshold value";
                  }
    
                  leaf loss-threshold-window {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 30";
                      }
                    }
                    description
                      "Number of samples for loss threshold calculation";
                  }
                }  // list traffic-class
              }  // container loss
    
              container delay {
                description
                  "Delay measurement options";
                uses apply-advanced;
    
                list traffic-class {
                  key "name";
                  description
                    "Traffic class specific options";
                  leaf name {
                    type enumeration {
                      enum "tc-0" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 0;
                        description
                          "Traffic class 0";
                      }
                      enum "tc-1" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 1;
                        description
                          "Traffic class 1";
                      }
                      enum "tc-2" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 2;
                        description
                          "Traffic class 2";
                      }
                      enum "tc-3" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 3;
                        description
                          "Traffic class 3";
                      }
                      enum "tc-4" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 4;
                        description
                          "Traffic class 4";
                      }
                      enum "tc-5" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 5;
                        description
                          "Traffic class 5";
                      }
                      enum "tc-6" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 6;
                        description
                          "Traffic class 6";
                      }
                      enum "tc-7" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 7;
                        description
                          "Traffic class 7";
                      }
                      enum "all" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 8;
                        description
                          "All Traffic classes";
                      }
                    }
                    description
                      "Traffic class value";
                  }
    
                  uses apply-advanced;
    
                  leaf query-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range
                          "1000 .. 4294967295";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf padding-size {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 1500";
                      }
                    }
                    description
                      "Size of padding";
                  }
    
                  leaf average-sample-size {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 30";
                      }
                    }
                    description
                      "Number of samples used in average calculation";
                  }
    
                  leaf twcd-delay-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    units "microseconds";
                    description
                      "Two way channel delay threshold value";
                  }
    
                  leaf rtt-delay-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    units "microseconds";
                    description
                      "Round trip delay threshold value";
                  }
                }  // list traffic-class
              }  // container delay
    
              container loss-delay {
                description
                  "Combined loss-delay measurement options";
                uses apply-advanced;
    
                list traffic-class {
                  key "name";
                  description
                    "Traffic class specific options";
                  leaf name {
                    type enumeration {
                      enum "tc-0" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 0;
                        description
                          "Traffic class 0";
                      }
                      enum "tc-1" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 1;
                        description
                          "Traffic class 1";
                      }
                      enum "tc-2" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 2;
                        description
                          "Traffic class 2";
                      }
                      enum "tc-3" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 3;
                        description
                          "Traffic class 3";
                      }
                      enum "tc-4" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 4;
                        description
                          "Traffic class 4";
                      }
                      enum "tc-5" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 5;
                        description
                          "Traffic class 5";
                      }
                      enum "tc-6" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 6;
                        description
                          "Traffic class 6";
                      }
                      enum "tc-7" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 7;
                        description
                          "Traffic class 7";
                      }
                      enum "all" {
                        junos:must "("protocols mpls statistics traffic-class-statistics")";
                        junos:must-message "Traffic class can be configured only for traffic-class-statistics";
                        value 8;
                        description
                          "All Traffic classes";
                      }
                      enum "none" {
                        value 9;
                        description
                          "No Traffic class";
                      }
                    }
                    description
                      "Traffic class value";
                  }
    
                  uses apply-advanced;
    
                  leaf query-interval {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range
                          "1000 .. 4294967295";
                      }
                    }
                    units "milliseconds";
                    description
                      "Minimum transmit interval";
                  }
    
                  leaf measurement-quantity {
                    type enumeration {
                      enum "bytes" {
                        value 0;
                        description
                          "Byte loss measurement";
                      }
                      enum "packets" {
                        value 1;
                        description
                          "Packet loss measurement";
                      }
                    }
                    default "packets";
                    description
                      "Loss measurement quantity";
                  }
    
                  leaf padding-size {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 1500";
                      }
                    }
                    description
                      "Size of padding";
                  }
    
                  leaf average-sample-size {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint16 {
                        range "1 .. 30";
                      }
                    }
                    description
                      "Number of samples used in average calculation";
                  }
    
                  leaf loss-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    description
                      "Loss threshold value";
                  }
    
                  leaf loss-threshold-window {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 30";
                      }
                    }
                    description
                      "Number of samples for loss threshold calculation";
                  }
    
                  leaf twcd-delay-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    units "microseconds";
                    description
                      "Two way channel delay threshold value";
                  }
    
                  leaf rtt-delay-threshold {
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint32 {
                        range "1 .. 4294967295";
                      }
                    }
                    units "microseconds";
                    description
                      "Round trip delay threshold value";
                  }
                }  // list traffic-class
              }  // container loss-delay
            }  // container querier
    
            container responder {
              junos:must "(".. .. .. ultimate-hop-popping")";
              junos:must-message "Performance monitoring can be configured only on ultimate-hop-popping LSPs";
              junos:must "(".. .. .. associate-lsp")";
              junos:must-message "Performance monitoring can be configured only for associated LSPs";
              description "Responder options";
              uses apply-advanced;
    
              container loss {
                description
                  "Loss measurement options";
                uses apply-advanced;
    
                leaf min-query-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1000 .. 4294967295";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum query interval";
                }
              }  // container loss
    
              container delay {
                description
                  "Delay measurement options";
                uses apply-advanced;
    
                leaf min-query-interval {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "1000 .. 4294967295";
                    }
                  }
                  units "milliseconds";
                  description
                    "Minimum query interval";
                }
              }  // container delay
            }  // container responder
          }  // container performance-monitoring
    
          leaf lsp-ping-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "30 .. 3600";
              }
            }
            units "seconds";
            description
              "Time interval between LSP ping messages";
          }
    
          leaf lsp-ping-multiplier {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "1 .. 5";
              }
            }
            description
              "Number of ping reply missed before declaring BFD down";
          }
    
          container traceoptions {
            description
              "Trace options for MPLSOAM process";
            uses apply-advanced;
    
            leaf no-remote-trace {
              junos:must "("system tracing")";
              junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
              type empty;
              description
                "Disable remote tracing";
            }
    
            container file {
              description
                "Trace file information";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "3";
                description
                  "Maximum number of trace files";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
    
              leaf match {
                type jt:regular-expression;
                description
                  "Regular expression for lines to be logged";
              }
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "configuration" {
                    value 0;
                    description
                      "Trace configuration events";
                  }
                  enum "pipe" {
                    value 1;
                    description
                      "Trace pipe activity";
                  }
                  enum "rpc-packet-details" {
                    value 2;
                    description
                      "Trace RPC packet details";
                  }
                  enum "database" {
                    value 3;
                    description
                      "Trace database activity";
                  }
                  enum "network" {
                    value 4;
                    description
                      "Trace network activity";
                  }
                  enum "traceroute" {
                    value 5;
                    description
                      "Trace traceroute activity";
                  }
                  enum "all" {
                    value 6;
                    description
                      "Trace everything";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
        }  // grouping periodic_oam
    
        grouping pim_bootstrap_options_type {
          uses apply-advanced;
    
          leaf priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 255";
              }
            }
            description
              "Eligibility to be the bootstrap router";
          }
    
          leaf-list import {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Bootstrap import policy";
          }
    
          leaf-list export {
            type jt:policy-algebra;
            ordered-by user;
            description
              "Bootstrap export policy";
          }
        }  // grouping pim_bootstrap_options_type
    
        grouping pim_filter_obj {
          description
            "Filter to apply to tracing";
          leaf match-on {
            type enumeration {
              enum "prefix" {
                value 0;
                description
                  "Filter based on prefix";
              }
            }
            description
              "Argument on which to match";
          }
    
          leaf-list policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Filter policy";
          }
        }  // grouping pim_filter_obj
    
        grouping pim_rp_group_range_type {
          leaf name {
            type jt:ipprefix;
          }
    
          uses apply-advanced;
    
          leaf nexthop-hold-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1000";
              }
            }
            units "milliseconds";
            description
              "Nexthop hold time in milliseconds";
          }
        }  // grouping pim_rp_group_range_type
    
        grouping pm-rspan-bridge-domain {
          description
            "RSPAN bridge-domain for pm";
          leaf name {
            type string;
            description
              "Bridge domain name or VLAN id";
          }
    
          uses apply-advanced;
        }  // grouping pm-rspan-bridge-domain
    
        grouping pm-rspan-vlan {
          description "RSPAN vlan for pm";
          leaf name {
            type string;
            description "VLAN name or VLAN id";
          }
    
          uses apply-advanced;
    
          leaf no-tag {
            type empty;
            description
              "Removes extra RSPAN tag from mirrored packets";
          }
        }  // grouping pm-rspan-vlan
    
        grouping pm_family_input_type {
          description
            "Input options for port mirroring";
          uses apply-advanced;
    
          leaf rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            description
              "Ratio of packets to be sampled (1 out of N)";
          }
    
          leaf run-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 20";
              }
            }
            description
              "Number of samples after initial trigger";
          }
    
          leaf maximum-packet-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 9216";
              }
            }
            units "bytes";
            default "0";
            description
              "Maximum length of the mirrored packet";
          }
        }  // grouping pm_family_input_type
    
        grouping programmable-rpd-type {
          uses apply-advanced;
    
          container traceoptions {
            description "Trace options";
            uses apply-advanced;
    
            container file {
              description "Trace file options";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf replace {
                type empty;
                status deprecated;
                description
                  "Replace trace file rather than appending to it";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "10";
                description
                  "Maximum number of trace files";
              }
    
              leaf no-stamp {
                type empty;
                status deprecated;
                description
                  "Do not timestamp trace file";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
            }  // container file
    
            list flag {
              key "name";
              ordered-by user;
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "client" {
                    value 0;
                    description "Client events";
                  }
                  enum "japi" {
                    value 1;
                    description
                      "JAPI related traces";
                  }
                  enum "routing-interface" {
                    value 2;
                    description
                      "Routing interface traces";
                  }
                  enum "route" {
                    value 3;
                    description
                      "Trace routing information";
                  }
                  enum "normal" {
                    value 4;
                    description
                      "Trace normal events";
                  }
                  enum "general" {
                    value 5;
                    description
                      "Trace general events";
                  }
                  enum "state" {
                    value 6;
                    description
                      "Trace state transitions";
                  }
                  enum "policy" {
                    value 7;
                    description
                      "Trace policy processing";
                  }
                  enum "task" {
                    value 8;
                    description
                      "Trace routing protocol task processing";
                  }
                  enum "timer" {
                    value 9;
                    description
                      "Trace routing protocol timer processing";
                  }
                  enum "all" {
                    value 10;
                    description
                      "Trace everything";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
    
          container purge-timeout {
            presence "enable purge-timeout";
            description
              "Purge timeout for all programmable-rpd clients in seconds";
            choice purge-parm {
              leaf never {
                type empty;
                description
                  "Client programmed objects are never purged";
              }
              leaf timeout {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 604800";
                  }
                }
                units "seconds";
                description
                  "Timeout value, in seconds, for purging client programmed objects";
              }
            }  // choice purge-parm
          }  // container purge-timeout
    
          list client {
            key "name";
            ordered-by user;
            description
              "Programmable-rpd client options";
            leaf name {
              type string {
                length "1 .. 255";
              }
              description "Client ID";
            }
    
            uses apply-advanced;
    
            list interface-notification {
              key "name";
              ordered-by user;
              description
                "Interfaces for notification";
              leaf name {
                type string {
                  length "1 .. 32";
                }
                description "Interface";
              }
    
              uses apply-advanced;
            }  // list interface-notification
          }  // list client
    
          container rib-service {
            presence "enable rib-service";
            description
              "RIB service API options";
            uses apply-advanced;
    
            container dynamic-next-hop-interface {
              presence
                "enable dynamic-next-hop-interface";
              description
                "Update routes for next-hop interface changes";
              uses apply-advanced;
    
              choice enable-disable {
                leaf disable {
                  type empty;
                  description
                    "Disable dynamic next-hop interface handling";
                }
              }  // choice enable-disable
            }  // container dynamic-next-hop-interface
          }  // container rib-service
        }  // grouping programmable-rpd-type
    
        grouping qualified_nh_obj {
          leaf name {
            type union {
              type jt:ipaddr-or-interface;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Next hop to destination";
          }
    
          uses apply-advanced;
    
          leaf preference {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Preference of qualified next hop";
          }
    
          leaf metric {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Metric of qualified next hop";
          }
    
          leaf interface {
            type union {
              type jt:interface-name;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "Interface of qualified next hop";
          }
    
          leaf mac-address {
            type jt:mac-unicast;
            description "Next-hop Mac Address";
          }
    
          leaf tag {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Tag string";
          }
    
          container bfd-liveness-detection {
            description
              "Bidirectional Forwarding Detection (BFD) options";
            uses apply-advanced;
    
            leaf version {
              type enumeration {
                enum "0" {
                  value 0;
                  description
                    "BFD version 0 (deprecated)";
                }
                enum "1" {
                  value 1;
                  description "BFD version 1";
                }
                enum "automatic" {
                  value 2;
                  description
                    "Choose BFD version automatically";
                }
              }
              default "automatic";
              description
                "BFD protocol version number";
            }
    
            leaf minimum-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum transmit and receive interval";
            }
    
            leaf minimum-transmit-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              status deprecated;
              description
                "Minimum transmit interval";
            }
    
            leaf minimum-receive-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Minimum receive interval";
            }
    
            leaf multiplier {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 255";
                }
              }
              default "3";
              description
                "Detection time multiplier";
            }
    
            choice adaptation-choice {
              leaf no-adaptation {
                type empty;
                description "Disable adaptation";
              }
            }  // choice adaptation-choice
    
            container transmit-interval {
              description
                "Transmit-interval options";
              uses apply-advanced;
    
              leaf minimum-interval {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "1 .. 255000";
                  }
                }
                units "milliseconds";
                description
                  "Minimum transmit interval";
              }
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High transmit interval triggering a trap";
              }
            }  // container transmit-interval
    
            container detection-time {
              description
                "Detection-time options";
              uses apply-advanced;
    
              leaf threshold {
                type union {
                  type uint32;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                units "milliseconds";
                description
                  "High detection-time triggering a trap";
              }
            }  // container detection-time
    
            container authentication {
              description
                "Authentication options";
              uses apply-advanced;
    
              leaf key-chain {
                junos:must "(".. algorithm")";
                junos:must-message "May not be configured without algorithm";
                junos:must "("security authentication-key-chains key-chain $$")";
                junos:must-message "Referenced key-chain must be defined";
                type string;
                description "Key chain name";
              }
    
              leaf algorithm {
                junos:must "(".. key-chain")";
                junos:must-message "May not be configured without key-chain";
                type enumeration {
                  enum "simple-password" {
                    value 0;
                    description
                      "Simple password";
                  }
                  enum "keyed-md5" {
                    value 1;
                    description
                      "Keyed message Digest 5";
                  }
                  enum "meticulous-keyed-md5" {
                    value 2;
                    description
                      "Meticulous keyed message Digest 5";
                  }
                  enum "keyed-sha-1" {
                    value 3;
                    description
                      "Keyed secure hash algorithm (SHA1) ";
                  }
                  enum "meticulous-keyed-sha-1" {
                    value 4;
                    description
                      "Meticulous keyed secure hash algorithm (SHA1) ";
                  }
                }
                description "Algorithm name";
              }
    
              leaf loose-check {
                type empty;
                description
                  "Verify authentication only if authentication is negotiated";
              }
            }  // container authentication
    
            leaf neighbor {
              type jt:ipaddr;
              description "BFD neighbor address";
            }
    
            leaf local-address {
              type jt:ipaddr;
              description
                "BFD local address (for multihop only)";
            }
    
            leaf holddown-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 255000";
                }
              }
              units "milliseconds";
              description
                "Time to hold the session-UP notification to the client";
            }
    
            leaf minimum-receive-ttl {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint8 {
                  range "1 .. 255";
                }
              }
              description
                "Minimum receive TTL below which to drop";
            }
          }  // container bfd-liveness-detection
        }  // grouping qualified_nh_obj
    
        grouping reconfigure-trigger-type {
          description "DHCP reconfigure trigger";
          uses apply-advanced;
    
          leaf radius-disconnect {
            type empty;
            description
              "Trigger DHCP reconfigure by radius initiated disconnect";
          }
        }  // grouping reconfigure-trigger-type
    
        grouping reconfigure-type {
          description
            "DHCP reconfigure processing";
          uses apply-advanced;
    
          leaf clear-on-abort {
            type empty;
            description
              "Delete client on reconfiguration abort";
          }
    
          leaf attempts {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            description
              "Number of reconfigure attempts before aborting";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            description
              "Initial timeout value for retry";
          }
    
          leaf token {
            type string {
              length "1 .. 244";
            }
            description "Reconfigure token";
          }
    
          container trigger {
            description
              "DHCP reconfigure trigger";
            uses reconfigure-trigger-type;
          }  // container trigger
    
          leaf support-option-pd-exclude {
            type empty;
            description
              "Request prefix exclude option in reconfigure message";
          }
        }  // grouping reconfigure-type
    
        grouping relay-active-leasequery-v4-type {
          description
            "Configure active leasequery";
          uses apply-advanced;
    
          leaf topology-discover {
            junos:must "(".. peer-address")";
            junos:must-message "Must configure [peer-address] to configure topology-discover";
            type empty;
            description "Topology discovery";
          }
    
          list peer-address {
            key "name";
            ordered-by user;
            description "Server ip address";
            leaf name {
              type jt:ipaddr;
              description "Peer ip address";
            }
    
            uses apply-advanced;
          }  // list peer-address
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "120";
            description
              "Read/write timeout in seconds";
          }
    
          leaf idle-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "60";
            description
              "Idle timeout in seconds";
          }
        }  // grouping relay-active-leasequery-v4-type
    
        grouping relay-active-leasequery-v6-type {
          description
            "Configure active leasequery";
          uses apply-advanced;
    
          leaf topology-discover {
            junos:must "(".. peer-address")";
            junos:must-message "Must configure [peer-address] to configure topology-discover";
            type empty;
            description "Topology discovery";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "120";
            description
              "Read/write timeout in seconds";
          }
    
          leaf idle-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "60";
            description
              "Idle timeout in seconds";
          }
    
          list peer-address {
            key "name";
            ordered-by user;
            description "Peer ipv6 address";
            leaf name {
              type jt:ipv6addr;
              description "Peer ipv6 address";
            }
    
            uses apply-advanced;
          }  // list peer-address
        }  // grouping relay-active-leasequery-v6-type
    
        grouping relay-bulk-leasequery-v4-type {
          junos:must "(".. overrides always-write-option-82")";
          junos:must-message "Must configure [overrides always-write-option-82] to overwrite circuit-id for bulk-leasequery";
          junos:must "((".. relay-option-82 circuit-id" && !((".. relay-option-82 circuit-id use-interface-description" || ".. relay-option-82 circuit-id require-interface-description"))))";
          junos:must-message "Must configure [relay-option-82 circuit-id] without description to insert circuit-id for bulk-leasequery";
          description
            "Configure bulk leasequery";
          uses apply-advanced;
    
          leaf attempts {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 720";
              }
            }
            default "360";
            description
              "Number of retry attempts";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            units "seconds";
            default "10";
            description "Number of seconds";
          }
        }  // grouping relay-bulk-leasequery-v4-type
    
        grouping relay-bulk-leasequery-v6-type {
          junos:must "(".. relay-agent-interface-id")";
          junos:must-message "Must configure [relay-agent-interface-id] to insert interface-id for bulk-leasequery";
          description
            "Configure bulk leasequery";
          uses apply-advanced;
    
          leaf attempts {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            default "6";
            description
              "Number of retry attempts";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            units "seconds";
            default "10";
            description "Number of seconds";
          }
    
          container trigger {
            description
              "Trigger for bulk leasequery";
            leaf automatic {
              type empty;
              description
                "Trigger automatically";
            }
          }  // container trigger
        }  // grouping relay-bulk-leasequery-v6-type
    
        grouping relay-leasequery-type {
          description "Configure leasequery";
          uses apply-advanced;
    
          leaf attempts {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            default "6";
            description
              "Number of retry attempts";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            units "seconds";
            default "10";
            description "Number of seconds";
          }
        }  // grouping relay-leasequery-type
    
        grouping relay-option-60-type-group {
          description
            "DHCP option-60 processing";
          uses apply-advanced;
    
          container vendor-option {
            description "Add vendor option";
            uses apply-advanced;
    
            container equals {
              description "Option 60 equals";
              uses relay-option-60-match-group;
            }  // container equals
    
            container not-equals {
              status deprecated;
              description
                "Option 60 does not equal";
              uses relay-option-60-match-group;
            }  // container not-equals
    
            container starts-with {
              description
                "Option 60 starts with";
              uses relay-option-60-match-group;
            }  // container starts-with
    
            choice server-group-choice {
              leaf default-relay-server-group {
                junos:must "(".. .. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is not made";
              }
              leaf default-local-server-group {
                junos:must "(".. .. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is not made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is not made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is not made";
              }
            }  // choice server-group-choice
          }  // container vendor-option
        }  // grouping relay-option-60-type-group
    
        grouping relay-option-60-match-group {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "(".. .. .. .. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit forwarding options dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "(".. .. .. .. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "(".. .. .. .. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "(".. .. .. .. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list hexadecimal
        }  // grouping relay-option-60-match-group
    
        grouping relay-option-60-type-top {
          description
            "DHCP option-60 processing";
          uses apply-advanced;
    
          container vendor-option {
            description "Add vendor option";
            uses apply-advanced;
    
            container equals {
              description "Option 60 equals";
              uses relay-option-60-match-top;
            }  // container equals
    
            container not-equals {
              status deprecated;
              description
                "Option 60 does not equal";
              uses relay-option-60-match-top;
            }  // container not-equals
    
            container starts-with {
              description
                "Option 60 starts with";
              uses relay-option-60-match-top;
            }  // container starts-with
    
            choice server-group-choice {
              leaf default-relay-server-group {
                junos:must "(".. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is not made";
              }
              leaf default-local-server-group {
                junos:must "(".. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is not made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is not made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is not made";
              }
            }  // choice server-group-choice
          }  // container vendor-option
        }  // grouping relay-option-60-type-top
    
        grouping relay-option-60-match-top {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "(".. .. .. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit forwarding options dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "(".. .. .. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "(".. .. .. .. .. server-group $$")";
                junos:must-message "Referenced group must be defined under [edit forwarding-options dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "(".. .. .. .. .. .. .. system services dhcp-local-server group $$")";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list hexadecimal
        }  // grouping relay-option-60-match-top
    
        grouping relay-option-82-type {
          description
            "DHCP option-82 processing";
          uses apply-advanced;
    
          container circuit-id {
            presence "enable circuit-id";
            description "Add circuit identifier";
            uses apply-advanced;
    
            container prefix {
              description
                "Add prefix to circuit/interface-id or remote-id";
              uses apply-advanced;
    
              leaf host-name {
                type empty;
                description
                  "Add router host name to circuit / interface-id or remote-id";
              }
    
              leaf logical-system-name {
                type empty;
                description
                  "Add logical system name to circuit / interface-id or remote-id";
              }
    
              leaf routing-instance-name {
                type empty;
                description
                  "Add routing instance name to circuit / interface-id or remote-id";
              }
            }  // container prefix
    
            leaf use-interface-description {
              junos:must "(!(".. require-interface-description"))";
              junos:must-message "use-interface-description may not be set with require-interface-desciption";
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Use interface description instead of circuit identifier";
            }
    
            leaf use-vlan-id {
              junos:must "((!(".. no-vlan-interface-name") && (!(".. use-interface-description") && !(".. require-interface-description"))))";
              junos:must-message "Vlan-tag cannot be added as no-vlan-interface-name or interface-description is configured";
              type empty;
              description
                "Use VLAN id instead of name";
            }
    
            container vlan-id-only {
              junos:must "(!((".. include-irb-and-l2" || (".. keep-incoming-circuit-id" || (".. user-defined" || (".. no-vlan-interface-name" || (".. use-interface-description" || (".. use-vlan-id" || (".. prefix" || ".. require-interface-description")))))))))";
              junos:must-message "Vlan-id-only cannot be clubbed along with any other option-82 knob";
              presence "enable vlan-id-only";
              description "Use only VLAN id";
              uses apply-advanced;
            }  // container vlan-id-only
    
            leaf no-vlan-interface-name {
              type empty;
              description
                "Not include vlan or interface name";
            }
    
            leaf include-irb-and-l2 {
              type empty;
              description
                "Include IRB and L2 interface name";
            }
    
            leaf user-defined {
              junos:must "(!((".. include-irb-and-l2" || (".. keep-incoming-circuit-id" || (".. no-vlan-interface-name" || (".. use-interface-description" || (".. use-vlan-id" || (".. prefix" || ".. require-interface-description"))))))))";
              junos:must-message "The user defined description for option 82 must be defined in order to see the usage and doesnt coexist with prefix";
              type empty;
              description
                "Include user defined string";
            }
    
            leaf keep-incoming-circuit-id {
              type empty;
              description
                "Keep incoming circuit identifier";
            }
          }  // container circuit-id
    
          container remote-id {
            presence "enable remote-id";
            description "Add remote identifier";
            uses apply-advanced;
    
            container prefix {
              description
                "Add prefix to circuit/interface-id or remote-id";
              uses apply-advanced;
    
              leaf host-name {
                type empty;
                description
                  "Add router host name to circuit / interface-id or remote-id";
              }
    
              leaf logical-system-name {
                type empty;
                description
                  "Add logical system name to circuit / interface-id or remote-id";
              }
    
              leaf routing-instance-name {
                type empty;
                description
                  "Add routing instance name to circuit / interface-id or remote-id";
              }
            }  // container prefix
    
            leaf use-interface-description {
              junos:must "(!(".. require-interface-description"))";
              junos:must-message "use-interface-description may not be set with require-interface-desciption";
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Use interface description instead of circuit identifier";
            }
    
            leaf use-vlan-id {
              junos:must "((!(".. no-vlan-interface-name") && (!(".. use-interface-description") && !(".. require-interface-description"))))";
              junos:must-message "Vlan-tag cannot be added as no-vlan-interface-name or interface-description is configured";
              type empty;
              description
                "Use VLAN id instead of name";
            }
    
            leaf no-vlan-interface-name {
              type empty;
              description
                "Not include vlan or interface name";
            }
    
            leaf include-irb-and-l2 {
              type empty;
              description
                "Include IRB and L2 interface name";
            }
    
            container hostname-only {
              junos:must "(!((".. include-irb-and-l2" || (".. keep-incoming-remote-id" || (".. no-vlan-interface-name" || (".. use-interface-description" || (".. use-vlan-id" || (".. prefix" || ".. use-string"))))))))";
              junos:must-message "Hostname-only cannot be clubbed with any other sub-option";
              presence "enable hostname-only";
              description
                "Include hostname only";
              uses apply-advanced;
            }  // container hostname-only
    
            leaf keep-incoming-remote-id {
              type empty;
              description
                "Keep incoming remote identifier";
            }
    
            leaf use-string {
              junos:must "(!((".. use-interface-description" || (".. require-interface-description" || (".. include-irb-and-l2" || (".. keep-incoming-circuit-id" || (".. no-vlan-interface-name" || ".. use-vlan-id")))))))";
              junos:must-message "use-string can only coexist with prefix";
              type string;
              description
                "Use raw string instead of the default remote id";
            }
          }  // container remote-id
    
          leaf server-id-override {
            junos:must "(!(".. link-selection"))";
            junos:must-message "server-id-override cannot be configured with link-selection";
            type empty;
            description
              "Add link-selection and server-id sub-options on packets to server";
          }
    
          leaf link-selection {
            junos:must "(!(".. server-id-override"))";
            junos:must-message "link-selection cannot be configured with server-id-override";
            type empty;
            description
              "Add link-selection suboption on packets to server";
          }
    
          leaf exclude-relay-agent-identifier {
            type empty;
            description
              "Exclude relay agent identifier from packets to server";
          }
    
          container vendor-specific {
            description
              "Add vendor-specific information";
            uses jdhcp-vendor-specific-type;
          }  // container vendor-specific
        }  // grouping relay-option-82-type
    
        grouping relay-v4-option-ascii-hex {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
                junos:must-message "Referenced group must be defined under [edit forwarding dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "((".. .. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. system services dhcp-local-server group $$" || ".. .. .. .. .. system services dhcp-local-server group $$"))))";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
                junos:must-message "Referenced group must be defined under [edit forwarding dhcp-relay server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf local-server-group {
                junos:must "((".. .. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. .. system services dhcp-local-server group $$" || (".. .. .. .. .. .. system services dhcp-local-server group $$" || ".. .. .. .. .. system services dhcp-local-server group $$"))))";
                junos:must-message "Referenced group must be defined under [edit system services dhcp-local-server group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP local server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list hexadecimal
        }  // grouping relay-v4-option-ascii-hex
    
        grouping relay-v6-option-ascii-hex {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
                junos:must-message "Referenced group must be defined under [edit forwarding options dhcp-relay dhcpv6 server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
    
            choice server-group-choice {
              leaf relay-server-group {
                junos:must "((".. .. .. .. .. .. server-group $$" || (".. .. .. .. .. server-group $$" || (".. .. .. .. server-group $$" || ".. .. .. server-group $$"))))";
                junos:must-message "Referenced group must be defined under [edit forwarding options dhcp-relay dhcpv6 server-group]";
                type string {
                  length "1 .. 64";
                }
                description
                  "Name of DHCP relay server group when match is made";
              }
              leaf drop {
                type empty;
                description
                  "Discard when a match is made";
              }
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
            }  // choice server-group-choice
          }  // list hexadecimal
        }  // grouping relay-v6-option-ascii-hex
    
        grouping rib-inet3 {
          uses apply-advanced;
    
          container inet.3 {
            presence "enable inet.3";
            description
              "Use inet.3 to exchange labeled unicast routes";
            uses apply-advanced;
          }  // container inet.3
        }  // grouping rib-inet3
    
        grouping rib_aggregate_type {
          uses apply-advanced;
    
          container defaults {
            description "Global route options";
            uses apply-advanced;
    
            container metric {
              presence "enable metric";
              description "Metric value";
              uses rib_static_metric_type;
            }  // container metric
    
            container metric2 {
              presence "enable metric2";
              description "Metric value 2";
              uses rib_static_metric_type;
            }  // container metric2
    
            container metric3 {
              presence "enable metric3";
              description "Metric value 3";
              uses rib_static_metric_type;
            }  // container metric3
    
            container metric4 {
              presence "enable metric4";
              description "Metric value 4";
              uses rib_static_metric_type;
            }  // container metric4
    
            container tag {
              presence "enable tag";
              description "Tag string";
              uses rib_static_metric_type;
            }  // container tag
    
            container tag2 {
              presence "enable tag2";
              description "Tag string 2";
              uses rib_static_metric_type;
            }  // container tag2
    
            container preference {
              presence "enable preference";
              description "Preference value";
              uses rib_static_metric_type;
            }  // container preference
    
            container preference2 {
              presence "enable preference2";
              description "Preference value 2";
              uses rib_static_metric_type;
            }  // container preference2
    
            container color {
              presence "enable color";
              description
                "Color (preference) value";
              uses rib_static_metric_type;
            }  // container color
    
            container color2 {
              presence "enable color2";
              description
                "Color (preference) value 2";
              uses rib_static_metric_type;
            }  // container color2
    
            leaf-list community {
              type jt:community;
              ordered-by user;
              description
                "BGP community identifier";
            }
    
            container as-path {
              description
                "Autonomous system path";
              uses apply-advanced;
    
              leaf path {
                type string;
                description
                  "Autonomous system path";
              }
    
              leaf origin {
                type enumeration {
                  enum "igp" {
                    value 0;
                    description
                      "Path originated in the local IGP";
                  }
                  enum "egp" {
                    value 1;
                    description
                      "Path originated in another AS";
                  }
                  enum "incomplete" {
                    value 2;
                    description
                      "Path was learned by some other means";
                  }
                }
              }
    
              leaf atomic-aggregate {
                type empty;
                description
                  "Add ATOMIC_AGGREGATE path attribute to route";
              }
    
              container aggregator {
                presence "enable aggregator";
                description
                  "Add AGGREGATOR path attribute to route";
              }  // container aggregator
    
              leaf as-number {
                type string {
                  junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                  junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                }
                description
                  " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
              }
    
              leaf address {
                type jt:ipv4addr;
                description
                  "Address of BGP system that formed the route";
              }
            }  // container as-path
    
            leaf discard {
              type empty;
              description
                "Drop packets to destination; send no ICMP unreachables";
            }
    
            leaf next-table {
              type string;
              description
                "Next hop to another table";
            }
    
            choice brief_flag {
              leaf brief {
                type empty;
                description
                  "Include longest common sequences from contributing paths";
              }
              leaf full {
                type empty;
                description
                  "Include all AS numbers from all contributing paths";
              }
            }  // choice brief_flag
    
            choice passive_flag {
              leaf active {
                type empty;
                description
                  "Remove inactive route from forwarding table";
              }
              leaf passive {
                type empty;
                description
                  "Retain inactive route in forwarding table";
              }
            }  // choice passive_flag
          }  // container defaults
    
          list route {
            key "name";
            ordered-by user;
            description
              "Individual route options";
            leaf name {
              type jt:ipprefix;
              description "Destination prefix";
            }
    
            uses apply-advanced;
    
            leaf-list policy {
              type jt:policy-algebra;
              ordered-by user;
              description "Policy filter";
            }
    
            container metric {
              presence "enable metric";
              description "Metric value";
              uses rib_static_metric_type;
            }  // container metric
    
            container metric2 {
              presence "enable metric2";
              description "Metric value 2";
              uses rib_static_metric_type;
            }  // container metric2
    
            container metric3 {
              presence "enable metric3";
              description "Metric value 3";
              uses rib_static_metric_type;
            }  // container metric3
    
            container metric4 {
              presence "enable metric4";
              description "Metric value 4";
              uses rib_static_metric_type;
            }  // container metric4
    
            container tag {
              presence "enable tag";
              description "Tag string";
              uses rib_static_metric_type;
            }  // container tag
    
            container tag2 {
              presence "enable tag2";
              description "Tag string 2";
              uses rib_static_metric_type;
            }  // container tag2
    
            container preference {
              presence "enable preference";
              description "Preference value";
              uses rib_static_metric_type;
            }  // container preference
    
            container preference2 {
              presence "enable preference2";
              description "Preference value 2";
              uses rib_static_metric_type;
            }  // container preference2
    
            container color {
              presence "enable color";
              description
                "Color (preference) value";
              uses rib_static_metric_type;
            }  // container color
    
            container color2 {
              presence "enable color2";
              description
                "Color (preference) value 2";
              uses rib_static_metric_type;
            }  // container color2
    
            leaf-list community {
              type jt:community;
              ordered-by user;
              description
                "BGP community identifier";
            }
    
            container as-path {
              description
                "Autonomous system path";
              uses apply-advanced;
    
              leaf path {
                type string;
                description
                  "Autonomous system path";
              }
    
              leaf origin {
                type enumeration {
                  enum "igp" {
                    value 0;
                    description
                      "Path originated in the local IGP";
                  }
                  enum "egp" {
                    value 1;
                    description
                      "Path originated in another AS";
                  }
                  enum "incomplete" {
                    value 2;
                    description
                      "Path was learned by some other means";
                  }
                }
              }
    
              leaf atomic-aggregate {
                type empty;
                description
                  "Add ATOMIC_AGGREGATE path attribute to route";
              }
    
              container aggregator {
                presence "enable aggregator";
                description
                  "Add AGGREGATOR path attribute to route";
              }  // container aggregator
    
              leaf as-number {
                type string {
                  junos:posix-pattern "^[0-9]+(.[0-9]+)?$";
                  junos:pattern-message "Use format 'x' or 'x.y' to specify number 'x' (Range 1 .. 4294967295) or number with higher 2 bytes 'x' (Range 0 .. 65535) and lower 2 bytes 'y' (Range 0 .. 65535) respectively";
                }
                description
                  " Autonomous system number in plain number or 'higher 16bits'.'Lower 16 bits' (asdot notation) format";
              }
    
              leaf address {
                type jt:ipv4addr;
                description
                  "Address of BGP system that formed the route";
              }
            }  // container as-path
    
            leaf discard {
              type empty;
              description
                "Drop packets to destination; send no ICMP unreachables";
            }
    
            leaf next-table {
              type string;
              description
                "Next hop to another table";
            }
    
            choice brief_flag {
              leaf brief {
                type empty;
                description
                  "Include longest common sequences from contributing paths";
              }
              leaf full {
                type empty;
                description
                  "Include all AS numbers from all contributing paths";
              }
            }  // choice brief_flag
    
            choice passive_flag {
              leaf active {
                type empty;
                description
                  "Remove inactive route from forwarding table";
              }
              leaf passive {
                type empty;
                description
                  "Retain inactive route in forwarding table";
              }
            }  // choice passive_flag
          }  // list route
        }  // grouping rib_aggregate_type
    
        grouping rib_group_inet_type {
          description "Routing table group";
          leaf ribgroup-name {
            type string;
            description
              "Name of the routing table group";
          }
        }  // grouping rib_group_inet_type
    
        grouping rib_group_type {
          uses apply-advanced;
    
          leaf inet-old-style {
            type string;
            status deprecated;
            description
              "Name of the IPv4 routing table group";
          }
    
          leaf inet {
            type string;
            description
              "Name of the IPv4 routing table group";
          }
    
          leaf inet3 {
            type string;
            description
              "Name of the IPv4 inet.3 routing table group";
          }
    
          leaf inet6 {
            type string;
            description
              "Name of the IPv6 routing table group";
          }
    
          leaf inet63 {
            type string;
            description
              "Name of the IPv6 inet6.3 routing table group";
          }
        }  // grouping rib_group_type
    
        grouping rib_static_metric_type {
          leaf metric-value {
            type union {
              type uint32;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description "Metric value";
          }
    
          leaf type {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 16";
              }
            }
            description "Metric type";
          }
        }  // grouping rib_static_metric_type
    
        grouping rip_filter_obj {
          description
            "Filter to apply to tracing";
          leaf match-on {
            type enumeration {
              enum "prefix" {
                value 0;
                description
                  "Filter based on prefix";
              }
            }
            description
              "Argument on which to match";
          }
    
          leaf-list policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Filter policy";
          }
        }  // grouping rip_filter_obj
    
        grouping route_record_traceoptions {
          description
            "Traceoptions for sampling route record";
          uses apply-advanced;
    
          leaf no-remote-trace {
            junos:must "("system tracing")";
            junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
            type empty;
            description "Disable remote tracing";
          }
    
          container file {
            description "Trace file information";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "3";
              description
                "Maximum number of trace files";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
    
            leaf match {
              type jt:regular-expression;
              description
                "Regular expression for lines to be logged";
            }
          }  // container file
    
          leaf level {
            type enumeration {
              enum "error" {
                value 0;
                description
                  "Match error conditions";
              }
              enum "warning" {
                value 1;
                description
                  "Match warning messages";
              }
              enum "notice" {
                value 2;
                description
                  "Match conditions that should be handled specially";
              }
              enum "info" {
                value 3;
                description
                  "Match informational messages";
              }
              enum "verbose" {
                value 4;
                description
                  "Match verbose messages";
              }
              enum "all" {
                value 5;
                description "Match all levels";
              }
            }
            default "error";
            description
              "Level of debugging output";
          }
    
          list flag {
            key "name";
            ordered-by user;
            description
              "Area of route-record to enable debuging output";
            leaf name {
              type enumeration {
                enum "parse" {
                  value 0;
                  description
                    "Trace parsing code";
                }
                enum "all" {
                  value 1;
                  description
                    "Trace all area of jflow-service code";
                }
              }
            }
          }  // list flag
        }  // grouping route_record_traceoptions
    
        grouping rpd_rib_group_type {
          description "Routing table group";
          leaf name {
            type string;
            description "Routing table group";
          }
    
          uses apply-advanced;
    
          leaf export-rib {
            type string;
            description "Export routing table";
          }
    
          leaf-list import-rib {
            type string;
            ordered-by user;
            description "Import routing table";
          }
    
          leaf-list import-policy {
            type jt:policy-algebra;
            ordered-by user;
            description "Import policy";
          }
        }  // grouping rpd_rib_group_type
    
        grouping rpm-next-hop {
          leaf name {
            type jt:ipaddr;
            description
              "Next hop to destination";
          }
    
          uses apply-advanced;
    
          list rpm-probe {
            key "name";
            ordered-by user;
            leaf name {
              junos:must "("services rpm probe $$")";
              junos:must-message "Referenced RPM probe must be defined under 'services rpm probe'";
              type string;
              description "RPM probe to track";
            }
    
            leaf rpm-test {
              junos:must "("services rpm probe ${rpm-probe} test $$")";
              junos:must-message "Referenced RPM test must be defined under 'services rpm probe <probe> test '";
              type string;
              description "RPM test to track";
            }
          }  // list rpm-probe
        }  // grouping rpm-next-hop
    
        grouping sampling_family_inet6_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_sampling_inet6_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "((any ".. flow-server <*>" || any ".. extension-service <*>"))";
            junos:must-message "'flow-server' or 'extension-service' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline;
          }  // container inline-jflow
    
          list extension-service {
            junos:must "(!(".. flow-active-timeout"))";
            junos:must-message "'.. flow-active-timeout' is not needed with 'extension-service'";
            junos:must "(!(".. flow-inactive-timeout"))";
            junos:must-message "'.. flow-inactive-timeout' is not valid for 'extension-service'";
            junos:must "(!(".. aggregate-export-interval"))";
            junos:must-message "'.. aggregate-export-interval' is not valid for 'extension-service'";
            junos:must "(!(any ".. flow-server <*>"))";
            junos:must-message "'.. flow-server' is not needed with 'extension-service'";
            junos:must "(!(any ".. interface <*> source-address"))";
            junos:must-message "'.. interface source-address' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-id"))";
            junos:must-message "'.. interface engine-id' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-type"))";
            junos:must-message "'.. interface engine-type' is not valid for 'extension-service'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'.. interface' must be specified with 'extension-service'";
            key "name";
            ordered-by user;
            description
              "Define the customer specific sampling configuration";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Customer prefixed sampling service name";
            }
    
            uses apply-advanced;
          }  // list extension-service
        }  // grouping sampling_family_inet6_output_type
    
        grouping cflowd_sampling_inet6_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
    
          container version9 {
            junos:must "((!(any ".. .. .. .. inet output flow-server <*> version") || !(any ".. .. .. .. inet output interface <*>")))";
            junos:must-message "Select only one version or configure only RE based samping under family inet";
            junos:must "((any ".. .. interface <*>" || ".. .. inline-jflow"))";
            junos:must-message "Service PIC or inline-jflow (j-series and SRX only) must be specified for version9";
            presence "enable version9";
            description
              "Export data in version 9 format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("services flow-monitoring version9 template $$ ipv6-template")";
                junos:must-message "Template type must match input protocol";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version9
        }  // grouping cflowd_sampling_inet6_sampling_type
    
        grouping packet_export_inline {
          uses apply-advanced;
    
          leaf source-address {
            type jt:ipaddr;
            description
              "Address to use for generating monitored packets";
          }
    
          leaf flow-export-rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 3200";
              }
            }
            description
              "Flow export rate of monitored packets in kpps";
          }
        }  // grouping packet_export_inline
    
        grouping sampling_family_input_type {
          description
            "Configure input options for packet sampling";
          uses apply-advanced;
    
          leaf rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            description
              "Ratio of packets to be sampled (1 out of N)";
          }
    
          leaf run-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 20";
              }
            }
            default "0";
            description
              "Number of samples after initial trigger";
          }
    
          leaf max-packets-per-second {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "1000";
            description
              "Threshold of samples per second before dropping";
          }
    
          leaf maximum-packet-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 9192";
              }
            }
            units "bytes";
            default "0";
            description
              "Maximum length of the sampled packet";
          }
        }  // grouping sampling_family_input_type
    
        grouping sampling_global_mpls_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_global_mpls_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
        }  // grouping sampling_global_mpls_output_type
    
        grouping cflowd_global_mpls_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
    
          container version9 {
            junos:must "((!(any ".. .. .. .. inet output flow-server <*> version") || !(any ".. .. .. .. inet output interface <*>")))";
            junos:must-message "Select only one version or configure only RE based samping under family inet";
            junos:must "((any ".. .. interface <*>" || ".. .. inline-jflow"))";
            junos:must-message "Service PIC or inline-jflow (j-series and SRX only) must be specified for version9";
            presence "enable version9";
            description
              "Export data in version 9 format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "(("services flow-monitoring version9 template $$ mpls-template" || ("services flow-monitoring version9 template $$ mpls-ipv4-template" || "services flow-monitoring version9 template $$ mpls-ipvx-template")))";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version9 template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version9
        }  // grouping cflowd_global_mpls_sampling_type
    
        grouping sampling_input_type {
          description
            "Configure input options for packet sampling";
          uses apply-advanced;
    
          leaf rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            description
              "Ratio of packets to be sampled (1 out of N)";
          }
    
          leaf run-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 20";
              }
            }
            default "0";
            description
              "Number of samples after initial trigger";
          }
    
          leaf max-packets-per-second {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "1000";
            description
              "Threshold of samples per second before dropping";
          }
    
          leaf maximum-packet-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 9192";
              }
            }
            units "bytes";
            default "0";
            description
              "Maximum length of the sampled packet";
          }
    
          container family {
            presence "enable family";
            status deprecated;
            description "Protocol family";
            container inet {
              description
                "Sampling parameters for IPv4";
              uses apply-advanced;
    
              leaf rate {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Ratio of packets to be sampled (1 out of N)";
              }
    
              leaf run-length {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 20";
                  }
                }
                default "0";
                description
                  "Number of samples after initial trigger";
              }
    
              leaf max-packets-per-second {
                type union {
                  type uint16;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                default "1000";
                description
                  "Threshold of samples per second before dropping";
              }
    
              leaf maximum-packet-length {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 9192";
                  }
                }
                units "bytes";
                default "0";
                description
                  "Maximum length of the sampled packet";
              }
            }  // container inet
    
            container mpls {
              description
                "Sampling parameters for MPLS";
              uses apply-advanced;
    
              leaf rate {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Ratio of packets to be sampled (1 out of N)";
              }
    
              leaf run-length {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 20";
                  }
                }
                default "0";
                description
                  "Number of samples after initial trigger";
              }
    
              leaf max-packets-per-second {
                type union {
                  type uint16;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                default "1000";
                description
                  "Threshold of samples per second before dropping";
              }
    
              leaf maximum-packet-length {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 9192";
                  }
                }
                units "bytes";
                default "0";
                description
                  "Maximum length of the sampled packet";
              }
            }  // container mpls
    
            container inet6 {
              description
                "Sampling parameters for IPv6";
              uses apply-advanced;
    
              leaf rate {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Ratio of packets to be sampled (1 out of N)";
              }
    
              leaf run-length {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 20";
                  }
                }
                default "0";
                description
                  "Number of samples after initial trigger";
              }
    
              leaf max-packets-per-second {
                type union {
                  type uint16;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                default "1000";
                description
                  "Threshold of samples per second before dropping";
              }
    
              leaf maximum-packet-length {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 9192";
                  }
                }
                units "bytes";
                default "0";
                description
                  "Maximum length of the sampled packet";
              }
            }  // container inet6
          }  // container family
        }  // grouping sampling_input_type
    
        grouping sampling_instance_bridge_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          list flow-server {
            junos:must "(".. inline-jflow")";
            junos:must-message "Output 'inline Jflow' should be configured with flow-server";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_instance_bridge_sampling_type;
          }  // list flow-server
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline_instance;
          }  // container inline-jflow
        }  // grouping sampling_instance_bridge_output_type
    
        grouping cflowd_instance_bridge_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          container version9 {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "inline Jflow must be specified for version9";
            presence "enable version9";
            description
              "Export data in version 9 format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("services flow-monitoring version9 template $$ bridge-template")";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version9 template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version9
    
          container version-ipfix {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "inline Jflow must be specified for version-ipfix";
            presence "enable version-ipfix";
            description
              "Export data in version ipfix format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("services flow-monitoring version-ipfix template $$ bridge-template")";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version-ipfix template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version-ipfix
        }  // grouping cflowd_instance_bridge_sampling_type
    
        grouping packet_export_inline_instance {
          uses apply-advanced;
    
          leaf source-address {
            type jt:ipaddr;
            description
              "Address to use for generating monitored packets";
          }
    
          leaf flow-export-rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 3200";
              }
            }
            description
              "Flow export rate of monitored packets in kpps";
          }
        }  // grouping packet_export_inline_instance
    
        grouping sampling_instance_inet6_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_instance_inet6_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "((any ".. flow-server <*>" || any ".. extension-service <*>"))";
            junos:must-message "'flow-server' or 'extension-service' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline_instance;
          }  // container inline-jflow
    
          list extension-service {
            junos:must "(!(".. flow-active-timeout"))";
            junos:must-message "'.. flow-active-timeout' is not needed with 'extension-service'";
            junos:must "(!(".. flow-inactive-timeout"))";
            junos:must-message "'.. flow-inactive-timeout' is not valid for 'extension-service'";
            junos:must "(!(".. aggregate-export-interval"))";
            junos:must-message "'.. aggregate-export-interval' is not valid for 'extension-service'";
            junos:must "(!(any ".. flow-server <*>"))";
            junos:must-message "'.. flow-server' is not needed with 'extension-service'";
            junos:must "(!(any ".. interface <*> source-address"))";
            junos:must-message "'.. interface source-address' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-id"))";
            junos:must-message "'.. interface engine-id' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-type"))";
            junos:must-message "'.. interface engine-type' is not valid for 'extension-service'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'.. interface' must be specified with 'extension-service'";
            key "name";
            ordered-by user;
            description
              "Define the customer specific sampling configuration";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Customer prefixed sampling service name";
            }
    
            uses apply-advanced;
          }  // list extension-service
        }  // grouping sampling_instance_inet6_output_type
    
        grouping cflowd_instance_inet6_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
    
          container version9 {
            junos:must "((!(any ".. .. .. .. inet output flow-server <*> version") || !(any ".. .. .. .. inet output interface <*>")))";
            junos:must-message "Select only one version or configure only RE based samping under family inet";
            junos:must "((any ".. .. interface <*>" || ".. .. inline-jflow"))";
            junos:must-message "Service PIC or inline-jflow (j-series and SRX only) must be specified for version9";
            presence "enable version9";
            description
              "Export data in version 9 format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("services flow-monitoring version9 template $$ ipv6-template")";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version9 template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version9
    
          container version-ipfix {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "inline Jflow must be specified for version-ipfix";
            presence "enable version-ipfix";
            description
              "Export data in version ipfix format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("services flow-monitoring version-ipfix template $$ ipv6-template")";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version-ipfix template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version-ipfix
        }  // grouping cflowd_instance_inet6_sampling_type
    
        grouping sampling_instance_inet_global_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          container file {
            junos:must "(!(any ".. extension-service <*>"))";
            junos:must-message "This configuration is not required with 'extension-service'";
            description
              "Configure parameters for dumping sampled packets";
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable sampled packet dumps";
              }
            }  // choice enable-disable
    
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file to contain sampled packet dumps";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10000";
                }
              }
              default "10";
              description
                "Maximum number of sampled packet dump files";
            }
    
            leaf size {
              type string;
              description
                "Maximum sample dump file size";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the sampled dump";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the sampled dump";
              }
            }  // choice world-readable-choice
    
            choice stamp-choice {
              leaf stamp {
                type empty;
                description
                  "Timestamp every packet in the dump";
              }
              leaf no-stamp {
                type empty;
                description
                  "Don't timestamp every packet in the dump";
              }
            }  // choice stamp-choice
          }  // container file
    
          container port-mirroring {
            junos:must "(!(any ".. extension-service <*>"))";
            junos:must-message "This configuration is not required with 'extension-service'";
            presence "enable port-mirroring";
            description
              "Configure sending sampled traffic out through an interface";
            uses inet_pm_family_output_type;
          }  // container port-mirroring
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_sampling_inet_type;
          }  // list flow-server
    
          list interface {
            junos:must "((any ".. flow-server <*>" || any ".. extension-service <*>"))";
            junos:must-message "'flow-server' or 'extension-service' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline;
          }  // container inline-jflow
    
          list extension-service {
            junos:must "(!(".. flow-active-timeout"))";
            junos:must-message "'.. flow-active-timeout' is not needed with 'extension-service'";
            junos:must "(!(".. flow-inactive-timeout"))";
            junos:must-message "'.. flow-inactive-timeout' is not valid for 'extension-service'";
            junos:must "(!(".. aggregate-export-interval"))";
            junos:must-message "'.. aggregate-export-interval' is not valid for 'extension-service'";
            junos:must "(!(any ".. flow-server <*>"))";
            junos:must-message "'.. flow-server' is not needed with 'extension-service'";
            junos:must "(!(any ".. interface <*> source-address"))";
            junos:must-message "'.. interface source-address' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-id"))";
            junos:must-message "'.. interface engine-id' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-type"))";
            junos:must-message "'.. interface engine-type' is not valid for 'extension-service'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'.. interface' must be specified with 'extension-service'";
            key "name";
            ordered-by user;
            description
              "Define the customer specific sampling configuration";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Customer prefixed sampling service name";
            }
    
            uses apply-advanced;
          }  // list extension-service
        }  // grouping sampling_instance_inet_global_output_type
    
        grouping cflowd_sampling_inet_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
    
          container version9 {
            junos:must "((!(any ".. .. .. .. inet output flow-server <*> version") || !(any ".. .. .. .. inet output interface <*>")))";
            junos:must-message "Select only one version or configure only RE based samping under family inet";
            junos:must "((any ".. .. interface <*>" || ".. .. inline-jflow"))";
            junos:must-message "Service PIC or inline-jflow (j-series and SRX only) must be specified for version9";
            presence "enable version9";
            description
              "Export data in version 9 format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "(("services flow-monitoring version9 template $$ ipv4-template" || "services flow-monitoring version9 template $$ peer-as-billing-template"))";
                junos:must-message "Template type must match input protocol";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version9
    
          container version-ipfix {
            presence "enable version-ipfix";
            status deprecated;
            description
              "Export data in version ipfix format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version-ipfix
    
          leaf version {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            type enumeration {
              enum "5" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 0;
                description
                  "Export cflowd aggregates in version 5 format";
              }
              enum "8" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 1;
                description
                  "Export cflowd aggregates in version 8 format";
              }
              enum "500" {
                junos:must "(!(".. .. interface"))";
                junos:must-message "This feature is only supported for RE based sampling";
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 2;
                description
                  "Export cflowd aggregates in ASN 500 format";
              }
            }
            default "5";
            description
              "Format of exported cflowd aggregates";
          }
        }  // grouping cflowd_sampling_inet_type
    
        grouping sampling_instance_inet_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            junos:must "((".. interface" || ".. inline-jflow"))";
            junos:must-message "Output 'interface' or 'inline Jflow' should be configured with flow-server";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_instance_inet_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "((any ".. flow-server <*>" || any ".. extension-service <*>"))";
            junos:must-message "'flow-server' or 'extension-service' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline_instance;
          }  // container inline-jflow
    
          list extension-service {
            junos:must "(!(".. flow-active-timeout"))";
            junos:must-message "'.. flow-active-timeout' is not needed with 'extension-service'";
            junos:must "(!(".. flow-inactive-timeout"))";
            junos:must-message "'.. flow-inactive-timeout' is not valid for 'extension-service'";
            junos:must "(!(".. aggregate-export-interval"))";
            junos:must-message "'.. aggregate-export-interval' is not valid for 'extension-service'";
            junos:must "(!(any ".. flow-server <*>"))";
            junos:must-message "'.. flow-server' is not needed with 'extension-service'";
            junos:must "(!(any ".. interface <*> source-address"))";
            junos:must-message "'.. interface source-address' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-id"))";
            junos:must-message "'.. interface engine-id' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-type"))";
            junos:must-message "'.. interface engine-type' is not valid for 'extension-service'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'.. interface' must be specified with 'extension-service'";
            key "name";
            ordered-by user;
            description
              "Define the customer specific sampling configuration";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Customer prefixed sampling service name";
            }
    
            uses apply-advanced;
          }  // list extension-service
        }  // grouping sampling_instance_inet_output_type
    
        grouping cflowd_instance_inet_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
    
          container version9 {
            junos:must "((!(any ".. .. .. .. inet output flow-server <*> version") || !(any ".. .. .. .. inet output interface <*>")))";
            junos:must-message "Select only one version or configure only RE based samping under family inet";
            junos:must "((any ".. .. interface <*>" || ".. .. inline-jflow"))";
            junos:must-message "Service PIC or inline-jflow (j-series and SRX only) must be specified for version9";
            presence "enable version9";
            description
              "Export data in version 9 format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("services flow-monitoring version9 template $$ ipv4-template")";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version9 template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version9
    
          container version-ipfix {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "inline Jflow must be specified for version-ipfix";
            presence "enable version-ipfix";
            description
              "Export data in version ipfix format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("services flow-monitoring version-ipfix template $$ ipv4-template")";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version-ipfix template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version-ipfix
    
          leaf version {
            junos:must "(!(any ".. .. .. .. .. family mpls output flow-server <*> version9"))";
            junos:must-message "Select only one version";
            junos:must "(!(any ".. .. .. .. .. family inet6 output flow-server <*> version9"))";
            junos:must-message "Select only one version";
            junos:must "(!(any ".. .. .. .. .. family inet output flow-server <*> version9"))";
            junos:must-message "Select only one version";
            junos:must "(!(any ".. .. flow-server <*> version-ipfix"))";
            junos:must-message "Select only one version";
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            type enumeration {
              enum "5" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 0;
                description
                  "Export cflowd aggregates in version 5 format";
              }
              enum "8" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 1;
                description
                  "Export cflowd aggregates in version 8 format";
              }
            }
            default "5";
            description
              "Format of exported cflowd aggregates";
          }
        }  // grouping cflowd_instance_inet_sampling_type
    
        grouping sampling_instance_input_type {
          description
            "Configure input options for packet sampling";
          uses apply-advanced;
    
          leaf rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            description
              "Ratio of packets to be sampled (1 out of N)";
          }
    
          leaf run-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 20";
              }
            }
            default "0";
            description
              "Number of samples after initial trigger";
          }
    
          leaf max-packets-per-second {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            default "1000";
            description
              "Threshold of samples per second before dropping";
          }
    
          leaf maximum-packet-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 9192";
              }
            }
            units "bytes";
            default "0";
            description
              "Maximum length of the sampled packet";
          }
        }  // grouping sampling_instance_input_type
    
        grouping sampling_instance_mpls_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            junos:must "((".. interface" || ".. inline-jflow"))";
            junos:must-message "Output 'interface' or 'inline Jflow' should be configured with flow-server";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_instance_mpls_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline_instance;
          }  // container inline-jflow
        }  // grouping sampling_instance_mpls_output_type
    
        grouping cflowd_instance_mpls_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
    
          container version9 {
            junos:must "((!(any ".. .. .. .. inet output flow-server <*> version") || !(any ".. .. .. .. inet output interface <*>")))";
            junos:must-message "Select only one version or configure only RE based samping under family inet";
            junos:must "((any ".. .. interface <*>" || ".. .. inline-jflow"))";
            junos:must-message "Service PIC or inline-jflow (j-series and SRX only) must be specified for version9";
            presence "enable version9";
            description
              "Export data in version 9 format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "(("services flow-monitoring version9 template $$ mpls-template" || ("services flow-monitoring version9 template $$ mpls-ipv4-template" || "services flow-monitoring version9 template $$ mpls-ipvx-template")))";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version9 template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version9
    
          container version-ipfix {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "inline Jflow must be specified for version-ipfix";
            presence "enable version-ipfix";
            description
              "Export data in version ipfix format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "(("services flow-monitoring version-ipfix template $$ mpls-template" || ("services flow-monitoring version-ipfix template $$ mpls-ipv4-template" || "services flow-monitoring version-ipfix template $$ mpls-ipvx-template")))";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version-ipfix template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version-ipfix
        }  // grouping cflowd_instance_mpls_sampling_type
    
        grouping sampling_instance_vpls_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          list flow-server {
            junos:must "(".. inline-jflow")";
            junos:must-message "Output 'inline Jflow' should be configured with flow-server";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_instance_vpls_sampling_type;
          }  // list flow-server
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline_instance;
          }  // container inline-jflow
        }  // grouping sampling_instance_vpls_output_type
    
        grouping cflowd_instance_vpls_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          container version9 {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "inline Jflow must be specified for version9";
            presence "enable version9";
            description
              "Export data in version 9 format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("services flow-monitoring version9 template $$ vpls-template")";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version9 template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version9
    
          container version-ipfix {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "inline Jflow must be specified for version-ipfix";
            presence "enable version-ipfix";
            description
              "Export data in version ipfix format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "("services flow-monitoring version-ipfix template $$ vpls-template")";
                junos:must-message "Template type must match input protocol";
                junos:must "((!(".. .. .. .. inline-jflow source-address") || (".. .. .. .. inline-jflow source-address" && all ".. .. .. .. flow-server <*> version-ipfix template $$")))";
                junos:must-message "All the collector under same family should share the same template in Inline-Jflow";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version-ipfix
        }  // grouping cflowd_instance_vpls_sampling_type
    
        grouping sampling_output_type {
          description
            "Configure output options for packet sampling";
          uses apply-advanced;
    
          leaf aggregate-export-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "90 .. 1800";
              }
            }
            units "seconds";
            default "90";
            description
              "Interval of exporting aggregate accounting information";
          }
    
          leaf flow-inactive-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "15 .. 1800";
              }
            }
            units "seconds";
            default "60";
            description
              "Interval of inactivity that marks a flow inactive";
          }
    
          leaf flow-active-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "60 .. 1800";
              }
            }
            units "seconds";
            default "1800";
            description
              "Interval after which an active flow is exported";
          }
    
          container file {
            junos:must "(!(any ".. extension-service <*>"))";
            junos:must-message "This configuration is not required with 'extension-service'";
            description
              "Configure parameters for dumping sampled packets";
            choice enable-disable {
              leaf disable {
                type empty;
                description
                  "Disable sampled packet dumps";
              }
            }  // choice enable-disable
    
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file to contain sampled packet dumps";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 10000";
                }
              }
              default "10";
              description
                "Maximum number of sampled packet dump files";
            }
    
            leaf size {
              type string;
              description
                "Maximum sample dump file size";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the sampled dump";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the sampled dump";
              }
            }  // choice world-readable-choice
    
            choice stamp-choice {
              leaf stamp {
                type empty;
                description
                  "Timestamp every packet in the dump";
              }
              leaf no-stamp {
                type empty;
                description
                  "Don't timestamp every packet in the dump";
              }
            }  // choice stamp-choice
          }  // container file
    
          container port-mirroring {
            junos:must "(!(any ".. extension-service <*>"))";
            junos:must-message "This configuration is not required with 'extension-service'";
            presence "enable port-mirroring";
            description
              "Configure sending sampled traffic out through an interface";
            uses inet_pm_family_output_type;
          }  // container port-mirroring
    
          list flow-server {
            junos:must "((!(any ".. interface <*>") || all ".. interface <*> source-address"))";
            junos:must-message "'output interface source-address' must be specified with 'flow-server' and 'interface'";
            key "name";
            max-elements 8;
            description
              "Configure sending traffic aggregates in cflowd format";
            uses cflowd_sampling_type;
          }  // list flow-server
    
          list interface {
            junos:must "((any ".. flow-server <*>" || any ".. extension-service <*>"))";
            junos:must-message "'flow-server' or 'extension-service' must be specified with 'interface'";
            key "name";
            max-elements 1;
            description
              "Interfaces used to send monitored information";
            uses packet_export_intf_type;
          }  // list interface
    
          container inline-jflow {
            junos:must "(any ".. flow-server <*>")";
            junos:must-message "'flow-server' must be specified with the inline Jflow";
            presence "enable inline-jflow";
            description
              "Inline processing of sampled packets";
            uses packet_export_inline;
          }  // container inline-jflow
    
          list extension-service {
            junos:must "(!(".. flow-active-timeout"))";
            junos:must-message "'.. flow-active-timeout' is not needed with 'extension-service'";
            junos:must "(!(".. flow-inactive-timeout"))";
            junos:must-message "'.. flow-inactive-timeout' is not valid for 'extension-service'";
            junos:must "(!(".. aggregate-export-interval"))";
            junos:must-message "'.. aggregate-export-interval' is not valid for 'extension-service'";
            junos:must "(!(any ".. flow-server <*>"))";
            junos:must-message "'.. flow-server' is not needed with 'extension-service'";
            junos:must "(!(any ".. interface <*> source-address"))";
            junos:must-message "'.. interface source-address' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-id"))";
            junos:must-message "'.. interface engine-id' is not valid for 'extension-service'";
            junos:must "(!(any ".. interface <*> engine-type"))";
            junos:must-message "'.. interface engine-type' is not valid for 'extension-service'";
            junos:must "(any ".. interface <*>")";
            junos:must-message "'.. interface' must be specified with 'extension-service'";
            key "name";
            ordered-by user;
            description
              "Define the customer specific sampling configuration";
            leaf name {
              type string {
                length "1 .. 63";
              }
              description
                "Customer prefixed sampling service name";
            }
    
            uses apply-advanced;
          }  // list extension-service
        }  // grouping sampling_output_type
    
        grouping cflowd_sampling_type {
          leaf name {
            type jt:ipaddr;
            description
              "Name of host collecting cflowd packets";
          }
    
          uses apply-advanced;
    
          leaf port {
            type union {
              type uint16;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "UDP port number on host collecting cflowd packets";
          }
    
          leaf dscp {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "DSCP can be configured for inline-jflow";
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "0 .. 63";
              }
            }
            default "0";
            description
              "Numeric DSCP value in the range 0 to 63";
          }
    
          leaf forwarding-class {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "forwarding-class can be configured for inline-jflow";
            type string {
              length "1 .. 64";
            }
            description
              "Forwarding-class for exported jflow packets, applicable only for inline-jflow";
          }
    
          leaf routing-instance {
            junos:must "(".. .. inline-jflow")";
            junos:must-message "Routing Instances can be configured for inline-jflow";
            junos:must "("routing-instances $$ instance-type vrf")";
            junos:must-message "routing instance should be defined and should be of type Virtual routing forwarding instance(VRF)";
            type string;
            description
              "Name of routing instance on which flow collector is reachable";
          }
    
          leaf autonomous-system-type {
            type enumeration {
              enum "origin" {
                value 0;
                description
                  "Export origin-AS numbers";
              }
              enum "peer" {
                value 1;
                description
                  "Export peer-AS numbers";
              }
            }
            default "origin";
            description
              "Type of autonomous system number to export";
          }
    
          container aggregation {
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            description
              "Aggregations to perform for exported flows (version 8 only)";
            uses aggregation_type;
          }  // container aggregation
    
          choice local-dump-choice {
            leaf local-dump {
              type empty;
              description
                "Dump cflowd records to log file before exporting";
            }
            leaf no-local-dump {
              type empty;
              description
                "Don't dump cflowd records to log file before exporting";
            }
          }  // choice local-dump-choice
    
          leaf source-address {
            type jt:ipv4addr;
            description
              "Source IPv4 address for cflowd packets";
          }
    
          container version9 {
            junos:must "(!(any ".. .. flow-server <*> version"))";
            junos:must-message "Select only one version";
            junos:must "((any ".. .. interface <*>" || ".. .. inline-jflow"))";
            junos:must-message "Service PIC or inline-jflow (j-series and SRX only) must be specified for version9";
            presence "enable version9";
            description
              "Export data in version 9 format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                junos:must "((("services flow-monitoring version9 template $$ ipv4-template" && "forwarding-options sampling input family inet") || (("services flow-monitoring version9 template $$ ipv6-template" && "forwarding-options sampling input family inet6") || (("services flow-monitoring version9 template $$ mpls-template" && "forwarding-options sampling input family mpls") || (("services flow-monitoring version9 template $$ mpls-ipv4-template" && "forwarding-options sampling input family mpls") || ("services flow-monitoring version9 template $$ mpls-ipvx-template" && "forwarding-options sampling input family mpls"))))))";
                junos:must-message "Template type must match input protocol";
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version9
    
          container version-ipfix {
            presence "enable version-ipfix";
            status deprecated;
            description
              "Export data in version ipfix format";
            uses apply-advanced;
    
            container template {
              description
                "Template configuration";
              uses apply-advanced;
    
              leaf template-name {
                type string;
                description "Template name";
              }
            }  // container template
          }  // container version-ipfix
    
          leaf version {
            junos:must "("forwarding-options sampling input family inet")";
            junos:must-message "input 'family inet' must be configured";
            junos:must "(!(any ".. .. flow-server <*> version9"))";
            junos:must-message "Select only one version";
            type enumeration {
              enum "5" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 0;
                description
                  "Export cflowd aggregates in version 5 format";
              }
              enum "8" {
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 1;
                description
                  "Export cflowd aggregates in version 8 format";
              }
              enum "500" {
                junos:must "(!(".. .. interface"))";
                junos:must-message "This feature is only supported for RE based sampling";
                junos:must "("system ntp")";
                junos:must-message " NTP must be configured for sampling v5/8/500 to work properly";
                value 2;
                description
                  "Export cflowd aggregates in ASN 500 format";
              }
            }
            default "5";
            description
              "Format of exported cflowd aggregates";
          }
        }  // grouping cflowd_sampling_type
    
        grouping sampling_traceoptions_type {
          description
            "Configure packet sampling traceoptions";
          uses apply-advanced;
    
          leaf no-remote-trace {
            junos:must "("system tracing")";
            junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
            type empty;
            description "Disable remote tracing";
          }
    
          container file {
            description "Trace file information";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "3";
              description
                "Maximum number of trace files";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
    
            leaf match {
              type jt:regular-expression;
              description
                "Regular expression for lines to be logged";
            }
          }  // container file
        }  // grouping sampling_traceoptions_type
    
        grouping security-dhcpv6-options-type {
          description "Configure DHCPv6 options";
          uses apply-advanced;
    
          container option-37 {
            presence "enable option-37";
            description
              "Configure DHCPv6 remote identifier option";
            uses apply-advanced;
    
            container prefix {
              description
                "Configure DHCPv6 remote identifier prefix";
              uses apply-advanced;
    
              leaf host-name {
                type empty;
                description
                  "Prefix router host name to DHCPv6 remote identifier";
              }
    
              leaf logical-system-name {
                type empty;
                description
                  "Prefix logical system name to DHCPv6 remote identifier";
              }
    
              leaf routing-instance-name {
                type empty;
                description
                  "Prefix routing instance name to DHCPv6 remote identifier";
              }
    
              leaf vlan-name {
                type empty;
                description
                  "Prefix vlan name to DHCPv6 remote identifier";
              }
    
              leaf vlan-id {
                type empty;
                description
                  "Prefix vlan tag to DHCPv6 remote identifier";
              }
            }  // container prefix
    
            leaf use-interface-mac {
              type empty;
              description
                "Add incoming interface's MAC address to DHCPv6 remote identifier";
            }
    
            leaf use-interface-index {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface index";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface index";
                }
              }
              description
                "Add interface index to DHCPv6 remote identifier";
            }
    
            leaf use-interface-name {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface name";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface name";
                }
              }
              description
                "Add interface name to DHCPv6 remote identifier";
            }
    
            leaf use-interface-description {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Add interface description to DHCPv6 remote identifier";
            }
    
            leaf use-string {
              junos:must "(!(".. use-interface-description"))";
              junos:must-message "use-string and use-interface-description cannot be configured together";
              type string;
              description
                "Add custom string to DHCPv6 remote identifier";
            }
          }  // container option-37
    
          container option-18 {
            presence "enable option-18";
            description
              "Configure DHCPv6 interface identifier option";
            uses apply-advanced;
    
            container prefix {
              description
                "Configure DHCPv6 interface identifier prefix";
              uses apply-advanced;
    
              leaf host-name {
                type empty;
                description
                  "Prefix router host name to DHCPv6 interface identifier";
              }
    
              leaf logical-system-name {
                type empty;
                description
                  "Prefix logical system name to DHCPv6 interface identifier";
              }
    
              leaf routing-instance-name {
                type empty;
                description
                  "Prefix routing instance name to DHCPv6 interface identifier";
              }
    
              leaf vlan-name {
                type empty;
                description
                  "Prefix vlan name to DHCPv6 interface identifier";
              }
    
              leaf vlan-id {
                type empty;
                description
                  "Prefix vlan tag to DHCPv6 interface identifier";
              }
            }  // container prefix
    
            leaf use-interface-mac {
              type empty;
              description
                "Add incoming interface's MAC address to DHCPv6 circuit identifier";
            }
    
            leaf use-interface-index {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface index";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface index";
                }
              }
              description
                "Add interface index to DHCPv6 interface identifier";
            }
    
            leaf use-interface-name {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface name";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface name";
                }
              }
              description
                "Add interface name to DHCPv6 remote identifier";
            }
    
            leaf use-interface-description {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Add interface description to DHCPv6 interface identifier";
            }
    
            leaf use-string {
              junos:must "(!(".. use-interface-description"))";
              junos:must-message "use-string and use-interface-description cannot be configured together";
              type string;
              description
                "Add custom string to DHCPv6 interface identifier";
            }
          }  // container option-18
    
          container option-16 {
            presence "enable option-16";
            description
              "Configure DHCPv6 vendor class identifier option. Overwrite if exists";
            uses apply-advanced;
    
            leaf use-string {
              type string;
              description
                "Add custom string to DHCPv6 vendor identifier";
            }
          }  // container option-16
    
          leaf option-79 {
            junos:must "(".. .. light-weight-dhcpv6-relay")";
            junos:must-message "Option-79 can be configured only on LDRAs";
            type empty;
            description
              "Configure DHCPv6 client link layer address option";
          }
        }  // grouping security-dhcpv6-options-type
    
        grouping security-option-82-type {
          description
            "DHCP option-82 processing";
          uses apply-advanced;
    
          container circuit-id {
            presence "enable circuit-id";
            description
              "Configure DHCP option 82 circuit id";
            uses apply-advanced;
    
            container prefix {
              description
                "Configure DHCP option 82 circuit id prefix";
              uses apply-advanced;
    
              leaf host-name {
                type empty;
                description
                  "Add router host name to DHCP option-82 circuit id";
              }
    
              leaf logical-system-name {
                type empty;
                description
                  "Add logical system name to DHCP option-82 circuit id";
              }
    
              leaf routing-instance-name {
                type empty;
                description
                  "Add routing instance name to DHCP option-82 circuit id";
              }
            }  // container prefix
    
            leaf use-interface-description {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Use interface description instead of circuit identifier";
            }
    
            leaf use-vlan-id {
              type empty;
              description
                "Use VLAN id instead of name";
            }
          }  // container circuit-id
    
          container remote-id {
            presence "enable remote-id";
            description
              "Configure DHCP option 82 remote id";
            uses apply-advanced;
    
            leaf host-name {
              type empty;
              description
                "Add router host name to DHCP option-82 remote id";
            }
    
            leaf use-interface-description {
              type enumeration {
                enum "logical" {
                  value 0;
                  description
                    "Use the logical interface description";
                }
                enum "device" {
                  value 1;
                  description
                    "Use the device interface description";
                }
              }
              description
                "Use interface description instead of interface name";
            }
    
            leaf use-string {
              junos:must "(!(".. use-interface-description"))";
              junos:must-message "use-string and use-interface-description cannot be configured together";
              type string;
              description
                "Use raw string instead of the default remote id";
            }
    
            leaf mac {
              type empty;
              description
                "Add chassis MAC Address to DHCP option-82 remote id";
            }
          }  // container remote-id
    
          container vendor-id {
            presence "enable vendor-id";
            description
              "Configure DHCP option 82 vendor id";
            uses apply-advanced;
    
            leaf use-string {
              type string;
              default "Juniper Networks";
              description
                "Use raw string instead of the default vendor id";
            }
          }  // container vendor-id
        }  // grouping security-option-82-type
    
        grouping server-active-leasequery-type {
          description "Allow active leasequery";
          uses apply-advanced;
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "120";
            description
              "Read/write timeout in seconds";
          }
    
          leaf idle-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "10 .. 3600";
              }
            }
            units "seconds";
            default "60";
            description
              "Idle-timeout in seconds";
          }
        }  // grouping server-active-leasequery-type
    
        grouping server-bulk-leasequery-type {
          description "Allow bulk leasequery";
          uses apply-advanced;
    
          leaf max-connections {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 10";
              }
            }
            default "3";
            description
              "Max TCP connections allowed at a time";
          }
    
          leaf timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 1000";
              }
            }
            units "seconds";
            default "120";
            description
              "Timeout for blocked connection";
          }
    
          leaf max-empty-replies {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 100";
              }
            }
            units "seconds";
            default "5";
            description
              "Maximum number of empty replies for a connection";
          }
    
          leaf restricted-requestor {
            type empty;
            description
              "Allow bulk leasequery only from restricted requestors";
          }
        }  // grouping server-bulk-leasequery-type
    
        grouping server-group-type {
          uses apply-advanced;
    
          list server-group {
            key "name";
            ordered-by user;
            description
              "One or more server groups";
            leaf name {
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
                junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                length "1 .. 64";
              }
              description "Server group name";
            }
    
            uses apply-advanced;
    
            list address {
              key "name";
              max-elements 32;
              ordered-by user;
              description
                "IP Address of one or more DHCP servers";
              leaf name {
                type jt:ipaddr;
                description
                  "IP Address of DHCP server";
              }
    
              uses apply-advanced;
            }  // list address
          }  // list server-group
        }  // grouping server-group-type
    
        grouping server-leasequery-type {
          description "Allow leasequery";
          uses apply-advanced;
    
          leaf restricted-requestor {
            type empty;
            description
              "Allow leasequery only from restricted requestors";
          }
        }  // grouping server-leasequery-type
    
        grouping server-match-action-choice {
          uses apply-advanced;
    
          choice v4-action-choice {
            leaf forward-only {
              type empty;
              description
                "Forward without subscriber services";
            }
            leaf create-relay-entry {
              type empty;
              description
                "Create relay entry and allow subscriber services";
            }
          }  // choice v4-action-choice
        }  // grouping server-match-action-choice
    
        grouping server-match-v6-ascii-hex {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
    
            choice server-match-action-choice {
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
              leaf create-relay-entry {
                type empty;
                description
                  "Create relay entry and allow subscriber services";
              }
            }  // choice server-match-action-choice
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
    
            choice server-match-action-choice {
              leaf forward-only {
                type empty;
                description
                  "Forward without subscriber services when a match is made";
              }
              leaf create-relay-entry {
                type empty;
                description
                  "Create relay entry and allow subscriber services";
              }
            }  // choice server-match-action-choice
          }  // list hexadecimal
        }  // grouping server-match-v6-ascii-hex
    
        grouping server-v6-option-ascii-hex {
          uses apply-advanced;
    
          list ascii {
            key "name";
            description "ASCII string";
            leaf name {
              type string {
                length "1 .. 256";
              }
              description "ASCII string";
            }
    
            uses apply-advanced;
          }  // list ascii
    
          list hexadecimal {
            key "name";
            description "Hexadecimal string";
            leaf name {
              type string {
                junos:posix-pattern "^[[:xdigit:]]+$";
                junos:pattern-message "Must be hexadecimal digits (0-9, a-f, A-F)";
                length "1 .. 512";
              }
              description "Hexadecimal string";
            }
    
            uses apply-advanced;
          }  // list hexadecimal
        }  // grouping server-v6-option-ascii-hex
    
        grouping service-device-object {
          leaf name {
            type string {
              length "1 .. 64";
            }
            description "Service device name";
          }
    
          uses apply-advanced;
    
          leaf address {
            type jt:ipv4addr;
            description
              "Service device ip address";
          }
    
          container access-domain {
            description
              "Subscriber access configuration";
            uses apply-advanced;
    
            leaf-list vlan-id-list {
              type jt:vlan-range;
              description
                "List of access VLAN identifiers";
            }
          }  // container access-domain
    
          container provisioning-method {
            description
              "Provisioning method configuration";
            uses apply-advanced;
    
            choice prov_method {
              container netconf {
                presence "enable netconf";
                description
                  "Netconf provisioning method";
                uses netconf-object;
              }  // container netconf
            }  // choice prov_method
          }  // container provisioning-method
    
          container dictionary {
            description "Dictionary file path";
            uses apply-advanced;
    
            leaf dictionary-path {
              type jt:filename;
              description
                "Complete path with dictionary name";
            }
          }  // container dictionary
        }  // grouping service-device-object
    
        grouping netconf-object {
          uses apply-advanced;
    
          leaf user-name {
            type string {
              length "1 .. 64";
            }
            description "User name for netconf";
          }
    
          leaf password {
            type string {
              length "1 .. 64";
            }
            description "Password for netconf";
          }
    
          leaf connection-retry-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 10";
              }
            }
            units "seconds";
            default "3";
            description
              "Retry interval for connection establishment";
          }
    
          leaf response-timeout {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 180";
              }
            }
            units "seconds";
            default "10";
            description
              "Timeout for provisioning response";
          }
    
          leaf response-timeout-count {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 10";
              }
            }
            default "3";
            description
              "Consecutive timeout failures before taking action";
          }
    
          leaf bulk-interval {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "500 .. 50000";
              }
            }
            units "milliseconds";
            default "1000";
            description
              "Bulked services time interval per commit";
          }
    
          leaf bulk-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 1000";
              }
            }
            default "1";
            description
              "Maximum number of bulked services per commit";
          }
    
          leaf reconfigure-bulk-limit {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 1000";
              }
            }
            default "100";
            description
              "Maximum number of bulked services per reconfiguration";
          }
    
          leaf port {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            default "830";
            description
              "Tcp port number for netconf";
          }
        }  // grouping netconf-object
    
        grouping slaacd-config-type {
          description
            "Slaacd configuration options";
          uses apply-advanced;
    
          container vlans {
            description "Slaac config on vlan";
            uses apply-advanced;
    
            list vlan-config {
              key "name";
              description
                "Virtual LAN configuration";
              uses vlan-slaacd;
            }  // list vlan-config
          }  // container vlans
    
          container interface {
            description
              "Slaac config on interface";
            uses apply-advanced;
    
            list intf-config {
              key "name";
              description
                "Interface configuration";
              uses slaacd-interface;
            }  // list intf-config
          }  // container interface
    
          container link-local-expiry-interval {
            description
              "Link local address expiry interval";
            uses apply-advanced;
    
            leaf interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "60 .. 86400";
                }
              }
              units "seconds";
              default "86400";
              description "Expiry interval";
            }
          }  // container link-local-expiry-interval
    
          container traceoptions {
            description
              "Slaac Snooping trace options";
            uses apply-advanced;
    
            leaf no-remote-trace {
              junos:must "("system tracing")";
              junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
              type empty;
              description
                "Disable remote tracing";
            }
    
            container file {
              description
                "Trace file information";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "3";
                description
                  "Maximum number of trace files";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
    
              leaf match {
                type jt:regular-expression;
                description
                  "Regular expression for lines to be logged";
              }
            }  // container file
    
            list flag {
              key "name";
              description "Tracing parameters";
              leaf name {
                type enumeration {
                  enum "configuration" {
                    value 0;
                    description
                      "Log configuration events";
                  }
                  enum "init" {
                    value 1;
                    description
                      "Trace init message events";
                  }
                  enum "state" {
                    value 2;
                    description
                      "Trace state message events";
                  }
                  enum "rtsock" {
                    value 3;
                    description
                      "Trace rtsock message events";
                  }
                  enum "packet" {
                    value 4;
                    description
                      "Trace packet events";
                  }
                  enum "fsm" {
                    value 5;
                    description
                      "Trace fsm update events";
                  }
                  enum "io" {
                    value 6;
                    description
                      "Trace io events";
                  }
                  enum "verbose" {
                    value 7;
                    description
                      "Trace verbose events";
                  }
                  enum "task" {
                    value 8;
                    description
                      "Trace TASK related events";
                  }
                  enum "all" {
                    value 9;
                    description
                      "Trace all events";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
        }  // grouping slaacd-config-type
    
        grouping slaacd-interface {
          description "Interface name";
          leaf name {
            type string;
            description "Interface name";
          }
    
          uses apply-advanced;
    
          container mark-interface {
            description "Mark interface";
            uses apply-advanced;
    
            leaf trusted {
              type empty;
              description
                "Mark interface trusted";
            }
          }  // container mark-interface
    
          container max-allowed-contention {
            description
              "Maximum allowed contention count(will be valid only for un-trusted ports)";
            uses apply-advanced;
    
            leaf count {
              junos:must "(".. duration")";
              junos:must-message "Duration cannot be zero for non-zero count.";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 10";
                }
              }
              description "Contention count";
            }
    
            leaf duration {
              junos:must "(".. count")";
              junos:must-message "Count cannot be zero for non-zero duration.";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "60 .. 3600";
                }
              }
              units "seconds";
              description "Contention duration";
            }
          }  // container max-allowed-contention
    
          container auto-dad {
            description
              "Auto duplicate address detection";
            uses apply-advanced;
    
            leaf retries {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 3";
                }
              }
              default "1";
              description "DAD retry value";
            }
    
            leaf retrans-interval {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "1 .. 6";
                }
              }
              units "seconds";
              default "1";
              description
                "DAD re-transmission interval";
            }
          }  // container auto-dad
        }  // grouping slaacd-interface
    
        grouping sm-ippool-pool {
          description
            "Address pool configuration";
          leaf name {
            type string {
              length "1 .. 64";
            }
            description "Address pool name";
          }
    
          uses apply-advanced;
    
          leaf service-mode {
            type enumeration {
              enum "maintenance" {
                value 0;
                description "Maintenance mode";
              }
            }
            description "Service mode";
          }
    
          container family {
            presence "enable family";
            description "Address family";
            choice family_type {
              container inet {
                presence "enable inet";
                description
                  "IPv4 address pool configuration";
                uses apply-advanced;
    
                list network {
                  key "name";
                  ordered-by user;
                  description
                    "Specify IPv4 network prefix";
                  leaf name {
                    type jt:ipv4prefix-only;
                    description
                      "IPv4 network prefix";
                  }
    
                  uses apply-advanced;
    
                  leaf external-assigned {
                    junos:must "(!(".. allocation-prefix-length"))";
                    junos:must-message "external assigned addresses do not support allocation-prefix-length";
                    junos:must "(!(any ".. range <*> external-assigned"))";
                    junos:must-message "This can be defined for the network prefix or range";
                    type empty;
                    description
                      "Assigned by an external authority";
                  }
    
                  leaf allocation-prefix-length {
                    junos:must "(!(".. external-assigned"))";
                    junos:must-message "allocation-prefix-length not valid for external assigned addresses";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint8 {
                        range "22 .. 32";
                      }
                    }
                    description
                      "Size of address allocation block";
                  }
    
                  list range {
                    key "name";
                    ordered-by user;
                    description
                      "Specify ranges within the prefix";
                    leaf name {
                      junos:must "(unique ".. .. .. network <*> range $$")";
                      junos:must-message "Range name has to be unique in the pool";
                      type string {
                        length "1 .. 64";
                      }
                      description "Range name";
                    }
    
                    uses apply-advanced;
    
                    leaf low {
                      type jt:ipv4addr;
                      description
                        "Lower limit of the range";
                    }
    
                    leaf high {
                      type jt:ipv4addr;
                      description
                        "Upper limit of the range";
                    }
    
                    leaf external-assigned {
                      junos:must "(!(".. .. allocation-prefix-length"))";
                      junos:must-message "external assigned addresses do not support allocation-prefix-length";
                      junos:must "(!(".. .. external-assigned"))";
                      junos:must-message "This can be defined for the network prefix or range";
                      type empty;
                      description
                        "Assigned by an external authority";
                    }
                  }  // list range
                }  // list network
              }  // container inet
              container inet6 {
                presence "enable inet6";
                description
                  "IPv6 address pool configuration";
                uses apply-advanced;
    
                list network {
                  key "name";
                  ordered-by user;
                  description
                    "Specify IPv6 network prefix";
                  leaf name {
                    type jt:ipv6prefix-only;
                    description
                      "IPv6 network prefix";
                  }
    
                  uses apply-advanced;
    
                  leaf external-assigned {
                    junos:must "(!(".. allocation-prefix-length"))";
                    junos:must-message "external assigned addresses do not support allocation-prefix-length";
                    junos:must "(!(any ".. range <*> external-assigned"))";
                    junos:must-message "This can be defined for the network prefix or range";
                    type empty;
                    description
                      "Assigned by an external authority";
                  }
    
                  leaf allocation-prefix-length {
                    junos:must "(!(".. external-assigned"))";
                    junos:must-message "allocation-prefix-length not valid for external assigned addresses";
                    type union {
                      type string {
                        pattern "<.*>|$.*";
                      }
                      type uint8 {
                        range "54 .. 64";
                      }
                    }
                    description
                      "Size of address allocation block";
                  }
    
                  list range {
                    key "name";
                    ordered-by user;
                    description
                      "Specify ranges within the prefix";
                    leaf name {
                      junos:must "(unique ".. .. .. network <*> range $$")";
                      junos:must-message "Range name has to be unique in the pool";
                      type string {
                        length "1 .. 64";
                      }
                      description "Range name";
                    }
    
                    uses apply-advanced;
    
                    leaf low {
                      type jt:ipv6prefix-only;
                      description
                        "Lower limit of the range";
                    }
    
                    leaf high {
                      type jt:ipv6prefix-only;
                      description
                        "Upper limit of the range";
                    }
    
                    leaf external-assigned {
                      junos:must "(!(".. .. allocation-prefix-length"))";
                      junos:must-message "external assigned addresses do not support allocation-prefix-length";
                      junos:must "(!(".. .. external-assigned"))";
                      junos:must-message "This can be defined for the network prefix or range";
                      type empty;
                      description
                        "Addresses in this range are assigned to the client by an external authority";
                    }
                  }  // list range
                }  // list network
              }  // container inet6
            }  // choice family_type
          }  // container family
    
          leaf ageing-window {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "1 .. 65535";
              }
            }
            units "seconds";
            default "2";
            description
              "Time in sec when the address should not be re-used";
          }
    
          leaf pool-prefetch-threshold {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "1 .. 100";
              }
            }
            units "percent";
            default "80";
            description
              "Pool usage threshold to prefetch more addresses";
          }
    
          leaf pool-snmp-trap-threshold {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint8 {
                range "1 .. 100";
              }
            }
            units "percent";
            default "80";
            description
              "Pool usage threshold to generate SNMP trap";
          }
    
          leaf default-pool {
            type empty;
            description
              "Pool usage as one of default pools or APN(s) specific";
          }
        }  // grouping sm-ippool-pool
    
        grouping smpl-analyzer-type {
          leaf name {
            junos:must "(!("forwarding-options sampling instance $$"))";
            junos:must-message "analyzer must not have the same name as of any other sampling instance";
            junos:must "(!("forwarding-options port-mirroring instance $$"))";
            junos:must-message "analyzer must not have the same name as of any other port mirror instance";
            type string {
              junos:posix-pattern "^[[:alpha:]][[:alnum:]_-]+$";
              junos:pattern-message "Must be a string beginning with a letter and consisting of letters, numbers, dashes, and underscores";
              length "1 .. 63";
            }
            description "Analyzer name";
          }
    
          uses apply-advanced;
    
          container input {
            description
              "Ports and VLANs to monitor";
            uses smpl-analyzer-input-type;
          }  // container input
    
          container output {
            description
              "Outgoing port or VLAN for mirrored packets";
            uses smpl-analyzer-output-type;
          }  // container output
        }  // grouping smpl-analyzer-type
    
        grouping smpl-analyzer-input-type {
          uses apply-advanced;
    
          leaf rate {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Ratio of packets to be sampled (1 out of N)";
          }
    
          leaf maximum-packet-length {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 9216";
              }
            }
            units "bytes";
            description
              "Maximum length of the mirrored packet";
          }
    
          container ingress {
            description
              "Ports and VLANs to monitor incoming traffic";
            uses smpl-analyzer-ingress-type;
          }  // container ingress
    
          container egress {
            description
              "Ports and VLANs to monitor outgoing traffic";
            uses smpl-analyzer-egress-type;
          }  // container egress
        }  // grouping smpl-analyzer-input-type
    
        grouping smpl-analyzer-egress-type {
          uses apply-advanced;
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Port to monitor outgoing traffic";
            uses analyzer-egress-interface-type;
          }  // list interface
    
          list routing-instance {
            key "name";
            description "Routing instances";
            uses analyzer-egress-routing-instance-type;
          }  // list routing-instance
    
          list vlan {
            key "name";
            ordered-by user;
            description
              "VLAN to monitor outgoing traffic";
            uses analyzer-egress-vlan-type;
          }  // list vlan
    
          list bridge-domain {
            key "name";
            ordered-by user;
            description
              "Bridge-domain to monitor outgoing traffic";
            uses analyzer-egress-bridge-domain-type;
          }  // list bridge-domain
        }  // grouping smpl-analyzer-egress-type
    
        grouping analyzer-egress-bridge-domain-type {
          leaf name {
            junos:must "(!(any "forwarding-options analyzer <*> output bridge-domain $$"))";
            junos:must-message "bridge-domain must not be output of any analyzer session";
            junos:must "(unique "forwarding-options analyzer <*> input egress bridge-domain $$")";
            junos:must-message "bridge-domain must not be input egress to any other analyzer";
            type string;
            description
              "Bridge domain name, VLAN id or VLAN range string";
          }
    
          uses apply-advanced;
        }  // grouping analyzer-egress-bridge-domain-type
    
        grouping analyzer-egress-interface-type {
          leaf name {
            type string;
            description "Logical interface name";
          }
    
          uses apply-advanced;
        }  // grouping analyzer-egress-interface-type
    
        grouping analyzer-egress-routing-instance-type {
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          list vlan {
            key "name";
            ordered-by user;
            description
              "VLAN to monitor outgoing traffic";
            uses analyzer-egress-vlan-type;
          }  // list vlan
    
          list bridge-domain {
            key "name";
            ordered-by user;
            description
              "Bridge-domain to monitor outgoing traffic";
            uses analyzer-egress-bridge-domain-type;
          }  // list bridge-domain
        }  // grouping analyzer-egress-routing-instance-type
    
        grouping analyzer-egress-vlan-type {
          leaf name {
            junos:must "(!(any "forwarding-options analyzer <*> output vlan $$"))";
            junos:must-message "vlan must not be output of any analyzer session";
            junos:must "(unique "forwarding-options analyzer <*> input egress vlan $$")";
            junos:must-message "vlan must not be input egress to any other analyzer";
            type string;
            description
              "VLAN name, VLAN id or VLAN range string";
          }
    
          uses apply-advanced;
        }  // grouping analyzer-egress-vlan-type
    
        grouping smpl-analyzer-ingress-type {
          uses apply-advanced;
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Port to monitor incoming traffic";
            uses analyzer-ingress-interface-type;
          }  // list interface
    
          list routing-instance {
            key "name";
            description "Routing instances";
            uses analyzer-ingress-routing-instance-type;
          }  // list routing-instance
    
          list vlan {
            key "name";
            ordered-by user;
            description
              "VLAN to monitor incoming traffic";
            uses analyzer-ingress-vlan-type;
          }  // list vlan
    
          list bridge-domain {
            key "name";
            ordered-by user;
            description
              "Bridge-domain to monitor incoming traffic";
            uses analyzer-ingress-bridge-domain-type;
          }  // list bridge-domain
        }  // grouping smpl-analyzer-ingress-type
    
        grouping analyzer-ingress-bridge-domain-type {
          leaf name {
            junos:must "(!(any "forwarding-options analyzer <*> output bridge-domain $$"))";
            junos:must-message "vlan must not be output of any analyzer session";
            junos:must "(unique "forwarding-options analyzer <*> input ingress bridge-domain $$")";
            junos:must-message "vlan must not be input ingress to any other analyzer";
            junos:must "(!("vlans $$ vlan-id-list"))";
            junos:must-message "vlan-id-list cannot be configured on forwarding-options analyzer";
            type string;
            description
              "Bridge domain name, VLAN id or VLAN range string";
          }
    
          uses apply-advanced;
        }  // grouping analyzer-ingress-bridge-domain-type
    
        grouping analyzer-ingress-interface-type {
          leaf name {
            type string;
            description "Logical interface name";
          }
    
          uses apply-advanced;
        }  // grouping analyzer-ingress-interface-type
    
        grouping analyzer-ingress-routing-instance-type {
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          list vlan {
            key "name";
            ordered-by user;
            description
              "VLAN to monitor incoming traffic";
            uses analyzer-ingress-vlan-type;
          }  // list vlan
    
          list bridge-domain {
            key "name";
            ordered-by user;
            description
              "Bridge-domain to monitor incoming traffic";
            uses analyzer-ingress-bridge-domain-type;
          }  // list bridge-domain
        }  // grouping analyzer-ingress-routing-instance-type
    
        grouping analyzer-ingress-vlan-type {
          leaf name {
            junos:must "(!(any "forwarding-options analyzer <*> output vlan $$"))";
            junos:must-message "vlan must not be output of any analyzer session";
            junos:must "(unique "forwarding-options analyzer <*> input ingress vlan $$")";
            junos:must-message "vlan must not be input ingress to any other analyzer";
            junos:must "(!("vlans $$ vlan-id-list"))";
            junos:must-message "vlan-id-list cannot be configured on forwarding-options analyzer";
            type string;
            description
              "VLAN name, VLAN id or VLAN range string";
          }
    
          uses apply-advanced;
        }  // grouping analyzer-ingress-vlan-type
    
        grouping smpl-analyzer-output-type {
          uses apply-advanced;
    
          choice interface_or_vlan {
            leaf interface {
              junos:must "(!("interfaces $$-IFL family inet"))";
              junos:must-message "An interface configured as family inet cannot be configured as analyzer output interface";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Outgoing port for mirrored packets";
            }
            leaf ip-address {
              type jt:ipv4addr;
              description
                "ERSPAN Destination IP Address";
            }
            leaf ipv6-address {
              type jt:ipv6addr;
              description
                "ERSPAN Destination IPv6 Address";
            }
            leaf next-hop-group {
              junos:must "("forwarding-options next-hop-group $$ group-type layer-2")";
              junos:must-message "Referenced next-hop-group must be defined as layer-2 group";
              type string;
              description
                "Next-hop-group through which to send port-mirror traffic";
            }
            list routing-instance {
              key "name";
              max-elements 1;
              description "Routing instances";
              uses output-routing-instance-type;
            }  // list routing-instance
            list vlan {
              key "name";
              max-elements 1;
              description
                "Outgoing VLAN for mirrored packets";
              uses pm-rspan-vlan;
            }  // list vlan
            list bridge-domain {
              key "name";
              max-elements 1;
              description
                "Outgoing bridge-domain for mirrored packets";
              uses pm-rspan-bridge-domain;
            }  // list bridge-domain
          }  // choice interface_or_vlan
        }  // grouping smpl-analyzer-output-type
    
        grouping output-routing-instance-type {
          leaf name {
            type string {
              junos:posix-pattern "!^((__.*__)|(all)|(.*[ ].*)|("")|(.{129,}))$";
              junos:pattern-message "Must be a non-reserved string of 128 characters or less with no spaces.";
            }
            description "Routing instance name";
          }
    
          uses apply-advanced;
    
          choice ipaddr_or_vlan {
            leaf ip-address {
              type jt:ipv4addr;
              description
                "ERSPAN Destination IP Address";
            }
            leaf ipv6-address {
              type jt:ipv6addr;
              description
                "ERSPAN Destination IPv6 Address";
            }
            list vlan {
              key "name";
              max-elements 1;
              description
                "Outgoing VLAN for mirrored packets";
              uses pm-rspan-vlan;
            }  // list vlan
            list bridge-domain {
              key "name";
              max-elements 1;
              description
                "Outgoing bridge-domain for mirrored packets";
              uses pm-rspan-bridge-domain;
            }  // list bridge-domain
          }  // choice ipaddr_or_vlan
        }  // grouping output-routing-instance-type
    
        grouping source-class-filters {
          leaf name {
            junos:must "((any "policy-options policy-statement <*> then source-class $$" || (any "policy-options policy-statement <*> term <*> then source-class $$" || (any "policy-options policy-statement <*> from route-filter <*> <*> source-class $$" || (any "policy-options policy-statement <*> term <*> from route-filter <*> <*> source-class $$" || (any "policy-options policy-statement <*> then forwarding-class $$" || (any "policy-options policy-statement <*> term <*> then forwarding-class $$" || (any "policy-options policy-statement <*> from route-filter <*> <*> forwarding-class $$" || (any "logical-systems <*> policy-options policy-statement <*> then source-class $$" || (any "logical-systems <*> policy-options policy-statement <*> term <*> then source-class $$" || (any "logical-systems <*> policy-options policy-statement <*> from route-filter <*> <*> source-class $$" || (any "logical-systems <*> policy-options policy-statement <*> term <*> from route-filter <*> <*> source-class $$" || (any "logical-systems <*> policy-options policy-statement <*> then forwarding-class $$" || (any "logical-systems <*> policy-options policy-statement <*> term <*> then forwarding-class $$" || any "logical-systems <*> policy-options policy-statement <*> from route-filter <*> <*> forwarding-class $$"))))))))))))))";
            junos:must-message "referenced source-class must be defined";
            type string;
            description "Source class name";
          }
    
          uses apply-advanced;
    
          container family {
            description "Protocol family";
            container inet {
              description
                "Protocol family IPv4 for firewall filter";
              uses apply-advanced;
    
              container filter {
                description "Packet filtering";
                uses apply-advanced;
    
                leaf filter-name {
                  type string;
                  description "Inet Filter name";
                }
              }  // container filter
            }  // container inet
    
            container inet6 {
              description
                "Protocol family IPv6 for firewall filter";
              uses apply-advanced;
    
              container filter {
                description "Packet filtering";
                uses apply-advanced;
    
                leaf filter-name {
                  type string;
                  description
                    "Inet6 Filter name";
                }
              }  // container filter
            }  // container inet6
          }  // container family
        }  // grouping source-class-filters
    
        grouping spring-te-template-map {
          description
            "SPRING-TE template color map";
          leaf name {
            junos:must "("protocols source-packet-routing source-routing-path-template $$ primary")";
            junos:must-message "Referenced spring-te template doesn't exist or primary not configured in it";
            type string;
            description
              "Name of SPRING-TE template";
          }
    
          uses apply-advanced;
    
          choice colors {
            leaf-list color {
              type union {
                type uint32;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description
                "Set of color list to be mapped to corresponding SPRING-TE template";
            }
            leaf color-any {
              type empty;
              description
                "Map any color to corresponding SPRING-TE template";
            }
          }  // choice colors
        }  // grouping spring-te-template-map
    
        grouping springte_lsp_nh_obj {
          uses apply-advanced;
    
          leaf nexthop {
            type string {
              length "1 .. 128";
            }
            description
              "SPRING-TE LSP to use to reach destination";
          }
    
          container lsp-source {
            description
              "Source of tunnel creation";
            uses apply-advanced;
    
            choice lsp-src-choice {
              leaf pcep {
                type empty;
                description
                  "Path computation element protocol";
              }
              leaf static {
                type empty;
                description
                  "Static configuration";
              }
              leaf dtm {
                type empty;
                description
                  "Dynamic tunnel module";
              }
              leaf bgp {
                type empty;
                description "BGP SRTE";
              }
            }  // choice lsp-src-choice
          }  // container lsp-source
        }  // grouping springte_lsp_nh_obj
    
        grouping stp-interface {
          leaf name {
            type string;
          }
    
          uses apply-advanced;
    
          leaf priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint16 {
                range "0 .. 255";
              }
            }
            description
              "Interface priority (in increments of 16 - 0,16,..240)";
          }
    
          leaf cost {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 200000000";
              }
            }
            description "Cost of the interface";
          }
    
          leaf mode {
            type enumeration {
              enum "point-to-point" {
                value 0;
                description
                  "Interface mode is point-to-point";
              }
              enum "shared" {
                value 1;
                description
                  "Interface mode is shared";
              }
            }
            description
              "Interface mode (P2P or shared)";
          }
    
          leaf edge {
            type empty;
            description "Port is an edge port";
          }
    
          leaf access-trunk {
            type empty;
            description
              "Send/Receive untagged RSTP BPDUs on this interface";
          }
    
          container bpdu-timeout-action {
            presence
              "enable bpdu-timeout-action";
            description
              "Define action on BPDU expiry (Loop Protect)";
            uses apply-advanced;
    
            leaf block {
              type empty;
              description "Block the interface";
            }
    
            leaf alarm {
              type empty;
              description "Generate an alarm";
            }
          }  // container bpdu-timeout-action
    
          leaf no-root-port {
            type empty;
            description
              "Do not allow the interface to become root (Root Protect)";
          }
    
          leaf disable {
            type empty;
            description
              "Disable Spanning Tree on port";
          }
        }  // grouping stp-interface
    
        grouping stp-trace-options {
          description
            "Trace options for Spanning Tree Protocol";
          uses apply-advanced;
    
          container file {
            description "Trace file options";
            leaf filename {
              type string {
                junos:posix-pattern "![/ %]";
                junos:pattern-message "Must not contain '/', % or a space";
                length "1 .. 1024";
              }
              description
                "Name of file in which to write trace information";
            }
    
            leaf replace {
              type empty;
              status deprecated;
              description
                "Replace trace file rather than appending to it";
            }
    
            leaf size {
              type string;
              description
                "Maximum trace file size";
            }
    
            leaf files {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "2 .. 1000";
                }
              }
              default "10";
              description
                "Maximum number of trace files";
            }
    
            leaf no-stamp {
              type empty;
              status deprecated;
              description
                "Do not timestamp trace file";
            }
    
            choice world-readable-choice {
              leaf world-readable {
                type empty;
                description
                  "Allow any user to read the log file";
              }
              leaf no-world-readable {
                type empty;
                description
                  "Don't allow any user to read the log file";
              }
            }  // choice world-readable-choice
          }  // container file
    
          list flag {
            junos:must "(".. file")";
            junos:must-message "Trace file name required to enable tracing";
            key "name";
            ordered-by user;
            description "Tracing parameters";
            leaf name {
              type enumeration {
                enum "events" {
                  value 0;
                  description
                    "Trace events to the protocol state machine";
                }
                enum "bpdu" {
                  value 1;
                  description
                    "Trace BPDU reception and transmission";
                }
                enum "timers" {
                  value 2;
                  description
                    "Trace protocol timers";
                }
                enum
                  "port-information-state-machine" {
                  value 3;
                  description
                    "Trace port information state machine";
                }
                enum
                  "port-receive-state-machine" {
                  value 4;
                  description
                    "Trace port receive state machine";
                }
                enum
                  "port-role-select-state-machine" {
                  value 5;
                  description
                    "Trace port role selection state machine";
                }
                enum
                  "port-role-transit-state-machine" {
                  value 6;
                  description
                    "Trace port role transit state machine";
                }
                enum
                  "port-state-transit-state-machine" {
                  value 7;
                  description
                    "Trace port state transit state machine";
                }
                enum
                  "port-migration-state-machine" {
                  value 8;
                  description
                    "Trace port migration state machine";
                }
                enum
                  "port-transmit-state-machine" {
                  value 9;
                  description
                    "Trace port transmit state machine";
                }
                enum
                  "topology-change-state-machine" {
                  value 10;
                  description
                    "Trace topology change state machine";
                }
                enum
                  "bridge-detection-state-machine" {
                  value 11;
                  description
                    "Trace Bridge detection state machine";
                }
                enum "state-machine-variables" {
                  value 12;
                  description
                    "Trace when state machine variables change";
                }
                enum "ppmd" {
                  value 13;
                  description
                    "Trace state and events for ppmd process";
                }
                enum "all-failures" {
                  value 14;
                  description
                    "Trace all failure conditions";
                }
                enum "all" {
                  value 15;
                  description "Trace all";
                }
              }
            }
    
            leaf disable {
              type empty;
              description
                "Disable this trace flag";
            }
          }  // list flag
        }  // grouping stp-trace-options
    
        grouping subscription-type {
          uses apply-advanced;
    
          leaf link-subscription {
            type string;
            default "100";
            description
              "Link bandwidth percentage for RSVP reservation";
          }
    
          leaf ct0 {
            junos:must "("protocols mpls diffserv-te bandwidth-model")";
            junos:must-message "Must have a diffserv-te bandwidth model configured when configuring subscription per traffic class";
            type string;
            default "100";
            description
              "Subscription percentage for traffic class 0";
          }
    
          leaf ct1 {
            junos:must "("protocols mpls diffserv-te bandwidth-model")";
            junos:must-message "Must have a diffserv-te bandwidth model configured when configuring subscription per traffic class";
            type string;
            default "100";
            description
              "Subscription percentage for traffic class 1";
          }
    
          leaf ct2 {
            junos:must "("protocols mpls diffserv-te bandwidth-model")";
            junos:must-message "Must have a diffserv-te bandwidth model configured when configuring subscription per traffic class";
            type string;
            default "100";
            description
              "Subscription percentage for traffic class 2";
          }
    
          leaf ct3 {
            junos:must "("protocols mpls diffserv-te bandwidth-model")";
            junos:must-message "Must have a diffserv-te bandwidth model configured when configuring subscription per traffic class";
            type string;
            default "100";
            description
              "Subscription percentage for traffic class 3";
          }
    
          list priority {
            key "priority-value";
            ordered-by user;
            description
              "Subscription percentage for a specific priority";
            leaf priority-value {
              junos:must "(!("protocols mpls diffserv-te"))";
              junos:must-message "Cannot configure per-priority subscription alongside diffserv-te";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 7";
                }
              }
              description
                "Priority for which subscription percent is being configured";
            }
    
            uses apply-advanced;
    
            leaf percent {
              junos:must "(!("protocols mpls diffserv-te"))";
              junos:must-message "Cannot configure per-priority subscription alongside diffserv-te";
              type string;
              description
                "Subscription percent for the specific priority";
            }
          }  // list priority
        }  // grouping subscription-type
    
        grouping system-id-ip-map {
          leaf name {
            type jt:mac-unicast;
          }
    
          uses apply-advanced;
    
          leaf ip-address {
            type jt:ipv4prefix;
            description "Peer ID (IP Address)";
          }
        }  // grouping system-id-ip-map
    
        grouping te-class-object {
          leaf traffic-class {
            type enumeration {
              enum "ct0" {
                value 0;
                description "Traffic class 0";
              }
              enum "ct1" {
                value 1;
                description "Traffic class 1";
              }
              enum "ct2" {
                value 2;
                description "Traffic class 2";
              }
              enum "ct3" {
                value 3;
                description "Traffic class 3";
              }
            }
            description "Traffic class";
          }
    
          leaf priority {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "0 .. 7";
              }
            }
            description
              "Preemption priority for this class";
          }
        }  // grouping te-class-object
    
        grouping v6-relay-option-interface-id-type {
          description "Interface ID processing";
          uses apply-advanced;
    
          container prefix {
            description
              "Add prefix to circuit/interface-id or remote-id";
            uses apply-advanced;
    
            leaf host-name {
              type empty;
              description
                "Add router host name to circuit / interface-id or remote-id";
            }
    
            leaf logical-system-name {
              type empty;
              description
                "Add logical system name to circuit / interface-id or remote-id";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Add routing instance name to circuit / interface-id or remote-id";
            }
          }  // container prefix
    
          leaf use-interface-description {
            junos:must "(!(".. require-interface-description"))";
            junos:must-message "use-interface-description may not be set with require-interface-desciption";
            type enumeration {
              enum "logical" {
                value 0;
                description
                  "Use the logical interface description";
              }
              enum "device" {
                value 1;
                description
                  "Use the device interface description";
              }
            }
            description
              "Use interface description instead of circuit identifier";
          }
    
          leaf use-vlan-id {
            junos:must "((!(".. no-vlan-interface-name") && (!(".. use-interface-description") && !(".. require-interface-description"))))";
            junos:must-message "Vlan-tag cannot be added as no-vlan-interface-name or interface-description is configured";
            type empty;
            description
              "Use VLAN id instead of name";
          }
    
          leaf no-vlan-interface-name {
            type empty;
            description
              "Not include vlan or interface name";
          }
    
          leaf include-irb-and-l2 {
            type empty;
            description
              "Include IRB and L2 interface name";
          }
    
          container use-option-82 {
            presence "enable use-option-82";
            description
              "Use option-82 circuit-id for interface-id";
            uses v6-relay-option-cid-rid-action;
          }  // container use-option-82
    
          container keep-incoming-interface-id {
            presence
              "enable keep-incoming-interface-id";
            description
              "Keep incoming interface identifier";
            uses v6-relay-option-cid-rid-action;
          }  // container keep-incoming-interface-id
        }  // grouping v6-relay-option-interface-id-type
    
        grouping v6-relay-option-cid-rid-action {
          uses apply-advanced;
    
          leaf strict {
            type empty;
            description
              "Drop packet if id not present";
          }
        }  // grouping v6-relay-option-cid-rid-action
    
        grouping v6-relay-option-remote-id-type {
          description "Remote ID processing";
          uses apply-advanced;
    
          container prefix {
            description
              "Add prefix to circuit/interface-id or remote-id";
            uses apply-advanced;
    
            leaf host-name {
              type empty;
              description
                "Add router host name to circuit / interface-id or remote-id";
            }
    
            leaf logical-system-name {
              type empty;
              description
                "Add logical system name to circuit / interface-id or remote-id";
            }
    
            leaf routing-instance-name {
              type empty;
              description
                "Add routing instance name to circuit / interface-id or remote-id";
            }
          }  // container prefix
    
          leaf use-interface-description {
            junos:must "(!(".. require-interface-description"))";
            junos:must-message "use-interface-description may not be set with require-interface-desciption";
            type enumeration {
              enum "logical" {
                value 0;
                description
                  "Use the logical interface description";
              }
              enum "device" {
                value 1;
                description
                  "Use the device interface description";
              }
            }
            description
              "Use interface description instead of circuit identifier";
          }
    
          leaf use-vlan-id {
            junos:must "((!(".. no-vlan-interface-name") && (!(".. use-interface-description") && !(".. require-interface-description"))))";
            junos:must-message "Vlan-tag cannot be added as no-vlan-interface-name or interface-description is configured";
            type empty;
            description
              "Use VLAN id instead of name";
          }
    
          leaf no-vlan-interface-name {
            type empty;
            description
              "Not include vlan or interface name";
          }
    
          leaf include-irb-and-l2 {
            type empty;
            description
              "Include IRB and L2 interface name";
          }
    
          container use-option-82 {
            presence "enable use-option-82";
            description
              "Use option-82 remote-id for v6 remote-id";
            uses v6-relay-option-cid-rid-action;
          }  // container use-option-82
    
          leaf keep-incoming-remote-id {
            type empty;
            description
              "Keep incoming remote identifier";
          }
        }  // grouping v6-relay-option-remote-id-type
    
        grouping v6-server-group-type {
          uses apply-advanced;
    
          list server-group {
            key "name";
            ordered-by user;
            description
              "One or more server groups";
            leaf name {
              type string {
                junos:posix-pattern "^[A-Za-z0-9][_0-9A-Za-z-]*$";
                junos:pattern-message "Must be a non-reserved string of 64 characters or less";
                length "1 .. 64";
              }
              description
                "DHCPv6 Server group name";
            }
    
            uses apply-advanced;
    
            list address {
              key "name";
              max-elements 32;
              ordered-by user;
              description
                "IP Address of one or more DHCP servers";
              leaf name {
                type jt:ipaddr;
                description
                  "IP Address of DHCP server";
              }
    
              uses apply-advanced;
            }  // list address
          }  // list server-group
        }  // grouping v6-server-group-type
    
        grouping vlan-policy {
          description "Virtual LAN";
          leaf name {
            type string;
            description "VLAN id";
          }
    
          uses apply-advanced;
    
          container policy {
            description "Attach policy";
            uses apply-advanced;
    
            leaf policy-name {
              type string;
              description
                "Router Advertisement Guard policy name";
            }
    
            choice policy-type {
              leaf stateful {
                type empty;
                description
                  "Stateful router advertisement guard";
              }
              leaf stateless {
                type empty;
                description
                  "Stateless router advertisement guard";
              }
            }  // choice policy-type
          }  // container policy
        }  // grouping vlan-policy
    
        grouping vlan-slaacd {
          description "Virtual LAN";
          leaf name {
            type string;
            description "VLAN id";
          }
    
          uses apply-advanced;
        }  // grouping vlan-slaacd
    
        grouping vlan-types {
          description "Virtual LAN";
          leaf name {
            junos:must "(((!("vlans ${vlan} isolated-vlan") && (!("vlans ${vlan} community-vlans") && !("vlans ${vlan} private-vlan"))) || !("vlans ${vlan} forwarding-options filter output")))";
            junos:must-message "Configuring Egress VACL is not supported on PVLAN";
            type string {
              length "2 .. 64";
            }
            description "VLAN name";
          }
    
          uses apply-advanced;
    
          leaf description {
            type string {
              junos:posix-pattern "^.{1,255}$";
              junos:pattern-message "Must be a string of 255 characters or less";
            }
            description
              "Text description of VLANs";
          }
    
          choice vlan-identifier-choice {
            leaf vlan-id {
              type string;
              description
                "IEEE 802.1q VLAN identifier for VLAN";
            }
            leaf-list vlan-id-list {
              junos:must "(!(("routing-instances ${instance} instance-type mac-vrf" && " .. vxlan")))";
              junos:must-message "vxlan can not be specified under vlan-id-list for mac-vrf instance";
              type jt:vlan-range;
              description
                "Create VLAN for each of the vlan-id specified in the vlan-id-list";
            }
            container vlan-tags {
              presence "enable vlan-tags";
              description
                "IEEE 802.1q VLAN tags for VLANs";
              leaf outer {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
    
              leaf inner {
                type string {
                  junos:posix-pattern "^(0[Xx][0-9A-Fa-f]{4}.([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4]))$|^([0-9]{1,3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-8][0-9]|409[0-4])$";
                  junos:pattern-message "vlan-id in vlan-tag (0xNNNN.vlan-id) must be 0 to 4094";
                }
                description
                  "[tpid.]vlan-id, tpid format is 0xNNNN and is optional";
              }
            }  // container vlan-tags
          }  // choice vlan-identifier-choice
    
          list interface {
            key "name";
            ordered-by user;
            description
              "Interface name for this VLAN";
            leaf name {
              junos:must "(!("interfaces $$-IFL encapsulation ethernet"))";
              junos:must-message "encapsulation ethernet is not allowed on l2 interface";
              junos:must "(!((("interfaces $$-IFL vlan-id-list" || "interfaces $$-IFL vlan-id-range") && (".. .. .. .. instance-type mac-vrf" && (".. .. .. .. service-type vlan-aware" || ".. .. .. .. service-type vlan-based")))))";
              junos:must-message "Interface with vlan-id-list/vlan-id-range cannot be added to vlan under mac-vrf routing-instance with vlan-based/vlan-aware service-type";
              junos:must "((!("interfaces $$-IFL family") || "interfaces $$-IFL family ethernet-switching"))";
              junos:must-message "only family ethernet-switching can be configured on this interface";
              junos:must "((!(("interfaces $$ vlan-id-list" || "interfaces $$ vlan-tags inner-list")) || (!((".. .. vlan-id" || ".. .. vlan-tags")) || (".. .. no-normalization" || ".. .. switch-options no-normalization"))))";
              junos:must-message "interface with vlan-id-list/inner-list cannot be added to a vlan with a vlan-id/vlan-tags configured";
              junos:must "(!(("interfaces $$-IFL family ethernet-switching interface-mode" || "interfaces $$-IFL family ethernet-switching vlan members")))";
              junos:must-message "Interface with 'interface-mode' config is not allowed under vlans";
              junos:must "(!(".. .. .. interfaces $$"))";
              junos:must-message "This interface is already defined at the routing-instance level";
              junos:must "(("interfaces $$-IFL" || !(".. .. .. .. protocols evpn encapsulation")))";
              junos:must-message "Interface not defined; Interface must be defined for configuring under VLAN for protocols evpn";
              junos:must "(((".. .. vlan-id all" && "interfaces $$-IFL input-vlan-map pop") || ((".. .. vlan-id inner-all" && "interfaces $$-IFL input-vlan-map") || (!((".. .. vlan-id" || ".. .. vlan-tags")) || (!(("interfaces $$-IFL input-vlan-map" || "interfaces $$-IFL output-vlan-map")) || (".. .. no-normalization" || ".. .. switch-options no-normalization"))))))";
              junos:must-message "interface with input/output vlan-maps cannot be added to a routing-instance with a vlan-id/vlan-tags configured";
              junos:must "((!("interfaces $$-IFL vlan-tags inner-range") || ((".. .. vlan-id all" || ".. .. vlan-id inner-all") || (".. .. no-normalization" || ".. .. switch-options no-normalization"))))";
              junos:must-message "vlan-tags inner-range is specified for this logical interface; 'vlan-id all' or 'vlan-id inner-all' should also be enabled";
              junos:must "(((!("interfaces $$-IFL vlan-id-range") || ".. .. vlan-id all") || (".. .. no-normalization" || ".. .. switch-options no-normalization")))";
              junos:must-message "vlan-id-range is specified for this logical interface; 'vlan-id all' should also be enabled";
              type string;
            }
    
            uses apply-advanced;
          }  // list interface
    
          leaf l3-interface {
            junos:must "(!((".. .. .. protocols evpn mclag" && !(".. no-arp-suppression"))))";
            junos:must-message "no-arp-suppression needs to be configured, when evpn is configured with mclag.";
            junos:must "(!((".. mcae-mac-synchronize" && "interfaces $$-IFL mac")))";
            junos:must-message "irb-ifl mac and vlan mcae-mac-synchronize cannot coexist";
            junos:must "((!("interfaces $$-IFL family mpls") || !(("routing-instances ${instance} instance-type virtual-switch" && ("routing-instances ${instance} protocols vpls" && "routing-instances ${instance} route-distinguisher")))))";
            junos:must-message "routing-interface with family MPLS cannot be added to virtual-switch with protocol VPLS";
            junos:must "((!(".. vlan-tags") || !("interfaces $$-IFL family mpls")))";
            junos:must-message "routing-interface with family MPLS cannot be added to bridge-domain with 'vlan-tags'";
            junos:must "(!("routing-instances ${instance} service-type vlan-bundle"))";
            junos:must-message "routing-interface not valid for vlan-bundle service type";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id inner-all")))";
            junos:must-message "l3-interface cannot be configured under vlans with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "((".. vlan-id" || ".. vlan-tags"))";
            junos:must-message "l3-interface can be configured only under vlans with 'vlan-id'/'vlan-tags'";
            type union {
              type jt:interface-unit;
              type string {
                pattern "<.*>|$.*";
              }
            }
            description
              "L3 interface name for this vlans";
          }
    
          leaf no-local-switching {
            type empty;
            description
              "Disable local switching within CE-facing interfaces";
          }
    
          container forwarding-options {
            description
              "Forwarding options configuration";
            uses juniper-ethernet-switching-forwarding-options;
          }  // container forwarding-options
    
          container multicast-snooping-options {
            junos:must "(".. .. .. protocols igmp-snooping vlan ${vlan}")";
            junos:must-message "multicast-snooping-options can be configured only if snooping is enabled on the vlan";
            description
              "Multicast snooping option configuration";
            uses juniper-multicast-snooping-options;
          }  // container multicast-snooping-options
    
          container switch-options {
            description
              "VLANs switch-options configuration";
            uses juniper-protocols-vlan;
          }  // container switch-options
    
          leaf domain-type {
            type enumeration {
              enum "bridge" {
                value 0;
                description
                  "Forwarding instance";
              }
            }
            description
              "Type of VLANs SVLAN/DVLAN";
          }
    
          leaf no-irb-layer-2-copy {
            junos:must "(".. l3-interface")";
            junos:must-message "l3-interface must be configured to configure this feature";
            type empty;
            description
              "Disable transmission of layer-2 copy of packets of IRB routing-interface";
          }
    
          leaf service-id {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32 {
                range "1 .. 65535";
              }
            }
            description
              "Service id required if VLAN is of type MC-AE, and vlan-id all or vlan-id none or vlan-tags is configured";
          }
    
          leaf mcae-mac-synchronize {
            junos:must "(".. l3-interface")";
            junos:must-message "Layer 3 interface for this VLAN is not configured";
            type empty;
            description
              "Enable IRB MAC synchronization in this VLAN";
          }
    
          container proxy-mac {
            junos:must "(".. .. .. instance-type virtual-switch")";
            junos:must-message "Applicable to instance-type evpn only";
            description "Proxy MAC settings";
            uses apply-advanced;
    
            leaf irb {
              junos:must "(!(".. .. no-arp-suppression"))";
              junos:must-message "Proxy MAC is not supported with no-arp-supression";
              junos:must "((".. .. l3-interface" && !(".. proxy-mac-address")))";
              junos:must-message "Proxy MAC in IRB mode should have routing-interface configured";
              type empty;
              description
                "Reply with virtual-gateway MAC or IRB MAC";
            }
    
            leaf proxy-mac-address {
              junos:must "(!(".. .. no-arp-suppression"))";
              junos:must-message "Proxy MAC is not supported with no-arp-supression";
              junos:must "((!(".. .. l3-interface") && !(".. irb")))";
              junos:must-message "Proxy MAC with specified MAC should not have routing-interface configured";
              type jt:mac-unicast;
              description
                "Reply with configured MAC for all requests";
            }
          }  // container proxy-mac
    
          leaf mcae-mac-flush {
            type empty;
            description
              "Enable IRB MAC flush in a/s mode for this VLAN on MCAE link up";
          }
    
          leaf private-vlan {
            junos:must "(!((".. isolated-vlan" || ".. community-vlans")))";
            junos:must-message "This vlan is already configured as primary vlan";
            junos:must "(!(".. l3-interface"))";
            junos:must-message "l3-interface cannot be configured on a secondary vlan";
            type enumeration {
              enum "isolated" {
                value 0;
                description "Isolated vlan";
              }
              enum "community" {
                value 1;
                description "Community vlan";
              }
            }
            description
              "Type of secondary vlan for private vlan";
          }
    
          leaf isolated-vlan {
            junos:must "(!(".. private-vlan"))";
            junos:must-message "This vlan is already configured as secondary vlan";
            type string;
            description "VLAN id or name";
          }
    
          leaf-list community-vlans {
            junos:must "(!(".. private-vlan"))";
            junos:must-message "This vlan is already configured as secondary vlan";
            type string;
            ordered-by user;
            description
              "List of VLAN id or name";
          }
    
          container vxlan {
            junos:must "((". riot-loopback" || (!(". riot-loopback") && (((". ovsdb-managed" || ".. .. .. switch-options ovsdb-managed") && (!((". ingress-node-replication" || ".. .. .. protocols evpn encapsulation vxlan")) && !(". multicast-group"))) || ((!((". ovsdb-managed" || ".. .. .. switch-options ovsdb-managed")) && ((". ingress-node-replication" || ".. .. .. protocols evpn encapsulation vxlan") && !(". multicast-group"))) || (!((". ovsdb-managed" || ".. .. .. switch-options ovsdb-managed")) && (!((". ingress-node-replication" || ".. .. .. protocols evpn encapsulation vxlan")) && ". multicast-group")))))))";
            junos:must-message "ovsdb, multicast-group, ingress-node-replication cannot be configured together. ingress-node-replication must be configured when remote-vtep-list is configured";
            junos:must "((". ovsdb-managed" || (".. .. .. switch-options ovsdb-managed" || (". multicast-group" || ("routing-instances ${instance} remote-vtep-list" || (".. .. .. switch-options remote-vtep-list" || (". ingress-node-replication" || (".. .. .. protocols evpn encapsulation vxlan" || ". riot-loopback"))))))))";
            junos:must-message "One of multicast-group or ovsdb-managed or ingress-node-replication or protocols evpn encapsulation vxlan or remote-vtep-list or riot-loopback should be enabled";
            junos:must "((!(".. vlan-id all") && !(".. vlan-id all")))";
            junos:must-message "vxlan does not support bridge domain with 'vlan-id all' or 'vlan-id inner-all'";
            junos:must "((". riot-loopback" || (!(". riot-loopback") && ("routing-instances ${instance} vtep-source-interface" || ".. .. .. switch-options vtep-source-interface"))))";
            junos:must-message "vtep-source-interface is required for VXLAN configuration";
            uses apply-advanced;
    
            leaf ovsdb-managed {
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. .. .. .. switch-options remote-vtep-list" || (".. multicast-group" || ".. .. .. .. protocols evpn encapsulation vxlan")))))";
              junos:must-message "ovsdb-managed not valid with remote-vtep-list or multicast-group or protocol evpn encapsulation vxlan";
              type empty;
              description
                "Bridge-domain is managed remotely via VXLAN OVSDB Controller";
            }
    
            leaf vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 16777214";
                }
              }
              description "VXLAN identifier";
            }
    
            leaf translation-vni {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 16777214";
                }
              }
              description
                "Translated VXLAN identifier";
            }
    
            leaf multicast-group {
              junos:must "(!(("routing-instances ${instance} remote-vtep-list" || (".. .. .. switch-options remote-vtep-list" || (".. ovsdb-managed" || ("routing-instances ${instance} switch-options ovsdb-managed" || ".. .. .. .. protocols evpn encapsulation vxlan"))))))";
              junos:must-message "multicast-group not valid with remote-vtep-list or ovsdb-managed or evpn configuration";
              type jt:ipv4addr;
              description
                "Multicast group registered for VXLAN segment";
            }
    
            leaf encapsulate-inner-vlan {
              type empty;
              description
                "Retain inner VLAN in the packet";
            }
    
            leaf decapsulate-accept-inner-vlan {
              type empty;
              description
                "Accept VXLAN packets with inner VLAN";
            }
    
            leaf unreachable-vtep-aging-timer {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint16 {
                  range "300 .. 1800";
                }
              }
              units "seconds";
              description
                "Unreachable VXLAN tunnel endpoint removal timer";
            }
    
            leaf ingress-node-replication {
              junos:must "(!(".. .. .. .. protocols evpn assisted-replication"))";
              junos:must-message "ingress-node-replication cannot be configured with assisted-replication";
              junos:must "((".. ovsdb-managed" || (".. .. .. .. switch-options ovsdb-managed" || ("routing-instances ${instance} remote-vtep-list" || (".. .. .. .. switch-options remote-vtep-list" || ".. .. .. .. protocols evpn encapsulation vxlan")))))";
              junos:must-message "Valid for ovsdb-managed instance or with remote-vtep-list or with protocols evpn encapsulation vxlan";
              type empty;
              description
                "Enable ingress node replication";
            }
    
            leaf-list static-remote-vtep-list {
              type jt:ipaddr;
              max-elements 1024;
              description
                "Configure vlan specific static remote VXLAN tunnel endpoints";
            }
    
            leaf riot-loopback {
              type empty;
              description
                "Enable loopback on RIOT platform";
            }
          }  // container vxlan
        }  // grouping vlan-types
    
        grouping juniper-ethernet-switching-forwarding-options {
          uses apply-advanced;
    
          container filter {
            description
              "Filtering for ethernet switching forwarding table";
            uses apply-advanced;
    
            leaf input {
              type string;
              description
                "Name of input filter to apply for forwarded packets";
            }
    
            leaf output {
              junos:must "(!(any "firewall family ethernet-switching filter $$ term <*> from traffic-type-except"))";
              junos:must-message "Vacl with term as 'from traffic-type-except' not supported on the egress side";
              junos:must "(!(any "firewall family ethernet-switching filter $$ term <*> from traffic-type"))";
              junos:must-message "Vacl with term as 'from traffic-type' not supported on the egress side";
              type string;
              description
                "Name of output filter to apply for forwarded packets";
            }
          }  // container filter
    
          container flood {
            description
              "Filtering for ethernet switching flood table";
            uses apply-advanced;
    
            leaf input {
              type string;
              description
                "Name of input filter to apply for ethernet switching flood packets";
            }
          }  // container flood
    
          container dhcp-relay {
            junos:must "(!("forwarding-options helpers bootp"))";
            junos:must-message "'dhcp-relay' statement cannot be included along with 'forwarding-options helpers bootp' statement";
            status deprecated;
            description
              "Dynamic Host Configuration Protocol relay configuration";
            uses jdhcp-relay-type;
          }  // container dhcp-relay
    
          container dhcp-security {
            presence "enable dhcp-security";
            description
              "DHCP access security configuration";
            uses jdhcp-security-type;
          }  // container dhcp-security
        }  // grouping juniper-ethernet-switching-forwarding-options
    
        grouping juniper-protocols-vlan {
          description
            "VLANs switch-options configuration";
          uses apply-advanced;
    
          container mac-table-size {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC address forwarding table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container mac-table-size
    
          container mac-ip-table-size {
            junos:must "(!(((".. .. .. protocols vpls" || ".. .. .. protocols evpn") && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-ip-table-size needs to be specified under switch-options for a virtual-switch instance";
            description
              "Size of MAC+IP bindings table";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings";
            }
          }  // container mac-ip-table-size
    
          container interface-mac-limit {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface-mac-limit needs to be specified under switch-options for a virtual-switch instance";
            description
              "Maximum MAC address learned per interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC addresses per interface";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description
                    "Forward the packet";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop packets and do not learn. Default is forward";
                }
                enum "log" {
                  value 2;
                  description
                    "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                }
                enum "shutdown" {
                  value 3;
                  description
                    "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                }
                enum "drop-and-log" {
                  value 4;
                  description
                    "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                }
              }
              description
                "Action when MAC limit is reached";
            }
          }  // container interface-mac-limit
    
          container interface-mac-ip-limit {
            description
              "Maximum number of MAC+IP bindings learned on the interface";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32;
              }
              description
                "Maximum number of MAC+IP bindings per interface";
            }
          }  // container interface-mac-ip-limit
    
          container mac-move-limit {
            presence "enable mac-move-limit";
            description
              "Number of MAC movements allowed on this VLAN";
            uses apply-advanced;
    
            leaf limit {
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "1 .. 4294967295";
                }
              }
              description
                "Number of MAC movements allowed on this VLAN";
            }
    
            leaf packet-action {
              type enumeration {
                enum "none" {
                  value 0;
                  description "Take no action";
                }
                enum "drop" {
                  value 1;
                  description
                    "Drop the packet and do not generate an alarm";
                }
                enum "log" {
                  value 2;
                  description
                    "Do not drop the packet but generate an alarm, an SNMP trap, or a system log entry.";
                }
                enum "shutdown" {
                  value 3;
                  description
                    "Disable the interface and generate an alarm, an SNMP trap, or a system log entry.";
                }
                enum "drop-and-log" {
                  value 4;
                  description
                    "Drop the packet and generate an alarm, an SNMP trap, or a system log entry.";
                }
                enum "vlan-member-shutdown" {
                  value 5;
                  description
                    "Disable the interface of this VLAN";
                }
              }
              default "drop";
              description
                "Action to be taken in case the MAC movement limit is exceeded";
            }
    
            list interface {
              key "name";
              ordered-by user;
              description
                "Interface that connect this site to the VPN";
              leaf name {
                type union {
                  type jt:interface-name;
                  type string {
                    pattern "<.*>|$.*";
                  }
                }
                description "Interface name";
              }
    
              uses apply-advanced;
    
              leaf action-priority {
                junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
                junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "0 .. 7";
                  }
                }
                description
                  "Blocking priority of this interface on mac move detection";
              }
            }  // list interface
          }  // container mac-move-limit
    
          leaf mac-table-aging-time {
            type union {
              type string {
                pattern "<.*>|$.*";
              }
              type uint32;
            }
            units "seconds";
            description
              "Delay for discarding MAC address if no updates are received";
          }
    
          leaf no-mac-learning {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "no-mac-learning needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Disable dynamic MAC address learning";
          }
    
          leaf no-normalization {
            type empty;
            description
              "Disable vlan id normalization for interfaces";
          }
    
          leaf mac-statistics {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "mac-statistics needs to be specified under switch-options for a virtual-switch instance";
            type empty;
            description
              "Enable MAC address statistics";
          }
    
          container static-rvtep-mac {
            description
              "Configure Static MAC and remote VxLAN tunnel endpoint entries";
            uses apply-advanced;
    
            list mac {
              key "mac_addr remote-vtep";
              description "Unicast MAC address";
              leaf mac_addr {
                type jt:mac-unicast;
              }
    
              leaf remote-vtep {
                type jt:ipaddr;
                description
                  "Configure static remote VXLAN tunnel endpoints";
              }
            }  // list mac
          }  // container static-rvtep-mac
    
          list interface {
            junos:must "(!((".. .. .. protocols vpls" && ".. .. ..  instance-type virtual-switch")))";
            junos:must-message "interface needs to be specified under switch-options for a virtual-switch instance";
            key "name";
            ordered-by user;
            description
              "Interface that connect this site to the VPN";
            leaf name {
              junos:must "(((".. .. .. interface $$" || (".. .. .. .. .. interface $$" || "interfaces $$-IFL family ethernet-switching vlan")) || "interfaces $$-IFL family ethernet-switching"))";
              junos:must-message "Interface must be part of this routing instance";
              type union {
                type jt:interface-name;
                type string {
                  pattern "<.*>|$.*";
                }
              }
              description "Interface name";
            }
    
            uses apply-advanced;
    
            container interface-mac-limit {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              description
                "Maximum number of MAC addresses learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC addresses per interface";
              }
    
              leaf disable {
                type empty;
                description
                  "Disable interface for interface-mac-limit";
              }
    
              leaf packet-action {
                type enumeration {
                  enum "none" {
                    value 0;
                    description
                      "Forward the packet";
                  }
                  enum "drop" {
                    value 1;
                    description
                      "Drop packets and do not learn. Default is forward";
                  }
                  enum "log" {
                    value 2;
                    description
                      "Do not drop the packet but generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "shutdown" {
                    value 3;
                    description
                      "Disable the interface and generate an alarm, an SNMP trap or a system log entry";
                  }
                  enum "drop-and-log" {
                    value 4;
                    description
                      "Drop the packet and generate an alarm, an SNMP trap or a system log entry";
                  }
                }
                description
                  "Action when MAC limit is reached";
              }
            }  // container interface-mac-limit
    
            leaf action-priority {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              type union {
                type string {
                  pattern "<.*>|$.*";
                }
                type uint32 {
                  range "0 .. 8";
                }
              }
              description
                "Blocking priority of this interface on mac move detection";
            }
    
            list static-mac {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              key "name";
              ordered-by user;
              description
                "Static MAC addresses assigned to this interface";
              leaf name {
                junos:must "((!(".. .. .. .. vlan-id all") || all ".. vlan-id <*>"))";
                junos:must-message " Specify vlan-id for qualified learning ";
                type jt:mac-addr;
                description "MAC address";
              }
    
              uses apply-advanced;
    
              list vlan-id {
                junos:must "(".. .. .. .. vlan-id all")";
                junos:must-message "'vlan-id all' has to be configured for the bridging domain";
                key "name";
                ordered-by user;
                description
                  "VLAN ID of learning VLAN";
                leaf name {
                  type union {
                    type string {
                      pattern "<.*>|$.*";
                    }
                    type uint32 {
                      range "0 .. 4094";
                    }
                  }
                  description "Learning VLAN";
                }
    
                uses apply-advanced;
              }  // list vlan-id
            }  // list static-mac
    
            container interface-mac-ip-limit {
              description
                "Maximum number of MAC+IP bindings learned on the interface";
              uses apply-advanced;
    
              leaf limit {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32;
                }
                description
                  "Maximum number of MAC+IP bindings per interface";
              }
            }  // container interface-mac-ip-limit
    
            leaf no-mac-learning {
              junos:must "(!(".. .. .. .. .. vlans ${vlan} private-vlan"))";
              junos:must-message "Switch-options configuration is not allowed on interfaces which are part of secondary VLANs";
              type empty;
              description
                "Disable dynamic MAC address learning";
            }
    
            leaf mac-pinning {
              type empty;
              description "Enable MAC pinning";
            }
    
            leaf persistent-learning {
              junos:must "(!("switch-options mac-table-aging-time "))";
              junos:must-message "Persistent learning can not co-exist with mac-table-aging-time";
              type empty;
              description
                "Enable persistent MAC learning on this interface";
            }
          }  // list interface
    
          container traceoptions {
            description
              "Trace options for this bridge domain";
            uses apply-advanced;
    
            leaf no-remote-trace {
              junos:must "("system tracing")";
              junos:must-message "'no-remote-trace' is valid only when [system tracing] is configured";
              type empty;
              description
                "Disable remote tracing";
            }
    
            container file {
              description
                "Trace file information";
              leaf filename {
                type string {
                  junos:posix-pattern "![/ %]";
                  junos:pattern-message "Must not contain '/', % or a space";
                  length "1 .. 1024";
                }
                description
                  "Name of file in which to write trace information";
              }
    
              leaf size {
                type string;
                description
                  "Maximum trace file size";
              }
    
              leaf files {
                type union {
                  type string {
                    pattern "<.*>|$.*";
                  }
                  type uint32 {
                    range "2 .. 1000";
                  }
                }
                default "3";
                description
                  "Maximum number of trace files";
              }
    
              choice world-readable-choice {
                leaf world-readable {
                  type empty;
                  description
                    "Allow any user to read the log file";
                }
                leaf no-world-readable {
                  type empty;
                  description
                    "Don't allow any user to read the log file";
                }
              }  // choice world-readable-choice
    
              leaf match {
                type jt:regular-expression;
                description
                  "Regular expression for lines to be logged";
              }
            }  // container file
    
            leaf level {
              type enumeration {
                enum "error" {
                  value 0;
                  description
                    "Match error conditions";
                }
                enum "warning" {
                  value 1;
                  description
                    "Match warning messages";
                }
                enum "notice" {
                  value 2;
                  description
                    "Match conditions that should be handled specially";
                }
                enum "info" {
                  value 3;
                  description
                    "Match informational messages";
                }
                enum "verbose" {
                  value 4;
                  description
                    "Match verbose messages";
                }
                enum "all" {
                  value 5;
                  description "Match all levels";
                }
              }
              default "error";
              description
                "Level of debugging output";
            }
    
            list flag {
              key "name";
              ordered-by user;
              description
                "Type of operation or event to include in trace";
              leaf name {
                type enumeration {
                  enum "configuration" {
                    value 0;
                    description
                      "Configuration operations";
                  }
                  enum "routing-socket" {
                    value 1;
                    description
                      "Routing socket operations";
                  }
                  enum "interface-device" {
                    value 2;
                    description
                      "Interface device operations";
                  }
                  enum "interface-logical" {
                    value 3;
                    description
                      "Logical interface operations";
                  }
                  enum "interface-family" {
                    value 4;
                    description
                      "Interface family operations";
                  }
                  enum "learning-domain" {
                    value 5;
                    description
                      "Learning domain operations";
                  }
                  enum "ipc" {
                    value 6;
                    description
                      "Inter-process communications operations";
                  }
                  enum "mac-learning" {
                    value 7;
                    description
                      "MAC address learning operations";
                  }
                  enum "initialization" {
                    value 8;
                    description
                      "Initialization operations";
                  }
                  enum "flood-next-hop" {
                    value 9;
                    description
                      "Flood next hop operations";
                  }
                  enum "storm-control" {
                    value 10;
                    description "Storm-control";
                  }
                  enum
                    "unknown-unicast-forwarding" {
                    value 11;
                    description
                      "Trace unknown unicast forwarding events";
                  }
                  enum "all" {
                    value 12;
                    description "All operations";
                  }
                }
              }
            }  // list flag
          }  // container traceoptions
        }  // grouping juniper-protocols-vlan
    
        grouping write-option-82-type {
          uses apply-advanced;
        }  // grouping write-option-82-type
      }  // module junos-conf-routing-instances
    

© 2024 YumaWorks, Inc. All rights reserved.