init
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
build/
|
||||
44
build.sh
Executable file
44
build.sh
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Define ANSI Color Codes
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m' # No Color (Reset)
|
||||
|
||||
SOURCE="./src/mathe_2_merkblatt.typ"
|
||||
BUILD_DIR="./build"
|
||||
|
||||
# Check if Build Directory exists
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo -e "${BLUE}[INFO]${NC} Creating build directory: $BUILD_DIR"
|
||||
mkdir -p "$BUILD_DIR"
|
||||
fi
|
||||
|
||||
# Check if Source File exists
|
||||
if [ ! -f "$SOURCE" ]; then
|
||||
echo -e "${RED}[ERROR]${NC} Source file '$SOURCE' not found!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}Starting compilation...${NC}"
|
||||
|
||||
# Compile Dark Mode
|
||||
typst compile --input dark-mode=true "$SOURCE" "${BUILD_DIR}/mathe_2_merkblatt_dark.pdf"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN}[SUCCESS]${NC} Darkmode build: ${CYAN}${BUILD_DIR}/mathe_2_merkblatt_dark.pdf${NC}"
|
||||
else
|
||||
echo -e "${RED}[FAIL]${NC} Error compiling Darkmode target"
|
||||
fi
|
||||
|
||||
# Compile Light Mode
|
||||
typst compile --input dark-mode=false "$SOURCE" "${BUILD_DIR}/mathe_2_merkblatt_light.pdf"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN}[SUCCESS]${NC} Lightmode build: ${CYAN}${BUILD_DIR}/mathe_2_merkblatt_light.pdf${NC}"
|
||||
else
|
||||
echo -e "${RED}[FAIL]${NC} Error compiling Lightmode target"
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}Build process finished!${NC}"
|
||||
377
src/mathe_2_merkblatt.typ
Normal file
377
src/mathe_2_merkblatt.typ
Normal file
@@ -0,0 +1,377 @@
|
||||
// THEME SETUP
|
||||
#let dark-mode = sys.inputs.at("dark-mode", default: "true") == "true"
|
||||
|
||||
// Catppuccin Farben Definition
|
||||
#let palette = if dark-mode {
|
||||
(
|
||||
bg: rgb("#1e1e2e"),
|
||||
fg: rgb("#cdd6f4"),
|
||||
base: rgb("#181825"),
|
||||
blue: rgb("#89b4fa"),
|
||||
red: rgb("#f38ba8"),
|
||||
teal: rgb("#94e2d5"),
|
||||
subtext: rgb("#a6adc8"),
|
||||
surface: rgb("#313244"),
|
||||
line: rgb("#45475a")
|
||||
)
|
||||
} else {
|
||||
(
|
||||
bg: rgb("#FFFFFF"),
|
||||
fg: rgb("#232634"),
|
||||
base: rgb("#303446"),
|
||||
blue: rgb("#8caaee"),
|
||||
red: rgb("#e78284"),
|
||||
teal: rgb("#81c8be"),
|
||||
subtext: rgb("#b5bfe2"),
|
||||
surface: rgb("#414559"),
|
||||
line: rgb("#bcc0cc")
|
||||
)
|
||||
}
|
||||
|
||||
// SETUP & DESIGN
|
||||
#set page(
|
||||
paper: "a4",
|
||||
flipped: true,
|
||||
margin: (top: 1cm, left: 1cm, right: 1cm, bottom: 1.5cm),
|
||||
fill: palette.bg,
|
||||
footer: [
|
||||
#set text(fill: palette.fg, size: 7pt)
|
||||
#block(width: 100%, inset: (top: 0.5em))[
|
||||
#line(length: 100%, stroke: 0.5pt + palette.line)
|
||||
#v(0.2em)
|
||||
#grid(
|
||||
columns: (1fr, 2fr, 1fr),
|
||||
align: (left, center, right),
|
||||
|
||||
[Nils Pukropp],
|
||||
|
||||
[
|
||||
#link("mailto:nils@narl.io") #h(1em) | #h(1em)
|
||||
#link("https://git.narl.io/nvrl/Mathe-II-f-r-Informatiker-Merkblatt")[#underline[https://git.narl.io/nvrl/Mathe-II-f-r-Informatiker-Merkblatt]]
|
||||
],
|
||||
[Stand: WS2026]
|
||||
)
|
||||
]
|
||||
],
|
||||
footer-descent: 0.3cm
|
||||
)
|
||||
|
||||
#set text(
|
||||
font: "FiraCode Nerd Font",
|
||||
size: 7pt,
|
||||
lang: "de",
|
||||
fill: palette.fg
|
||||
)
|
||||
|
||||
// Spalten-Layout
|
||||
#show: columns.with(3, gutter: 1.5em)
|
||||
|
||||
#set heading(numbering: none)
|
||||
|
||||
#show heading.where(level: 1): it => block(
|
||||
width: 100%,
|
||||
above: 1.5em,
|
||||
below: 0.8em,
|
||||
fill: palette.blue,
|
||||
inset: (x: 4pt, y: 3pt),
|
||||
radius: 2pt,
|
||||
text(fill: palette.bg, weight: "bold", 10pt, upper(it.body))
|
||||
)
|
||||
|
||||
#show heading.where(level: 2): it => block(
|
||||
width: 100%,
|
||||
above: 1.2em,
|
||||
below: 0.6em,
|
||||
sticky: true,
|
||||
{
|
||||
text(fill: palette.red, weight: "bold", it.body)
|
||||
v(0.1em)
|
||||
line(length: 100%, stroke: 0.5pt + palette.line)
|
||||
}
|
||||
)
|
||||
|
||||
// HILFSFUNKTIONEN
|
||||
|
||||
#let defbox(title, body) = block(
|
||||
width: 100%,
|
||||
fill: palette.teal.lighten(if dark-mode { 60% } else { 90% }),
|
||||
stroke: (left: 2pt + palette.teal),
|
||||
inset: 5pt,
|
||||
radius: (right: 2pt),
|
||||
above: 1em,
|
||||
below: 1em,
|
||||
breakable: false,
|
||||
[#text(fill: if dark-mode { palette.bg } else { palette.fg })[#strong(title): #body]]
|
||||
)
|
||||
|
||||
#let alertbox(body) = block(
|
||||
width: 100%,
|
||||
fill: palette.surface.lighten(if dark-mode { 10% } else { 50% }),
|
||||
stroke: 0.5pt + palette.line,
|
||||
inset: 5pt,
|
||||
radius: 3pt,
|
||||
above: 1em,
|
||||
below: 1em,
|
||||
breakable: false,
|
||||
[#text(fill: palette.fg)[#body]]
|
||||
)
|
||||
|
||||
// Operatoren & Symbole
|
||||
#let rang = math.op("Rang")
|
||||
#let ker = math.op("Kern")
|
||||
#let bild = math.op("Bild")
|
||||
#let span = math.op("span")
|
||||
#let dim = math.op("dim")
|
||||
#let spur = math.op("Spur")
|
||||
#let id = math.bb("1")
|
||||
#let grad = math.op("grad")
|
||||
#let div = math.op("div")
|
||||
#let rot = math.op("rot")
|
||||
#let Hess = math.op("Hess")
|
||||
#let ggT = math.op("ggT")
|
||||
|
||||
// Zahlbereiche
|
||||
#let RR = math.bb("R")
|
||||
#let ZZ = math.bb("Z")
|
||||
#let NN = math.bb("N")
|
||||
#let QQ = math.bb("Q")
|
||||
#let CC = math.bb("C")
|
||||
#let FF = math.bb("F")
|
||||
|
||||
// CONTENT
|
||||
|
||||
= Analysis (Mehrdimensional)
|
||||
|
||||
#defbox[Gradient & Hesse-Matrix][
|
||||
Für $f: RR^n -> RR$:
|
||||
- *Gradient:* $nabla f(x) = (partial_1 f, ..., partial_n f)^T$
|
||||
- *Hesse-Matrix:* $H_f (x) = ( (partial^2 f) / (partial x_i partial x_j) )_(i,j)$
|
||||
(Symmetrisch nach Satz von Schwarz)
|
||||
]
|
||||
|
||||
== Stationäre Punkte & Extrema
|
||||
1. *Notwendig:* Berechne $nabla f(x) = 0$. Löse LGS.
|
||||
2. *Hinreichend:* Prüfe Definitheit von $H_f(x_0)$.
|
||||
|
||||
#alertbox[
|
||||
*Definitheit der Hesse-Matrix $H_f(x_0)$*:
|
||||
- *Positiv definit* ($>0$): *Lokales Minimum*
|
||||
- *Negativ definit* ($<0$): *Lokales Maximum*
|
||||
- *Indefinit:* *Sattelpunkt*
|
||||
]
|
||||
|
||||
== Hurwitz-Kriterium (Definitheit)
|
||||
Für symmetrische Matrix $A in RR^(n times n)$. Betrachte Hauptminoren $D_k$ (Det. der oberen linken $k times k$ Untermatrix).
|
||||
- *Pos. Def.:* Alle $D_k > 0$ ($D_1 > 0, D_2 > 0, ...$)
|
||||
- *Neg. Def.:* Vorzeichenwechsel beginnend mit Minus ($- + - + ...$), d.h. $D_1 < 0, D_2 > 0, D_3 < 0 ...$
|
||||
- *Indefinit:* $det(A) != 0$, aber kein Muster oben passt.
|
||||
- *Semidefinit:* Wenn $det(A)=0$ (Eigenwerte prüfen!).
|
||||
*Spezialfall $2 times 2$:* $H_f = mat(f_(x x), f_(x y); f_(y x), f_(y y))$
|
||||
- $det(H) > 0$ und $f_(x x) > 0 =>$ Minimum.
|
||||
- $det(H) > 0$ und $f_(x x) < 0 =>$ Maximum.
|
||||
- $det(H) < 0 =>$ Sattelpunkt.
|
||||
|
||||
== Richtungsableitung
|
||||
Ableitung in Punkt $x$ in Richtung $v$ ($v$ muss normiert sein! $||v||=1$):
|
||||
$ (partial f) / (partial v) (x) = nabla f(x) dot v / ||v|| $
|
||||
|
||||
== Konvexität
|
||||
- $f$ konvex $<=> H_f(x)$ positiv (semi-)definit für alle $x$.
|
||||
- $f$ konkav $<=> H_f(x)$ negativ (semi-)definit für alle $x$.
|
||||
- $S$ konvex: Verbindungslinie zweier Punkte liegt in $S$.
|
||||
|
||||
#colbreak()
|
||||
|
||||
= Zahlentheorie
|
||||
|
||||
== Modulo-Rechnung
|
||||
$\ZZ_n = \{0, ..., n-1\}$. Rechnen mit Rest.
|
||||
- *Einheiten* $\ZZ_n^*$: Elemente $a in \ZZ_n$ mit $ggT(a, n) = 1$.
|
||||
- *Euler $phi(n)$*: Anzahl der Einheiten.
|
||||
- $p$ prim: $phi(p) = p-1$.
|
||||
- $n = p dot q$: $phi(n) = (p-1)(q-1)$.
|
||||
- $n = p^k$: $phi(p^k) = p^k - p^(k-1)$.
|
||||
|
||||
== Wichtige Sätze
|
||||
#alertbox[
|
||||
*Kleiner Fermat:* $p$ prim, $a$ kein Vielfaches:
|
||||
$ a^(p-1) equiv 1 mod p $
|
||||
*Satz von Euler:* $ggT(a, n) = 1$:
|
||||
$ a^phi(n) equiv 1 mod n $
|
||||
]
|
||||
- *Anwendung (Inverse):* In $\ZZ_n$ ist $a^(-1) = a^(phi(n)-1) mod n$.
|
||||
- *Schnelle Exponentiation:*
|
||||
Berechne $b^e mod m$.
|
||||
1. Exponent $e$ binär schreiben.
|
||||
2. Quadrieren und bei 1 multiplizieren (Square & Multiply).
|
||||
3. Oder: $e$ reduzieren modulo $phi(m)$ (falls Basis $b$ teilerfremd zu $m$!).
|
||||
|
||||
== Euklidischer Algorithmus (ggT)
|
||||
Zur Berechnung von $ggT(a, b)$ und $s, t$ mit $ggT(a,b) = s dot a + t dot b$.
|
||||
Beispiel $ggT(12, 7)$:
|
||||
$12 = 1 dot 7 + 5 => 5 = 12 - 1 dot 7$
|
||||
$7 = 1 dot 5 + 2 => 2 = 7 - 1 dot 5 = 7 - (12-7) = 2 dot 7 - 1 dot 12$
|
||||
$5 = 2 dot 2 + 1 => 1 = 5 - 2 dot 2 = (12-7) - 2(2 dot 7 - 12) = 3 dot 12 - 5 dot 7$
|
||||
$=> 1 = 3 dot 12 + (-5) dot 7$. Inverse von 7 mod 12 ist -5 (=7).
|
||||
|
||||
== Chinesischer Restsatz (CRT)
|
||||
Löse System: $x equiv a_i mod m_i$ (moduli $m_i$ paarweise teilerfremd).
|
||||
$M = product m_i, quad M_i = M / m_i$.
|
||||
Löse $M_i y_i equiv 1 mod m_i$ (Inverse von $M_i$).
|
||||
Lösung: $x = sum_(i) a_i M_i y_i mod M$.
|
||||
|
||||
#colbreak()
|
||||
|
||||
= Lineare Algebra: Matrizen
|
||||
|
||||
== Matrizen & LGS
|
||||
$A in K^(m times n)$. LGS $A x = b$.
|
||||
*Gauß-Verfahren:* Auf Zeilenstufenform bringen.
|
||||
- Rang $r$: Anzahl der Stufen (Nicht-Null-Zeilen).
|
||||
- $r = n$: Eindeutige Lsg. (bei hom. nur 0).
|
||||
- $r < n$: Unendlich viele Lsg. ($n-r$ Parameter frei).
|
||||
- $r < m$: Lösbar nur wenn Nullzeilen rechts 0 sind.
|
||||
|
||||
== Determinante (nur $n times n$)
|
||||
- $det(A) != 0 <=> A$ invertierbar $<=> rang(A)=n$.
|
||||
- $2 times 2$: $det mat(a, b; c, d) = a d - b c$.
|
||||
- $3 times 3$: Sarrus (Jägerzaun).
|
||||
- $n times n$: Laplace (Entwicklung nach Zeile/Spalte mit vielen 0).
|
||||
- Regeln: $det(A B) = det A det B$, $det(A^T) = det A$.
|
||||
- $det(lambda A) = lambda^n det A$.
|
||||
|
||||
== Inverse Matrix
|
||||
$A^(-1)$ existiert nur wenn $det A != 0$.
|
||||
- $2 times 2$: $A^(-1) = 1/(det A) mat(d, -b; -c, a)$.
|
||||
- Allgemein: Gauß $(A | I_n) -> (I_n | A^(-1))$.
|
||||
|
||||
= Lineare Abbildungen
|
||||
|
||||
$phi: V -> W$ linear ($phi(v+w)=phi(v)+phi(w), phi(c v)=c phi(v)$).
|
||||
- *Bild:* Spaltenraum der Matrix $A$. $dim(bild) = rang(A)$.
|
||||
- *Kern:* Lösungsraum von $A x = 0$.
|
||||
#alertbox[
|
||||
*Dimensionssatz:*
|
||||
$ dim(V) = dim(ker(phi)) + dim(bild(phi)) $
|
||||
$ n = "Anzahl freie Parameter" + rang(A) $
|
||||
]
|
||||
- *Injektiv:* $ker(phi) = \{0\}$.
|
||||
- *Surjektiv:* $bild(phi) = W$ (Rang = Zeilenzahl).
|
||||
- *Bijektiv:* $n=m$ und Determinante $!= 0$.
|
||||
|
||||
== Abbildungsmatrix
|
||||
$M_B^C(phi)$: Matrix bzgl. Basis $B$ (Start) und $C$ (Ziel).
|
||||
Spalten sind Bilder der Basisvektoren von $B$, dargestellt in $C$.
|
||||
$ "Spalte" j = phi(b_j)_C $
|
||||
*Basiswechsel:* $M_B^C(id)$ transformiert von $B$ nach $C$.
|
||||
$A' = T^(-1) A T$ (wenn $T$ Transformationsmatrix).
|
||||
|
||||
#colbreak()
|
||||
|
||||
= Eigenwerte (EW) & Diagonalisierung
|
||||
|
||||
1. *Charakteristisches Polynom:* $P_A(lambda) = det(A - lambda I) = 0$.
|
||||
2. Nullstellen sind EW $lambda_i$.
|
||||
- *Alg. Vielfachheit:* Potenz im Polynom.
|
||||
- *Geom. Vielfachheit:* $dim(ker(A - lambda_i I)) = n - rang(A - lambda_i I)$.
|
||||
3. *Eigenraum:* $E_lambda = ker(A - lambda I)$ (LGS lösen).
|
||||
|
||||
#alertbox[
|
||||
*Diagonalisierbar gdw:*
|
||||
1. $P_A$ zerfällt komplett in Linearfaktoren.
|
||||
2. Für jeden EW gilt: *Alg. VFH = Geom. VFH*.
|
||||
Symmetrische Matrizen sind *immer* diagonalisierbar!
|
||||
]
|
||||
Matrix $D = S^(-1) A S$ (Diagonalmatrix mit EW).
|
||||
$S$: Spalten sind die Eigenvektoren.
|
||||
|
||||
== Spektralsatz (Symmetrische Matrizen)
|
||||
Ist $A = A^T$, dann:
|
||||
- Alle EW sind reell.
|
||||
- $A$ ist orthogonal diagonalisierbar: $D = Q^T A Q$ mit $Q^T = Q^(-1)$.
|
||||
- Eigenvektoren zu versch. EW sind *orthogonal*.
|
||||
|
||||
= Euklidische Vektorräume
|
||||
|
||||
== Skalarprodukt & Norm
|
||||
Standard $\RR^n$: $chevron.l u, v chevron.r = u^T v = sum u_i v_i$.
|
||||
- Norm: $||u|| = sqrt(chevron.l u\, u chevron.r)$.
|
||||
- Winkel: $cos alpha = chevron.l u, v chevron.r / (||u|| dot ||v||)$.
|
||||
- Orthogonal: $chevron.l u, v chevron.r = 0$.
|
||||
|
||||
== Gram-Schmidt (ONB)
|
||||
Aus Basis $v_1, ..., v_n$ mache Orthonormalbasis $b_1, ..., b_n$.
|
||||
1. $u_1 = v_1$, dann $b_1 = u_1 / ||u_1||$.
|
||||
2. $u_2 = v_2 - chevron.l v_2, b_1 chevron.r b_1$, dann $b_2 = u_2 / ||u_2||$.
|
||||
3. $u_k = v_k - sum_(j=1)^(k-1) chevron.l v_k, b_j chevron.r b_j$.
|
||||
4. $b_k = u_k / ||u_k||$.
|
||||
|
||||
== Orthogonale Matrizen $Q$
|
||||
$Q^T Q = I$ ($Q^(-1) = Q^T$). Spalten bilden ONB.
|
||||
Längentreu ($||Q x|| = ||x||$) und winkeltreu.
|
||||
Determinante ist $\pm 1$.
|
||||
*Drehmatrix (2D):* $mat(cos alpha, -sin alpha; sin alpha, cos alpha)$.
|
||||
*Drehmatrix (3D):* Drehung um Achse $a$. Ein EW ist 1 (Achse). Spur ist $1 + 2 cos(alpha)$.
|
||||
|
||||
#colbreak()
|
||||
|
||||
= Kodierungstheorie
|
||||
|
||||
Lineare Codes $C subset RR^n$ (meist $\FF_2, \FF_3, \FF_5$).
|
||||
Parameter $[n, k, d]$: Länge $n$, Dimension $k$, Minimaldistanz $d$.
|
||||
|
||||
== Erzeugermatrix $G$ ($k times n$)
|
||||
Zeilen bilden Basis von $C$. $G$ in Stufenform bringen um Dimension zu sehen.
|
||||
Standardform: $G = (I_k | A)$.
|
||||
Codierung: $x -> x G$.
|
||||
|
||||
== Prüfmatrix $H$ ($(n-k) times n$)
|
||||
Es gilt: $G H^T = 0$.
|
||||
Wenn $G = (I_k | A)$, dann $H = (-A^T | I_(n-k))$.
|
||||
(Im Binären ist $-A = A$, also $H = (A^T | I_(n-k))$).
|
||||
Code ist Kern von $H$: $c in C <=> H c^T = 0$.
|
||||
|
||||
== Minimaldistanz & Fehler
|
||||
- *Hamming-Gewicht* $w(x)$: Anzahl Einträge $!= 0$.
|
||||
- *Minimaldistanz* $d_(min) = min \{w(c) | c in C, c != 0\}$.
|
||||
- $d_(min)$ ist auch das minimale Gewicht der Spalten von $H$, die linear abhängig sind (oft die kleinste Anzahl linear abh. Spalten).
|
||||
#alertbox[
|
||||
*Erkennung:* $d-1$ Fehler erkennbar.
|
||||
*Korrektur:* $e = floor((d-1)/2)$ Fehler korrigierbar.
|
||||
($d=3 => 1$ Fehler, $d=5 => 2$ Fehler)
|
||||
]
|
||||
|
||||
== Dekodierung (Syndrom)
|
||||
Empfangenes Wort $r = c + e$ (Code + Fehler).
|
||||
1. Berechne *Syndrom* $S = H r^T$.
|
||||
2. Wenn $S = 0 =>$ kein Fehler.
|
||||
3. Wenn $S != 0$: Suche Spalte in $H$, die Vielfaches von $S$ ist.
|
||||
- Position der Spalte = Position des Fehlers.
|
||||
- Wert des Fehlers aus Faktor bestimmen.
|
||||
|
||||
#colbreak()
|
||||
|
||||
= Algebraische Strukturen
|
||||
|
||||
#defbox[Gruppen $(G, dot)$][
|
||||
Assoziativ, Neutrales $e$, Inverses $a^(-1)$.
|
||||
- *Abelsch:* + Kommutativ.
|
||||
- *Zyklisch:* Ein Erzeuger $g$ generiert ganze Gruppe ($g^k$). $\ZZ_n$ ist zyklisch (Erzeuger 1).
|
||||
- *Ordnung:* $|G|$ Anzahl Elemente. Satz von Lagrange: $|U|$ teilt $|G|$.
|
||||
]
|
||||
*Untergruppen:* Teilmenge, abgeschlossen bzgl. Op. und Inverse.
|
||||
*Isomorphie:* $\ZZ_(n m) tilde.eq \ZZ_n times \ZZ_m$ gdw. $ggT(n,m)=1$.
|
||||
|
||||
#defbox[Körper $(K, +, dot)$][
|
||||
$(K, +)$ abelsche Grp, $(K without \{0\}, dot)$ abelsche Grp, Distributiv.
|
||||
Beispiele: $\RR, \QQ, \CC, \ZZ_p$ ($p$ prim).
|
||||
$\ZZ_n$ ist kein Körper wenn $n$ nicht prim (Nullteiler!).
|
||||
]
|
||||
*Polynomring $K[x]$:* Division mit Rest möglich.
|
||||
|
||||
= Diverses & Tipps
|
||||
- *LGS lösen:* Immer Gauß. Nie Cramer (zu langsam).
|
||||
- *Komplexe Zahlen:* $i^2 = -1$. $z = a+b i$. $overline{z} = a-b i$. $|z|^2 = z overline{z} = a^2+b^2$. Polarkoordinaten $r e^(i phi)$.
|
||||
- *Nilpotent:* $A^k = 0$. Einziger EW ist 0. Spur ist 0. Nicht invertierbar.
|
||||
- *Äquivalenzrelation:* Reflexiv ($x tilde x$), Symmetrisch ($x tilde y => y tilde x$), Transitiv ($x tilde y, y tilde z => x tilde z$). Äquivalenzklassen bilden Partition.
|
||||
- *Injektiv:* Kern = $\{0\}$. *Surjektiv:* Bild = Zielraum.
|
||||
Reference in New Issue
Block a user