Opened 4 months ago

Closed 12 days ago

#700 closed задача (fixed)

Добавить поддержку исполнения 2 для платы PE-14

Reported by: AlexLir Owned by: alx
Priority: средний Milestone: 1 очередь
Component: sw Keywords:
Cc:

Description (last modified by AlexLir)

Параметры PE-14 исп. 2 нужно отображать так-же как параметры исп. 1, за исключением того что у плат исп. 2 есть новые переменные:
.13.0: RO, INT8 - Ревизия ПО платы. Если переменная .13.0 присутствует в MIB, то в переменную .5.5.1.0 в 5 байт нужно записать не константные значения(0x5F), а значения с checkbox "Port-based VLAN settings", рассчитанные по такому же алгоритму как для остальных портов. Если переменная .13.0 отсутствует, то в переменную .5.5.1.0 в 5 байт нужно записать константу 0x5F(как это сейчас и делается).

.14.0: RO, INT8 - Авария "Отсутствует 48 вольт". В верхней части диалогового окна платы, в исполнении 1 выводилась предупреждающая надпись если отсутствовали плата питания, которая формирует напряжение 48 вольт. В исполнении 2 нужно вывести предупреждающую надпись "Предупреждение: для работы PoE требуется наличие в блоке напряжения 48 В" если переменная .14.0 == 1, иначе надпись не выводить.

.250.0 - серийный номер

Change History (31)

comment:1 by AlexLir, 4 months ago

Потыкть плату можно в блоке 192.168.20.202

in reply to:  description comment:2 by alx, 4 months ago

Replying to AlexLir:

Если переменная .13.0 присутствует в MIB, то в переменную .5.0 в...

Здесь какая-то ошибка: у платы PE-14 нет переменной .5.0.

comment:3 by AlexLir, 4 months ago

Действительно, переменная .5 - эта таблица на 5 портов.
Исправляю ранее написанное:
.13.0: RO, INT8 - Ревизия ПО платы. Если переменная .13.0 присутствует в MIB, то в переменную .5.5.0 в 5 байт нужно записать не константные значения(0x5F), а значения с checkbox "Port-based VLAN settings", рассчитанные по такому же алгоритму как для остальных портов. Если переменная .13.0 отсутствует, то в переменную .5.5.0 в 5 байт нужно записать константу 0x5F(как это сейчас и делается).

comment:4 by AlexLir, 4 months ago

Description: modified (diff)

in reply to:  3 comment:5 by alx, 4 months ago

Replying to AlexLir:

Действительно, переменная .5 - эта таблица на 5 портов.
Исправляю ранее написанное:
.13.0: RO, INT8 - Ревизия ПО платы. Если переменная .13.0 присутствует в MIB, то в переменную .5.5.0

Здесь опять ошибка: в плате PE-14 нет переменной .5.5.0.

Так как речь идет о таблице, то вторая "5" здесь означает номер строки в таблице (пятая строка), а далее должен следовать oid столбца в этой строке, он не может быть пустым. Предполагаю, что имелась в виду переменная .5.5.1.0. Угадал? :)

Last edited 4 months ago by alx (previous) (diff)

comment:6 by AlexLir, 4 months ago

Да. Угадал)))

Last edited 4 months ago by AlexLir (previous) (diff)

comment:7 by AlexLir, 4 months ago

Description: modified (diff)

in reply to:  6 comment:8 by alx, 4 months ago

Replying to AlexLir:

Да. Угадал)))

Хорошо. С этим разобрались, нужный байт я нашел. Однако возник новый вопрос...

Replying to AlexLir:

Если переменная .13.0 присутствует в MIB, то в переменную .5.5.1.0 в 5 байт нужно записать не константные значения(0x5F),...
Если переменная .13.0 отсутствует, то в переменную .5.5.1.0 в 5 байт нужно записать константу 0x5F(как это сейчас и делается).

Здесь опять какая-то ошибка. Так не делается сейчас (и по-моем не делалось никогда) - в 5-й байт переменной .5.5.1.0 не записывается константа. Значение, записываемое в этот байт, определяется задаваемой пользователем конфигурацией. Неверно указан номер байта? Прошу уточнить.

comment:9 by AlexLir, 4 months ago

Вот кусок кода из JS, где в порт == 5 плат PE-04 или PE-14, записывается в массив data[5] = 0x5F

