circt-verilog
2026-03-07 13:55Попробовал я собрать симулятор Верилога от ИИ - увы. На маке сборка валится в конце, на нестыковке между Си++17 и Си++20. Какие-то проблемы в скриптах cmake, подозреваю. На Линуксе получилось собрать circt-verilog. Но это только фрондэнд от LLVM. А симулятор circt-sim не компилируется: недостаёт какого-то метода.
Но фрондэнд давайте попробуем. Возьмём простой счётчик для примера:
circt/lib/Dialect/Sim/Transforms/ProceduralizeSim.cpp: In member function ‘llvm::LogicalResult {anonymous}::ProceduralizeSimPass::proceduralizePrintOps(mlir::Value, llvm::ArrayRef)’:
circt/lib/Dialect/Sim/Transforms/ProceduralizeSim.cpp:213:33: error: no matching function for call to ‘circt::sim::PrintFormattedProcOp::create(mlir::OpBuilder&, mlir::Location, mlir::Value&)’
213 | PrintFormattedProcOp::create(builder, printOp.getLoc(), procPrintInput);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Искусство по прежнему в большом долгу...Но фрондэнд давайте попробуем. Возьмём простой счётчик для примера:
module counter (
input logic clk,
input logic reset,
output logic [7:0] count
);
always_ff @(posedge clk or posedge reset) begin
if (reset)
count <= 8'b0;
else
count <= count + 9'd1;
end
endmodule
Превратим Верилог в промежуточное представление:
$ circt-verilog counter.sv
module {
llvm.func @__moore_signal_event_in_slot(i32, !llvm.ptr) -> i1
llvm.func @__moore_wait_event(i32, !llvm.ptr)
hw.module @counter(in %clk : !hw.struct<value: i1, unknown: i1>, in %reset : !hw.struct<value: i1, unknown: i1>, out count : !hw.struct<value: i8, unknown: i8>) attributes {circt.default_time_units = -9 : i32, vpi.all_vars = {clk = 1 : i32, count = 8 : i32, reset = 1 : i32}} {
%0 = llhd.constant_time <0ns, 0d, 1e>
%c-1_i8 = hw.constant -1 : i8
%c0_i8 = hw.constant 0 : i8
%c1_i8 = hw.constant 1 : i8
%1 = hw.aggregate_constant [0 : i8, -1 : i8] : !hw.struct<value: i8, unknown: i8>
%true = hw.constant true
%2 = hw.aggregate_constant [0 : i8, 0 : i8] : !hw.struct<value: i8, unknown: i8>
%value = hw.struct_extract %clk["value"] : !hw.struct<value: i1, unknown: i1>
%unknown = hw.struct_extract %clk["unknown"] : !hw.struct<value: i1, unknown: i1>
%3 = comb.xor %unknown, %true : i1
%4 = comb.and bin %value, %3 : i1
%value_0 = hw.struct_extract %reset["value"] : !hw.struct<value: i1, unknown: i1>
%unknown_1 = hw.struct_extract %reset["unknown"] : !hw.struct<value: i1, unknown: i1>
%5 = comb.xor %unknown_1, %true : i1
%6 = comb.and bin %value_0, %5 : i1
%count = llhd.sig %1 : !hw.struct<value: i8, unknown: i8>
%7:2 = llhd.combinational -> !hw.struct<value: i8, unknown: i8>, i1 {
%10 = llhd.prb %count : !hw.struct<value: i8, unknown: i8>
%value_3 = hw.struct_extract %10["value"] : !hw.struct<value: i8, unknown: i8>
%unknown_4 = hw.struct_extract %10["unknown"] : !hw.struct<value: i8, unknown: i8>
%11 = comb.add %value_3, %c1_i8 : i8
%12 = comb.icmp ne %unknown_4, %c0_i8 : i8
%13 = comb.replicate %12 : (i1) -> i8
%14 = comb.xor %13, %c-1_i8 : i8
%15 = comb.and %11, %14 : i8
%16 = hw.struct_create (%15, %13) : !hw.struct<value: i8, unknown: i8>
llhd.yield %16, %true : !hw.struct<value: i8, unknown: i8>, i1
}
%8 = seq.to_clock %4
%count_2 = seq.firreg %7#0 clock %8 reset async %6, %2 preset 255 {name = "count"} : !hw.struct<value: i8, unknown: i8>
llhd.drv %count, %count_2 after %0 : !hw.struct<value: i8, unknown: i8>
%9 = llhd.prb %count : !hw.struct<value: i8, unknown: i8>
hw.output %9 : !hw.struct<value: i8, unknown: i8>
}
}
Ничо так вроде, годно на первый взгляд.Линуксный журнал
2026-03-06 16:44Я собственно почему на загрузку с DVD жаловался. И для чего купил мини компьютер. Какое-то время назад увидел в новостях, что один линуксный журнал закрылся. А было их всего два таких журнала, и вот остался один. Дай думаю подпишусь, помогу им немного. Теперь регулярно получаю Linux Magazine в шикарном бумажном виде, да ещё и с DVD впридачу. С двух сторон диска находятся установочные дистрибутивы разных интересных линуксов. Вот я их и пробую в качестве развлечения.
Журнал весьма интересный. Штудирую от корки до корки, встречаю много нового. Не то чтобы я занимался развитием самого линукса, но и вокруг него тоже много любопытного происходит.

