Browse Source

SVI Переход на kern v3

SVI 7 months ago
parent
commit
f9a778ce4a

+ 3 - 3
cmd/packer/main.go

@@ -4,17 +4,17 @@ package main
 import (
 import (
 	"log"
 	"log"
 
 
-	"gitp78su.ipnodns.ru/svi/packer/internal/service"
+	"gitp78su.ipnodns.ru/svi/packer/lev3/mod_pack"
 )
 )
 
 
 func main() {
 func main() {
 	log.Printf("main()\n")
 	log.Printf("main()\n")
-	serv, err := service.НовСервис()
+	packer, err := mod_pack.НовМодПак()
 	if err != nil {
 	if err != nil {
 		log.Printf("main(): in create ИСервис, err=\n\t%v\n", err)
 		log.Printf("main(): in create ИСервис, err=\n\t%v\n", err)
 		return
 		return
 	}
 	}
-	if err := serv.Пуск(); err != nil {
+	if err := packer.Пуск(); err != nil {
 		log.Printf("main(): in run ИСервис, err=\n\t%v\n", err)
 		log.Printf("main(): in run ИСервис, err=\n\t%v\n", err)
 	}
 	}
 }
 }

+ 1 - 1
go.mod

@@ -2,4 +2,4 @@ module gitp78su.ipnodns.ru/svi/packer
 
 
 go 1.26.0
 go 1.26.0
 
 
-require gitp78su.ipnodns.ru/svi/kern v1.19.1
+require gitp78su.ipnodns.ru/svi/kern/v3 v3.1.1

+ 2 - 2
go.sum

@@ -1,2 +1,2 @@
-gitp78su.ipnodns.ru/svi/kern v1.19.1 h1:zc/B+CjdOz9c7I6GkrHdAT+d24b1KGbd8L2RalAjf3g=
-gitp78su.ipnodns.ru/svi/kern v1.19.1/go.mod h1:cnu6lg4ybZw9wgp559o/z7x3OWtN+lUgPFQ9DtXecv4=
+gitp78su.ipnodns.ru/svi/kern/v3 v3.1.1 h1:1ymYrax2WuEB13JSj0aA9pUQJU/VGRI7CpqTyFOaTB4=
+gitp78su.ipnodns.ru/svi/kern/v3 v3.1.1/go.mod h1:hq6dlAu+6/x2HJAA1yXKRRILaBXFzywBdgXIL5uwEwg=

+ 0 - 45
internal/packer/freq_pair/freq_pair.go

@@ -1,45 +0,0 @@
-// package freq_pair -- наиболее частотная пара
-package freq_pair
-
-import (
-	"fmt"
-)
-
-// ЧастПара -- самая частотная пара
-type ЧастотПара struct {
-	Val1_, Val2_ int    // Самые частотные значения
-	Key0_, Key1_ uint32 // Самый частотные ключи
-	Combo_       string // Самая выгодная комбинация для сжатия(11, 12, 21, 22)
-}
-
-// SetVal1 -- устанавливает значения частотных пар
-func (сам *ЧастотПара) SetVal1(key uint32, val int) {
-	if val > сам.Val2_ {
-		сам.Val1_ = сам.Val2_
-		сам.Key0_ = сам.Key1_
-
-		сам.Val2_ = val
-		сам.Key1_ = key
-		return
-	}
-	сам.Val1_ = val
-	сам.Key0_ = key
-}
-
-// String -- строковое представление частотных пар
-func (сам *ЧастотПара) String() string {
-	str := fmt.Sprintf("{key1:%v val1:%v; key2:%v val2:%v; combo:%q}",
-		сам.Key0_,
-		сам.Val1_,
-		сам.Key1_,
-		сам.Val2_,
-		сам.Combo_,
-	)
-	return str
-}
-
-// SetKeys -- устанавливает ключи замен
-func (сам *ЧастотПара) SetKeys(key0, key1 uint32) {
-	сам.Key0_ = key0
-	сам.Key1_ = key1
-}