if((this.type == 22 || this.type == 45) && p == 5) {
	data[5] = 0x5f;
	data[15] = 0x20;
	data[29] = 3;
}

Именно про этот байт и идет речь.

Last edited 4 months ago by AlexLir (previous) (diff)

in reply to:  9 comment:10 by alx, 4 months ago

Replying to AlexLir:

if((this.type == 22 || this.type == 45) && p == 5) {
	data[5] = 0x5f;

А, действительно... 45 - это же PE-14 и есть!

Но тогда я не понимаю, как выполнить то, что предлагается в описании тикета:

...в переменную .5.5.1.0 в 5 байт нужно записать не константные значения(0x5F), а значения с checkbox "Port-based VLAN settings", рассчитанные по такому же алгоритму как для остальных портов.

Если в веб-интерфейсе значение, рассчитанное как для всех остальных портов, было заменено константой (в приведенном выше фрагменте кода), следовательно, рассчитанное значение было безвозвратно потеряно - в плату PE-14 было записано значение 0x5f, и именно это значение (а не рассчитанное как для всех остальных портов) было записано в конфиг-файл. То есть в конфиг-файле для порта 5 в пятом байте всегда записано 0x5f! Как же я теперь вместо 0x5f могу записать то, что когда-то было рассчитано веб-интерфейсом, но никогда не передавалось в блок? По-моему это невыполнимо...

comment:11 by AlexLir, 4 months ago

Вот именно если есть переменная .13.0 значение 5 порта ненужно заменять константой, а если нет переменной .13.0 заменить значение константой.

in reply to:  11 ; comment:12 by alx, 4 months ago

Replying to AlexLir:

Вот именно если есть переменная .13.0 значение 5 порта ненужно заменять константой, а если нет переменной .13.0 заменить значение константой.

Ты не понимаешь, о чем я говорю. Представь себе, что год назад пользователь сконфигурировал плату и записал конфиг в ПЗУ. Там байт 5 переменной .5.5.1.0 уже заменен константой! Теперь в блок вставили PE-14 исполнения 2. Откуда теперь брать то, что год назад было заменено константой 0x5f?

in reply to:  12 comment:13 by alx, 4 months ago

Replying to alx:

Откуда теперь брать то, что год назад было заменено константой 0x5f?

Хорошо. Я только что сообразил, что этот байт можно перевычислить. Ведь при чтении настроек из платы веб-интерфейс каким-то образом узнает, какие чекбоксы отмечены, а какие нет. Следовательно, в конфиге эта информация в какой-то форме присутствует. Следовательно, ее можно извлечь и перевычислить наш несчастный 5-й байт по правилам остальных портов...

Но не могу удержаться от вопроса: зачем ты сделал в двух исполнениях одной и той же платы, одинаковых по функционалу (судя по тому, что никаких изменений в диалоге конфигурации делать не предлагается) разный формат настроек? Если все чекбоксы, select'ы и прочие поля ввода в веб-интерфейсе остались прежние, зачем ты формат конфига изменил? Разве не было бы логичнее (и, главное, проще!) оставить его прежним??? Это был риторический вопрос...

Last edited 4 months ago by alx (previous) (diff)

comment:14 by san, 4 months ago

То что год назад было заменено константой, конечно никак не вернёшь :)
Алексей, приостанови пока работу по этому тикету, мы с Сашей сейчас обсуждали и увидели что есть проблема.
Попробую объяснить.
В разводке GE-04 в сторону кросс смотрит порт 4 коммутатора платы, а в разводке PE-04 - порт 5.
ПО платы PE-04 было сделано из ПО GE-04, настройки порта были перенесены в соответствующий порт, однако один битик в настройках port-based порта смотрящего в кросс сместить с позиции 4 в позицию 5 забыли. В результате этот порт имел настройку port-based "сам в себя" т.е. трафик кольцевался. Т.к. в момент выпуска ПО платы суть проблемы была неизвестна(а как обычно нужно было срочно отгружать), то вместо "настройки делающей кольцо" разработчик принял решение писать константу 0x5f, что сломало настройку, но избавило от кольца. Затем проблема была благополучно забыта, пока не появилась плата PE-14 исп 2 с другим контроллером и ПО платы было переписано другим разработчиком.

comment:15 by san, 4 months ago