Журнал весьма интересный. Штудирую от корки до корки, встречаю много нового. Не то чтобы я занимался развитием самого линукса, но и вокруг него тоже много любопытного происходит.

Не всякий загрузочный DVD одинаково полезен
2026-03-05 22:10Если у вас есть установочный DVD для Linux Mint... выкиньте его сразу, не мучайтесь. 😀 Загрузка системы с DVD занимает больше 30 минут. Не стоит оно того. Лучше USB флешку запишите.
circt-sim
2026-03-04 12:41Один крутой чувак сбацал полный симулятор SystemVerilog с помощью ИИ за 43 дня. Не игрушка, вполне реальная вещь: проходит все официальные тестбенчи UVM.
https://github.com/thomasnormal/circt
https://github.com/thomasnormal/circt
Украина уничтожает российский газовый флот
2026-03-04 12:23Российский танкер Arctic Metagaz вёз сжиженный газ из Мурманска в Китай. Около Италии его понадкусывали украинские морские дроны.
https://www.reuters.com/business/energy/russian-flagged-sanctioned-lng-tanker-fire-mediterranean-crew-fate-unknown-2026-03-03/

https://www.reuters.com/business/energy/russian-flagged-sanctioned-lng-tanker-fire-mediterranean-crew-fate-unknown-2026-03-03/

Бага в stosb
2026-03-04 00:35Покажу как выглядит поиск ошибки в симуляторе. Сначала запускаем работающий вариант, с записью трассировки в файл.

Как видим, команда STOSB слева выполняет 8 итераций и завершается. Та же команда справа продолжает крутиться до бесконечности. Что за ерунда? Проверим значение счётчика итераций в регистре CX. Глядите, команда MOV на адресе 07d89 заносит значение 8 в регистр CX (слева). А справа в регистре ECX оказывается ffff0008. Тоже не придерёшься: в реальнгом режиме задействуются только младшие 16 бит регистра. В старших битах остался мусор от каких-то предыдущих команд.
Но команда STOSB тоже должна использовать только младшую половину регистра CX, и выполнить 8 итераций. Вместо этого она, очевидно, берёт полное 32-битное значение, и крутится до морковкина заговенья.
А всё почему? От нетерпения. 😀 Надо было сначала добиться работы всех 100% MOO тестов, и потом уже пробовать грузить ДОС. Но очень хотелось глянуть, как оно пойдёт.
$ tiltti msdos3.31-1.44m.img -r -o a.logТеперь запускаем глюкавую версию, получаем второй файл трассировки.
$ tiltti --386 msdos3.31-1.44m.img -r -o b.logСравниваем файлы трассировки умной тулзой. В левой части экрана работает процессор i8086. В правой части - процессор i386. Выполняют один и тот же код, а именно MS-DOS 3.31. Результаты должны совпадать, за исключением того, что слева регистры 16-битные, а справа 32-битные. И они совпадают... до момента ошибки.