+ 0 - 42
internal/service/service.go

@@ -1,42 +0,0 @@
-// package Сервис -- главный тип пакера
-package service
-
-import (
-	"fmt"
-	"log"
-	"os"
-
-	"gitp78su.ipnodns.ru/svi/packer/internal/packer"
-)
-
-// Сервис -- главный тип пакера
-type Сервис struct {
-	пакер *packer.Пакер
-}
-
-// НовСервис -- возвращает новый сервис
-func НовСервис() (*Сервис, error) {
-	log.Printf("НовСервис()\n")
-	сам := &Сервис{}
-	сам.пакер = packer.НовПакер()
-	return сам, nil
-}
-
-// Пуск -- запускает сервис в работу
-func (sf *Сервис) Пуск() error {
-	log.Printf("Сервис.Пуск()\n")
-	cmd := os.Getenv("PACKER_CMD")
-	if cmd == "" {
-		return fmt.Errorf("Сервис.Пуск(): env PACKER_CMD not set")
-	}
-	switch cmd {
-	case "pack":
-		err := sf.пакер.Пуск()
-		if err != nil {
-			return fmt.Errorf("Сервис.Пуск(): in Пуск IPacker, err=\n\t%w", err)
-		}
-	default:
-		return fmt.Errorf("Сервис.Пуск(): unknown env PACKER_CMD(%q)", cmd)
-	}
-	return nil
-}

+ 0 - 0
pkg/types/idict_keys.go → lev0/types/idict_keys.go


+ 0 - 0
pkg/types/ifrequencer.go → lev0/types/ifrequencer.go


+ 0 - 0
pkg/types/ipacker.go → lev0/types/ipacker.go


+ 28 - 25
internal/packer/dict_keys/dict_keys.go → lev1/dict_keys/dict_keys.go

@@ -5,15 +5,15 @@ import (
 	"fmt"
 	"fmt"
 	"sync"
 	"sync"
 
 
-	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	mKh "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
 
 
-	"gitp78su.ipnodns.ru/svi/packer/pkg/types"
+	"gitp78su.ipnodns.ru/svi/packer/lev0/types"
 )
 )
 
 
 // СловКлючи -- словарь ключей для подстановки
 // СловКлючи -- словарь ключей для подстановки
 type СловКлючи struct {
 type СловКлючи struct {
-	sync.RWMutex
-	слов map[uint32]bool // Словарь ключей подстановки с частотой встреч (для частотника)
+	блок sync.RWMutex
+	слов map[uint32]uint32 // Словарь ключей подстановки с количеством встреч (для частотника)
 }
 }
 
 
 var (
 var (
@@ -21,7 +21,7 @@ var (
 	блок sync.Mutex
 	блок sync.Mutex
 )
 )
 
 
-// СловКлючиПолуч -- возвращает новый словарь для подстановки ключей
+// СловКлючиПолуч -- возвращает новый словарь ключей c количеством встреч
 func СловКлючиПолуч() *СловКлючи {
 func СловКлючиПолуч() *СловКлючи {
 	блок.Lock()
 	блок.Lock()
 	defer блок.Unlock()
 	defer блок.Unlock()
@@ -29,16 +29,16 @@ func СловКлючиПолуч() *СловКлючи {
 		return сам
 		return сам
 	}
 	}
 	сам = &СловКлючи{
 	сам = &СловКлючи{
-		слов: map[uint32]bool{},
+		слов: map[uint32]uint32{},
 	}
 	}
 	_ = types.ИСловКлючи(сам)
 	_ = types.ИСловКлючи(сам)
 	return сам
 	return сам
 }
 }
 
 