Разве не было бы логичнее (и, главное, проще!) оставить его прежним

Да тут ты прав. Логичнее сделать для обоих исполнений PE-14 и для PE-04 одинаковую настройку.
Сейчас мы с Сашей сформулируем что конкретно нужно записать в плату, чтобы настройка стала рабочей и не было колец.

in reply to:  14 comment:16 by alx, 4 months ago

Replying to san:

То что год назад было заменено константой, конечно никак не вернёшь :)

Прочитай comment:13 - насколько я понимаю, как раз вернешь (если я там нигде не ошибся в своих рассуждениях).

Алексей, приостанови пока работу по этому тикету,

Нет проблем.

Попробую объяснить.

Сразу скажу, что объяснить не получилось. Главным образом потому, что я искренне не понимаю, какое отношение внутреннее устройство и прошлые проблемы плат GE-04 и PE-04 имеют к плате PE-14 и к веб-интерфейсу...

В веб-интерфейсе для конфигурации кроссового порта платы PE-14 исполнения 1 имеется 6 чекбоксов ("Запрет управления потоком" не считаю) и две строки ввода. Значения всех этих элементов в какой-то форме передаются плате. В PE-14 исполнения 2 все эти конфигурационные элементы и их семантика остались прежними. Так зачем разработчик изменил формат, в котором те же самые настройки передаются плате? Это был риторический вопрос.

В разводке GE-04 в сторону кросс смотрит порт 4 коммутатора платы, а в разводке PE-04 - порт 5.

Какое это имеет значение? Из веб-интерфейса в переменную .5.5.1.0 передаются настройки кроссового порта коммутатора. Какое имеет значение, какой физический номер этот порт имеет в каждой конкретной плате? Хоть четвертый, хоть пятый, хоть двадцать пятый... Плата получила настройки, и она знает, что это настройки того порта, который идет в кросс-плату, какой бы номер он не имел...

ПО платы PE-04 было сделано из ПО GE-04, настройки порта были перенесены в соответствующий порт, однако один битик в настройках port-based порта смотрящего в кросс сместить с позиции 4 в позицию 5 забыли.

И что? Ну, забыли, а потом вспомнили, сместили, выпустили исправленную прошивку... Это же чисто внутренняя проблема платы PE-04. Искренне не понимаю, каким образом из этой проблемы (к тому же давно решенной) платы PE-04 логически вытекает необходимость двум разным вариантам исполнения платы PE-14 иметь разный формат одних и тех же настроек...

...пока не появилась плата PE-14 исп 2 с другим контроллером и ПО платы было переписано другим разработчиком.

Искренне не понимаю, что мешало разработчику ПО платы PE-14 исполнения 2 использовать тот же формат конфигурации, который уже применяется в PE-14 исполнения 1. Ведь все нужные плате настройки в нем уже есть...

Last edited 4 months ago by alx (previous) (diff)

in reply to:  15 comment:17 by alx, 4 months ago

Replying to san:

Разве не было бы логичнее (и, главное, проще!) оставить его прежним

Я тут почему-то (видимо, в силу очевидности) не написал самое главное, что сразу бросается в глаза и больше всего удивляет: ведь изменение формата настроек делает разные исполнения одной и той же платы несовместимыми между собой! Это же просто диверсия: у владельца блока выходит из строя плата PE-14, он берет из ЗИП другую такую же, вставляет в блок на место сломавшейся, эта плата получает конфиг и... не работает!

Last edited 4 months ago by alx (previous) (diff)

comment:18 by san, 4 months ago

какое отношение внутреннее устройство и прошлые проблемы плат GE-04 и PE-04 имеют к плате PE-14 и к веб-интерфейсу...

PE-14 это таже PE-04 но с гигабитными портами, её ПО для исполнения 1 сделано из ПО PE-04 и унаследовало проблему.

Так зачем разработчик изменил формат, в котором те же самые настройки передаются плате?

Саша пытался исправить ошибку в формате конфигурации допущенную в первом исполнении платы. Но в ходе обсуждения, мы пришли к выводу, что формат должен быть одинаковый, чтобы не допустить несовместимости.

Сейчас придётся сделать в веб-морде костыль, чтобы настройки можно было таки корректно записать и в предыдущее исполнения платы и в новое.

