İçeriğe geç
academia.sh

Ders 21 / 21

Sorumlu Yayımlama

Yayımlanan sayının kapsadığının ve kapsamadığının ölçülmesi: eşik 0,50 kurulumu tek bir duyarlılık sayısı yayımlıyor (0,7097) ama sınıf başına okunduğunda aynı savunma 0,9583 ile 0,2105 arasında dağılıyor ve yayımlanan sayı ile en zayıf sınıf arasındaki fark 0,4992 çıkıyor. Dokuz taahhüt üç sınıfta toplanıyor — kullanım sınırı, şeffaflık kalemi ve kötüye kullanım planı — ve dar bir sistem kartı bunların 2'sini sayıya bağlıyor, geniş kart 6'sını; kalan 3 taahhüt hiçbir kartla karşılanmıyor ve iddia olarak kalıyor. Ders M28/K07 kursunun ve M28 müfredatının kapanışıdır: yirmi bir dersin savunmasız tabanı, savunmalı kurulumu ve bedeli tek tabloda toplanır.

İçindekiler

Bir önceki derste geri bildirim döngüsünün yanlış alarmı göremediği ölçüldü. Bütün bu sayılar şimdiye kadar içeride kaldı: kümeyi kuran, göstergeyi okuyan ve eşiği oynatan aynı ekipti. Bir sistem yayımlandığında dışarıya bir şey söyler — nerede kullanılacağı, neyin ölçüldüğü ve kötüye kullanıldığında ne yapılacağı. Bu ders o metni ölçer: bir sistem kartının taşıdığı sayılar, taşımadığı sayılar ve taşımadığı her sayının ne olduğu. Koşullar sınıflarıyla anılır: kullanım sınırı, şeffaflık kalemi, kötüye kullanım planı.

  • DG63. Kayıtlar, sınıflar, savunma ve taahhüt listesi kurgudur. Kayıtların metni tümüyle zararsız destek talepleridir ve sınıfla hiçbir ilişkisi yoktur; sınıf yalnızca yapısal öznitelik profilinde durur. Küme kursun 240 kaydı, 93 zararlı, 147 temiz.
  • DG64. Yayımlanan kurulum model süzgeci, eşik 0,50’dir.
  • DG65. Dar kart yalnız iki ortalama sayı taşır. Geniş kart bunlara sınıf başına duyarlılığı, kümenin çözünürlüğünü, insana giden kaydı ve itirazın kapsadığı payı ekler.
  • DG66. Bir taahhüt, dayandığı ölçü kartta varsa sayıya bağlıdır; yoksa iddia olarak kalır. Ölçüsü bu kursta hiç üretilmemiş taahhütler her iki kartta da iddia kalır.
  • DG67. Kümenin çözünürlüğü: duyarlılık adımı 1/93 = 0,0108, yanlış engelleme adımı 1/147 = 0,0068; sınıf başına adım sınıfın kayıt sayısının tersidir ve on kayıtlık sınıfta 0,1000’e çıkar. İkinci koşum kayıt kümesini değiştirmez, yalnız süzgecin kendi çekilişini tohum 20260219 ile yeniler.

Kartın Taşıdığı Sayı

# KURGUDUR. Kayitlarin metni tumuyle zararsiz destek talepleridir ve sinifla
# hicbir iliskisi yoktur; sinif yalnizca yapisal ozellik profilinde durur.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


def ayrik(u, w):
    t = 0.0
    for i, x in enumerate(w):
        t += x
        if u < t:
            return i
    return len(w) - 1


def izno(m):
    h = 2166136261
    for c in str(m):
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


SINIF = ["temiz", "dolayli_yonerge", "gizli_alan_istegi", "yetki_asimi",
         "kaynak_taklidi", "bozulmus_girdi"]
KAYNAK = ["kullanici", "erisilen_belge", "arac_ciktisi"]
OZELLIK = ["yonerge_kipi", "rol_degistirme_istegi", "gizli_alan_adi", "yan_etkili_arac_adi",
           "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi", "asiri_uzunluk"]