Как видим, команда STOSB слева выполняет 8 итераций и завершается. Та же команда справа продолжает крутиться до бесконечности. Что за ерунда? Проверим значение счётчика итераций в регистре CX. Глядите, команда MOV на адресе 07d89 заносит значение 8 в регистр CX (слева). А справа в регистре ECX оказывается ffff0008. Тоже не придерёшься: в реальнгом режиме задействуются только младшие 16 бит регистра. В старших битах остался мусор от каких-то предыдущих команд.
Но команда STOSB тоже должна использовать только младшую половину регистра CX, и выполнить 8 итераций. Вместо этого она, очевидно, берёт полное 32-битное значение, и крутится до морковкина заговенья.
А всё почему? От нетерпения. 😀 Надо было сначала добиться работы всех 100% MOO тестов, и потом уже пробовать грузить ДОС. Но очень хотелось глянуть, как оно пойдёт.
Теперь и i386
2026-03-03 14:01Допилил я за выходные модель процессора 386, и она прошла без ошибок первые пять тысяч MOO тестов. То есть каждая команда многократно корректно выполнилась в разных условиях. Уже неплохо.
Теперь в симуляторе tiltti можно выбирать процессор флагами --8086 или --386. Пробую запустить MS-DOS на i386 - даже что-то запускается! Запрашивает дату, время, выходит на приглашение. Ввожу ver, жму Enter... и оно зависает. Где-то нелады. Но для первого запуска очень неплохо.

Теперь в симуляторе tiltti можно выбирать процессор флагами --8086 или --386. Пробую запустить MS-DOS на i386 - даже что-то запускается! Запрашивает дату, время, выходит на приглашение. Ввожу ver, жму Enter... и оно зависает. Где-то нелады. Но для первого запуска очень неплохо.
$ tiltti --386 msdos3.31-1.44m.img