in reply to:  18 comment:19 by alx, 4 months ago

Replying to san:

какое отношение внутреннее устройство и прошлые проблемы плат GE-04 и PE-04 имеют к плате PE-14 и к веб-интерфейсу...

PE-14 это таже PE-04 но с гигабитными портами, её ПО для исполнения 1 сделано из ПО PE-04 и унаследовало проблему.

А, понял. Форк PE-04 --> PE-14 был сделан до того, как проблема в PE-04 была устранена. Но я все равно не понимаю, при чем тут формат, в котором плате передаются настройки. Это же все равно внутренняя проблема платы! Надо всего-то смержить коммит, исправляющий эту проблему в PE-04, в ветку PE-14...

Так зачем разработчик изменил формат, в котором те же самые настройки передаются плате?

Саша пытался исправить ошибку в формате конфигурации допущенную в первом исполнении платы.

По-прежнему не вижу логики... Если в формате допущена ошибка, почему исправить ее предлагается только для платы PE-14 исполнения 2? Казалось бы, формат должен быть исправлен для всех исполнений всх плат, которые его используют - и GE-04, и GE-12, и GE-16, и PE-04 и т.п... Как минимум, для всех исполнений платы одного типа!...

Сейчас придётся сделать в веб-морде костыль, чтобы настройки можно было таки корректно записать и в предыдущее исполнения платы и в новое.

А что этому (корректной записи) мешает? Настройки и так записываются одинаково, номер исполнения на них никак не влияет, и не должен влиять (иначе платы одного типа разных исполнений окажутся несовместимы между собой)...

Last edited 4 months ago by alx (previous) (diff)

in reply to:  18 comment:20 by alx, 4 months ago

Replying to san:

Саша пытался исправить ошибку в формате конфигурации

А в чем заключается ошибка в формате? Я как разработчик SW-01 имею непосредственное отношение к этому формату (ведь этот формат используется для передачи настроек от SW-01 к PE-14), поэтому, если в формате обнаружена ошибка, мне кажется, что мне необходимо о ней знать...

Last edited 4 months ago by alx (previous) (diff)

comment:21 by san, 4 months ago

Ошибка в том, что вместо выбранных пользователем настроек, в переменную .5.x.1.0 пишется константа 0x5f.
Эту ошибку намеренно ввёл разработчик ПО первого исполнения PE-14, т.к. в то время не разобрался в корне проблемы и применил такое обходное решение.
На данный момент известно, что в прошивке PE-14 исп1 (как и в PE-04, там ошибка тоже не исправлена) есть ошибка - в настройке port-based в байте 5 переменных .5.x.1.0 перепутаны биты 5 и 4.

Кажется, что правильный путь - исправить ошибку в ПО PE-14 исп1, а в веб-интерфейсе, вместо костыля-константы честно писать настройки выбранные пользователем.
Но в таком случае, если пользователь вдруг вставит на место сконфигурированной платы с новой прошивкой плату со старой прошивкой, то получит кольцо Ethernet.

Сейчас мне лучшим решением кажется - переставить битики со стороны веб-интерфейса для того чтобы формат этого байта подходил для плат со старым(ошибочным) ПО, и в новом ПО платы использовать тот-же формат.

in reply to:  21 comment:22 by alx, 4 months ago

Replying to san:

Ошибка в том, что вместо выбранных пользователем настроек, в переменную .5.x.1.0 пишется константа 0x5f.

О, я только сейчас понял, что байт 5 переменной .5.5.1.0, в который пишется константа 0x5f, как раз и должен содержать значения четырех чекбоксов порта 5, разрешающих/запрещаюших форвардинг в другие порты! То есть, записывая константу, мы "портим" заданную пользователем конфигурацию!

Провел эксперимент: снял отметку пары из этих четырех чекбоксов, записал конфигурацию в плату PE-04, затем прочитал конфигурацию из платы. Результат - все чекбоксы отмечены! Кошмар...

Эту ошибку намеренно ввёл разработчик ПО первого исполнения PE-14,

Ты что-то путаешь. Плата PE-14 исполнения 1 использует тот же формат конфигурации, что и плата PE-04. Никаких изменений в формат конфигурации при добавлении поддержки платы PE-14 внесено не было. Смотри changeset:2156 - там ко всем проверкам типа платы PE-04 добавляется "или PE-14", и ничего более...