PROFIL = {
    "temiz":              [0.06, 0.02, 0.05, 0.03, 0.02, 0.04, 0.05],
    "dolayli_yonerge":    [0.88, 0.42, 0.10, 0.30, 0.35, 0.08, 0.12],
    "gizli_alan_istegi":  [0.35, 0.15, 0.86, 0.12, 0.10, 0.06, 0.08],
    "yetki_asimi":        [0.30, 0.25, 0.12, 0.84, 0.14, 0.05, 0.07],
    "kaynak_taklidi":     [0.22, 0.55, 0.08, 0.10, 0.82, 0.07, 0.06],
    "bozulmus_girdi":     [0.05, 0.03, 0.04, 0.03, 0.06, 0.80, 0.62],
}
KAYNAK_PAYI = {
    "temiz":             [0.72, 0.20, 0.08],
    "dolayli_yonerge":   [0.05, 0.70, 0.25],
    "gizli_alan_istegi": [0.55, 0.30, 0.15],
    "yetki_asimi":       [0.40, 0.35, 0.25],
    "kaynak_taklidi":    [0.10, 0.60, 0.30],
    "bozulmus_girdi":    [0.65, 0.20, 0.15],
}
METIN = ["bu ayki fatura tutari gecen aya gore yuksek geldi",
         "sayac endeksi yanlis girilmis olabilir",
         "mahallede kesinti ne zaman bitecek",
         "tarife basamagimi ogrenmek istiyorum",
         "ariza kaydim icin ekip ne zaman gelir",
         "adres degisikligi nasil yapilir"]
KAYIT = []
for i in range(240):
    r = uretec(TOHUM + 6151 * i)
    s = SINIF[ayrik(r(), [0.62, 0.10, 0.07, 0.07, 0.07, 0.07])]
    kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])]
    oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])}
    KAYIT.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz,
                  "metin": METIN[int(r() * len(METIN))],
                  "uzunluk": 40 + int(r() * 260)})


def zararli(k):
    return k["sinif"] != "temiz"


AGIRLIK = {"yonerge_kipi": 0.42, "rol_degistirme_istegi": 0.26, "gizli_alan_adi": 0.44,
           "yan_etkili_arac_adi": 0.40, "kaynak_damgasi_uyusmuyor": 0.38,
           "olagandisi_damga_dagilimi": 0.30, "asiri_uzunluk": 0.12}
KAYNAK_EK = {"kullanici": 0.00, "erisilen_belge": 0.18, "arac_ciktisi": 0.12}


def puan(k, tohum=TOHUM):
    p = sum(AGIRLIK[o] for o in OZELLIK if k["ozellik"][o]) + KAYNAK_EK[k["kaynak"]]
    r = uretec(tohum ^ izno(k["no"]))
    return min(max(p + (r() - 0.5) * 0.20, 0.0), 1.6)


def model_suzgeci(k, esik=0.40, tohum=TOHUM):
    return puan(k, tohum) >= esik


def onay_kapisi(k, gerekli=True):
    """Yan etkili arac istegi tasiyan kayit insana sorulur."""
    return gerekli and k["ozellik"]["yan_etkili_arac_adi"]


def olc(kayitlar, karar):
    dp = yp = dn = yn = 0
    for k in kayitlar:
        isaret, gercek = karar(k), zararli(k)
        if isaret and gercek:
            dp += 1
        elif isaret and not gercek:
            yp += 1
        elif not isaret and gercek:
            yn += 1
        else:
            dn += 1
    kesinlik = dp / (dp + yp) if dp + yp else 0.0
    duyarlilik = dp / (dp + yn) if dp + yn else 0.0
    return {"dp": dp, "yp": yp, "yn": yn, "dn": dn,
            "kesinlik": round(kesinlik, 4), "duyarlilik": round(duyarlilik, 4),
            "yanlis_engelleme_payi": round(yp / (yp + dn), 4) if yp + dn else 0.0}


ESIK, IKINCI = 0.50, 20260219                  # kurulu esik , ikinci kosum tohumu
kart = olc(KAYIT, lambda k: model_suzgeci(k, ESIK))
iki = olc(KAYIT, lambda k: model_suzgeci(k, ESIK, IKINCI))
print(f"yayimlanan tek sayi: duyarlilik {kart['duyarlilik']:.4f} , ikinci kosumda"
      f" {iki['duyarlilik']:.4f} (band {iki['duyarlilik'] - kart['duyarlilik']:.4f})")
