1. Introduction
The study of human gait is an interdisciplinary field that integrates principles of biomechanics, neurophysiology, and orthopedics to understand movement patterns during bipedal locomotion [
1]. The use of technologies such as force platforms and wearable or marker-based and marker-less systems for gait analysis allows the quantification of spatiotemporal, kinematic, and kinetic parameters, essential for the evaluation of neuromuscular pathologies, musculoskeletal injuries, and therapeutic interventions [
2]. Recent advances in machine learning algorithms and wearable and inertial sensors have improved the accuracy and accessibility of these analyses, facilitating their application in clinical and sports environments [
3].
Kinematics is the branch of mechanics that deals with the geometry of motion of rigid bodies without considering the masses of those bodies or the forces that cause movement. Forward and inverse kinematics are fundamental problems in clinical and research biomechanics [
4]. The forward kinematics (FK) problem involves determining the position and orientation of the end-effector of an articulated chain given a collection of known joint angles and segment lengths, while the inverse kinematics (IK) problem seeks to calculate the joint angles using the known position and orientation of the end-effector and segment lengths [
5]. Differential kinematics concerns the relationship between velocities. The forward differential kinematics problem consists in the determination of linear and angular velocities of the end-effector from known joint velocities. The inverse differential kinematic problem looks for the opposite relationship. Differential kinematics is often used to solve the IK problem through the derivation of the Jacobian matrix. Kinematic gait analysis involves the analysis of joint angles and segment movements during walking; previous studies suggest that examination of kinematic differences during the gait cycle can provide information related to the function of the lower limb to recommend postural control strategies [
6]. Kinematic analysis and gait characterization have been used in many fields, including path planing for biped walking robots and humanoids [
7,
8], development of robotic exoskeletons for gait assistance [
9], age-based performance evaluation [
10], chronic stroke assessment [
11], or cerebral palsy rehabilitation [
12].
The solution to the FK problem has been extensively documented in the literature. A detailed description of the method for solving this problem using homogeneous transformation matrices is provided in [
13]. Although rotation matrices in 3D space have nine elements, only three of them are independent, corresponding to the three degrees of freedom (DoF). This redundancy may lead to computational inefficiency [
14]. Other ways of representing rotations are described in [
15], such as the Euler angles representation, which uses three independent parameters, or the axis–angle representation, which uses four parameters to express the rotation of a given angle with respect to an axis in 3D space. Although these representations reduce parameter redundancy, they must be converted into rotation matrices to perform forward kinematics calculations.
Many robotics tasks, such as object manipulation, path tracking, or viewpoint control, rely on inverse kinematics (IK). However, for open kinematic chains, such as the human lower limb model used in this work, the IK problem is often difficult to solve analytically, and when closed forms solutions can be found, they are seldom unique [
16]. On the other hand, numerical algorithms such as Newton–Raphson, Jacobian methods, and damped least squares converge to a single solution for IK [
17]. Metaheuristics have recently attracted a lot of attention in the pursuit of answers to challenging optimization issues in subjects such as inverse kinematics [
18]. Artificial intelligence has already been used in combination with dual quaternions to analyze and eliminate accumulated errors in the FK and IK of a robot arm. This combination showed high efficiency and accuracy and has the important advantage of being able to obtain the robot arm parameters without knowing the robot’s structure in advance [
19].
Recently, quaternions have emerged as a fundamental tool in the kinematic analysis of robots and biomechanical systems with complex chains and structures due to their computational efficiency and absence of singularities, overcoming limitations of representations based on Euler angles [
20]. Quaternions have also been used efficiently for the kinematics and dynamics of rigid bodies [
21,
22]. Using the dual-quaternion exponential and logarithm, an efficient derivation of dual-quaternion forms of forward, differential, and inverse kinematics that eliminates the singularity is possible [
23]. This approach offers a potential way to use planar quaternions to control the 3-DoF of planar parallel mechanisms based on forward kinematics in real time [
24]. The most related work presents a method to solve the inverse kinematic problem for articulated chains using an iterative dual-quaternion and exponential mapping strategy [
25]. However, the authors point out some important limitations: when the joints are very close to their angular limits, the computed angles are pushed back and forth repeatedly, increasing the time to converge to a solution. Also, because the joint angles have not been weighted or coupled, some solutions generate unnatural postures. In addition, there are still problems to be solved, such as the compensation of modeling errors in biomechanical systems using quaternions, the real-time implementation in embedded platforms, or the generalization of quaternion-based methods for soft robots with nonlinear deformations.
In addition to the above-mentioned problems related to quaternion-based kinematic modeling, very few studies, including our previous works, have focused on the use of this approach to model human gait [
26,
27]. In [
28] an approach for data based prediction of rigid body movements is presented. The method uses a combination of data-based learning with a physically motivated neural network architecture and dual quaternions. The obtained results support the applicability and potential of the approach in terms of improving prediction performance.
Therefore, this study proposes a framework for the solution of forward and inverse kinematics problems applied to gait analysis in the sagittal plane of a 3-DoF kinematic model of the lower limb. This is guided by our overarching research question: How to model the kinematics of a lower limb during the gait cycle using dual quaternions for gait analysis in the sagittal plane? The main contribution of this work is the proposed framework to model and evaluate the motion of a lower limb during the gait cycle using dual quaternions, which can be extended to a kinematic chain with more DoF and multiple end-effectors.
2. Materials and Methods
Figure 1 depicts the general framework for the 3-DoF human gait analysis used in this work. The framework consists of a sequence of processes to solve the forward and inverse kinematics problems for a kinematic chain representing a human lower limb. The first forward kinematic process (
) has two inputs: the body segments parameters and the reference joint angles.
The input joint angles of the 3-DoF kinematic model consist of hip flexion–extension, knee flexion–extension, and ankle dorsiflexion–plantarflexion. With the objective to assess the accuracy of the IK method in different scenarios, we use three different gait cycles: normal gait, toe-walking, and heel-walking. The dataset of reference joint angles, publicly available and recorded using the SMART-E motion capture system (BTS, Milano, Italy), was acquired at 60 Hz during gait cycles performed by a group of subjects aged 22 to 72 years (mean
), with a mean body mass of
kg and a mean height of
m [
29].
The anatomical model used in this work corresponds to a subject with a height of 1.65 m. It is considered representative of the population of the dataset, since its height lies within one standard deviation from the mean height of the dataset population. The femur and tibia lengths, as well as lateral malleolus height and the distance from the lateral malleolus to the distal phalanx of the hallux (LM-to-DPH) were defined based on the adult human male anthropometric proportions [
30] and measurements [
31]. The body segments parameters are summarized in
Table 1.
The solution is a set of coordinates that describe the positions of anatomical landmarks in the knee, ankle, and toe in the sagittal plane, as well as the orientations of the femur, tibia, and foot with respect to the global coordinate system (referred to as workspace coordinates 1). Next, using the workspace coordinates 1, an IK method is used to estimate a set of joint angles (designated as estimated joint angles) that best reproduce the corresponding positions and orientations of anatomical landmarks and body segments. The second forward kinematics process () is then applied to the estimated joint angles to compute a second set of workspace coordinates (identified as workspace coordinates 2) for comparison purposes. To validate the results, RMS errors were calculated between the reference and estimated joint angles, as well as between workspace coordinates 1 and 2. Furthermore, all coordinates of the workspace and joint space were visualized and compared using 2D plots and a 3D model of the human right lower limb. A detailed description of each process, along with the fundamental theory, is provided in the following sections.
2.1. Quaternions Preliminaries
Quaternions were described by William Rowan Hamilton in 1843 [
32]. Let
denote the set of quaternions. A quaternion
is defined as
where
. The term
is the real or scalar part and
is the imaginary or vector part. The elements
are the unit vectors or imaginary units that satisfy
and form the orthonormal basis for
[
33]. Quaternions can also be represented as a column vector in
, that is
The following is a brief introduction to the essential definitions on quaternion and dual-quaternion algebra. For a comprehensive description of quaternion algebra refer to [
34].
Given the following quaternion operations are defined:
Addition. .
Multiplication.
, where
and × denote the scalar and vector product in
, respectively [
35]. Multiplication is associative and distributive but non-commutative.
Multiplication identity. .
Conjugate. .
Magnitude. .
Inverse. , such that .
There are two important subsets of :
is the set of unit quaternions defined as
This subset forms the 3-sphere and is used to represent 3D rotations. The inverse of a unit quaternion is its conjugate.
is the set of pure quaternions defined as
Since the vector part of is a column vector , pure quaternions are commonly used to represent vectors and translations in 3D.
2.2. Rotations Using Unit Quaternions
Unit quaternions can be treated as rotation operators in
.
Figure 2 shows the projection of a unit quaternion in the complex plane, where it can be visualized as the radius of a unit circle. Let
, and given that
, then
Moreover, since for every angle
, it is satisfied that
, there exists an angle
such that
and
[
34]. Also, a unit vector
representing the rotation axis of
can be defined. Then,
can be written in terms of the angle
and the unit vector
as
The product of two unit quaternions that have the same rotation axis
is a unit quaternion that represents the sum of the two rotation angles about
. Let
and
, the quaternion product
results in the following:
A unit quaternion
can be used to rotate a vector in
by applying the transformation
, where
is a pure quaternion that represents a 3D vector in the quaternion space. As an example, consider the unit quaternion
representing a rotation of angle
about the unit vector
. Applying this rotation to the basis vector
gives the following:
Using the right-hand rule for rotation, the result is the vector
rotated counter-clockwise through an angle
, about the vector
as an axis. Due to the fact that quaternion multiplication is non-commutative, the operation
results in the vector
rotated clockwise through an angle
, about the vector
as an axis.
Extending Euler’s equation for the exponential map of a complex number to quaternions, a unit quaternion can be defined as the exponential map of an angle and a unit vector pair
. Let
, where, given the results of Equations (
8) and (
9), half the angle
is used. The quaternion associated with this rotation is given by
where
and
[
36]. However, when
, there is a singularity in
[
23]. In order to avoid it, a Taylor series is used:
On the other hand, the logarithm of a unit quaternion
that encodes a rotation of an angle
about an axis
is given by
Note that, although the rotation angle
could be recovered using
, this formulation restricts the rotation to the interval
. In contrast, using
the possible rotation angles are in the range
, ensuring proper treatment of positive and negative rotations. When
, the expression
is not defined, and this is handled using a Taylor series as follows:
2.3. Dual Quaternions
Dual quaternions combine ordinary quaternions and dual numbers [
23]. A dual quaternion is a number of the form
where
is the primary part,
is the dual part, and
is the dual operator satisfying
. Given
, the following dual quaternion operations are defined:
Multiplication. .
Conjugate. .
Norm. .
Inverse. . Only when .
A dual quaternion is a unit if and only if
and
. The set of unit dual quaternions is denoted as
[
33]. Unit dual quaternions are always invertible because their inverse is their conjugate.
2.4. Rigid Transformations Using Dual Quaternions
Geometrically, elements of
equipped with the multiplication operation represent rigid motions in Euclidian 3D space [
33]. Let
and
; the translation
followed by the rotation
is given by
Conversely, for any
the rotation is given by
, and the translation is given by
Remarkably, the composition of rigid transformations is given by a sequence of unit dual quaternion multiplications. Let
, thus
Note that the primary part of the result is the composition of the rotations as shown in Equation (
7); that is
whereas the composition of translations can be obtained from the dual part using Equation (
17) as follows
2.5. Three-DoF Kinematic Model of the Human Lower Limb
The biomechanical functions of the human body can be represented using a series of rigid bodies connected by joints.
Figure 3 shows the collection of 3 rigid bodies connected by 3 revolute joints used to analyze the motion of the right lower limb in the sagittal plane. A revolute joint allows rotation around a single axis; therefore, each joint has one degree of freedom (DoF), while the resulting kinematic chain has three DoF.
The global coordinate system is represented by the fixed frame with coordinate axes , and pointing in the anterior, cranial, and lateral (to the right) directions, respectively. The origin of is the origin of the kinematic chain and is also referred to as the frame of joint 0. The hip, knee, and ankle joints correspond to indices , respectively. These joints are associated with the femur, tibia, and foot segments, in that same order. Each joint is assigned a local coordinate frame, denoted by , which defines the position of the anatomical landmarks at the joints and the orientation of the corresponding body segments. In anatomical posture all frames are aligned with frame , this is the initial posture of the kinematic chain. Global coordinates, expressed with respect to , are denoted by the superscript W, whereas relative coordinates, expressed with respect to the local coordinate frame of the preceding joint, are denoted by the superscript R.
Figure 3a illustrates that the distance from the origin of the global coordinate frame
to the hip joint frame
is expressed by
, since they are at the same point in space. The lengths of the femur and tibia are indicated by the
y component of
for
, respectively, and correspond to the values listed in
Table 1.
The symbol
in
Figure 3b denotes the axis–angle pair at each joint (also known as the joint configuration), where
is the hip flexion–extension angle,
is the knee flexion–extension angle, and
is the ankle dorsiflexion–plantarflexion angle. The rotation axis of each joint is given by
. For the 3-DoF kinematic chain representing the lower limb, the chain configuration is given by
The anatomical landmark at the toe is considered the end-effector of the kinematic chain and is assigned the local coordinate frame
. The distance from
to
is represented by the
x and
y components of
and take the values given in
Table 1. The relative orientation between
and
is indicated by the rotation vector
, since the orientation of the end-effector follows that of the ankle joint (joint 3).
2.6. Forward Kinematics
The posture (position and orientation) of any coordinate frame
in the global coordinate system is defined as
where
and
are the position and orientation vectors in
, respectively. Specifically, the positions are given by the 3D vectors
for the end-effector and
for the anatomical landmarks at the joints. The orientations are given by the 3D vector
for the foot and
for the femur (
) and the tibia (
). The forward kinematics problem is described formally by
where
f is a non-linear function that uniquely determines the posture of a given anatomical landmark
, based on the chain configuration vector
up to that point.
Let
and
be rotation and translation quaternions, respectively. The unit dual quaternion that represents the position and orientation of the local coordinate frame
with respect to the local coordinate frame
is given by
The unit dual quaternion that represents the posture of the end-effector coordinate frame
relative to the global coordinate frame
can be found by
where
indicates that joint 0 is fixed in the origin of the global coordinate frame.
describes the posture of joint 3 with respect to the global coordinate frame.
denotes the posture of the end-effector with respect to the local coordinate frame of joint 3.
From Equation (
18) it is known that
. Using Equations (
12), (
13), and (
17), the end-effector position
and orientation
can be extracted; therefore, the solution to the forward kinematics problem at any timestep of the gait cycle is given by
Similarly, the forward kinematics solution for each coordinate frame
is computed using Equation (
24) by composing the transformations up to the
i-th quaternion and is given by
Algorithm 1 summarizes the method described for the calculation of the forward kinematics solutions [
37].
Algorithm 1 Forward kinematics |
Require: Body segments parameters , reference joint configurations , and end-effector dual quaternion |
|
for , do |
|
|
|
|
|
|
end for |
|
|
|
return |
2.7. Inverse Kinematics
Let
f be the function that determines the end-effector posture vector
given the chain configuration vector
; the inverse kinematics problem can be defined as
which implies that there may not always exist a solution, and when it does, there may not be a unique solution [
38]. Nevertheless, it is desirable to find a solution that results in the most natural posture and the most stable behavior. For the case of human lower limbs, this means finding a solution with knee-forward configuration and smooth trajectories. In some cases, it is possible to compute the solution
analytically, by trying all possible joint configurations that bring the end-effector closer to the desired posture. For cases where it is not possible to compute an analytical solution, Jacobian-based methods iteratively approximate an effective inverse kinematics solution [
25]. The basic equation for forward dynamics that describes the velocities of the end-effector is given by
, where
J is the Jacobian matrix. This can be approximated as a small change in the end-effector posture caused by a small change in joint angles, given by
Therefore, the relationship expressed in Equation (
27) can be approximated as
In some cases, the Equation (
29) cannot be solved uniquely. Indeed, the Jacobian may not be square or invertible, and even if is invertible, Equation (
29) may work poorly if
J is near singularity. A recurring problem in tracking target postures is that when the target postures are too distant, the kinematic chain stretches out to try to reach the target position. Once the chain is extended in this way, it is usually near a singularity, that is, the Jacobian is very sensitive to small changes in joint angles, and the chain may shake or jitter, attempting unsuccessfully to reach the distant target [
38].
The Damped Least Squares (DLS) Jacobian method addresses many of the singularities problems of other Jacobian methods. DLS works by finding the value of
that minimizes the value of
where
is a positive, nonzero damping constant. The solution to the inverse kinematics problem using the DLS method is formally defined as
The value of the damping constant
depends on the parameters of the kinematic chain and target postures, which must be set to make the DLS numerically stable. Let
be the
error between the current posture
and the target posture
of the end-effector. By definition in Equation (
29), the approximation
is valid only for small changes
. Therefore, it is convenient to approximate the end-effector posture
to the target posture
only by a step size constant
. Then, the incremental posture update is defined as
. Thus, the new configuration is as follows:
and leads to a new posture of the end-effector
. For
and
, the Jacobian matrix is given by
where
, for
,
, are the partial derivatives of the components of the posture vector of the end-effector with respect to the logarithm of
. In fact, the columns of the Jacobian matrix are given by
The calculation of the partial derivatives of
and
and of the Jacobian matrix is discussed extensively in [
27]. At each timestep of the gait cycle, the inverse kinematics method iterates until the norm of the posture error
falls below a selected threshold
, or when the number of iterations exceeds the maximum limit
N.
2.8. IK Algorithm Parametrization
To prevent the IK solution from taking values outside the range of motion of the lower limb joints, it is necessary to set limits to the joint angles. Then, any rotation of the joints
is clamped as follows:
where the angle
is obtained from Equation (
32) using
. The quaternion logarithm with the clamped angle is given by
Table 2 summarizes the angular limits of the joints used in this work [
29].
Setting the angles of the the initial chain configuration
with the knee in slight flexion (
) forces a knee-forward solution. While setting the angles of the hip and the ankle joints close to the angle values in the first step of a given gait cycle improves the convergence time of the solution at the beginning of the estimation process. This is particularly visible in the heel-walking initial chain configuration values. The values shown in
Table 3 were set heuristically.
The values of the algorithm parameters
and
were computed by means of a particle swarm optimization algorithm [
39,
40].
Table 4, shows the numerical values of
and
for each gait pattern used in this work.
Additionally, to determine the values of
and
N, the following was considered: The frequency sampling of the data provided by the authors is 60 Hz [
29], which is equivalent to a period of
s. The resolution of the data was estimated as the minimum difference between all samples, for which the data were first sorted, and repeated values were removed. Then, the difference between contiguous values was calculated. Finally, the minimum difference was computed, the value of which was found to be
. From
Table 5 it can be seen that, for
, the average computation time per sample is
s (roughly 99 Hz) and that the average error norm is
. Both values are adequate given the characteristics of the data. Therefore, we established
.
The pseudocode in Algorithm 2 presents the way to solve the inverse kinematics problem for a kinematic chain of n DoF. In this work, we use a 3-DoF kinematic chain to model a lower limb on the sagittal plane.
Algorithm 2 Inverse kinematics |
Require: Target posture coordinates , step size factor , damping factor , joint limits , body segments parameters , initial chain configuration and end-effector dual quaternion |
|
|
|
|
|
while and do |
|
|
|
|
for
, do |
|
end for |
|
|
end while |
return |
4. Discussion
In previous works we addressed the solution of the forward kinematics problem to determine only the position of anatomical landmarks [
26] and a geometric approach to estimate the joint coordinates [
17]. This was useful for a first approximation but results in an incomplete description. In order to provide a complete solution, that is, a solution that not only describes the anatomical landmark positions at the knee, ankle, and hip but also that quantifies the angular variations of the joints and body segments in the sagittal plane, in the present study two main objectives were set. First, it aims to develop a framework for kinematic gait analysis using a dual-quaternions composition to solve the forward kinematics problem and the DLS Jacobian method for the inverse kinematics problem. Second, it seeks to assess whether the proposed method is applicable to different types of gait whose characteristics resemble those seen in pathological gait patterns.
Regarding the development of the proposed framework, the algebraic formulation presented in
Section 2 supports the reliability of the forward kinematics solution. Other representation formalisms, such as unit quaternions, Euler angles, and angle–axis representations in combination with 3D vectors, describe rotation and translation independently, which may result in a loss of coupling between rotation and translation [
41]. In contrast, dual-quaternion operations have been widely demonstrated to provide a unified and formally valid representation of rigid body transformations in three-dimensional Euclidean space, effectively integrating rotation and translation [
23]. Dual quaternions also avoid discontinuities and singularities that arise from the Euler angle representation, such as the phenomenon of gimbal lock [
42], and can be used to generate fast reliable IK solutions in real-time for highly articulated models [
43].
Furthermore, dual quaternions offer some advantages in representing human motion in gait analysis compared to homogeneous transformation matrices. Dual quaternions can be easily concatenated, interpolated smoothly, and provide rigid transform comparisons effortlessly [
43], but more important, they are a compact representation, using only eight parameters to represent both rotation and translation, while homogeneous matrices require twelve parameters [
42], which also reduces the number of algebraic operations for kinematic modeling applications [
41].
On the other hand,
Figure 5,
Figure 6 and
Figure 7 serve to highlight the differences in joint angles, anatomical landmark positions, and segment orientations over the three types of gait analyzed. In toe-walking, hip extension and knee flexion are reduced, and ankle dorsiflexion is absent. While, heel-walking is characterized by a lack of hip extension, reduced knee flexion, and decreased ankle plantarflexion. These gait abnormalities are features of pathological gaits seen in disease conditions such as cerebral palsy [
44], Parkinson’s disease [
45], and post-stroke hemiplegia [
46]. Gait deviations exhibited in impairments such as the aforementioned tend to be a continuum of deviations rather than distinct categories. Therefore, an accurate description of individual gait deviations, rather than a group classification, may provide better guidance for the development and customization of therapeutic treatments.
The RMSE data summarized in
Table 6,
Table 8, and
Table 9 show that, in general, both the estimated angles and the computed end-effector postures are close to the reference joint angles and to the target postures, respectively, for all gait types analyzed. Consequently, we consider that the proposed approach holds potential for gait analysis in clinical settings and that it can be applied to identify and quantify motor deficits, as well as to provide an objective assessment of gait treatments [
47].
Quantitative comparison of the proposed DLS algorithm with a Denavit–Hartenberg formulation shown in
Table 7 exhibit an improvement in computation time per sample, and a reduction in the number of iterations and on the average of the RMSE of the estimated angles in all gait types except for the toe-walking pattern. Therefore, further optimization of the algorithm and its parameters must be realized in order to solve the visible problems that limit the current performance of the proposed method.
Limitations
The presented IK method performs the estimations of the joint angles based only on the foot segment postures. Although in some cases this does not make it difficult to obtain an anatomically correct IK solution; in some other cases this results in the need for conditions to force a solution with a forward knee configuration and ensure fast convergence time at the beginning of the estimation process. The first condition is the need to impose an initial posture different from the anatomical posture. The initial postures used in this work are based on the rotation of the joints in the first step of the gait pattern analyzed. Currently, there is no general posture that is applicable for all different types of gait, but that would be desirable. In fact, in the case of heel-walking, to ensure fast convergence time at the beginning of the estimation process, it was necessary to set the initial estimated posture very close to the initial target posture.
The second condition is the need to impose joint limits close to the limits of the specific range of motion of the gait type being analyzed. The toe-walking gait cycle is an example of this scenario. A close look at
Figure 5 reveals a deviation of the estimated angles during the last
of the toe-walking gait cycle. The effects of this angular deviation are reflected in the positions of the anatomical landmarks and in the orientations of the body segments, as shown in
Figure 6 and
Figure 7, respectively. Although the imposition of joint limits helped to considerably reduce this deviation, it was not possible to eliminate it completely.
5. Conclusions
In this paper we presented a framework for solving forward and inverse kinematics problems, applied to two-dimensional gait analysis of a three-DoF model of the human lower limb. However, due to the generality of the formulation, the method can be extended to the analysis of kinematic chains with more degrees of freedom and multiple end-effectors, as would be the case of a model of the human body representing the motion of all its limbs in three dimensions. Furthermore, we consider that the proposed algorithms could be used in diverse scenarios such as performance evaluation in sports or in the clinical diagnosis of motor deficits. In particular, the results demonstrate that diseases that share characteristics with toe-walking and heel-walking, such as cerebral palsy, Parkinson’s disease, or post-stroke hemiplegia could be analyzed using the proposed method.
Despite the encouraging results, a rigorous comparison with other numerical methods and IK solvers is still needed. In addition, a review of novel methods, such as those based on machine learning, could provide useful tools to generalize the results and reduce the need for specific parameterizations for each type of motion. Finally, it is necessary to consider the inclusion of more diverse data and therefore the development of the necessary methods for the acquisition and processing of data from different types of sensors for the recording of gait kinematic data.