На данный момент известно, что в прошивке PE-14 исп1 (как и в PE-04, там ошибка тоже не исправлена) есть ошибка - в настройке port-based в байте 5 переменных .5.x.1.0 перепутаны биты 5 и 4.

А, теперь понятно. Ты, видимо, говоришь об этой ошибке. Этому тикету уже шестой год (а "костыль" в байте 5 переменной .5.5.1.0 существует 10 лет!). Странно, что суть ошибки известна, однако эта ошибка до сих пор не была исправлена...

Last edited 4 months ago by alx (previous) (diff)

comment:23 by alx, 3 months ago

Я вспомнил одно обстоятельство, которое, наверное, поможет выйти из нашей затруднительной ситуации.

Когда-то очень давно (видимо, по указанию разработчика платы GE-04) в веб-интерфейсе было запрещено устанавливать несимметричные настройки port-based VLAN (когда одному порту A разрешен форвардинг в порт B, но порту B не разрешен форвардинг в порт A): при установке или снятии отметки чекбокса, управляющего форвардингом из порта A в порт B, то жесаое автоматически происходит с отметкой чекбокса, управляющего форвардингом из порта B в порт A. Почему это было сделано, я сейчас не помню, но это нам сейчас и не важно.

Благодаря описанной выше особенности, конфигурация форвардинга содержит избыточность, так как пары чекбоксов всегда имеют одно и то же состояние (прямо как квантовая запутанность!). Пользуясь этой особенностью, платы могут определить, какие настройки порта 5 пользователь хотел записать в плату, несмотря на то, что эти настройки были испорчены заменой байта 5 на константу. Чтобы определить, разрешен ли форвардинг порту 5 в любой другой порт, плата должна вместо соответствующего бита байта 5 переменной .5.5.1.0 проверят бит 4 байта 5 переменных .5.x.1.0 где x - номер порта, куда порт 5 форвардит пакеты. Например если в переменной .5.3.1.0 бит 4 байта 5 установлен в 0 (запрещен форвардинг из порта 3 в порт 5), значит и форвардинг из порта 5 в порт 3 тоже должен быть запрещен.

Предлагаю использовать описанный выше принцип для исправления ошибки в платах PE-04 и PE-14.

comment:24 by AlexLir, 2 weeks ago

Применил вышеописанный алгоритм, если значение переменной .5.5.1.0 == 0x5F, то для порта 5 значение формируется из значений других портов, иначе записывается как есть, благодаря этому в старых платах ошибка будет исправлена.
Для новых плат предлагаю сделать нормально то есть как описано в тикете.

in reply to:  24 ; comment:25 by alx, 13 days ago

Replying to AlexLir:

Для новых плат предлагаю сделать нормально то есть как описано в тикете.

Тогда у меня есть еще вопрос по предложению из описания тикета.

Параметры PE-14 исп. 2 нужно отображать так-же как параметры исп. 1, за исключением того что у плат исп. 2 есть новые переменные:
.13.0: RO, INT8 - Ревизия ПО платы. Если переменная .13.0 присутствует в MIB, то в переменную .5.5.1.0 в 5 байт нужно записать не константные значения(0x5F)...

Если известно, что у PE-14 исполнения 2 есть переменная .13.0, могу я не проверять наличие этой переменной в MIB, а вместо этого проверить номер исполнения платы? Мне так было бы проще и удобнее, так как номер исполнения известен сразу, а MIB надо специально запрашивать.

in reply to:  24 comment:26 by alx, 13 days ago

Replying to AlexLir:

Применил вышеописанный алгоритм, если значение переменной .5.5.1.0 == 0x5F, то для порта 5 значение формируется из значений других портов,
Для новых плат предлагаю сделать нормально то есть как описано в тикете.

Поясни, пожалуйста, что значит "старые платы" и "новые платы". Я, например, не понял, применен ли этот алгоритм для PE-14 исполнения 2.

in reply to:  25 ; comment:27 by AlexLir, 13 days ago

Replying to alx:

Если известно, что у PE-14 исполнения 2 есть переменная .13.0, могу я не проверять наличие этой переменной в MIB, а вместо этого проверить номер исполнения платы?

Нельзя на номер исполнения платы ориентироваться, так как эта переменная будет добавлена в PE-04 и в PE-14 исп.1, для исправления ошибки с port-based VLAN.