print(f"yanlis engelleme payi {kart['yanlis_engelleme_payi']:.4f} ve"
      f" {iki['yanlis_engelleme_payi']:.4f}")
print("\nsinif                 kayit  20260218  20260219  cozunurluk")
sinif_duyarlilik = {}
for s in SINIF[1:]:
    ks = [k for k in KAYIT if k["sinif"] == s]
    d = sum(model_suzgeci(k, ESIK) for k in ks) / len(ks)
    d2 = sum(model_suzgeci(k, ESIK, IKINCI) for k in ks) / len(ks)
    sinif_duyarlilik[s] = d
    print(f"{s:<20} {len(ks):>6} {d:>9.4f} {d2:>9.4f} {1 / len(ks):>11.4f}")
en_dusuk = min(sinif_duyarlilik, key=sinif_duyarlilik.get)
print(f"yayimlanan sayi ile en dusuk sinif arasindaki fark:"
      f" {kart['duyarlilik'] - sinif_duyarlilik[en_dusuk]:.4f} ({en_dusuk})")

# ---- Sistem karti: tasidigi olculer. Tasinmayan her olcu bir IDDIA olarak kalir.
DAR = {"durdurulan zararli payi", "yanlis engelleme payi"}
GENIS = DAR | {"sinif basina duyarlilik", "kume cozunurlugu", "insana giden kayit",
               "yanlis alarmin kapsanan payi"}
TAAHHUT = [
    ("kullanim siniri", "belirtilen sinifta kullanilmaz", "sinif basina duyarlilik"),
    ("kullanim siniri", "geri donulemez eylem onay ister", "insana giden kayit"),
    ("kullanim siniri", "sonucun tek dayanagi olmaz", "durdurulan zararli payi"),
    ("seffaflik kalemi", "yanlis engellenen kayit payi", "yanlis engelleme payi"),
    ("seffaflik kalemi", "olcumun cozunurlugu", "kume cozunurlugu"),
    ("seffaflik kalemi", "olcumun yapildigi kume", "kume kapsami"),
    ("kotuye kullanim plani", "itirazin kapsadigi pay", "yanlis alarmin kapsanan payi"),
    ("kotuye kullanim plani", "bozulmanin gorulme gecikmesi", "gosterge gecikmesi"),
    ("kotuye kullanim plani", "denenmemis sinif sayisi", "kapsanmayan sinif"),
]
ok = [k for k in KAYIT if onay_kapisi(k)]
print(f"\ngenis kartin ekledigi sayilar: insana giden kayit {len(ok)} , bunlarin"
      f" {sum(zararli(k) for k in ok)} tanesi zararli ; kume {len(KAYIT)} kayit ,"
      f" duyarlilik adimi {1 / 93:.4f} , yanlis engelleme adimi {1 / 147:.4f}")
print("\ntaahhut sinifi          taahhut                          dar kart  genis kart")
for tur, ne, olcu in TAAHHUT:
    print(f"{tur:<23} {ne:<32} {'sayi' if olcu in DAR else 'iddia':<9}"
          f" {'sayi' if olcu in GENIS else 'iddia'}")
for ad, kart_kume in (("dar", DAR), ("genis", GENIS)):
    var = sum(o in kart_kume for _, _, o in TAAHHUT)
    print(f"{ad} kart: {var}/{len(TAAHHUT)} taahhut sayiya bagli ,"
          f" {len(TAAHHUT) - var} iddia olarak kaliyor")
yayimlanan tek sayi: duyarlilik 0.7097 , ikinci kosumda 0.7419 (band 0.0322)
yanlis engelleme payi 0.0544 ve 0.0544

sinif                 kayit  20260218  20260219  cozunurluk
dolayli_yonerge          24    0.9583    0.9583      0.0417
gizli_alan_istegi        17    0.7059    0.7059      0.0588
yetki_asimi              10    0.8000    0.8000      0.1000
kaynak_taklidi           23    0.8261    0.8261      0.0435
bozulmus_girdi           19    0.2105    0.3684      0.0526
yayimlanan sayi ile en dusuk sinif arasindaki fark: 0.4992 (bozulmus_girdi)

