src/Entity/User.php line 18

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use App\Repository\UserRepository;
  4. use Doctrine\Common\Collections\ArrayCollection;
  5. use Doctrine\Common\Collections\Collection;
  6. use Doctrine\DBAL\Types\Types;
  7. use Doctrine\ORM\Mapping as ORM;
  8. use Scheb\TwoFactorBundle\Model\Email\TwoFactorInterface;
  9. use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
  10. use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
  11. use Symfony\Component\Security\Core\User\UserInterface;
  12. use Symfony\Component\Validator\Constraints as Assert;
  13. #[ORM\Entity(repositoryClassUserRepository::class)]
  14. #[UniqueEntity(fields: ['email'], message'There is already an account with this email')]
  15. class User implements UserInterfacePasswordAuthenticatedUserInterfaceTwoFactorInterface
  16. {
  17.     #[ORM\Id]
  18.     #[ORM\GeneratedValue]
  19.     #[ORM\Column]
  20.     private ?int $id null;
  21.     #[ORM\Column(length255)]
  22.     private ?string $firstName null;
  23.     #[ORM\Column(length255)]
  24.     private ?string $lastName null;
  25.     #[ORM\Column(length180uniquetrue)]
  26.     private ?string $email null;
  27.     /**
  28.      * @var array<int, string>
  29.      */
  30.     #[ORM\Column]
  31.     private array $roles = [];
  32.     #[ORM\Column(type'boolean')]
  33.     private ?bool $isVerified false;
  34.     #[ORM\Column(type'boolean')]
  35.     private ?bool $isApproved false;
  36.     #[ORM\Column(type'boolean')]
  37.     private ?bool $canChangeTheme true;
  38.     #[ORM\Column(type'boolean')]
  39.     private ?bool $showHideCollateralCoverage false;
  40.     #[ORM\Column(type'boolean')]
  41.     private ?bool $showHideTradeRequestLink true;
  42.     /**
  43.      * @var string The hashed password
  44.      */
  45.     #[ORM\Column]
  46.     #[Assert\Length(min8minMessage'Your password must be at least 8 characters long')]
  47.     #[Assert\Regex(pattern'^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W).*$^'message'Your password must contain at least one lowercase, one uppercase, one number and one special character')]
  48.     private ?string $password null;
  49.     #[Assert\EqualTo(propertyPath'password'message'Your passwords do not match!')]
  50.     public string $confirmPassword;
  51.     #[ORM\Column(length180nullabletrue)]
  52.     private ?string $authCode null;
  53.     #[ORM\Column(length255nullabletrue)]
  54.     private ?string $institutionName null;
  55.     #[ORM\Column(length255nullabletrue)]
  56.     private ?string $mainPhoneNumber null;
  57.     #[ORM\Column(length255nullabletrue)]
  58.     private ?string $mobilePhoneNumber null;
  59.     #[ORM\Column(length255nullabletrue)]
  60.     private ?string $referralAgent null;
  61.     #[ORM\Column(length255nullabletrue)]
  62.     private ?string $invitationCode null;
  63.     #[ORM\Column(typeTypes::TEXTnullabletrue)]
  64.     private ?string $notes null;
  65.     #[ORM\Column(length255nullabletrue)]
  66.     private ?string $sector null;
  67.     #[ORM\Column(length255nullabletrue)]
  68.     private ?string $country null;
  69.     #[ORM\Column(nullabletrue)]
  70.     private ?float $feeMargin 10;
  71.     #[ORM\ManyToOne(inversedBy'users')]
  72.     #[ORM\JoinColumn]
  73.     private ?Theme $associatedTheme null;
  74.     #[ORM\OneToOne(mappedBy'user'cascade: ['persist''remove'])]
  75.     private ?UserForm $userForm null;
  76.     /**
  77.      * @var Collection<int, SdsFormRequest>
  78.      */
  79.     #[ORM\OneToMany(mappedBy'user'targetEntitySdsFormRequest::class)]
  80.     private Collection $sdsFormRequests;
  81.     #[ORM\Column(type'boolean')]
  82.     private ?bool $isDeleted false;
  83.     #[ORM\Column]
  84.     private ?\DateTimeImmutable $createdAt null;
  85.     #[ORM\Column]
  86.     private ?\DateTimeImmutable $updatedAt null;
  87.     #[ORM\ManyToOne(inversedBy'users')]
  88.     private ?Currency $selectedCurrency null;
  89.     /**
  90.      * @var array<int, string>|null
  91.      */
  92.     #[ORM\Column(nullabletrue)]
  93.     private ?array $additionalEmails null;
  94.     /**
  95.      * @var Collection<int, Client>
  96.      */
  97.     #[ORM\ManyToMany(targetEntityClient::class, inversedBy'users')]
  98.     private Collection $clients;
  99.     /**
  100.      * @var Collection<int, SdsRequestsHistory>
  101.      */
  102.     #[ORM\OneToMany(mappedBy'editedBy'targetEntitySdsRequestsHistory::class)]
  103.     private Collection $sdsRequestsHistories;
  104.     /**
  105.      * @var Collection<int, SdsFormRequest>
  106.      */
  107.     #[ORM\OneToMany(mappedBy'createdBy'targetEntitySdsFormRequest::class)]
  108.     private Collection $createdRequests;
  109.     /**
  110.      * @var Collection<int, Counterparty>
  111.      */
  112.     #[ORM\ManyToMany(targetEntityCounterparty::class, mappedBy'cptyUsers')]
  113.     private Collection $counterparties;
  114.     /**
  115.      * @var Collection<int, SdsFormRequest>
  116.      */
  117.     #[ORM\OneToMany(mappedBy'deletedBy'targetEntitySdsFormRequest::class)]
  118.     private Collection $deletedSdsFormRequests;
  119.     /**
  120.      * @var Collection<int, ClientSsi>
  121.      */
  122.     #[ORM\OneToMany(mappedBy'submittedBy'targetEntityClientSsi::class)]
  123.     private Collection $submittedClientSsis;
  124.     /**
  125.      * @var Collection<int, ClientSsi>
  126.      */
  127.     #[ORM\OneToMany(mappedBy'editedBy'targetEntityClientSsi::class)]
  128.     private Collection $editedClientSsis;
  129.     /**
  130.      * @var Collection<int, ClientSsi>
  131.      */
  132.     #[ORM\OneToMany(mappedBy'declinedBy'targetEntityClientSsi::class)]
  133.     private Collection $declinedClientSsis;
  134.     public function __construct()
  135.     {
  136.         $this->sdsFormRequests = new ArrayCollection();
  137.         $this->setCreatedAt(new \DateTimeImmutable());
  138.         $this->setUpdatedAt(new \DateTimeImmutable());
  139.         $this->clients = new ArrayCollection();
  140.         $this->sdsRequestsHistories = new ArrayCollection();
  141.         $this->createdRequests = new ArrayCollection();
  142.         $this->counterparties = new ArrayCollection();
  143.         $this->deletedSdsFormRequests = new ArrayCollection();
  144.         $this->submittedClientSsis = new ArrayCollection();
  145.         $this->editedClientSsis = new ArrayCollection();
  146.         $this->declinedClientSsis = new ArrayCollection();
  147.     }
  148.     public function getId(): ?int
  149.     {
  150.         return $this->id;
  151.     }
  152.     public function getFirstName(): ?string
  153.     {
  154.         return $this->firstName;
  155.     }
  156.     public function setFirstName(string $firstName): self
  157.     {
  158.         $this->firstName $firstName;
  159.         return $this;
  160.     }
  161.     public function getLastName(): ?string
  162.     {
  163.         return $this->lastName;
  164.     }
  165.     public function setLastName(string $lastName): self
  166.     {
  167.         $this->lastName $lastName;
  168.         return $this;
  169.     }
  170.     public function getEmail(): ?string
  171.     {
  172.         return $this->email;
  173.     }
  174.     public function setEmail(string $email): self
  175.     {
  176.         $this->email $email;
  177.         return $this;
  178.     }
  179.     /**
  180.      * @see UserInterface
  181.      */
  182.     public function getRoles(): array
  183.     {
  184.         $roles $this->roles;
  185.         // guarantee every user at least has ROLE_USER
  186.         $roles[] = 'ROLE_USER';
  187.         return array_unique($roles);
  188.     }
  189.     /** @param array<int, string> $roles */
  190.     public function setRoles(array $roles): self
  191.     {
  192.         $this->roles $roles;
  193.         return $this;
  194.     }
  195.     public function isVerified(): bool
  196.     {
  197.         return $this->isVerified;
  198.     }
  199.     public function setIsVerified(bool $isVerified): self
  200.     {
  201.         $this->isVerified $isVerified;
  202.         return $this;
  203.     }
  204.     public function isApproved(): ?bool
  205.     {
  206.         return $this->isApproved;
  207.     }
  208.     public function setIsApproved(bool $isApproved): self
  209.     {
  210.         $this->isApproved $isApproved;
  211.         return $this;
  212.     }
  213.     public function canChangeTheme(): ?bool
  214.     {
  215.         return $this->canChangeTheme;
  216.     }
  217.     public function setCanChangeTheme(bool $canChangeTheme): self
  218.     {
  219.         $this->canChangeTheme $canChangeTheme;
  220.         return $this;
  221.     }
  222.     public function getShowHideCollateralCoverage(): ?bool
  223.     {
  224.         return $this->showHideCollateralCoverage;
  225.     }
  226.     public function setShowHideCollateralCoverage(bool $showHideCollateralCoverage): self
  227.     {
  228.         $this->showHideCollateralCoverage $showHideCollateralCoverage;
  229.         return $this;
  230.     }
  231.     public function getShowHideTradeRequestLink(): ?bool
  232.     {
  233.         return $this->showHideTradeRequestLink;
  234.     }
  235.     public function setShowHideTradeRequestLink(bool $showHideTradeRequestLink): self
  236.     {
  237.         $this->showHideTradeRequestLink $showHideTradeRequestLink;
  238.         return $this;
  239.     }
  240.     /**
  241.      * A visual identifier that represents this user.
  242.      *
  243.      * @see UserInterface
  244.      */
  245.     public function getUserIdentifier(): string
  246.     {
  247.         return (string) $this->email;
  248.     }
  249.     /**
  250.      * @see PasswordAuthenticatedUserInterface
  251.      */
  252.     public function getPassword(): string
  253.     {
  254.         return $this->password;
  255.     }
  256.     public function setPassword(string $password): self
  257.     {
  258.         $this->password $password;
  259.         return $this;
  260.     }
  261.     /**
  262.      * @see UserInterface
  263.      */
  264.     public function eraseCredentials(): void
  265.     {
  266.         // If you store any temporary, sensitive data on the user, clear it here
  267.         // $this->plainPassword = null;
  268.     }
  269.     /**
  270.      * Return true if the user should do two-factor authentication.
  271.      */
  272.     public function isEmailAuthEnabled(): bool
  273.     {
  274.         return true// This can be persisted fielD to switch email code authentication on/off
  275.     }
  276.     /**
  277.      * Return user email address.
  278.      */
  279.     public function getEmailAuthRecipient(): string
  280.     {
  281.         return $this->email;
  282.     }
  283.     /**
  284.      * Return the authentication code.
  285.      */
  286.     public function getEmailAuthCode(): ?string
  287.     {
  288.         if (null === $this->authCode) {
  289.             throw new \LogicException('The email authentication code was not set');
  290.         }
  291.         return $this->authCode;
  292.     }
  293.     /**
  294.      * Set the authentication code.
  295.      */
  296.     public function setEmailAuthCode(string $authCode): void
  297.     {
  298.         $this->authCode $authCode;
  299.     }
  300.     public function getInstitutionName(): ?string
  301.     {
  302.         return $this->institutionName;
  303.     }
  304.     public function setInstitutionName(string $institutionName): self
  305.     {
  306.         $this->institutionName $institutionName;
  307.         return $this;
  308.     }
  309.     public function getMainPhoneNumber(): ?string
  310.     {
  311.         return $this->mainPhoneNumber;
  312.     }
  313.     public function setMainPhoneNumber(string $mainPhoneNumber): self
  314.     {
  315.         $this->mainPhoneNumber $mainPhoneNumber;
  316.         return $this;
  317.     }
  318.     public function getMobilePhoneNumber(): ?string
  319.     {
  320.         return $this->mobilePhoneNumber;
  321.     }
  322.     public function setMobilePhoneNumber(?string $mobilePhoneNumber): self
  323.     {
  324.         $this->mobilePhoneNumber $mobilePhoneNumber;
  325.         return $this;
  326.     }
  327.     public function getReferralAgent(): ?string
  328.     {
  329.         return $this->referralAgent;
  330.     }
  331.     public function setReferralAgent(?string $referralAgent): self
  332.     {
  333.         $this->referralAgent $referralAgent;
  334.         return $this;
  335.     }
  336.     public function getInvitationCode(): ?string
  337.     {
  338.         return $this->invitationCode;
  339.     }
  340.     public function setInvitationCode(?string $invitationCode): self
  341.     {
  342.         $this->invitationCode $invitationCode;
  343.         return $this;
  344.     }
  345.     public function getNotes(): ?string
  346.     {
  347.         return $this->notes;
  348.     }
  349.     public function setNotes(?string $notes): self
  350.     {
  351.         $this->notes $notes;
  352.         return $this;
  353.     }
  354.     public function getSector(): ?string
  355.     {
  356.         return $this->sector;
  357.     }
  358.     public function setSector(?string $sector): self
  359.     {
  360.         $this->sector $sector;
  361.         return $this;
  362.     }
  363.     public function getCountry(): ?string
  364.     {
  365.         return $this->country;
  366.     }
  367.     public function setCountry(string $country): self
  368.     {
  369.         $this->country $country;
  370.         return $this;
  371.     }
  372.     public function getFeeMargin(): ?float
  373.     {
  374.         return $this->feeMargin;
  375.     }
  376.     public function setFeeMargin(?float $feeMargin): self
  377.     {
  378.         $this->feeMargin $feeMargin;
  379.         return $this;
  380.     }
  381.     public function getAssociatedTheme(): ?Theme
  382.     {
  383.         return $this->associatedTheme;
  384.     }
  385.     public function setAssociatedTheme(?Theme $associatedTheme): self
  386.     {
  387.         $this->associatedTheme $associatedTheme;
  388.         return $this;
  389.     }
  390.     public function getUserForm(): ?UserForm
  391.     {
  392.         return $this->userForm;
  393.     }
  394.     public function setUserForm(UserForm $userForm): self
  395.     {
  396.         // set the owning side of the relation if necessary
  397.         if ($userForm->getUser() !== $this) {
  398.             $userForm->setUser($this);
  399.         }
  400.         $this->userForm $userForm;
  401.         return $this;
  402.     }
  403.     /**
  404.      * @return Collection<int, SdsFormRequest>
  405.      */
  406.     public function getSdsFormRequests(): Collection
  407.     {
  408.         return $this->sdsFormRequests;
  409.     }
  410.     public function addSdsFormRequest(SdsFormRequest $sdsFormRequest): self
  411.     {
  412.         if (!$this->sdsFormRequests->contains($sdsFormRequest)) {
  413.             $this->sdsFormRequests->add($sdsFormRequest);
  414.             $sdsFormRequest->setUser($this);
  415.         }
  416.         return $this;
  417.     }
  418.     public function removeSdsFormRequest(SdsFormRequest $sdsFormRequest): self
  419.     {
  420.         if ($this->sdsFormRequests->removeElement($sdsFormRequest)) {
  421.             // set the owning side to null (unless already changed)
  422.             if ($sdsFormRequest->getUser() === $this) {
  423.                 $sdsFormRequest->setUser(null);
  424.             }
  425.         }
  426.         return $this;
  427.     }
  428.     public function isIsDeleted(): ?bool
  429.     {
  430.         return $this->isDeleted;
  431.     }
  432.     public function setIsDeleted(bool $isDeleted): self
  433.     {
  434.         $this->isDeleted $isDeleted;
  435.         return $this;
  436.     }
  437.     public function getCreatedAt(): ?\DateTimeImmutable
  438.     {
  439.         return $this->createdAt;
  440.     }
  441.     public function setCreatedAt(\DateTimeImmutable $createdAt): self
  442.     {
  443.         $this->createdAt $createdAt;
  444.         return $this;
  445.     }
  446.     public function getUpdatedAt(): ?\DateTimeImmutable
  447.     {
  448.         return $this->updatedAt;
  449.     }
  450.     public function setUpdatedAt(\DateTimeImmutable $updatedAt): self
  451.     {
  452.         $this->updatedAt $updatedAt;
  453.         return $this;
  454.     }
  455.     public function getSelectedCurrency(): ?Currency
  456.     {
  457.         return $this->selectedCurrency;
  458.     }
  459.     public function setSelectedCurrency(?Currency $selectedCurrency): self
  460.     {
  461.         $this->selectedCurrency $selectedCurrency;
  462.         return $this;
  463.     }
  464.     public function getAdditionalEmails(): ?string
  465.     {
  466.         return $this->additionalEmails implode(';'$this->additionalEmails) : null;
  467.     }
  468.     /** @param array<int, string>|null $additionalEmails */
  469.     public function setAdditionalEmails(?array $additionalEmails): self
  470.     {
  471.         $this->additionalEmails $additionalEmails;
  472.         return $this;
  473.     }
  474.     /**
  475.      * @return Collection<int, Client>
  476.      */
  477.     public function getClients(): Collection
  478.     {
  479.         return $this->clients;
  480.     }
  481.     public function addClient(Client $client): self
  482.     {
  483.         if (!$this->clients->contains($client)) {
  484.             $this->clients->add($client);
  485.         }
  486.         return $this;
  487.     }
  488.     public function removeClient(Client $client): self
  489.     {
  490.         $this->clients->removeElement($client);
  491.         return $this;
  492.     }
  493.     /**
  494.      * @return Collection<int, SdsRequestsHistory>
  495.      */
  496.     public function getSdsRequestsHistories(): Collection
  497.     {
  498.         return $this->sdsRequestsHistories;
  499.     }
  500.     public function addSdsRequestsHistory(SdsRequestsHistory $sdsRequestsHistory): self
  501.     {
  502.         if (!$this->sdsRequestsHistories->contains($sdsRequestsHistory)) {
  503.             $this->sdsRequestsHistories->add($sdsRequestsHistory);
  504.             $sdsRequestsHistory->setEditedBy($this);
  505.         }
  506.         return $this;
  507.     }
  508.     public function removeSdsRequestsHistory(SdsRequestsHistory $sdsRequestsHistory): self
  509.     {
  510.         if ($this->sdsRequestsHistories->removeElement($sdsRequestsHistory)) {
  511.             // set the owning side to null (unless already changed)
  512.             if ($sdsRequestsHistory->getEditedBy() === $this) {
  513.                 $sdsRequestsHistory->setEditedBy(null);
  514.             }
  515.         }
  516.         return $this;
  517.     }
  518.     /**
  519.      * @return Collection<int, SdsFormRequest>
  520.      */
  521.     public function getCreatedRequests(): Collection
  522.     {
  523.         return $this->createdRequests;
  524.     }
  525.     public function addCreatedRequest(SdsFormRequest $createdRequest): self
  526.     {
  527.         if (!$this->createdRequests->contains($createdRequest)) {
  528.             $this->createdRequests->add($createdRequest);
  529.             $createdRequest->setCreatedBy($this);
  530.         }
  531.         return $this;
  532.     }
  533.     public function removeCreatedRequest(SdsFormRequest $createdRequest): self
  534.     {
  535.         if ($this->createdRequests->removeElement($createdRequest)) {
  536.             // set the owning side to null (unless already changed)
  537.             if ($createdRequest->getCreatedBy() === $this) {
  538.                 $createdRequest->setCreatedBy(null);
  539.             }
  540.         }
  541.         return $this;
  542.     }
  543.     /**
  544.      * @return Collection<int, Counterparty>
  545.      */
  546.     public function getCounterparties(): Collection
  547.     {
  548.         return $this->counterparties;
  549.     }
  550.     public function addCounterparty(Counterparty $counterparty): self
  551.     {
  552.         if (!$this->counterparties->contains($counterparty)) {
  553.             $this->counterparties->add($counterparty);
  554.             $counterparty->addCptyUser($this);
  555.         }
  556.         return $this;
  557.     }
  558.     public function removeCounterparty(Counterparty $counterparty): self
  559.     {
  560.         if ($this->counterparties->removeElement($counterparty)) {
  561.             $counterparty->removeCptyUser($this);
  562.         }
  563.         return $this;
  564.     }
  565.     /**
  566.      * @return Collection<int, SdsFormRequest>
  567.      */
  568.     public function getDeletedSdsFormRequests(): Collection
  569.     {
  570.         return $this->deletedSdsFormRequests;
  571.     }
  572.     public function addDeletedSdsFormRequest(SdsFormRequest $deletedSdsFormRequest): self
  573.     {
  574.         if (!$this->deletedSdsFormRequests->contains($deletedSdsFormRequest)) {
  575.             $this->deletedSdsFormRequests->add($deletedSdsFormRequest);
  576.             $deletedSdsFormRequest->setDeletedBy($this);
  577.         }
  578.         return $this;
  579.     }
  580.     public function removeDeletedSdsFormRequest(SdsFormRequest $deletedSdsFormRequest): self
  581.     {
  582.         if ($this->deletedSdsFormRequests->removeElement($deletedSdsFormRequest)) {
  583.             // set the owning side to null (unless already changed)
  584.             if ($deletedSdsFormRequest->getDeletedBy() === $this) {
  585.                 $deletedSdsFormRequest->setDeletedBy(null);
  586.             }
  587.         }
  588.         return $this;
  589.     }
  590.     /**
  591.      * @return Collection<int, ClientSsi>
  592.      */
  593.     public function getSubmittedClientSsis(): Collection
  594.     {
  595.         return $this->submittedClientSsis;
  596.     }
  597.     public function addSubmittedClientSsi(ClientSsi $submittedClientSsi): self
  598.     {
  599.         if (!$this->submittedClientSsis->contains($submittedClientSsi)) {
  600.             $this->submittedClientSsis->add($submittedClientSsi);
  601.             $submittedClientSsi->setSubmittedBy($this);
  602.         }
  603.         return $this;
  604.     }
  605.     public function removeSubmittedClientSsi(ClientSsi $submittedClientSsi): self
  606.     {
  607.         if ($this->submittedClientSsis->removeElement($submittedClientSsi)) {
  608.             // set the owning side to null (unless already changed)
  609.             if ($submittedClientSsi->getSubmittedBy() === $this) {
  610.                 $submittedClientSsi->setSubmittedBy(null);
  611.             }
  612.         }
  613.         return $this;
  614.     }
  615.     /**
  616.      * @return Collection<int, ClientSsi>
  617.      */
  618.     public function getEditedClientSsis(): Collection
  619.     {
  620.         return $this->editedClientSsis;
  621.     }
  622.     public function addEditedClientSsi(ClientSsi $editedClientSsi): self
  623.     {
  624.         if (!$this->editedClientSsis->contains($editedClientSsi)) {
  625.             $this->editedClientSsis->add($editedClientSsi);
  626.             $editedClientSsi->setEditedBy($this);
  627.         }
  628.         return $this;
  629.     }
  630.     public function removeEditedClientSsi(ClientSsi $editedClientSsi): self
  631.     {
  632.         if ($this->editedClientSsis->removeElement($editedClientSsi)) {
  633.             // set the owning side to null (unless already changed)
  634.             if ($editedClientSsi->getEditedBy() === $this) {
  635.                 $editedClientSsi->setEditedBy(null);
  636.             }
  637.         }
  638.         return $this;
  639.     }
  640.     /**
  641.      * @return Collection<int, ClientSsi>
  642.      */
  643.     public function getDeclinedClientSsis(): Collection
  644.     {
  645.         return $this->declinedClientSsis;
  646.     }
  647.     public function addDeclinedClientSsi(ClientSsi $declinedClientSsi): self
  648.     {
  649.         if (!$this->declinedClientSsis->contains($declinedClientSsi)) {
  650.             $this->declinedClientSsis->add($declinedClientSsi);
  651.             $declinedClientSsi->setDeclinedBy($this);
  652.         }
  653.         return $this;
  654.     }
  655.     public function removeDeclinedClientSsi(ClientSsi $declinedClientSsi): self
  656.     {
  657.         if ($this->declinedClientSsis->removeElement($declinedClientSsi)) {
  658.             // set the owning side to null (unless already changed)
  659.             if ($declinedClientSsi->getDeclinedBy() === $this) {
  660.                 $declinedClientSsi->setDeclinedBy(null);
  661.             }
  662.         }
  663.         return $this;
  664.     }
  665. }