Replying to alx:

Поясни, пожалуйста, что значит "старые платы" и "новые платы".

Старые платы имелось в виду те, у которых уже присутствует ошибка. И эта ошибка будет исправлена добавление переменной .13.0.
Новые платы PE-14 исп.2.

in reply to:  27 comment:28 by alx, 13 days ago

Replying to AlexLir:

Нельзя на номер исполнения платы ориентироваться, так как эта переменная будет добавлена в PE-04 и в PE-14 исп.1, для исправления ошибки с port-based VLAN.

Не понимаю, какое отношение платы PE-04 и PE-14 исполнения 1 имеют у этому тикету. Насколько я вижу, тикет касается платы PE-14 исполнения 2. Хорошо, переформулирую вопрос. Верно ли я понял, что возможна ситуация, когда в MIB платы PE-14 исполнения 2 отсутствует переменная .13.0 (и в этом случае в байт 5 переменной .5.5.1.0 надо записывать 0x5f)?

Поясни, пожалуйста, что значит "старые платы" и "новые платы".

Старые платы имелось в виду те, у которых уже присутствует ошибка. И эта ошибка будет исправлена добавление переменной .13.0.
Новые платы PE-14 исп.2.

Спасибо за уточнение. То есть PE-14 исполнения 2 - это в твоей терминологии "новая плата", и в ней реализован алгоритм, предложенный в comment:23, и, следовательно, для нее безразлично, будет ли в байте 5 переменной .5.5.1.0 записано 0x5f или реальная конфигурация. Я правильно понял? Если все так, то я не буду повторно воспроизводить этот алгоритм в плате SW-01.

Last edited 13 days ago by alx (previous) (diff)

comment:29 by san, 12 days ago

То есть PE-14 исполнения 2 - это в твоей терминологии "новая плата", и в ней реализован алгоритм, предложенный в comment:23, и, следовательно, для нее безразлично, будет ли в байте 5 переменной .5.5.1.0 записано 0x5f или реальная конфигурация. Я правильно понял? Если все так, то я не буду повторно воспроизводить этот алгоритм в плате SW-01.

Да, алгоритм "воосстановления" конфига не нужно в SW-01 повторять.
В PE-14 исп2 Саша восстанавливает конфиг для совместимости с текущим ПО SW-01.

Но также план Саши был ввести признак отличающий старые прошивки(с ошибкой) от новых - переменную 13.0.
Сейчас новая прошивка(и только новая) есть только для PE-14 исп.2, в плату вместо 5f можно записать адекватный конфиг.
Но в PE-14 исп.1 адекватный конфиг записывать нельзя, у неё старая прошивка и она закольцует Ethernet, в неё можно записывать. только 5f, независимо от реального значения из конфига. Такая же проблема и с платами PE-04.
Можно надеяться что PE-14 исп1 и PE-04 в будующем тоже получат новые прошивки с исправленной ошибкой, поэтому вместо варианта отличать новые платы от старых по исполнению, Саша предлагает универсальный вариант для всех трёх плат(PE-14 исп2, PE-14 исп1, PE-04) - отличать новую прошивку от старой по наличию переменной 13.0.
В таком случае в старые прошивки конфиг будет записан как раньше, а в новых прошивках мы избавимся от костыля, например в файле конфига будут адекватные значения настройки для портов а не 5f.

Last edited 12 days ago by san (previous) (diff)

in reply to:  29 comment:30 by alx, 12 days ago

Replying to san:

В таком случае в старые прошивки конфиг будет записан как раньше, а в новых прошивках мы избавимся от костыля,

От костыля мы все равно не избавимся, так как уже выпущены платы, которые его требуют (PE-04 например). Добавление проверки на "новые" и "старые" платы в данном случае приведет только к усложнению кода (добавится дополнительное условие) и ухудшению его читаемости. Поэтому я принял решение оставить костыль как есть (в том числе для PE-14 исполнения 2) - пусть плата сама разбирается с полученной конфигурацией. Вопрос к разработчику из comment:28 снимается.

comment:31 by alx, 12 days ago

Resolution: fixed
Status: newclosed

In 2422/sw:

Добавлена поддержка платы PE-14 исполнения 2.
Closes #700.

Note: See TracTickets for help on using tickets.