genis kartin ekledigi sayilar: insana giden kayit 27 , bunlarin 24 tanesi zararli ; kume 240 kayit , duyarlilik adimi 0.0108 , yanlis engelleme adimi 0.0068

taahhut sinifi          taahhut                          dar kart  genis kart
kullanim siniri         belirtilen sinifta kullanilmaz   iddia     sayi
kullanim siniri         geri donulemez eylem onay ister  iddia     sayi
kullanim siniri         sonucun tek dayanagi olmaz       sayi      sayi
seffaflik kalemi        yanlis engellenen kayit payi     sayi      sayi
seffaflik kalemi        olcumun cozunurlugu              iddia     sayi
seffaflik kalemi        olcumun yapildigi kume           iddia     iddia
kotuye kullanim plani   itirazin kapsadigi pay           iddia     sayi
kotuye kullanim plani   bozulmanin gorulme gecikmesi     iddia     iddia
kotuye kullanim plani   denenmemis sinif sayisi          iddia     iddia
dar kart: 2/9 taahhut sayiya bagli , 7 iddia olarak kaliyor
genis kart: 6/9 taahhut sayiya bagli , 3 iddia olarak kaliyor

Kalan İddia

Yayımlanan tek sayı 0,7097’dir ve yanlıştır demek zordur — küme üzerinde doğrudur. Aynı savunma sınıf başına okunduğunda 0,9583 ile 0,2105 arasında dağılır; yayımlanan sayı ile en zayıf sınıf arasındaki fark 0,4992’dir. “Bu sistem şu sınıfta kullanılmaz” cümlesi bir kullanım sınırıdır ve onu doğrulayacak sayı ortalamanın içinde değil, ancak sınıf satırında bulunur. Dar kart o satırı taşımadığı için cümle bir iddia olarak kalır.

Sınıf satırı ikinci bir şeyi de açıyor. Yayımlanan sayının iki koşum bandı 0,7097 ile 0,7419, yani üç çözünürlük adımı — ve bandın tamamı en zayıf sınıftan gelir: bozulmuş girdi 0,2105 ile 0,3684 arasında oynarken öbür dört sınıfta fark sıfırdır.

Kartı genişletmek dokuz taahhütten dördünü daha sayıya bağlıyor: sınıf satırı, çözünürlük, insana giden 27 kayıt ve itirazın kapsadığı pay. Kalan üçü hiçbir kartla karşılanmıyor ve bu, kartın kusuru değil ölçümün durumudur. Ölçümün yapıldığı kümenin neyi temsil ettiği, o kümede yapılan hiçbir ölçümle gösterilemez. Bozulmanın görülme gecikmesi iki koşumda 45 ve 220 kayıt çıktı, yani bandı gecikmenin kendisinden geniş. Denenmemiş sınıf sayısı ise ancak denenmiş sınıflar sayılarak sınırlandırılır; raporda satırı olmayan sınıfın geçen payı sıfır değil bilinmezdir.

Kursun kuralının yayımlama tarafındaki karşılığı budur: yayımlanan sayının kapsadığı kümeyle birlikte yazılmadığı yerde, kapsamadığı her şey bir iddiadır.

Özet

  • Yayımlanan tek ortalama sayı 0,7097’dir; aynı savunma sınıf başına 0,9583 ile 0,2105 arasında dağılır ve fark 0,4992’dir.
  • Ortalamanın iki koşum bandı 0,0322’dir ve bandın tamamı en zayıf sınıftan gelir; öbür dört sınıfta fark sıfırdır.
  • Sınıfın çözünürlüğü kayıt sayısının tersidir: on kayıtlık sınıfta 0,1000, yani satır dört basamakla yazılsa da o kadar ince okunamaz.
  • Dokuz taahhütten dar kart 2’sini, geniş kart 6’sını bir sayıya bağlar; kalan 3’ünün ölçüsü yoktur, çünkü kümenin temsili kendi içinden ölçülemez, gösterge gecikmesinin bandı gecikmeden geniştir ve denenmemiş sınıfın payı bilinmezdir.