-// Ключи -- возвращает словарь ключей
+// Ключи -- возвращает список ключей
 func (сам *СловКлючи) Ключи() []uint32 {
 func (сам *СловКлючи) Ключи() []uint32 {
-	сам.RLock()
-	defer сам.RUnlock()
+	сам.блок.RLock()
+	defer сам.блок.RUnlock()
 	lstKey := make([]uint32, 0, len(сам.слов))
 	lstKey := make([]uint32, 0, len(сам.слов))
 	for key := range сам.слов {
 	for key := range сам.слов {
 		lstKey = append(lstKey, key)
 		lstKey = append(lstKey, key)
@@ -48,46 +48,49 @@ func (сам *СловКлючи) Ключи() []uint32 {
 
 
 // ПервичЗаполн -- заполняет первичные ключи
 // ПервичЗаполн -- заполняет первичные ключи
 func (сам *СловКлючи) ПервичЗаполн(бинТекст []uint32) {
 func (сам *СловКлючи) ПервичЗаполн(бинТекст []uint32) {
-	словПервич := map[int]bool{}
-	for инд := range 256 {
-		словПервич[инд] = true
+	сам.блок.Lock()
+	defer сам.блок.Unlock()
+	for инд := range uint32(256) {
+		сам.слов[uint32(инд)] = 0
 	}
 	}
 	for _, знач := range бинТекст {
 	for _, знач := range бинТекст {
-		delete(словПервич, int(знач))
+		delete(сам.слов, знач)
 	}
 	}
-	for ключ := range словПервич {
-		сам.слов[uint32(ключ)] = true
+	for _, ключ := range бинТекст {
+		ключЧаст := сам.слов[ключ]
+		ключЧаст += 1
+		сам.слов[ключ] = ключЧаст
 	}
 	}
 }
 }
 
 
 // Доб -- добавляет ключ в словарь
 // Доб -- добавляет ключ в словарь
 func (сам *СловКлючи) Доб(ключ uint32) {
 func (сам *СловКлючи) Доб(ключ uint32) {
-	сам.Lock()
-	defer сам.Unlock()
+	сам.блок.Lock()
+	defer сам.блок.Unlock()
 	_, еслиЕсть := сам.слов[ключ]
 	_, еслиЕсть := сам.слов[ключ]
-	Hassert(!еслиЕсть, "СловКлючи.Доб(): ключ(%v) уже есть", ключ)
-	сам.слов[ключ] = true
+	mKh.Hassert(!еслиЕсть, "СловКлючи.Доб(): ключ(%v) уже есть", ключ)
+	сам.слов[ключ] = 0
 }
 }
 
 
 // Стата -- отдаёт статистику словаря
 // Стата -- отдаёт статистику словаря
 func (сам *СловКлючи) Стата() string {
 func (сам *СловКлючи) Стата() string {
-	сам.RLock()
-	defer сам.RUnlock()
+	сам.блок.RLock()
+	defer сам.блок.RUnlock()
 	res := fmt.Sprintf("СловКлючи.Стата(): всего=%v", len(сам.слов))
 	res := fmt.Sprintf("СловКлючи.Стата(): всего=%v", len(сам.слов))
 	return res
 	return res
 }
 }
 
 
 // ЕслиЕсть -- проверяет существует ли такой ключ
 // ЕслиЕсть -- проверяет существует ли такой ключ
 func (сам *СловКлючи) ЕслиЕсть(key uint32) bool {
 func (сам *СловКлючи) ЕслиЕсть(key uint32) bool {
-	сам.RLock()
-	defer сам.RUnlock()
+	сам.блок.RLock()
+	defer сам.блок.RUnlock()
 	_, isOk := сам.слов[key]
 	_, isOk := сам.слов[key]
 	return isOk
 	return isOk
 }
 }
 
 
 // Всего -- возвращает размер словаря ключей
 // Всего -- возвращает размер словаря ключей
 func (сам *СловКлючи) Всего() int {
 func (сам *СловКлючи) Всего() int {
-	сам.RLock()
-	defer сам.RUnlock()
+	сам.блок.RLock()
+	defer сам.блок.RUnlock()
 	return len(сам.слов)
 	return len(сам.слов)
 }
 }

+ 55 - 0
lev1/freq_pair/freq_pair.go

@@ -0,0 +1,55 @@
+// package freq_pair -- наиболее частотная пара
+package freq_pair
+
+import (
+	"fmt"
+)
+
+// ЧастПара -- самая частотная пара
+type ЧастотПара struct {
+	val1, val2 int    // Самые частотные значения
+	key0, key1 uint32 // Самый частотные ключи
+	strCombo   string // Самая выгодная комбинация для сжатия(11, 12, 21, 22)
+}
+
+// SetVal1 -- устанавливает значения частотных пар
+func (сам *ЧастотПара) SetVal1(key uint32, val int) {
+	if val > сам.val2 {
+		сам.val1 = сам.val2
+		сам.key0 = сам.key1
+
+		сам.val2 = val
+		сам.key1 = key
+		return
+	}
+	сам.val1 = val
+	сам.key0 = key
+}
+
+// String -- строковое представление частотных пар
+func (сам *ЧастотПара) String() string {
+	str := fmt.Sprintf("{key1:%v val1:%v; key2:%v val2:%v; combo:%q}",
+		сам.key0,
+		сам.val1,
+		сам.key1,
+		сам.val2,
+		сам.strCombo,
+	)
+	return str
+}
+
+// SetKeys -- устанавливает ключи замен
+func (сам *ЧастотПара) SetKeys(key0, key1 uint32) {
+	сам.key0 = key0
+	сам.key1 = key1
+}
+
+// Key0 -- самый частотный ключ 0
+func (сам *ЧастотПара) Key0() uint32 {
+	return сам.key0
+}
+
+// Key1 -- самый частотный ключ 1
+func (сам *ЧастотПара) Key1() uint32 {
+	return сам.key1
+}

+ 4 - 4
internal/packer/frequencer/frequencer.go → lev1/frequencer/frequencer.go

@@ -6,11 +6,11 @@ import (
 	"log"
 	"log"
 	"time"
 	"time"
 
 
-	// . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	// . "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
 
 
-	"gitp78su.ipnodns.ru/svi/packer/internal/belt"
-	"gitp78su.ipnodns.ru/svi/packer/internal/packer/dict_keys"
-	"gitp78su.ipnodns.ru/svi/packer/pkg/types"
+	"gitp78su.ipnodns.ru/svi/packer/lev0/types"
+	"gitp78su.ipnodns.ru/svi/packer/lev1/dict_keys"
+	"gitp78su.ipnodns.ru/svi/packer/lev2/belt"
 )
 )
 
 
 // Частотник -- ищет минимально частотную пару
 // Частотник -- ищет минимально частотную пару

+ 1 - 0
lev1/lev1.go

@@ -0,0 +1 @@
+package lev1

+ 1 - 1
internal/belt/belt.go → lev2/belt/belt.go

@@ -6,7 +6,7 @@ import (
 	"os"
 	"os"
 	"sync"
 	"sync"
 
 
-	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
 )
 )
 
 
 type Лента struct {
 type Лента struct {

+ 1 - 0
lev2/lev2.go

@@ -0,0 +1 @@
+package lev2

+ 13 - 16
internal/packer/packer.go → lev2/packer/packer.go

@@ -7,13 +7,13 @@ import (
 	"math"
 	"math"
 	"time"
 	"time"
 
 
-	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	mKh "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
 
 
-	"gitp78su.ipnodns.ru/svi/packer/internal/belt"
-	"gitp78su.ipnodns.ru/svi/packer/internal/packer/dict_keys"
-	"gitp78su.ipnodns.ru/svi/packer/internal/packer/freq_pair"
-	"gitp78su.ipnodns.ru/svi/packer/internal/packer/frequencer"
-	"gitp78su.ipnodns.ru/svi/packer/pkg/types"
+	"gitp78su.ipnodns.ru/svi/packer/lev0/types"
+	"gitp78su.ipnodns.ru/svi/packer/lev1/dict_keys"
+	"gitp78su.ipnodns.ru/svi/packer/lev1/freq_pair"
+	"gitp78su.ipnodns.ru/svi/packer/lev1/frequencer"
+	"gitp78su.ipnodns.ru/svi/packer/lev2/belt"
 )
 )
 
 
 // Пакер -- упаковщик сервиса
 // Пакер -- упаковщик сервиса
@@ -42,10 +42,7 @@ func (сам *Пакер) Пуск() error {
 	log.Printf("Пакер.Пуск()\n")
 	log.Printf("Пакер.Пуск()\n")
 	сам.словКлючи.ПервичЗаполн(сам.лента.Исх())
 	сам.словКлючи.ПервичЗаполн(сам.лента.Исх())
 	раундСчёт := 1
 	раундСчёт := 1
-	for { // Главный цикл сжатия
-		if !сам.раунд() {
-			break
-		}
+	for сам.еслиРаунд() { // Главный цикл сжатия
 		log.Printf("Пакер.Пуск(): раунд=%v, ключиВсего=%v\n\n", раундСчёт, сам.словКлючи.Всего())
 		log.Printf("Пакер.Пуск(): раунд=%v, ключиВсего=%v\n\n", раундСчёт, сам.словКлючи.Всего())
 		раундСчёт++
 		раундСчёт++
 	}
 	}
@@ -77,7 +74,7 @@ func (сам *Пакер) времРаунд(времНач int64) {
 	case 8192 <= ключейВсего && ключейВсего < 16383:
 	case 8192 <= ключейВсего && ключейВсего < 16383:
 		словБит = 14
 		словБит = 14
 	case ключейВсего >= 16384:
 	case ключейВсего >= 16384:
-		Hassert(false, "Пакер.времРаунд(): слишком много ключей(%v)", ключейВсего)
+		mKh.Hassert(false, "Пакер.времРаунд(): слишком много ключей(%v)", ключейВсего)
 	}
 	}
 	размерНов := int((float32(len(сам.лента.Вых()) + ключейВсего)) * (float32(словБит) / 8))
 	размерНов := int((float32(len(сам.лента.Вых()) + ключейВсего)) * (float32(словБит) / 8))
 	сжатие := float32(размерНов) / float32(сам.лента.ИсхРазмер()) * 100
 	сжатие := float32(размерНов) / float32(сам.лента.ИсхРазмер()) * 100
@@ -90,18 +87,18 @@ func (сам *Пакер) времРаунд(времНач int64) {
 }
 }
 
 
 // Выполняет раунд сжатия
 // Выполняет раунд сжатия
-func (сам *Пакер) раунд() bool {
+func (сам *Пакер) еслиРаунд() bool {
 	времНач := time.Now().Local().UnixMilli()
 	времНач := time.Now().Local().UnixMilli()
 	defer сам.времРаунд(времНач)
 	defer сам.времРаунд(времНач)
 	// сам.словУст()
 	// сам.словУст()
 	if err := сам.частотник.Пуск(); err != nil {
 	if err := сам.частотник.Пуск(); err != nil {
-		log.Printf("Пакер.round(): in work IFrequencer, err=\n\t%v\n", err)
+		log.Printf("Пакер.еслиРаунд(): in work IFrequencer, err=\n\t%v\n", err)
 		return false
 		return false
 	}
 	}
 	сам.частотПара.SetKeys(сам.частотник.Ключи())
 	сам.частотПара.SetKeys(сам.частотник.Ключи())
 	keyNext, err := сам.keyNext()
 	keyNext, err := сам.keyNext()
 	if err != nil {
 	if err != nil {
-		log.Printf("Пакер.раунд(): limit keys, err=\n\t%v\n", err)
+		log.Printf("Пакер.еслиРаунд(): limit keys, err=\n\t%v\n", err)
 		return false
 		return false
 	}
 	}
 	сам.сменитьКлюч(keyNext)
 	сам.сменитьКлюч(keyNext)
@@ -130,8 +127,8 @@ func (сам *Пакер) сменитьКлюч(key uint32) {
 		val1 = binNew[ind]
 		val1 = binNew[ind]
 		return true
 		return true
 	}
 	}
-	key0 := сам.частотПара.Key0_
-	key1 := сам.частотПара.Key1_
+	key0 := сам.частотПара.Key0()
+	key1 := сам.частотПара.Key1()
 	for ind < len(binNew) {
 	for ind < len(binNew) {
 		val1 = binNew[ind]
 		val1 = binNew[ind]
 		if val0 == key0 && val1 == key1 {
 		if val0 == key0 && val1 == key1 {

+ 1 - 0
lev3/lev3.go

@@ -0,0 +1 @@
+package lev3

+ 42 - 0
lev3/mod_pack/mod_pack.go

@@ -0,0 +1,42 @@
+// package mod_pack -- главный модуль пакера
+package mod_pack
+
+import (
+	"fmt"
+	"log"
+	"os"
+
+	mKh "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
+	"gitp78su.ipnodns.ru/svi/packer/lev2/packer"
+)
+
+// МодПакер -- главный тип пакера
+type МодПакер struct {
+	пакер *packer.Пакер
+}
+
+// НовМодПак -- возвращает новый пакер
+func НовМодПак() (*МодПакер, error) {
+	log.Printf("НовМодПак()\n")
+	сам := &МодПакер{
+		пакер: packer.НовПакер(),
+	}
+	return сам, nil
+}
+
+// Пуск -- запускает пакер в работу
+func (sf *МодПакер) Пуск() error {
+	log.Printf("МодПакер.Пуск()\n")
+	cmd := os.Getenv("PACKER_CMD")
+	mKh.Hassert(cmd != "", "МодПакер.Пуск(): env PACKER_CMD not set")
+	switch cmd {
+	case "pack":
+		err := sf.пакер.Пуск()
+		if err != nil {
+			return fmt.Errorf("МодПакер.Пуск(): in Пуск IPacker, err=\n\t%w", err)
+		}
+	default:
+		return fmt.Errorf("МодПакер.Пуск(): unknown env PACKER_CMD(%q)", cmd)
+	}
+	return nil
+}

+ 0 - 116
vendor/gitp78su.ipnodns.ru/svi/kern/LICENSE.md

@@ -1,116 +0,0 @@
-# Универсальная коммунистическая лицензия
-
-`Версия 1.0.6` `2025-03-10 09:24:36 MSK +03`
-
-Сокращённое название:
-
-- русский: УКЛ;
-- английский: UCL.
-
-## Определения
-
-**Трудящийся**: человек, для которого приоритетным способом обеспечения своей жизни является реализация своего производительного труда каким-либо образом.
-
-**Капиталист**: человек, который является владельцем материальных и трудовых ресурсов, инструментов производства и присваивает в личное владение хотя бы часть прибавочной стоимости в ходе товарного производства.
-
-**Объект лицензирования**: любой результат труда, в отношение которого устанавливаются правовые отношения настоящей лицензией (далее `ОЛ`); `ОЛ` не может быть ничего, кроме артефакта, который потребовал для своего создания производительного труда.
-
-**Автор ОЛ**: человек (или несколько человек), который является автором `ОЛ` и всех сопутствующих материалов, которые он создал непосредственно.
-
-**Потребитель ОЛ**: `трудящийся` или `капиталист`, который использует настоящий `ОЛ`, с соблюдением требований данной лицензии или с нарушением требований данной лицензии.
-
-**Производный объект лицензирования**: `ОЛ` со всеми сопутствующими материалами, в котором доля модификации не превышает 50%; производный `ОЛ` подпадает под действие этих же лицензионных требований в полном объёме.
-
-**Лицензионные требования**: требования на условия использование `ОЛ`, которые предъявляет автор `ОЛ` при его использовании потребителем `ОЛ`. `Лицензионные требования` автоматически вступают в силу, если потребитель ОЛ использует объект лицензирования в любым способом.
-
-```mermaid
-flowchart TD
-  subgraph Потребитель
-    Трудящийся
-    Капиталист
-  end
-  subgraph Права
-    subgraph отчуждаемые
-      ПК[копирование]
-      ПМ[модификация]
-      ПИ[использование]
-    end
-    subgraph неотчуждаемые
-      ПА[авторское]
-      ПВ[владение]
-    end
-    ПК --> ОП[Отчуждаемые права]
-    ПМ --> ОП
-    ПИ --> ОП
-    ПА --> НП[Неотчуждаемые права]
-    ПВ --> НП
-  end
-  ОЛ[Объект лицензирования] --> Права
-  ОП --> Трудящийся
-  ОП --> Автор
-  ОП -.-x Капиталист
-  Автор --> Капиталист
-  НП --> Автор
-```
-
-## Права
-
-**Неотчуждаемое право**: такой вид права, который при любых условиях и/или обстоятельствах не может быть утрачен.
-
-**Авторское право**: неотчуждаемое право автора (или группы авторов) на своё произведение ни при каких условиях; авторское право означает, что автором `ОЛ` является конкретный человек (или группа людей) и ничего более.
-
-**Право владения**: особое, неотчуждаемое право в условиях капитализма, по непосредственному владению `ОЛ` `автором`; возможно отчуждаемое право в условиях социализма на свободном решении отказа  `автора` от права владения `ОЛ` в общественное пользование `трудящимися`.
-
-**Отчуждаемое право**: такой вид права, который может быть передан или отозван по различным основаниям.
-
-**Свободное решение**: решение двух сторон по обладанию отчуждаемыми правами без какого-либо внешнего давления, которое не принуждает любую из сторон  (с явной потерей своей пользы в явную пользу другой стороны или наоборот) передавать или принимать права любой из сторон.
-
-**Право копирования**:  возможное отчуждаемое право, по  `свободному решению`` сторон; копирование -- создание копии ПО. подлежащее данным лицензионным требованиям.
-
-**Право модификации**: возможное отчуждаемое право, по `свободному решению`` сторон; модификация -- доработка, декомпиляция. патчинг и другие виды изменений в отношении ПО, которое подлежит данному лицензированию.
-
-**Право использования**: возможное отчуждаемое право, по свободному решению сторон; использование -- использование `ОЛ` по функциональному назначению _и все действия_, связанные с технологией использования такого `ОЛ`, подлежащему данным лицензионным требованиям; право использования для `капиталиста` -- -- особое индивидуальное разрешение `капиталисту` на использование конкретного `ЛО` или его частью, которое подлежит данным лицензионным требованиям.
-
-## Обязанности сторон
-
-`Автор` в рамках определений в настоящих лицензионных требований _разрешает_ всем `трудящимся` мира использовать права на настоящий `ОЛ`:
-
-- копирования;
-- использования;
-- модификации.
-
-`Автор` в рамках определений настоящих лицензионных требований _запрещает_ всем `капиталистам` мира право копирования, использования, модификации настоящего `ОЛ` и любые права не указанные здесь, если это не оговорено особо или передача прав не является свободной.
-
-`Автор` _явно_ запрещает использование `ОЛ`, в случае его применения любым способом против `трудящихся`.
-
-`Автор` не даёт _никаких_ гарантий в отношении настоящего `ОЛ`:
-
-- необходимого функционала;
-- необходимой архитектуры;
-- необходимых архитектурных свойств;
-- необходимого качества и/или кодирования, материалов;
-- необходимого количества тестирования;
-- необходимых возможностей масштабирования;
-- отсутствия возможного ущерба;
-- возможной упущенной выгоды;
-- иных возможных потерь, которые не упомянуты здесь.
-
-`Автор` может дать дополнительные гарантии по своему усмотрению или договорённости с `потребителем`; подобные договорённости оформляются отдельным приложением и оно имеет приоритет надо отказом от гарантий, перечисленными (или не упомянутыми) выше.
-
-`Автор` гарантирует, что не включает в свой код деструктивный функционал, но оставляет за собой право ограничивать `потребителей` данного `ОЛ` в праве его использовать в случаях нарушения требований настоящей лицензии.
-
-`Трудящиеся` _обязаны_ не передавать права на настоящий `ОЛ` `капиталистам` и не препятствовать передаче этих же прав `трудящимся`, кроме случаев _явного_ использования `трудящимися` настоящего `ОЛ` в пользу `капиталистов`.
-
-В случае использования настоящего `ОЛ` `пользователи` автоматически принимают требования текущей УКЛ, и соглашаются со всеми положениями настоящих лицензионных требований.
-
-Настоящая лицензия _должна_ сопровождать `ОЛ`, в случае передачи отчуждаемых прав.
-
-## Защита лицензионных требований
-
-`Автор` может в любой момент изменить состав `ОЛ` в любых целях, кроме откровенно деструктивных, для защиты лицензионных требований.
-`Автор` может в любой момент изменить версию настоящих лицензионных требований, из-за внесённых им каких-либо изменений в `ОЛ`, но в рамках совместимости с предыдущими лицензионными требованиями.
-`Автор` может в любой момент отозвать отчуждаемые права (кроме особых случаев отчуждаемого права использования), если посчитает, что `потребитель` нарушает настоящие лицензионные требования.
-
-## Заключительные положения
-
-Если, какая-либо сторона настоящих лицензионных требований не оговорена или допускает какую-либо трактовку -- в таком случае, ситуация трактуется приоритетно в пользу `автора`, во вторую очередь в пользу `трудящихся` и никогда в пользу `капиталистов`. Данное требование не распространяется на особые случаи использования с отдельными договорённостями и только на основе свободного решения.

+ 11 - 1
vendor/gitp78su.ipnodns.ru/svi/kern/kc/helpers/helpers.go → vendor/gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers/helpers.go

@@ -8,7 +8,7 @@ import (
 	"os"
 	"os"
 	"time"
 	"time"
 
 
-	. "gitp78su.ipnodns.ru/svi/kern/krn/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
 )
 )
 
 
 var (
 var (
@@ -16,6 +16,11 @@ var (
 	IsStageProd  bool
 	IsStageProd  bool
 )
 )
 
 
+// FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert)
+//
+//	(isCond bool, msgFormat string, args ...any)
+type FnAssert func(isCond bool, msgFormat string, args ...any)
+
 // Assert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert)
 // Assert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert)
 func Assert(isCond bool, msgFormat string, args ...any) {
 func Assert(isCond bool, msgFormat string, args ...any) {
 	if isCond {
 	if isCond {
@@ -28,6 +33,11 @@ func Assert(isCond bool, msgFormat string, args ...any) {
 	fmt.Print(msg)
 	fmt.Print(msg)
 }
 }
 
 
+// FnHassert -- проверяет с жёстким падением условие
+//
+//	(isCond bool, msgFormat string, args ...any)
+type FnHassert func(isCond bool, msgFormat string, args ...any)
+
 // Hassert -- проверка на правильность утверждения с безусловным падением в панику (hard assert)
 // Hassert -- проверка на правильность утверждения с безусловным падением в панику (hard assert)
 func Hassert(isCond bool, msgFormat string, args ...any) {
 func Hassert(isCond bool, msgFormat string, args ...any) {
 	if isCond {
 	if isCond {

+ 0 - 0
vendor/gitp78su.ipnodns.ru/svi/kern/krn/kalias/kalias.go → vendor/gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias/kalias.go


+ 3 - 3
vendor/modules.txt

@@ -1,4 +1,4 @@
-# gitp78su.ipnodns.ru/svi/kern v1.19.1
+# gitp78su.ipnodns.ru/svi/kern/v3 v3.1.1
 ## explicit; go 1.24.2
 ## explicit; go 1.24.2
-gitp78su.ipnodns.ru/svi/kern/kc/helpers
-gitp78su.ipnodns.ru/svi/kern/krn/kalias
+gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers
+gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias