huawei-bras-dhcpv6-access

Configure the DHCPv6 user access.

  • Version: 2020-02-22

    huawei-bras-dhcpv6-access@2020-02-22


    
      module huawei-bras-dhcpv6-access {
    
        yang-version 1;
    
        namespace
          "urn:huawei:yang:huawei-bras-dhcpv6-access";
    
        prefix bras-dhcpv6-access;
    
        import huawei-ifm {
          prefix ifm;
        }
        import huawei-aaa {
          prefix aaa;
        }
        import huawei-bras-basic-access {
          prefix bras-basic-access;
        }
        import huawei-pub-type {
          prefix pub-type;
        }
        import ietf-inet-types {
          prefix inet;
        }
        import huawei-extension {
          prefix ext;
        }
        import ietf-yang-types {
          prefix yang;
        }
        import huawei-devm {
          prefix devm;
        }
        import huawei-network-instance {
          prefix ni;
        }
        import huawei-dhcpv6 {
          prefix dhcpv6;
        }
    
        organization
          "Huawei Technologies Co., Ltd.";
    
        contact
          "Huawei Industrial Base
        Bantian, Longgang
        Shenzhen 518129
        People's Republic of China
        Website: http://www.huawei.com
        Email: support@huawei.com";
    
        description
          "Configure the DHCPv6 user access.";
    
        revision "2020-02-22" {
          description
            "Description modification.";
          reference
            "Huawei private.";
    
        }
    
        revision "2019-10-17" {
          description "Second revision.";
          reference
            "Huawei private.";
    
        }
    
        revision "2019-04-02" {
          description "Initial revision.";
          reference
            "Huawei private.";
    
        }
    
        ext:task-name "bras-control";
    
        typedef option18-mode {
          type enumeration {
            enum "cn-telecom" {
              value 1;
              description
                "Configure option with cn-telecom format.";
            }
          }
          description "DHCPv6 option code mode.";
        }
    
        typedef option18-version {
          type enumeration {
            enum "version2" {
              value 2;
              description
                "Configure option with version2 format.";
            }
          }
          description
            "DHCPv6 option verdion type.";
        }
    
        container bras-dhcpv6-access {
          description
            "Configure the DHCPv6 user access.";
          container global-option {
            description
              "Configure bras DHCPv6 access.";
            container option37-decode {
              description
                "Configure Option 37 in DHCPv6 solicit or request packet decode.";
              leaf decode-any-format {
                type boolean;
                default "false";
                description
                  "Enable/disable Option 37 any format decode.";
              }
    
              leaf conflict-offline {
                type enumeration {
                  enum "ipv6" {
                    value 0;
                    description
                      "Only detects whether the IPv6 address assigned to a user from a DHCPv6 remote address pool and an IPv6 prefix pool conflicts with that of another user.";
                  }
                  enum "ipv6-and-radius" {
                    value 1;
                    description
                      "Detects whether the IPv6 address assigned to a user from a DHCPv6 remote address pool, an IPv6 prefix pool, or by the RADIUS server conflicts with that of another user.";
                  }
                }
                description
                  "The DHCPv6 conflict-ip-address offline user command configures the router to log out an online user and deny access of a new user. It detects that the IPv6 address assigned to the new user from a DHCPv6 remote address pool, an IPv6 prefix pool, or by the RADIUS server is the same as the IPv6 address of the online user.";
              }
            }  // container option37-decode
          }  // container global-option
    
          container global {
            description
              "Configure bras DHCPv6 access global.";
            container option {
              description
                "Configure the options.";
              container option17-decode {
                description
                  "Configure the device to parse the Option 17 field.";
                leaf option17-decode {
                  type boolean;
                  default "false";
                  description
                    "Enable/disable the device to parse the Option 17 field based on the format defined by the DSL forum.";
                }
    
                leaf wait-request-time {
                  type uint8 {
                    range "5..60";
                  }
                  units "s";
                  default "55";
                  description
                    "Specifies the DHCPv6 wait request time.";
                }
    
                leaf server-option {
                  type uint16 {
                    range "17";
                  }
                  description
                    "The option code retained in DHCPv6 server response messages.";
                }
              }  // container option17-decode
    
              container option-priority {
                description
                  "Configure the highest, medium, and lowest priorities for the DHCPv6 option delivered by the RADIUS server, configure in the domain scenario, and configure in the address pool scenario, respectively.";
                leaf enable {
                  type boolean;
                  default "false";
                  description
                    "Enable/disable the highest, medium, and lowest priorities for the DHCPv6 option delivered by the RADIUS server, configure in the domain scenario, and configure in the address pool scenario, respectively.";
                }
              }  // container option-priority
    
              container vendor-class {
                description
                  "Configure a mapping between the vendor-class attribute and a DHCPv6 option a code as well as the offset value.";
                leaf option-code {
                  type uint8 {
                    range "1..255";
                  }
                  default "16";
                  description
                    "Specifies a DHCPv6 option code.";
                }
    
                leaf offset-value {
                  type uint8 {
                    range "1..254";
                  }
                  description
                    "Specifies the offset value of the vendor-class attribute.";
                }
              }  // container vendor-class
    
              container option18 {
                description
                  "Configure the Option 18 processing policy.";
                leaf ignore-interface-type {
                  type boolean;
                  default "false";
                  description
                    'Enable/disable the device to encapsulate the interface type character string into the packet sent to the DHCPv6 server in the cn-telecom-defined format as "eth".';
                }
    
                leaf ignore-nas-logic {
                  type boolean;
                  default "false";
                  description
                    "Enable/disable a device to insert or from inserting the actual interface information into Option 18 in the cn-telecom format or the actual hostname and interface information into Option 18 in the TR-101 format of a message to be sent to a DHCPv6 server.";
                }
              }  // container option18
    
              container option37-option17 {
                description
                  "Configure the Option 37 or Option17 processing policy.";
                leaf nas-port-id-exclude {
                  type boolean;
                  default "false";
                  description
                    "Enable/disable a device from inserting the Option 37 and Option 17 information from a client into the NAS-Port-Id attribute encapsulated in the cn-telecom format of a packet to be sent to a RADIUS server.";
                }
              }  // container option37-option17
            }  // container option
    
            container user-offline {
              description
                "Configure user offLine.";
              leaf duid-mismatch {
                type boolean;
                default "false";
                description
                  "Enable/disable logging out the online user with the same MAC address but different DUIDs as that of a received DHCPv6 request packet.";
              }
            }  // container user-offline
    
            container client-duid-replace {
              description
                "Configure the router that functions as a DHCPv6 relay agent to replace the client DUID in a DHCPv6 message sent from a client with the one it generates for that client before sending the message to a server.";
              leaf enable {
                type boolean;
                default "false";
                description
                  "Enable/disable replace client.";
              }
            }  // container client-duid-replace
    
            container solict-speed {
              description
                "Configure DHCPv6 solicit speed.";
              leaf packet-num {
                type uint32 {
                  range "1..3000";
                }
                must
                  "((../packet-num) and (../second)) or (not(../packet-num) and not(../second))";
                description
                  "Specifies the maximum number of solicit packets that are received within a specified time period.";
              }
    
              leaf second {
                type uint32 {
                  range "1..10";
                }
                units "s";
                must
                  "((../packet-num) and (../second)) or (not(../packet-num) and not(../second))";
                description
                  "Specified time period.";
              }
            }  // container solict-speed
    
            container through-packet {
              description
                "Configure the router to transparently transmit DHCPv6 packets.";
              leaf enable {
                type boolean;
                default "true";
                description
                  "Enable/disable through packet.";
              }
            }  // container through-packet
    
            container rebind-no-user-reply {
              description
                "Configure the DHCPv6 rebind no-user action send an reply message in response to a client's DHCPv6 rebind message if a corresponding user entry does not exist on the device.";
              leaf enable {
                type boolean;
                default "false";
                description
                  "Enable/disable the DHCPv6 rebind no-user action send an reply message in response to a client's DHCPv6 rebind message if a corresponding user entry does not exist on the device.";
              }
            }  // container rebind-no-user-reply
    
            container reconfigure {
              presence
                "Create DHCPv6 reconfigure policy.";
              description
                "Enable/disable DHCPv6 reconfigure policy.";
              leaf retransmit-times {
                type uint8 {
                  range "1..8";
                }
                default "8";
                description
                  "Set the number of retransmission times of DHCPv6 reconfigure packets sent to users.";
              }
            }  // container reconfigure
    
            container lease-management {
              description
                "Configure the access frame IPv6 lease manage pool exclude function for remote IPv6 addresses pools.";
              leaf enable {
                type boolean;
                default "false";
                description
                  "Enable/disable to manage the leases of RADIUS-delivered IPv6 addresses that are not in the supported address pools.";
              }
            }  // container lease-management
    
            container whitelist-session-car {
              must "./cir <= ./pir";
              must "./cbs <= ./pbs";
              description
                "Configure DHCPv6 access whitelist session-car.";
              leaf enable {
                type boolean;
                default "true";
                description
                  "Enable/disable DHCPv6 access whitelist session-car.";
              }
    
              leaf cir {
                type uint32 {
                  range "0..1000000";
                }
                units "kbit/s";
                default "256";
                description
                  "DHCPv6 protocol packets committed information rate.";
              }
    
              leaf cbs {
                type uint32 {
                  range "0..9000000";
                }
                units "Byte";
                default "32000";
                description
                  "DHCPv6 protocol packets committed burst size.";
              }
    
              leaf pir {
                type uint32 {
                  range "0..1000000";
                }
                units "kbit/s";
                default "512";
                description
                  "DHCPv6 protocol packets peak information rate.";
              }
    
              leaf pbs {
                type uint32 {
                  range "0..9000000";
                }
                units "Byte";
                default "64000";
                description
                  "DHCPv6 protocol packets peak burst size.";
              }
            }  // container whitelist-session-car
    
            container duid-missmatch {
              description
                "Configure a BRAS device to continue to parse a DHCPv6 message in which the server identifier cannot be identified.";
              leaf reply {
                type boolean;
                default "false";
                description
                  "Enable/disable a BRAS device to continue to parse a DHCPv6 message in which the server identifier cannot be identified.";
              }
            }  // container duid-missmatch
    
            container reply-status-code {
              description
                "Configure the device not to respond with an Advertise packet if the Status Code in the Advertise packet is UnspecFail after receiving a DHCPv6 Solicit packet from a DHCPv6 user.";
              leaf reply-disable {
                type boolean;
                default "false";
                description
                  "Enable/disable the device not to respond with an Advertise packet if the Status Code in the Advertise packet is UnspecFail after receiving a DHCPv6 Solicit packet from a DHCPv6 user.";
              }
            }  // container reply-status-code
          }  // container global
    
          container rapid-commit {
            description
              "Configure the DHCPv6 server to support a rapid two-message exchange (solicit, reply).";
            leaf enable {
              type boolean;
              default "false";
              description
                "Enable/disable the DHCPv6 server to support a rapid two-message exchange (solicit, reply).";
            }
          }  // container rapid-commit
    
          container relay {
            status obsolete;
            description
              "Configure DHCPv6 Relay. This container is obsolete and the new container named relay-option on the interfaces.";
            container relay-options {
              status obsolete;
              description
                "List of the relay-forward packets. A packet sent to the DHCPv6 server in the bas relay scenario, the Option 18 and Option 37 attributes are inserted according to the OSP format.";
              list relay-option {
                key "interface-name";
                status obsolete;
                description
                  "Configure the relay-forward packet sent to the DHCPv6 server in the bas relay scenario, the Option 18 and Option 37 attributes are inserted according to the OSP format.";
                leaf interface-name {
                  type leafref {
                    path "/ifm:ifm/ifm:interfaces/ifm:interface/ifm:name";
                  }
                  must
                    "/ifm:ifm/ifm:interfaces/ifm:interface[ifm:name=current()]/ifm:type='GigabitEthernet' or
                      /ifm:ifm/ifm:interfaces/ifm:interface[ifm:name=current()]/ifm:type='10GE' or
                      /ifm:ifm/ifm:interfaces/ifm:interface[ifm:name=current()]/ifm:type='25GE' or
                      /ifm:ifm/ifm:interfaces/ifm:interface[ifm:name=current()]/ifm:type='400GE' or
                      /ifm:ifm/ifm:interfaces/ifm:interface[ifm:name=current()]/ifm:type='PW-VE' or
                      /ifm:ifm/ifm:interfaces/ifm:interface[ifm:name=current()]/ifm:type='FlexE' or
                      /ifm:ifm/ifm:interfaces/ifm:interface[ifm:name=current()]/ifm:type='Ethernet' or
                      /ifm:ifm/ifm:interfaces/ifm:interface[ifm:name=current()]/ifm:type='Eth-Trunk'";
                  status obsolete;
                  description
                    "Specifies an interface name.";
                }
    
                leaf remote-id-type {
                  type enumeration {
                    enum "neba" {
                      value 1;
                      description
                        "Specifies the remote-id padding to string NEBA.";
                    }
                    enum "vula" {
                      value 2;
                      description
                        "Specifies the remote-id padding to string VULA.";
                    }
                  }
                  default "neba";
                  status obsolete;
                  description
                    "Specifies the remote-id padding to string NEBA or VULA.";
                }
              }  // list relay-option
            }  // container relay-options
          }  // container relay
    
          container reconf-timeout-users {
            config false;
            description
              "List of statistics for clients that do not respond to reconfigure messages within the timeout period.";
            list reconf-timeout-user {
              key "index user-id";
              config false;
              description
                "Display the statistics for clients that do not respond to reconfigure messages within the timeout period.";
              leaf index {
                type uint32 {
                  range "0..4294967295";
                }
                config false;
                description "Index of Record.";
              }
    
              leaf user-id {
                type uint32 {
                  range "0..4294967295";
                }
                config false;
                description
                  "User ID of the client that does not respond to a Reconfigure message within the timeout period.";
              }
    
              leaf user-mac {
                ext:support-filter "true";
                type pub-type:mac-address {
                  length "0..255";
                }
                config false;
                description
                  "MAC address of the client that does not respond to a Reconfigure message within the timeout period.";
              }
    
              leaf session-id {
                ext:support-filter "true";
                type uint32;
                config false;
                description
                  "Session ID of the client that does not respond to a Reconfigure message within the timeout period.";
              }
    
              leaf ipv6-address {
                type inet:ipv6-address-no-zone;
                config false;
                description
                  "IPv6 address of the client that does not respond to a Reconfigure message within the timeout period.";
              }
    
              leaf ipv6-prefix {
                type inet:ipv6-address-no-zone;
                config false;
                description
                  "Prefix of the IPv6 address of the client that does not respond to a reconfigure message within the timeout period.";
              }
    
              leaf record-time {
                type string {
                  length "1..31";
                }
                config false;
                description
                  "Recorded time when client timeouts occur.";
              }
            }  // list reconf-timeout-user
          }  // container reconf-timeout-users
    
          container lease-proxy-users {
            config false;
            description
              "List of lease proxy users.";
            list lease-proxy-user {
              key "slot-id user-id";
              config false;
              description
                "Operational data of lease proxy users.";
              leaf slot-id {
                type string {
                  length "1..16";
                }
                description
                  "Slot of the lease proxy user.";
              }
    
              leaf user-id {
                type uint32 {
                  range "0..4294967295";
                }
                description
                  "User ID of the lease proxy user.";
              }
    
              leaf mac-address {
                ext:support-filter "true";
                type pub-type:mac-address {
                  length "0..255";
                }
                description
                  "MAC address of the lease proxy user.";
              }
    
              leaf interface {
                ext:support-filter "true";
                type string {
                  length "1..64";
                }
                description
                  "Interface of the lease proxy user.";
              }
    
              leaf pe-vlan {
                ext:support-filter "true";
                type uint16;
                description
                  "PE-VLAN of the lease proxy user.";
              }
    
              leaf ce-vlan {
                ext:support-filter "true";
                type uint16;
                description
                  "CE-VLAN of the lease proxy user.";
              }
    
              leaf start-time {
                type yang:date-and-time;
                description
                  "Original lease start time.";
              }
    
              leaf last-renew-time {
                type yang:date-and-time;
                description
                  "Original lease last renew time.";
              }
    
              leaf preferred-lifetime {
                type uint32;
                units "s";
                description
                  "Preferred lifetime of the lease proxy user.";
              }
    
              leaf valid-lifetime {
                type uint32;
                units "s";
                description
                  "Valid lifetime of the lease proxy user.";
              }
    
              leaf original-t1 {
                type uint32;
                units "s";
                description
                  "OriginalT1 of the lease proxy user.";
              }
            }  // list lease-proxy-user
          }  // container lease-proxy-users
    
          container access-lease-proxy-users {
            config false;
            description
              "List of access lease proxy users.";
            list access-lease-proxy-user {
              key "user-id";
              config false;
              description
                "Operational data of access lease proxy users.";
              leaf user-id {
                type uint32 {
                  range "0..4294967295";
                }
                description
                  "User ID of the lease proxy user.";
              }
    
              leaf interface {
                ext:support-filter "true";
                type string {
                  length "1..64";
                }
                description
                  "Interface of the lease proxy user.";
              }
    
              leaf domain-name {
                ext:support-filter "true";
                type leafref {
                  path "/aaa:aaa/aaa:domains/aaa:domain/aaa:name";
                }
                description
                  "Domain name of the lease proxy user.";
              }
    
              leaf vpn-instance {
                ext:support-filter "true";
                type leafref {
                  path "/ni:network-instance/ni:instances/ni:instance/ni:name";
                }
                description "VPN instance name.";
              }
    
              leaf mac-address {
                type pub-type:mac-address {
                  length "0..255";
                }
                description
                  "MAC address of the lease proxy user.";
              }
    
              leaf proxy-type {
                ext:support-filter "true";
                type enumeration {
                  enum "ipv4-stack" {
                    value 1;
                    description
                      "Specifies the proxy type of IPv4 stack.";
                  }
                  enum "ipv6-stack" {
                    value 2;
                    description
                      "Specifies the proxy type of IPv6 stack.";
                  }
                  enum "dual-stack" {
                    value 3;
                    description
                      "Specifies the proxy type of dual-stack.";
                  }
                }
                description
                  "Proxy type of the lease proxy user.";
              }
    
              leaf ipv4-address {
                type inet:ip-address-no-zone;
                description
                  "IPv4 address of the lease proxy user.";
              }
    
              leaf ipv6-address {
                type inet:ipv6-address-no-zone;
                description
                  "IPv6 address of the lease proxy user.";
              }
    
              leaf ipv6-prefix {
                type inet:ipv6-prefix;
                description
                  "IPv6 prefix of the lease proxy user.";
              }
    
              leaf pe-vlan {
                type uint16;
                description
                  "PE-VLAN of the lease proxy user.";
              }
    
              leaf ce-vlan {
                type uint16;
                description
                  "CE-VLAN of the lease proxy user.";
              }
    
              leaf ipv4-lease {
                type uint32;
                units "s";
                description
                  "IPv4 lease time of the lease proxy user.";
              }
    
              leaf preferred-lifetime {
                type uint32;
                units "s";
                description
                  "Preferred lifetime of the lease proxy user.";
              }
    
              leaf valid-lifetime {
                type uint32;
                units "s";
                description
                  "Valid lifetime of the lease proxy user.";
              }
            }  // list access-lease-proxy-user
          }  // container access-lease-proxy-users
    
          container ipoev6-user-delays {
            config false;
            description
              "List of IPoEv6 user detecting delay informations.";
            list ipoev6-user-delay {
              key "mac ipv6-prefix prefix-length vrfid";
              description
                "Statistics of IPoEv6 user detecting delay informations.";
              leaf mac {
                type pub-type:mac-address;
                description "User MAC address.";
              }
    
              leaf ipv6-prefix {
                type inet:ipv6-address-no-zone;
                description "User IPv6 prefix.";
              }
    
              leaf prefix-length {
                type uint8 {
                  range "1..128";
                }
                description
                  "User IPv6 address length.";
              }
    
              leaf vrfid {
                type uint32;
                description
                  "User vpn-instance ID.";
              }
    
              leaf detecting-delay-time {
                type uint32;
                units "ms";
                description
                  "User detecting delay time.";
              }
    
              leaf timestamp {
                type uint32;
                units "s";
                description "Acquisition time.";
              }
            }  // list ipoev6-user-delay
          }  // container ipoev6-user-delays
    
          container access-lease-proxy-user-statistics {
            config false;
            description
              "Statistics of access lease proxy user.";
            leaf total-lease-proxy-users {
              type uint32;
              description
                "The count of total lease proxy users.";
            }
    
            leaf dual-stack-users {
              type uint32;
              description
                "The count of dual stack type lease proxy users.";
            }
    
            leaf ipv4-stack-users {
              type uint32;
              description
                "The count of IPv4 stack type lease proxy users.";
            }
    
            leaf ipv6-stack-users {
              type uint32;
              description
                "The count of IPv6 stack type lease proxy users.";
            }
          }  // container access-lease-proxy-user-statistics
    
          container dhcpv6-client-statistics {
            config false;
            description
              "Statistics of DHCPv6 client.";
            leaf send-solicit {
              type uint32;
              units "packet";
              description
                "The count of solicit send packets.";
            }
    
            leaf send-request {
              type uint32;
              units "packet";
              description
                "The count of request send packets.";
            }
    
            leaf send-renew {
              type uint32;
              units "packet";
              description
                "The count of renew send packets.";
            }
    
            leaf send-rebind {
              type uint32;
              units "packet";
              description
                "The count of rebind send packets.";
            }
    
            leaf send-release {
              type uint32;
              units "packet";
              description
                "The count of release send packets.";
            }
    
            leaf send-decline {
              type uint32;
              units "packet";
              description
                "The count of decline send packets.";
            }
    
            leaf receive-advertise {
              type uint32;
              units "packet";
              description
                "The count of advertise receive packets.";
            }
    
            leaf receive-request-reply {
              type uint32;
              units "packet";
              description
                "The count of request reply receive packets.";
            }
    
            leaf receive-renew-reply {
              type uint32;
              units "packet";
              description
                "The count of renew reply receive packets.";
            }
    
            leaf receive-rebind-reply {
              type uint32;
              units "packet";
              description
                "The count of rebind reply receive packets.";
            }
    
            leaf receive-other {
              type uint32;
              units "packet";
              description
                "The count of other receive packets.";
            }
    
            leaf receive-conflict-address {
              type uint32;
              units "packet";
              description
                "The count of conflict address packets.";
            }
    
            leaf receive-transaction-id {
              type uint32;
              units "packet";
              description
                "The count of transactionid error packets.";
            }
    
            leaf receive-noduid-option {
              type uint32;
              units "packet";
              description
                "The count of no duid option packets.";
            }
    
            leaf receive-ip-or-udp-head {
              type uint32;
              units "packet";
              description
                "The count of ip or udp head error packets.";
            }
    
            leaf receive-iaid-error {
              type uint32;
              units "packet";
              description
                "The count of IAID error packets.";
            }
    
            leaf receive-client-duid-error {
              type uint32;
              units "packet";
              description
                "The count of clientduid error packets.";
            }
    
            leaf receive-prefix-lenth-error {
              type uint32;
              units "packet";
              description
                "The count of prefix length error packets.";
            }
    
            leaf receive-advertise-server-error {
              type uint32;
              units "packet";
              description
                "The count of advertise server error packets.";
            }
    
            leaf receive-reply-server-error {
              type uint32;
              units "packet";
              description
                "The count of reply server error packets.";
            }
          }  // container dhcpv6-client-statistics
        }  // container bras-dhcpv6-access
    
        rpc reset-ipv6-reconf-timeout {
          ext:node-ref "/bras-dhcpv6-access:bras-dhcpv6-access/bras-dhcpv6-access:reconf-timeout-users/bras-dhcpv6-access:reconf-timeout-user";
          description
            "Clears the records of clients that do not respond to reconfigure messages within the timeout period.";
          input {
            leaf all-timeout-record {
              type boolean;
              mandatory true;
              description
                "Clears the information about the clients that do not respond to reconfigure messages within the timeout period.";
            }
          }
        }  // rpc reset-ipv6-reconf-timeout
    
        rpc clear-lease-proxy-immediately {
          ext:node-ref "/ifm:ifm/ifm:interfaces/ifm:interface/bras-basic-access:bas/bras-basic-access:access-type/bras-basic-access:layer2-subscriber/bras-basic-access:layer2-subscriber/bras-dhcpv6-access:dhcpv6-access/bras-dhcpv6-access:lease-proxy";
          description
            "Clears the DHCPv6 lease proxy table immediately.";
          input {
            leaf if-name {
              type leafref {
                path "/ifm:ifm/ifm:interfaces/ifm:interface/ifm:name";
              }
              mandatory true;
              description
                "Clears the DHCPv6 lease proxy table of the BAS interface immediately.";
            }
          }
        }  // rpc clear-lease-proxy-immediately
      }  // module huawei-bras-dhcpv6-access
    

© 2023 YumaWorks, Inc. All rights reserved.