Kurs Kapanışı

Kurs boyunca ölçülen sayılar tek tabloda. İşaret düzeni tektir: + savunmalı kurulumun sayısının tabandan yüksek, düşük olduğunu gösterir ve iyi ya da kötü demez. Ortak birim taşımayan satırlarda hangi ölçütle okunduğu ders adının yanında yazılıdır.

Ders Savunmasız taban Savunmalı kurulum Bedel
yz-saldiri-yuzeyi/01 — duyarlılık süzgeçsiz 0,0000 kural süzgeci 0,7957 (+0,7957) yanlış alarm 0’dan 23’e
yz-saldiri-yuzeyi/02 — duyarlılık eşik 0,80: 0,4946 eşik 0,30: 0,9032 (+0,4086) yanlış engelleme 0,0068’den 0,1837’ye
yz-saldiri-yuzeyi/03 — durdurulan sızdırma isteği (35) süzgeçsiz 0 tam kural süzgeci 25 (+25) maskelemenin kattığı 0, kalıntı 1
yz-saldiri-yuzeyi/04 — insana giden zararlı kapısız 0 onay kapısı 24 (+24) 3 gereksiz inceleme, duyarlılık 0,2581
yz-saldiri-yuzeyi/05 — derlemdeki zararlı payı süzgeçsiz 0,3875 kural kapısı 0,1329 (−0,2546) 23 temiz kayıt kaybı
yz-saldiri-yuzeyi/06 — çıktıdaki gizli alan süzgeçsiz 106 dört adlık çıktı süzgeci 0 (−106) alan kaybeden temiz yanıt 41
yz-saldiri-yuzeyi/07 — bozulmuş girdide duyarlılık kural süzgeci 0,2632 bayrak eklenmiş kural 0,8421 (+0,5789) yanlış alarm 23’ten 30’a
yz-saldiri-yuzeyi/08 — savunmayı geçen pay dar kampanya 0,1000 93 denemelik kapsam 0,2043 (+0,1043) seçim bandı 0,0600, denenmeyen sınıf bilinmez
yz-savunma/01 — kesinlik kural süzgeci 0,7629 kural ile model üst üste 0,7551 (−0,0078) yanlış engelleme 0,1565’ten 0,1633’e, duyarlılık aynı
yz-savunma/02 — bozulmuş girdide duyarlılık kural süzgeci 0,2632 içerik denetimi 0,8421 (+0,5789) yanlış engelleme 0,1565’ten 0,2177’ye
yz-savunma/03 — temizlenen kayıt maskelemesiz 0 bayrak politikası 32 (+32) kırılan görev 23, 7’si temiz abonenin
yz-savunma/04 — durdurulan zararlı savunmasız 0 salt okuma 62 (+62) tamamlanan görev 1,0000’dan 0,6667’ye
yz-savunma/05 — etkisizleşen zararlı işaretlemesiz 0 işaretleme 42 (+42) yanlış alarm 0, yolunu yitiren temiz kayıt 1
yz-savunma/06 — yakalanan zararlı kapısız 0 dar kapı 24 (+24) 3 gereksiz kesinti; inceleme 0,20’de 4’e iner
yz-degerlendirme/01 — kesinlik (savunma sabit) temsili küme 0,7629 sınırda örnek kümesi 0,4444 (−0,3185) yanlış engelleme payı 0,7143
yz-degerlendirme/02 — insan etiketiyle uyum ölçüt temelli 0,8250 model hakem 0,8833 (+0,0583) 0 çağrıdan 246 çağrıya, 10779 belirteç
yz-degerlendirme/03 — değerlendiriciler arası uyum üç değerli ölçek 0,7583 örnekli yönerge 0,9306 (+0,1723) oybirliğinin doğruluğu 0,9126’dan 0,8744’e
yz-degerlendirme/04 — hakemin duyarlılığı biçim kısıtı yerinde 0,9570 kısıt kaldırılmış 0,7742 (−0,1828) çağrı 246’dan 330’a, okunamayan yanıt 0’dan 31’e; yanlış engelleme farkı tam 0,0000
yz-degerlendirme/05 — bozulmanın görülme gecikmesi göstergesiz bildirilmez vekil 20 kayıt sonra bildirir 300 kayıtta 32 inceleme; etiketli gösterge 45 ve 220
yz-degerlendirme/06 — yanlış alarmın kapsanan payı kanal kapalı 0,0000 dar itiraz kanalı 0,3750 (+0,3750) beş turda yanlış alarm 8’den 27’ye
yz-degerlendirme/07 — sayıya bağlı taahhüt (9) dar kart 2 geniş kart 6 (+4) 3 taahhüt iddia olarak kalıyor

