code: def add_services(self, info):
          
          if (self.login_uri):
              svc = self.login_service_description()
              svcs = []
              if (self.logout_uri):
                  svcs.append(self.logout_service_description())
              if (self.client_id_uri):
                  svcs.append(self.client_id_service_description())
              if (self.access_token_uri):
                  svcs.append(self.access_token_service_description())
              # Add one as direct child of service property, else array for >1
              if (len(svcs) == 1):
                  svc['service'] = svcs[0]
              elif (len(svcs) > 1):
                  svc['service'] = svcs
              info.add_service(svc)
docs: Add auth service descriptions to an IIIFInfo object.
  
          Login service description is the wrapper for all other
          auth service descriptions so we have nothing unless
          self.login_uri is specified. If we do then add any other
          auth services at children.
  
          Exactly the same structure is used in the authorized
          and unauthorized cases (although in the data could be
          different).