// 2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти визначення мавка/бібліотека;
взяти визначення мавка/пристрій;
простір мавка {
  простір бібліотека {
    внутрішня дія перед_знищенням_кдс(М: *Машина, користувацькі_дані: *КористувацькіДані) {
      змінна кдс = користувацькі_дані.значення як *КористувацькіДаніІнетСлуги;
      якщо кдс.адр_слуга != пусто {
        надрукувати_кд(М, "ПОМИЛКА МАВКИ: кдс.адр_слуга != пусто!!!");
      }
      звільнити(М, кдс);
    }

    внутрішня дія здійснити_предмет(М: *Машина, предмет: *Предмет, кількість_задіяних: п32, дані_задіяних: *Значення) {
      змінна інформація_падіння: ІнформаціяПадіння;

      здійснити(
        М,
        НЕДІЙСНЕ,
        ПРЕДМЕТ(предмет),
        Задіяні { ВидЗадіяних2, кількість_задіяних, дані_задіяних, 0 },
        МІСЦЕю8(М, ю8"вм://бібліотека/інет/служити.ц", 0),
      );

      якщо отримати_інформацію_падіння(М, інформація_падіння::адреса) {
        якщо М.налаштування.обробник_падінь == пусто {
          ЗАПАНІКУВАТИ(М, "необроблене падіння!");
        } інакше {
          вимкнути_стан_падіння(М);

          М.налаштування.обробник_падінь(
            М,
            інформація_падіння
          );
        }
      }
    }

    внутрішня дія обробник_запуску(адр_слуга: адреса, помилка: природне) {
      якщо адр_слуга == пусто {
        // потім: паніка
        вернути;
      }

      змінна ас = бібліотека_мавки_інет_отримати_аргумент_слуги(адр_слуга) як *АргументІнетСлуги;
      змінна М = ас.М;
      змінна кдбм = М.користувацькі_дані_бібліотеки.значення як *КористувацькіДаніБібліотекиМавки;
      змінна предмет_слуги = створити_складений_предмет(М, кдбм.інет__Слуга);
      змінна кдс = виділити<КористувацькіДаніІнетСлуги>(М, 1);
      кдс.адр_слуга = адр_слуга;
      предмет_слуги.користувацькі_дані = створити_користувацькі_дані(М, кдс, перед_знищенням_кдс);
      ас.прт_слуга = притримати_глобально(М, предмет_слуги як *Предмет);

      змінна предмет_обробник_запуску: *Предмет = пусто;

      якщо ас.прт_обробник_запуску != пусто {
        предмет_обробник_запуску = ас.прт_обробник_запуску.предмет;
      }

      якщо предмет_обробник_запуску == пусто {
        вернути;
      }

      змінна предмет_помилки: *Предмет = пусто;

      якщо помилка != 0 {
        предмет_помилки = створити_помилку(
          М,
          отримати_текст_інет_помилки(М, помилка),
        );
        змінити_властивість(
          М,
          ПРЕДМЕТ(предмет_помилки),
          М.константи_назв._код,
          ЧИСЛО(р64(помилка)),
          МІСЦЕю8(М, ю8"вм://бібліотека/інет/служити.ц", 0),
        );
      }

      змінна кількість_задіяних = п32(2);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_слуги);
      якщо предмет_помилки == пусто {
        дані_задіяних[1] = НЕДІЙСНЕ;
      } інакше {
        дані_задіяних[1] = ПРЕДМЕТ(предмет_помилки);
      }

      здійснити_предмет(
        М,
        предмет_обробник_запуску,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_помилки(адр_слуга: адреса, помилка: природне) {
      змінна ас = бібліотека_мавки_інет_отримати_аргумент_слуги(адр_слуга) як *АргументІнетСлуги;
      змінна М = ас.М;
      змінна предмет_слуги = ас.прт_слуга.предмет;
      змінна предмет_обробник_помилки: *Предмет = пусто;

      якщо ас.прт_обробник_помилки != пусто {
        предмет_обробник_помилки = ас.прт_обробник_помилки.предмет;
      }

      якщо предмет_обробник_помилки == пусто {
        вернути;
      }

      змінна предмет_помилки = створити_помилку(
        М,
        отримати_текст_інет_помилки(М, помилка),
      );
      змінити_властивість(
        М,
        ПРЕДМЕТ(предмет_помилки),
        М.константи_назв._код,
        ЧИСЛО(р64(помилка)),
        МІСЦЕю8(М, ю8"вм://бібліотека/інет/служити.ц", 0),
      );

      змінна кількість_задіяних = п32(2);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_слуги);
      якщо предмет_помилки == пусто {
        дані_задіяних[1] = НЕДІЙСНЕ;
      } інакше {
        дані_задіяних[1] = ПРЕДМЕТ(предмет_помилки);
      }

      здійснити_предмет(
        М,
        предмет_обробник_помилки,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_зупинки(адр_слуга: адреса) {
      змінна ас = бібліотека_мавки_інет_отримати_аргумент_слуги(адр_слуга) як *АргументІнетСлуги;
      змінна М = ас.М;
      змінна предмет_слуги = ас.прт_слуга.предмет;
      змінна предмет_обробник_зупинки: *Предмет = пусто;

      якщо ас.прт_обробник_зупинки != пусто {
        предмет_обробник_зупинки = ас.прт_обробник_зупинки.предмет;
      }

      якщо предмет_обробник_зупинки == пусто {
        вернути;
      }

      змінна кількість_задіяних = п32(1);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_слуги);

      здійснити_предмет(
        М,
        предмет_обробник_зупинки,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_підключення_звʼязку(адр_слуга: адреса, адр_звʼязок: адреса) {
      змінна ас = бібліотека_мавки_інет_отримати_аргумент_слуги(адр_слуга) як *АргументІнетСлуги;
      змінна М = ас.М;
      змінна предмет_слуги = ас.прт_слуга.предмет;
      змінна предмет_обробник_підключення_звʼязку: *Предмет = пусто;

      якщо ас.прт_обробник_підключення_звʼязку != пусто {
        предмет_обробник_підключення_звʼязку = ас.прт_обробник_підключення_звʼязку.предмет;
      }

      змінна предмет_звʼязку = створити_інет_Звʼязок(М, адр_звʼязок);

      змінна акс = виділити_аргумент_інет_звʼязку(М);
      акс.М = М;
      акс.прт_звʼязок = притримати_глобально(М, предмет_звʼязку як *Предмет);

      бібліотека_мавки_інет_записати_аргумент_звʼязку(
        адр_звʼязок,
        акс,
        обробник_знищення_інет_звʼязку
      );

      якщо предмет_обробник_підключення_звʼязку == пусто {
        вернути;
      }

      змінна кількість_задіяних = п32(2);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);
      дані_задіяних[1] = ПРЕДМЕТ(предмет_слуги);

      здійснити_предмет(
        М,
        предмет_обробник_підключення_звʼязку,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_даних_звʼязку(адр_слуга: адреса, адр_звʼязок: адреса, дані: *п8, розмір: природне) {
      змінна ас = бібліотека_мавки_інет_отримати_аргумент_слуги(адр_слуга) як *АргументІнетСлуги;
      змінна М = ас.М;
      змінна предмет_слуги = ас.прт_слуга.предмет;
      змінна предмет_обробник_даних_звʼязку: *Предмет = пусто;

      якщо ас.прт_обробник_даних_звʼязку != пусто {
        предмет_обробник_даних_звʼязку = ас.прт_обробник_даних_звʼязку.предмет;
      }

      якщо предмет_обробник_даних_звʼязку == пусто {
        звільнити(М, дані);
        вернути;
      }

      змінна акс = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна предмет_звʼязку = акс.прт_звʼязок.предмет;

      змінна кількість_задіяних = п32(3);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);
      якщо ас.як_текст {
        дані_задіяних[1] = ПРЕДМЕТ(створити_текст_без_копіювання(
          М,
          розмір,
          дані,
        ));
      } інакше {
        дані_задіяних[1] = ПРЕДМЕТ(створити_дані_без_копіювання(
          М,
          розмір,
          дані,
        ));
      }
      дані_задіяних[2] = ПРЕДМЕТ(предмет_слуги);

      здійснити_предмет(
        М,
        предмет_обробник_даних_звʼязку,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_стікання_звʼязку(адр_слуга: адреса, адр_звʼязок: адреса) {
      змінна ас = бібліотека_мавки_інет_отримати_аргумент_слуги(адр_слуга) як *АргументІнетСлуги;
      змінна аз = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна М = аз.М;
      змінна предмет_слуги = ас.прт_слуга.предмет;
      змінна предмет_звʼязку = аз.прт_звʼязок.предмет як *СкладенийПредмет;
      змінна кдз = предмет_звʼязку.користувацькі_дані.значення як *КористувацькіДаніІнетЗвʼязку;
      змінна предмет_обробник_стікання_звʼязку: *Предмет = пусто;

      якщо ас.прт_обробник_стікання_звʼязку != пусто {
        предмет_обробник_стікання_звʼязку = ас.прт_обробник_стікання_звʼязку.предмет;
      }

      якщо предмет_обробник_стікання_звʼязку == пусто {
        вернути;
      }

      змінна кількість_задіяних = п32(2);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);
      дані_задіяних[1] = ПРЕДМЕТ(предмет_слуги);

      здійснити_предмет(
        М,
        предмет_обробник_стікання_звʼязку,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_закінчення_звʼязку(адр_слуга: адреса, адр_звʼязок: адреса) {
      змінна ас = бібліотека_мавки_інет_отримати_аргумент_слуги(адр_слуга) як *АргументІнетСлуги;
      змінна аз = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна М = аз.М;
      змінна предмет_слуги = ас.прт_слуга.предмет;
      змінна предмет_звʼязку = аз.прт_звʼязок.предмет як *СкладенийПредмет;
      змінна кдз = предмет_звʼязку.користувацькі_дані.значення як *КористувацькіДаніІнетЗвʼязку;
      змінна предмет_обробник_закінчення_звʼязку: *Предмет = пусто;

      якщо ас.прт_обробник_закінчення_звʼязку != пусто {
        предмет_обробник_закінчення_звʼязку = ас.прт_обробник_закінчення_звʼязку.предмет;
      }

      якщо предмет_обробник_закінчення_звʼязку == пусто {
        вернути;
      }

      змінна кількість_задіяних = п32(2);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);
      дані_задіяних[1] = ПРЕДМЕТ(предмет_слуги);

      здійснити_предмет(
        М,
        предмет_обробник_закінчення_звʼязку,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_помилки_звʼязку(адр_слуга: адреса, адр_звʼязок: адреса, помилка: природне) {
      змінна ас = бібліотека_мавки_інет_отримати_аргумент_слуги(адр_слуга) як *АргументІнетСлуги;
      змінна аз = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна М = ас.М;
      змінна предмет_слуги = ас.прт_слуга.предмет;
      змінна предмет_звʼязку = аз.прт_звʼязок.предмет як *СкладенийПредмет;
      змінна предмет_обробник_помилки_звʼязку: *Предмет = пусто;

      якщо ас.прт_обробник_помилки_звʼязку != пусто {
        предмет_обробник_помилки_звʼязку = ас.прт_обробник_помилки_звʼязку.предмет;
      }

      якщо предмет_обробник_помилки_звʼязку == пусто {
        вернути;
      }

      змінна кількість_задіяних = п32(3);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      змінна предмет_помилки = створити_помилку(
        М,
        отримати_текст_інет_помилки(М, помилка),
      );
      змінити_властивість(
        М,
        ПРЕДМЕТ(предмет_помилки),
        М.константи_назв._код,
        ЧИСЛО(р64(помилка)),
        МІСЦЕю8(М, ю8"вм://бібліотека/інет/служити.ц", 0),
      );

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);
      дані_задіяних[1] = ПРЕДМЕТ(предмет_помилки);
      дані_задіяних[2] = ПРЕДМЕТ(предмет_слуги);

      здійснити_предмет(
        М,
        предмет_обробник_помилки_звʼязку,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_відключення_звʼязку(адр_слуга: адреса, адр_звʼязок: адреса) {
      змінна ас = бібліотека_мавки_інет_отримати_аргумент_слуги(адр_слуга) як *АргументІнетСлуги;
      змінна акс = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна М = акс.М;
      змінна предмет_слуги = ас.прт_слуга.предмет;
      змінна предмет_звʼязку = акс.прт_звʼязок.предмет як *СкладенийПредмет;
      змінна кдз = предмет_звʼязку.користувацькі_дані.значення як *КористувацькіДаніІнетЗвʼязку;
      змінна предмет_обробник_відключення_звʼязку: *Предмет = пусто;

      кдз.адр_звʼязок = пусто;

      якщо ас.прт_обробник_відключення_звʼязку != пусто {
        предмет_обробник_відключення_звʼязку = ас.прт_обробник_відключення_звʼязку.предмет;
      }

      якщо предмет_обробник_відключення_звʼязку == пусто {
        вернути;
      }

      змінна кількість_задіяних = п32(3);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);
      дані_задіяних[2] = ПРЕДМЕТ(предмет_слуги);

      здійснити_предмет(
        М,
        предмет_обробник_відключення_звʼязку,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_знищення(аргумент_слуги: адреса) {
      змінна ас = аргумент_слуги як *АргументІнетСлуги;
      змінна М = ас.М;

      якщо ас.прт_слуга != пусто {
        відпустити_притриманий_глобально(М, ас.прт_слуга);
      }
      якщо ас.прт_обробник_підключення_звʼязку != пусто {
        відпустити_притриманий_глобально(М, ас.прт_обробник_підключення_звʼязку);
      }
      якщо ас.прт_обробник_даних_звʼязку != пусто {
        відпустити_притриманий_глобально(М, ас.прт_обробник_даних_звʼязку);
      }
      якщо ас.прт_обробник_стікання_звʼязку != пусто {
        відпустити_притриманий_глобально(М, ас.прт_обробник_стікання_звʼязку);
      }
      якщо ас.прт_обробник_закінчення_звʼязку != пусто {
        відпустити_притриманий_глобально(М, ас.прт_обробник_закінчення_звʼязку);
      }
      якщо ас.прт_обробник_помилки_звʼязку != пусто {
        відпустити_притриманий_глобально(М, ас.прт_обробник_помилки_звʼязку);
      }
      якщо ас.прт_обробник_відключення_звʼязку != пусто {
        відпустити_притриманий_глобально(М, ас.прт_обробник_відключення_звʼязку);
      }

      звільнити(М, ас);
    }

    внутрішня дія рідна_дія__служити(
      М: *Машина,
      діяльність: *Діяльність
    ) -> ЗначенняАбоСтанПадіння {
      змінна задіяне_іа = НЕДІЙСНЕ;
      змінна знайдено_задіяне_іа = ні;
      змінна задіяне_порт = НЕДІЙСНЕ;
      змінна знайдено_задіяне_порт = ні;
      змінна задіяне_формат = НЕДІЙСНЕ;
      змінна знайдено_задіяне_формат = ні;
      змінна задіяне_обробник_запуску = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_запуску = ні;
      змінна задіяне_обробник_помилки = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_помилки = ні;
      змінна задіяне_обробник_зупинки = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_зупинки = ні;
      змінна задіяне_обробник_підключення_звʼязку = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_підключення_звʼязку = ні;
      змінна задіяне_обробник_даних_звʼязку = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_даних_звʼязку = ні;
      змінна задіяне_обробник_стікання_звʼязку = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_стікання_звʼязку = ні;
      змінна задіяне_обробник_закінчення_звʼязку = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_закінчення_звʼязку = ні;
      змінна задіяне_обробник_помилки_звʼязку = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_помилки_звʼязку = ні;
      змінна задіяне_обробник_відключення_звʼязку = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_відключення_звʼязку = ні;

      знайдено_задіяне_іа = знайти_задіяне(М, діяльність.задіяні, 0, М.константи_назв._іа, задіяне_іа::адреса);
      знайдено_задіяне_порт = знайти_задіяне(М, діяльність.задіяні, 1, М.константи_назв._порт, задіяне_порт::адреса);
      знайдено_задіяне_формат = знайти_задіяне(М, діяльність.задіяні, 2, М.константи_назв._формат, задіяне_формат::адреса);
      знайдено_задіяне_обробник_запуску = знайти_задіяне(М, діяльність.задіяні, 3, М.константи_назв._обробник_запуску, задіяне_обробник_запуску::адреса);
      знайдено_задіяне_обробник_помилки = знайти_задіяне(М, діяльність.задіяні, 4, М.константи_назв._обробник_помилки, задіяне_обробник_помилки::адреса);
      знайдено_задіяне_обробник_зупинки = знайти_задіяне(М, діяльність.задіяні, 5, М.константи_назв._обробник_зупинки, задіяне_обробник_зупинки::адреса);
      знайдено_задіяне_обробник_підключення_звʼязку = знайти_задіяне(М, діяльність.задіяні, 6, М.константи_назв._обробник_підключення_звʼязку, задіяне_обробник_підключення_звʼязку::адреса);
      знайдено_задіяне_обробник_даних_звʼязку = знайти_задіяне(М, діяльність.задіяні, 7, М.константи_назв._обробник_даних_звʼязку, задіяне_обробник_даних_звʼязку::адреса);
      знайдено_задіяне_обробник_стікання_звʼязку = знайти_задіяне(М, діяльність.задіяні, 8, М.константи_назв._обробник_стікання_звʼязку, задіяне_обробник_стікання_звʼязку::адреса);
      знайдено_задіяне_обробник_закінчення_звʼязку = знайти_задіяне(М, діяльність.задіяні, 9, М.константи_назв._обробник_закінчення_звʼязку, задіяне_обробник_закінчення_звʼязку::адреса);
      знайдено_задіяне_обробник_помилки_звʼязку = знайти_задіяне(М, діяльність.задіяні, 10, М.константи_назв._обробник_помилки_звʼязку, задіяне_обробник_помилки_звʼязку::адреса);
      знайдено_задіяне_обробник_відключення_звʼязку = знайти_задіяне(М, діяльність.задіяні, 11, М.константи_назв._обробник_відключення_звʼязку, задіяне_обробник_відключення_звʼязку::адреса);

      змінна іа_вид: природне;
      змінна іа_дані: *п8;
      змінна іа_розмір: природне;
      змінна треба_звільнити_іа_дані = ні;
      змінна порт: природне;
      змінна як_текст = ні;
      змінна предмет_обробник_запуску: *Предмет;
      змінна предмет_обробник_помилки: *Предмет;
      змінна предмет_обробник_зупинки: *Предмет;
      змінна предмет_обробник_підключення_звʼязку: *Предмет;
      змінна предмет_обробник_даних_звʼязку: *Предмет;
      змінна предмет_обробник_стікання_звʼязку: *Предмет;
      змінна предмет_обробник_закінчення_звʼязку: *Предмет;
      змінна предмет_обробник_помилки_звʼязку: *Предмет;
      змінна предмет_обробник_відключення_звʼязку: *Предмет;

      якщо не знайдено_задіяне_іа {
        змінна нульова_іа = ю8"0.0.0.0";
        іа_вид = БІБЛІОТЕКА_МАВКИ_ВИД_ІА_ІП4;
        іа_дані = нульова_іа.дані;
        іа_розмір = нульова_іа.розмір;
        треба_звільнити_іа_дані = ні;
      } інакше якщо задіяне_іа.вид == ЗПредмет {
        змінна предмет_іа = задіяне_іа.дані як *Предмет;

        якщо предмет_іа.клас == М.клас_Дані {
          змінна предмет_даних = предмет_іа як *ПредметДаних;

          іа_вид = БІБЛІОТЕКА_МАВКИ_ВИД_ІА_ІП6;
          іа_дані = предмет_даних.дані;
          іа_розмір = предмет_даних.розмір;
          треба_звільнити_іа_дані = ні;
        } інакше якщо предмет_іа.клас == М.клас_Текст {
          змінна предмет_тексту = предмет_іа як *ПредметТексту;
          змінна іа_ю8: ю8;
          змінна позиція_помилки: природне;

          змінна успіх = перекодувати_кд_в_ю8(
            М,
            предмет_тексту.значення,
            іа_ю8::адреса,
            позиція_помилки::адреса
          );
          якщо не успіх {
            вернути ПАДІННЯ(М, створити_текст(М, "Не вдалось перекодувати іа в ю8."));
          }

          іа_вид = БІБЛІОТЕКА_МАВКИ_ВИД_ІА_ІП4;
          іа_дані = іа_ю8.дані;
          іа_розмір = іа_ю8.розмір;
          треба_звільнити_іа_дані = так;
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"іа\" має бути текстом або даними."));
      }

      якщо не знайдено_задіяне_порт {
        порт = 0;
      } інакше якщо задіяне_порт.вид == ЗЧисло {
        порт = природне(задіяне_порт.дані як р64);
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"порт\" має бути числом."));
      }

      якщо не знайдено_задіяне_порт {
        порт = 0;
      } інакше якщо задіяне_порт.вид == ЗЧисло {
        порт = природне(задіяне_порт.дані як р64);
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"порт\" має бути числом."));
      }

      якщо знайдено_задіяне_формат {
        якщо задіяне_формат.вид == ЗПредмет {
          змінна пф = задіяне_формат.дані як *Предмет;
          якщо пф == М.клас_Дані {
          } інакше якщо пф == М.клас_Текст {
            як_текст = так;
          } інакше {
            вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"формат\" має бути класом Дані або Текст!"));
          }
        } інакше {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"формат\" має бути класом Дані або Текст!"));
        }
      }

      якщо не знайдено_задіяне_обробник_запуску {
        предмет_обробник_запуску = пусто;
      } інакше якщо задіяне_обробник_запуску.вид == ЗПредмет {
        предмет_обробник_запуску = задіяне_обробник_запуску.дані як *Предмет;

        якщо предмет_обробник_запуску.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_запуску\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_запуску\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_помилки {
        предмет_обробник_помилки = пусто;
      } інакше якщо задіяне_обробник_помилки.вид == ЗПредмет {
        предмет_обробник_помилки = задіяне_обробник_помилки.дані як *Предмет;

        якщо предмет_обробник_помилки.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_помилки\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_помилки\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_зупинки {
        предмет_обробник_зупинки = пусто;
      } інакше якщо задіяне_обробник_зупинки.вид == ЗПредмет {
        предмет_обробник_зупинки = задіяне_обробник_зупинки.дані як *Предмет;

        якщо предмет_обробник_зупинки.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_зупинки\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_зупинки\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_підключення_звʼязку {
        предмет_обробник_підключення_звʼязку = пусто;
      } інакше якщо задіяне_обробник_підключення_звʼязку.вид == ЗПредмет {
        предмет_обробник_підключення_звʼязку = задіяне_обробник_підключення_звʼязку.дані як *Предмет;

        якщо предмет_обробник_підключення_звʼязку.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_підключення_звʼязку\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_підключення_звʼязку\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_даних_звʼязку {
        предмет_обробник_даних_звʼязку = пусто;
      } інакше якщо задіяне_обробник_даних_звʼязку.вид == ЗПредмет {
        предмет_обробник_даних_звʼязку = задіяне_обробник_даних_звʼязку.дані як *Предмет;

        якщо предмет_обробник_даних_звʼязку.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_даних_звʼязку\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_даних_звʼязку\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_стікання_звʼязку {
        предмет_обробник_стікання_звʼязку = пусто;
      } інакше якщо задіяне_обробник_стікання_звʼязку.вид == ЗПредмет {
        предмет_обробник_стікання_звʼязку = задіяне_обробник_стікання_звʼязку.дані як *Предмет;

        якщо предмет_обробник_стікання_звʼязку.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_стікання_звʼязку\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_стікання_звʼязку\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_закінчення_звʼязку {
        предмет_обробник_закінчення_звʼязку = пусто;
      } інакше якщо задіяне_обробник_закінчення_звʼязку.вид == ЗПредмет {
        предмет_обробник_закінчення_звʼязку = задіяне_обробник_закінчення_звʼязку.дані як *Предмет;

        якщо предмет_обробник_закінчення_звʼязку.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_закінчення_звʼязку\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_закінчення_звʼязку\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_помилки_звʼязку {
        предмет_обробник_помилки_звʼязку = пусто;
      } інакше якщо задіяне_обробник_помилки_звʼязку.вид == ЗПредмет {
        предмет_обробник_помилки_звʼязку = задіяне_обробник_помилки_звʼязку.дані як *Предмет;

        якщо предмет_обробник_помилки_звʼязку.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_помилки_звʼязку\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_помилки_звʼязку\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_відключення_звʼязку {
        предмет_обробник_відключення_звʼязку = пусто;
      } інакше якщо задіяне_обробник_відключення_звʼязку.вид == ЗПредмет {
        предмет_обробник_відключення_звʼязку = задіяне_обробник_відключення_звʼязку.дані як *Предмет;

        якщо предмет_обробник_відключення_звʼязку.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_відключення_звʼязку\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_відключення_звʼязку\" має бути дією!"));
      }

      змінна ас = виділити<АргументІнетСлуги>(М, 1);
      ас.М = М;
      ас.як_текст = як_текст;
      ас.прт_слуга = пусто;
      якщо предмет_обробник_запуску != пусто {
        ас.прт_обробник_запуску = притримати_глобально(М, предмет_обробник_запуску);
      }
      якщо предмет_обробник_помилки != пусто {
        ас.прт_обробник_помилки = притримати_глобально(М, предмет_обробник_помилки);
      }
      якщо предмет_обробник_зупинки != пусто {
        ас.прт_обробник_зупинки = притримати_глобально(М, предмет_обробник_зупинки);
      }
      якщо предмет_обробник_підключення_звʼязку != пусто {
        ас.прт_обробник_підключення_звʼязку = притримати_глобально(М, предмет_обробник_підключення_звʼязку);
      }
      якщо предмет_обробник_даних_звʼязку != пусто {
        ас.прт_обробник_даних_звʼязку = притримати_глобально(М, предмет_обробник_даних_звʼязку);
      }
      якщо предмет_обробник_стікання_звʼязку != пусто {
        ас.прт_обробник_стікання_звʼязку = притримати_глобально(М, предмет_обробник_стікання_звʼязку);
      }
      якщо предмет_обробник_закінчення_звʼязку != пусто {
        ас.прт_обробник_закінчення_звʼязку = притримати_глобально(М, предмет_обробник_закінчення_звʼязку);
      }
      якщо предмет_обробник_помилки_звʼязку != пусто {
        ас.прт_обробник_помилки_звʼязку = притримати_глобально(М, предмет_обробник_помилки_звʼязку);
      }
      якщо предмет_обробник_відключення_звʼязку != пусто {
        ас.прт_обробник_відключення_звʼязку = притримати_глобально(М, предмет_обробник_відключення_звʼязку);
      }

      бібліотека_мавки_інет_служити(
        іа_вид,
        іа_дані,
        іа_розмір,
        порт,
        обробник_запуску,
        обробник_помилки,
        обробник_зупинки,
        ас,
        обробник_знищення,
        обробник_підключення_звʼязку,
        обробник_даних_звʼязку,
        обробник_стікання_звʼязку,
        обробник_закінчення_звʼязку,
        обробник_помилки_звʼязку,
        обробник_відключення_звʼязку,
      );

      якщо треба_звільнити_іа_дані {
        звільнити(М, іа_дані);
      }

      вернути НЕДІЙСНЕ;
    }

    дія записати_дію__інет__служити(
      М: *Машина,
      предмет_модуля: *ПредметМодуля
    ) {
      змінна кількість_параметрів = природне(12);
      змінна дані_параметрів = виділити<Значення>(М, кількість_параметрів);

      дані_параметрів[0] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._іа,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[1] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._порт,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[2] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._формат,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[3] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_запуску,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[4] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_помилки,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[5] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_зупинки,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[6] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_підключення_звʼязку,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[7] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_даних_звʼязку,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[8] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_стікання_звʼязку,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[9] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_закінчення_звʼязку,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[10] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_помилки_звʼязку,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[11] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_відключення_звʼязку,
        пусто,
        НЕДІЙСНЕ
      ));

      змінна д = створити_рідну_дію(
        М,
        М.константи_назв._служити,
        створити_послідовність_без_копіювання(
          М,
          кількість_параметрів,
          дані_параметрів
        ),
        пусто,
        рідна_дія__служити,
        пусто
      );

      записати_властивість_модуля(
        М,
        предмет_модуля,
        М.константи_назв._служити,
        ПРЕДМЕТ(д)
      );
    }
  }
}