Верховный лидер Али Хаменеи: тайная российская жизнь?
2026-03-03 11:04(перевод)
Является ли верховный лидер Ирана аятолла Али Хаменеи выпускником Московского университета дружбы народов имени Патриса Лумумбы? Завербовал ли КГБ Хаменеи в качестве шпиона в 1960-х годах? Виновата ли советская идеологическая обработка и подготовка в ненависти Хаменеи к Соединенным Штатам?
Персидская блогосфера бурлит спекуляциями о предполагаемых связях Хаменеи с Советским Союзом.
Дело началось в среду, когда иранские блогеры обнаружили репортаж Russia Today от 5 февраля 2010 года, посвященный 50-летию Московского университета дружбы народов, в котором Хаменеи упоминается среди «самых выдающихся выпускников» университета. Аналогичное утверждение появляется и на сайте Russia Today, хотя там упоминается «верховный лидер Ирана Али Хомейни», что является очевидной ошибкой. Впоследствии иранские блогеры выявили другие российские источники, содержащие аналогичное утверждение: в номере «Коммерсанта» от 25 ноября 2003 года Хаменеи представлен как выпускник Университета дружбы народов.
В официальной биографии Хаменеи нет никаких упоминаний об Университете дружбы народов. Это может отражать правду, и Хаменеи, возможно, не получал образования в Советском Союзе. Однако, если Хаменеи действительно является выпускником Университета дружбы народов, у него есть очень веские причины держать это в секрете: признание университетского образования в «безбожном» Советском Союзе не только нанесло бы серьезный удар по шаткой религиозной репутации Хаменеи, но и подвергло бы его обвинениям в вербовке КГБ в 1960-х годах, как это было со многими выпускниками Лумумбы.
Оценить утверждения о прошлом Хаменеи непросто, особенно потому, что российские источники не указывают год его окончания университета, что оставляет нас на милость менее надежных источников.
Согласно официальной биографии Хаменеи, он отправился в Ирак в 1957 году для обучения в Теологической семинарии в Наджафе. Поскольку Университет дружбы народов был основан в 1960 году, молодой Хаменеи не мог использовать свою поездку в Ирак в качестве прикрытия для учебы в Советском Союзе. Но согласно его официальной биографии, Хаменеи провел «подпольную жизнь» в Тегеране в 1345 году [21 марта 1966 г. – 21 марта 1967 г.], после чего был арестован полицией и заключен в тюрьму. Действительно ли 28-летний Хаменеи провел год, живя подпольно в Москве, а не в Тегеране? Был ли Хаменеи арестован потому, что иранская секретная служба САВАК, существовавшая до революции, узнала о его визите в Москву?
Документы САВАК, опубликованные Иранской освободительной армией (основанной в Париже после революции 1979 года генералом Бахрамом Арианой), могут предоставить иные интересные сведения о предполагаемых связях Хаменеи с Советским Союзом, но у автора этой статьи пока не было возможности изучить эти документы.
Хаменеи мог быть, а мог и не быть выпускником Московского университета дружбы народов; и он мог быть, а мог и быть завербован КГБ в 1960-х годах. Никто не может отрицать тот факт, что Исламская Республика, которая гордится проведением независимой внешней политики, основанной на принципе «Ни Восток, ни Запад – Исламская Республика», в действительности всегда больше склонялась к Востоку. Также нельзя отрицать, что под руководством Хаменеи дипломатически изолированный Иран становился все более зависимым от России и Китая. Историки будут судить, является ли превращение Ирана в российско-китайский протекторат результатом замысла Хаменеи… или же следствием общей некомпетентности лидеров Исламской Республики.
Является ли верховный лидер Ирана аятолла Али Хаменеи выпускником Московского университета дружбы народов имени Патриса Лумумбы? Завербовал ли КГБ Хаменеи в качестве шпиона в 1960-х годах? Виновата ли советская идеологическая обработка и подготовка в ненависти Хаменеи к Соединенным Штатам?
Персидская блогосфера бурлит спекуляциями о предполагаемых связях Хаменеи с Советским Союзом.
Дело началось в среду, когда иранские блогеры обнаружили репортаж Russia Today от 5 февраля 2010 года, посвященный 50-летию Московского университета дружбы народов, в котором Хаменеи упоминается среди «самых выдающихся выпускников» университета. Аналогичное утверждение появляется и на сайте Russia Today, хотя там упоминается «верховный лидер Ирана Али Хомейни», что является очевидной ошибкой. Впоследствии иранские блогеры выявили другие российские источники, содержащие аналогичное утверждение: в номере «Коммерсанта» от 25 ноября 2003 года Хаменеи представлен как выпускник Университета дружбы народов.
В официальной биографии Хаменеи нет никаких упоминаний об Университете дружбы народов. Это может отражать правду, и Хаменеи, возможно, не получал образования в Советском Союзе. Однако, если Хаменеи действительно является выпускником Университета дружбы народов, у него есть очень веские причины держать это в секрете: признание университетского образования в «безбожном» Советском Союзе не только нанесло бы серьезный удар по шаткой религиозной репутации Хаменеи, но и подвергло бы его обвинениям в вербовке КГБ в 1960-х годах, как это было со многими выпускниками Лумумбы.
Оценить утверждения о прошлом Хаменеи непросто, особенно потому, что российские источники не указывают год его окончания университета, что оставляет нас на милость менее надежных источников.
Согласно официальной биографии Хаменеи, он отправился в Ирак в 1957 году для обучения в Теологической семинарии в Наджафе. Поскольку Университет дружбы народов был основан в 1960 году, молодой Хаменеи не мог использовать свою поездку в Ирак в качестве прикрытия для учебы в Советском Союзе. Но согласно его официальной биографии, Хаменеи провел «подпольную жизнь» в Тегеране в 1345 году [21 марта 1966 г. – 21 марта 1967 г.], после чего был арестован полицией и заключен в тюрьму. Действительно ли 28-летний Хаменеи провел год, живя подпольно в Москве, а не в Тегеране? Был ли Хаменеи арестован потому, что иранская секретная служба САВАК, существовавшая до революции, узнала о его визите в Москву?
Документы САВАК, опубликованные Иранской освободительной армией (основанной в Париже после революции 1979 года генералом Бахрамом Арианой), могут предоставить иные интересные сведения о предполагаемых связях Хаменеи с Советским Союзом, но у автора этой статьи пока не было возможности изучить эти документы.
Хаменеи мог быть, а мог и не быть выпускником Московского университета дружбы народов; и он мог быть, а мог и быть завербован КГБ в 1960-х годах. Никто не может отрицать тот факт, что Исламская Республика, которая гордится проведением независимой внешней политики, основанной на принципе «Ни Восток, ни Запад – Исламская Республика», в действительности всегда больше склонялась к Востоку. Также нельзя отрицать, что под руководством Хаменеи дипломатически изолированный Иран становился все более зависимым от России и Китая. Историки будут судить, является ли превращение Ирана в российско-китайский протекторат результатом замысла Хаменеи… или же следствием общей некомпетентности лидеров Исламской Республики.
popad
2026-02-27 13:51Вот пример смешных вещей, которые выясняются при тестировании процессорных инструкций. Есть в i386 команда POPAD. Когда мы находимся в 32-битном режиме, она выпихивает из стека значения восьми 32-битных регистров. Но значение ESP игнорирует, чтобы не нарушать стек. Это всё подробно описано и надёжно работает.
Но у команд i386 ещё бывают префиксы. Например префикс 0x67 меняет разрядность адресов в команде. В данном случае команда продолжает выпихивать 32-битные значения, но к стеку обращается по 16-битным адресам. Старшая половина ESP[31:16] игнорируется.
Вопрос: что происходит с этой старшей половиной ESP в результате выполнения команды POPAD с префиксом 0x67?
В документации вы прочитаете, что старшая половина регистра стека не изменяется. Это неправда. Как показывают тесты, биты ESP[31:16] получают значение из стека, как и прочие регистры. Был стек ESP=0x00005E90, стал 0x5A045EB0. Неожиданность! Как говорится, это нельзя объяснить, можно только запомнить. 😀
Но у команд i386 ещё бывают префиксы. Например префикс 0x67 меняет разрядность адресов в команде. В данном случае команда продолжает выпихивать 32-битные значения, но к стеку обращается по 16-битным адресам. Старшая половина ESP[31:16] игнорируется.
Вопрос: что происходит с этой старшей половиной ESP в результате выполнения команды POPAD с префиксом 0x67?
В документации вы прочитаете, что старшая половина регистра стека не изменяется. Это неправда. Как показывают тесты, биты ESP[31:16] получают значение из стека, как и прочие регистры. Был стек ESP=0x00005E90, стал 0x5A045EB0. Неожиданность! Как говорится, это нельзя объяснить, можно только запомнить. 😀
Соображают ли в Сетуни на троих?
2026-02-27 12:56Один чувак запустил онлайн эмулятор троичного компьютера Сетунь: zaneham.github.io/setun70-emulator/web/.
Система команд напоминает простой стековый калькулятор: setun70_spec.md.
Вот пример простой программы.
Система команд напоминает простой стековый калькулятор: setun70_spec.md.
Вот пример простой программы.
; quadratic.s70 - Calculate x^2 + 2x + 1 where x = 5
LIT 5 ; x = 5
DUP ; x x
MUL ; x^2 = 25
LIT 5 ; x
LIT 2 ; 2
MUL ; 2x = 10
ADD ; 25 + 10 = 35
LIT 1 ; 1
ADD ; 35 + 1 = 36
OUT ; Output: 36
HALT
Тестируем i386
2026-02-26 13:57На симуляторе PC i86 успешно запускаются все версии PC DOS, все DR-DOS и почти все MS-DOS. Кроме последней неофициальной версии MS-DOS 7.1: потому что она требует процессора i386. А именно она и интересна полной поддержкой FAT32 и длинных имён файлов.
Так что я решил проапгредить процессор в симуляторе. Благо, для i386 тоже есть хороший набор тестов: SingleStepTests/80386. И тут же на первом тесте обнаруживаем странность, в регистре EFLAGS.
Интеловская документация утверждает, что неиспользуемые старшие 14 бит регистра EFLAGS всегда нули. Но из реального хардвера вычитываются единицы.
Так что я решил проапгредить процессор в симуляторе. Благо, для i386 тоже есть хороший набор тестов: SingleStepTests/80386. И тут же на первом тесте обнаруживаем странность, в регистре EFLAGS.
Интеловская документация утверждает, что неиспользуемые старшие 14 бит регистра EFLAGS всегда нули. Но из реального хардвера вычитываются единицы.
Figure 2-8. EFLAGS Register
16-BIT FLAGS REGISTER
A
+-------------------+---------------+
31 23 15 7 0
+-------------------+---------------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |V|R| |N| IO|O|D|I|T|S|Z| |A| |P| |C|
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | |0| | | | | | | | |0| |0| |1| |
| |M|F| |T| PL|F|F|F|F|F|F| |F| |F| |F|
+-------------------+---------------+++++-+++-+-+++++++++++++-+++-+++-+++
| | | | | | | | | | | | |
VIRTUAL 8086 MODE---X----------+ | | | | | | | | | | | |
RESUME FLAG---X------------+ | | | | | | | | | | |
NESTED TASK FLAG---X----------------+ | | | | | | | | | |
I/O PRIVILEGE LEVEL---X-------------------+ | | | | | | | | |
OVERFLOW---S----------------------+ | | | | | | | |
DIRECTION FLAG---C------------------------+ | | | | | | |
INTERRUPT ENABLE---X--------------------------+ | | | | | |
TRAP FLAG---S----------------------------+ | | | | |
SIGN FLAG---S------------------------------+ | | | |
ZERO FLAG---S--------------------------------+ | | |
AUXILIARY CARRY---S------------------------------------+ | |
PARITY FLAG---S----------------------------------------+ |
CARRY FLAG---S--------------------------------------------+
S = STATUS FLAG, C = CONTROL FLAG, X = SYSTEM FLAG
NOTE: 0 OR 1 INDICATES INTEL RESERVED. DO NOT DEFINE
Virtual Hard Disk
2026-02-25 18:40Я добавил в симулятор PC i86 поддержку образов жёсткого диска в формате VHD. Это когда пустые сектора не хранятся, а файл постепенно увеличивается по мере наполнения диска содержимым. Получилось совместимо с QEMU, что очень удобно: можно пользоваться утилитой qemu-img чтобы создавать и конвертировать образы. Формат VHD когда-то придумала фирма Connectix (позже доставшаяся Микрософту), и теперь это открытый стандарт. Кроме QEMU его поддерживают Hyper-V, VirtualBox, Virtual PC и другие.
Для примера, 100-мегабайтный диск C: с установленным MS-DOS 3.3 и Volkov Commander имеет размер всего 2 мегабайта. Никакого сжатия, чисто пропуск пустых секторов. Можно смело создавать диски большого размера, не боясь забить файловую систему ерундой.
Для проверки симулятора пробую запускать разные исторические приложения. Турбо Паскаль фунциклирует замечательно.

( +2 )
В целом уже понятно, что эксперимент с симуляцией биоса удался. Теперь задача перетащить всё хозяйство на микроконтроллер, с видео выходом HDMI, клавиатурой USB и диском на SD карточке.
Для примера, 100-мегабайтный диск C: с установленным MS-DOS 3.3 и Volkov Commander имеет размер всего 2 мегабайта. Никакого сжатия, чисто пропуск пустых секторов. Можно смело создавать диски большого размера, не боясь забить файловую систему ерундой.
Для проверки симулятора пробую запускать разные исторические приложения. Турбо Паскаль фунциклирует замечательно.

( +2 )
В целом уже понятно, что эксперимент с симуляцией биоса удался. Теперь задача перетащить всё хозяйство на микроконтроллер, с видео выходом HDMI, клавиатурой USB и диском на SD карточке.
Починил таки
2026-02-24 12:43Заработал наконец Волков Командер в полную высоту. Спасибо всем за советы. Дело было в вызове Int10 AX=1130h. Вот его описание:

INT 10h VideoВ регистре DL следует вернуть 24 - количество строк на экране минус один. А возвращалось 16, как бы высота символа в шрифте. После правки всё заработало как положено. Симулятор начинает обретать законченные очертания.
...
AH=11h Character generator (EGA/MCGA/VGA)
...
AL=30h Return font info (EGA/MCGA/VGA)
Entry: BH=00h return INT 1Fh pointer
01h return INT 43h pointer
02h return ROM 8x14 font pointer
03h return ROM 8x8 double-dot font pointer (0-127)
04h return ROM 8x8 double-dot font pointer (128-255)
05h return ROM 9x14 alternate text pointer (EGA/VGA)
06h return ROM 8x16 font pointer (MCGA/VGA)
07h return ROM 9x16 alternate text pointer (VGA)
Exit: ES:BP=requested pointer
CX=scan lines per character
DL=rows (EGA) or rows-1 (MCGA/VGA)