Kursun kuralı tabloda satır satır yazılıdır: durdurduğu pay ile yanlışlıkla durdurduğu pay birlikte yazılmayan savunma ölçülmemiş sayılır. Bedel sütunu boş bırakılsa her satır bir başarı gibi okunurdu; okunmaması onu yazdığımız içindir.

İkinci iddia da aynı tablodan okunur: eklenen savunma işi kötüleştirebilir. Adıyla yazan satırlar şunlardır: yz-savunma/01 (katman yeni zararlı yakalamadan bir temiz kaydı fazladan engeller), yz-saldiri-yuzeyi/03 (maskelemenin tam kural süzgecine kattığı 0, bedeli dokuz silinen alan), /04 (kaynakla genişleyen kapı dokuz zararlı için kırk dört temiz inceleme alır, kesinlik 0,5586), /05 (kaynak kapısı ölçülemez bir 0,0054 için temiz kayıt kaybını 23’ten 66’ya çıkarır), yz-savunma/02 (dolaylı yönergede etiket dokuz temiz kayda düşer, savunma taban altında kalır), /03 (her kaydı maskeleyen politika 169 görev kırar), /04 (eklenen on sekiz kaydın yalnız dördü zararlı, yanlış engelleme 0,2517), /06 (kapıyı genişletmek yakalananı 24’ten 17’ye, kesintiyi 23’e taşır) ve yz-degerlendirme/06 (döngü yeni zararlı yakalamadan yanlış alarmı 3,4 katına çıkarır). Dokuz yerde eklenen katman, eklendiği için ödetti.

Çözünürlüğün altında kalan farklar da adıyla yazılır ve bulgu sayılmazlar: yz-saldiri-yuzeyi/02‘de eşik 0,30’daki bir kayıtlık fark, /03’te ikinci koşumda sıfıra inen kalıntı, /05‘te 0,0106’lık adımın altındaki 0,0054, /07’de sınıf içi 0,4737 ile 0,4211 farkı, yz-savunma/05’te tam bir adımlık 0,0068, /06‘da genişletilmiş kapıların 22, 22, 23 sayıları, yz-degerlendirme/02‘de 0,0068’lik yanlış engelleme farkı ile 0,0588’lik sınıf farkı, ve /05’te bandı gecikmesinden geniş çıkan gösterge. Hiçbiri sıfır, hiçbiri ölçülmüş değildir.

Bu kapanış aynı zamanda M28 Yapay Zekâ Mühendisliği müfredatının kapanışıdır. Yedi kursun ölçü ekseni tek bir cümlede toplanır: yüzey → istem → çağrı → erişim → döngü → sözleşme → savunma. Her kurs bir öncekinin bıraktığı yerden başladı ve eklediği katmanın bedelini yazdı. Müfredatın kuralı son kez: bir yapay zekâ sisteminin sayısı modelin sayısı değil düzeneğin sayısıdır; bedeli yazılmayan düzenek ölçülmemiş sayılır.

Yüz otuz iki derste düzenek modelin çevresine kuruldu ve her birinin bedeli yazıldı. Bir şey hiç sorulmadı: bu düzeneği besleyen veri hattının kendisi. Kayıt kümesi ders içinde üretildi, belge dağarcığı elle yazıldı, iz kaydı bellekte tutuldu. Bu verinin nereden geldiği, hangi hattan aktığı, üretimde nasıl çalışır tutulduğu ve hattın bir yerinde bozulduğunda kimin haberi olacağı sorulmadı. Sonraki müfredat, Veri Mühendisliği ve MLOps, düzeneğin altındaki bu hattı kurar ve onun da bedelini sayar.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat