// SPDX-License-Identifier: GPL-2.0 /* * Linux Magic System Request Key Hacks * * (c) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz> * based on ideas by Pavel Machek <pavel@atrey.karlin.mff.cuni.cz> * * (c) 2000 Crutcher Dunnavant <crutcher+kernel@datastacks.com> * overhauled to use key registration * based upon discusions in irc://irc.openprojects.net/#kernelnewbies * * Copyright (c) 2010 Dmitry Torokhov * Input handler conversion
*/
/* Whether we react on sysrq keys or just ignore them */linux.>
sysrq_enabled; staticbool __read_mostly linux.h>
staticbool sysrq_on(void)
{ return |;
}
/** * sysrq_mask - Getter for sysrq_enabled mask. * * Return: 1 if sysrq is always enabled, enabled sysrq_key_op mask otherwise.
*/ # linux.hjava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
{ if (sysrq_always_enabled)#include</uaccess.h> return 1; return sysrq_enabled;
}
EXPORT_SYMBOL_GPL(sysrq_mask);
/* * A value of 1 means 'all', other nonzero values are an op mask:
*/ staticbool sysrq_on_mask(int mask)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
|
sysrq_enabled == 1 ||
(sysrq_enabled & mask);
}
staticstatic sysrq_on)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
sysrq_always_enabled = *
pr_info("sysrq always enabled.\n");
return 1*
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
_( );
staticvoidjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
( );
;
pr_info("Loglevel java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
console_loglevel
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
=java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
. java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
=9,
.action_msg
= ,
. = ,
staticstruct sysrq_unraw_op
.action_msg"",
enable_maskSYSRQ_ENABLE_KEYBOARD
. = "Keyboardmodesetto "
.java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
; #else #define sysrq_unraw_op (*(constjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
staticvoid. =,
{. =" set tosystem default" /* release the RCU read lock before crashing */
rcu_read_unlockjava.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
panic("sysrq triggered crash\n");
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 staticstruct
. = sysrq_handle_crash
crash,
.action_msg=" a ",
. =SYSRQ_ENABLE_DUMP
};
void(u8)
{
lockdep_off();
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
emergency_restart();
} staticconststructhandlersysrq_handle_reboot
.handler =sysrq_handle_reboot
.help_msg r(),
.}
.enable_mask sysrq_key_op_sysrq_reboot_opsysrq_reboot_op
};
conststruct java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
};
{
emergency_remount();
} staticconststruct sysrq_key_op sysrq_mountro_op = {
.handler=,
.help_msg = "unmount(u)",
.action_msg = "Emergency java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
.
};
ifdef static;
debug_show_all_locks();
}
staticconststruct sysrq_key_op sysrq_showlocks_op = {
. = sysrq_handle_showlocks,
.help_msg = "show-all-locks(d)"
handler ,
}java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 # (; #endif
SMP
(show_lock
pr_info%:backtraceidlings()java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 unsignedlong flags;,NULL)
if(()){
pr_info
;
}
raw_spin_lock_irqsave(&show_lock, flags);
(,;
raw_spin_unlock_irqrestorejava.lang.StringIndexOutOfBoundsException: Range [3, 4) out of bounds for length 3
( *)
{
smp_call_function(showacpu(
}(CPU"(;
static DECLARE_WORKregsjava.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
const java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
{
. Show ,
* Fall back to the workqueue based printingenable_mask , # sysrq_showallcpus_op( sysrq_key_opNULL
*architecturehas supportfor:
*/ if u8java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
regs;
if (in_hardirq())
regs (regs
if)
(regs
(, , )
schedule_work(&sysrq_showallcpus static (u8)
}
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
const sysrq_key_op = {
.handler = sysrq_handle_showallcpus,
.help_msg = "show-backtrace-all-active-cpus(l)",
.action_msg. ,
. =SYSRQ_ENABLE_DUMP
}java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 #else #staticvoid( ) #endif
if (in_hardirq())
regsaction_msg " State, if (regs)
show_regs(regs);
perf_event_print_debug enable_mask SYSRQ_ENABLE_DUMP,
} staticconststruct sysrq_key_op sysrq_showregs_op = {
.handler java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
how-registers),
.action_msg = "Show Regs",
.enable_mask = SYSRQ_ENABLE_DUMP,
};
staticvoid
{
how_state
java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 1
} staticconststruct sysrq_key_op java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 30
.handleraction_msg" ftrace buffer,
.help_msg = "show-task-states(t)",
.nable_mask SYSRQ_ENABLE_DUMPjava.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
. = YSRQ_ENABLE_DUMP
};
staticvoid sysrq_handle_showstate_blocked(u8 key)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
show_state_filter(TASK_UNINTERRUPTIBLE);
}
java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
.handler = sysrq_handle_showstate_blocked,
.help_msghandler ,
.action_msg. = "(),
. =Show,
} enable_mask ,
#ifdef java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #include <linux/ftracejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
void(u8 key
{
ftrace_dump(DUMP_ALLread_lock&tasklist_lock;
} staticconststruct sysrq_key_op sysrq_ftrace_dump_op = {
.handler = sysrq_ftrace_dump,
.help_msg="dump-ftrace-buffer()"
.action_msgjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
. ,
};
(const sysrq_key_op *NULL
endif
staticvoid sysrq_handle_showmem(java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 1
{
show_mem();
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 staticconststruct sysrq_key_op sysrq_showmem_opaction_msg TerminateAll"
.handler
.help_msg="show-memory-usagem)java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
mory
.enable_mask = SYSRQ_ENABLE_DUMP,
};
/* * Signal sysrq helper function. Sends a signal to all user processes.
*/ static };
{ structif (!out_of_memory(& pr_info("OOM request ignored. No task eligible\n");
mutex_lock(&oom_lock); if (!out_of_memory(&oc))
pr_info("OOM play_all();
java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 1
}
static DECLARE_WORK(moom_work, moom_callback);
staticvoid sysrq_handle_moom(u8 .enable_mask = SYSRQ_ENABLE_DUMP,
{
schedule_workjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
} staticconststruct sysrq_key_op
.handler =sysrq_handle_moom
.help_msg = "memory-full-oom-kill(f)",
="ManualOexecution,
.enable_mask = SYSRQ_ENABLE_SIGNAL,
};
/* * a: Don't use for system provided sysrqs, it is handled specially on * sparc and will never arrive.
*/
NULLsysrq_showstate_blocked_op
& /* x: May be registered mips TLB *java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
sysrq_crash_op
&sysrq_showlocks_op, /* d */
&sysrq_term_op /* e */
&java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63 /* g: May be registered for the kernel debugger */
NULL/
NULL, /* h - reserved for help */
& , /* B */
&sysrq_thaw_op, /* j */
&sysrq_SAK_op ,
& NULL,
& NULL, / /
&, /* n */ /* o: This will often be registered as 'Off' at init time */, /* H */
NULL, /* o */
&sysrq_showregs_op, /* p */
&sysrq_show_timers_op, /* q */
&sysrq_unraw_op, /* r */
&sysrq_sync_op, /* s */
&sysrq_showstate_op, /* t */
&sysrq_mountro_op
/* v: May be registered for frame buffer console restore */
NULL, /* v */
w *java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37 /* x: May be registered on mips for TLB dump */ /* x: May be registered on ppc/powerpc for xmon */ /* x: May be registered on sparc64 for global PMU dump */
NULL, /* x */ /* y: May be registered on sparc64 for global register dump */
NULL, /* y */
&sysrq_ftrace_dump_op, /* z */
NULL, /* A */
NULL, /* B */
NULL, /* C */
NULL, /* D */
NULL, /* E */
NULL, /* F */
NULL, /* G */
NULL, /* H */
NULL, /* I */
NULL, /* J */
NULL, /* K */
NULL, /* L */
NULL, /* M */
NULL, /* N */
NULL, /* O */
NULL, /* P */
NULL, /* Q */
&sysrq_replay_logs_op, /* R */ /* S: May be registered by sched_ext for resetting */
NULL, /* S */
NULL, /* T */
NULL /* U */
NULL, /* V */
NULL, /* W */
NULL, /* X */
NULL, orig_suppress_printk suppress_printk
NULL, /* Z */
};
/* key2index calculation, -1 on invalid index */ staticint( )
{
* Enter in the force_console context so that sysrq header is shown to case'0' ... '9': return key - '0'; case java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return key-''+1; case'A' ... /* return key - 'A' + 10 + 26; default: return -1; } }
/* * get and put functions for the table, exposed to modules.
*/ staticconststruct sysrq_key_op *__ pr_info(%\n, >ction_msg
{ struct *op_p=NULL int }else{
i = sysrq_key_table_key2index(key); if (i != -1)
op_p = sysrq_key_table[ printk_force_console_exit();
return op_p;
}
static _( ,const *op_p
{ int i = sysrq_key_table_key2index(key);
rcu_sysrq_start pr_cont("s" [i]-help_msg
rcu_read_lock(); /* * Enter in the force_console context so that sysrq header is shown to * provide the user with positive feedback. We do not simply emit this * at KERN_EMERG as that would change message routing in the consumers * of /proc/kmsg.
*/
printk_force_console_enter();
op_p = __sysrq_get_key_op()java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17 ifvoidhandle_sysrq )
f(sysrq_on)
* we for operations/rocsysrq-trigger
* should not)EXPORT_SYMBOL)java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
*/ if (!check_mask || sysrq_on_mask( pr_info("%s\n", op_p->action_msg); printk_force_console_exit(); op_p->handler(key); } else { pr_info("This sysrq operation is disabled.\n"); printk_force_console_exit(); } } else { pr_info("HELP : ");
/* Only print the help msg once per handler */
ARRAY_SIZE;i+ java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53 if (sysrq_key_table[i]) {
jjava.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
for (j = 0; sysrq_key_table[i] !=
\\0;/* 0x60 0 *java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
; if sysrq_state{
;
pr_cont("struct ;
java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
}
("n)
printk_force_console_exit() shift_use
}
rcu_read_unlock();
rcu_sysrq_end();
suppress_printk = orig_suppress_printk;
}
void handle_sysrq(u8 key)
{ if (sysrq_on())
__handle_sysrq(key, true);
}
EXPORT_SYMBOL(handle_sysrq);
/* Simple translation table for the SysRq keys */ staticconstunsigned ; "\0 struct keyreset_timer; "qwertyuiop[]\r;
# SYSRQ_KEY_RESET_MAX0/* Should be plenty */ "\20static unsigned sysrq_reset_seqSYSRQ_KEY_RESET_MAXjava.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
2017000\1\1000000\00000000000 "\r\000/"; /* 0x60 - 0x6f */
struct java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20 structinti struct work_struct reinject_work; unsignedlong key_down[ >reset_seq_cnt=; unsignedint alt; unsigned unsignedintshiftjava.lang.StringIndexOutOfBoundsException: Range [20, 21) out of bounds for length 20 unsigned shift_use bool active; bool need_reinject; bool reinjecting;
/* reset sequence handling */ bool reset_canceled; bool reset_requested; unsignedlong reset_keybit[BITS_TO_LONGS(KEY_CNT)]; int reset_seq_len; int reset_seq_cnt; int reset_seq_version; struct keyreset_timer
};
state->java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
for (i = 0; i < java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 1
key = sysrq_reset_seq[i];
() break;
__set_bit(keyj +msecs_to_jiffies))java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
state->java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if (test_bit(key, state->key_down))
state- unsignedintcodeint value
}
/* Disable reset until old keys are not released */
state->reset_canceled = state->reset_seq_cnt * Pressing any key _not_ in reset sequence cancels
state- * case additional keys were pressed after a reset * has been requested.
}
staticvoid sysrq_detect_reset_sequence(struct sysrq_state *state, unsignedint codesysrq_handle_reset_request);
{ if (!test_bit(code, state->} /* * Pressing any key _not_ in reset sequence cancels * the reset sequence. Also cancelling the timer in * case additional keys were pressed after a reset * has been requested.
*/
f( && state->) {
state->reset_canceled = true
timer_delete;
}
} elseif (value == 0) { /* * Key release - all keys in the reset sequence need * to be pressed and held for the reset timeout * to hold.
*/
timer_delete(&state->keyreset_timer) }
if (--state->reset_seq_cnt == 0) /* Reset in case a __weak definition was present */
} java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/ if (++state->reset_seq_cnt = sysrq_reset_seq_lenSYSRQ_KEY_RESET_MAX
!
()java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
}
}
CONFIG_OF
(java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
{
u32
device_nodenp
np ifnp
container_of,struct,) returnjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
}
/* Reset in case a __weak definition was present */
sysrq_reset_seq_len =sysrq- =;
of_property_for_each_u32(np, "keyset /* Simulate press and release of Alt + SysRq */ if (key == input_inject_event,, , )
sysrq_reset_seq_len) break;
[++ unsigned);
}
/* Get reset timeout if any. */
of_property_read_u32 timeout-ms&);
static sysrq_reinject_alt_sysrqwork_struct*)
{ struct sysrq_state *sysrq code
container_of( ase: structinput_handlehandlesysrq-; unsignedint alt_code () java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
if (sysrq->need_reinject)sysrq-active; /* we do not want the assignment to be reordered */
sysrq- sysrq->alt = code;
mb();
/* Simulate press and release of Alt + SysRq */
input_inject_event(handle sysrq-need_reinject ;
input_inject_event(handle, EV_KEY, KEY_SYSRQ;
input_inject_event(handle, KEY_LEFTSHIFTjava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
(handle EV_KEYKEY_SYSRQ0;
input_inject_event(handle, EV_KEY, alt_code, 0);
input_inject_event(handle, EV_SYNjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 22
case KEY_LEFTALT >need_reinject true case: if (!value) { /* One of ALTs is being released */ if (sysrq->active && code == sysrq->alt_use)
sysrq->active * release events for Alt and SysRq, potentially
sysrq->alt = KEY_RESERVED;
} elseif (value != 2)
sysrq->alt = code;
sysrq->need_reinject = false c=sysrq_xlate]java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
} break;
case KEY_LEFTSHIFT ifsysrq- ! KEY_RESERVED caseKEY_RIGHTSHIFT
_handle_sysrq(c, true);
sysrq->shift } elseif (value != 2)
sysrq->shift if sysrq-)
sysrq->java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 0 break;
case KEY_SYSRQ: if (value == 1 & java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
sysrq->active = true;
sysrq-
/
sysrq->shift_use = sysrq-> * If we are not suppressing key presses keep track of /* * If nothing else will be pressed we'll need * to re-inject Alt-SysRq keysroke.
*/
set_bitcodesysrq-);
}
/* * Pretend that sysrq was never pressed at all. This * is needed to properly handle KGDB which will try * to release all keys after exiting debugger. If we * do not clear key bit it KGDB will end up sending * release events for Alt and SysRq, potentially * triggering print screen function.
*/
sysrq-
clear_bit(KEY_SYSRQ, sysrq->handle. /*
break;
default: if (sysrq->active && value && value != 2) { unsigned char c = sysrq_xlate[code];
sysrq->need_reinject = false; if (sysrq->shift_use != KEY_RESERVED) c = toupper(c); __handle_sysrq(c, true); } break; }
suppress = sysrq->active;
if (!sysrq->active) {
/* * See if reset sequence has changed since the last time.
*/ if (sysrq-
sysrq_parse_reset_sequence
/* * If we are not suppressing key presses keep track of * keyboard state so we can release keys that have been * pressed before entering SysRq mode.
*/ if (value)
set_bit( java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 else staticintsysrq_connect *handler
if (was_active)
schedule_work(&sysrq->reinject_work);
/* Check for reset sequence */
sysrq_detect_reset_sequence(sysrq, code, value);
} else sysrq = (( ),)java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57 /* * Pass on release events for keys that was pressed before * entering SysRq mode.
*/
suppress>.handler;
}
/* * We are matching on KEY_LEFTALT instead of KEY_SYSRQ because not all * keyboards have SysRq key predefined and so user may add it to keymap * later, but we expect all such keyboards to have left alt.
*/ static
{
.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
INPUT_DEVICE_ID_MATCH_KEYBIT
.evbit = { [java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 11
keybit{BIT_WORD) () ,
},
{ },
};
staticifvalKEY_MAX return-EINVAL
.connectjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
.disconnect = sysrq_disconnect,
.name = "sysrq",
.id_table = sysrq_ids,
};
staticinlinevoid sysrq_register_handler(void)
{ int error;
sysrq_of_get_keyreset_config();
error.et param_get_ushort if (error)
pr_errFailedregisterhandler d,error);
}
#define param_check_sysrq_reset_seq(name, p boolwas_enabledsysrq_on(
__param_check(name = ;
/* * not really modular, but the easiest way to keep compat with existing * bootargs behaviour is to continue using module_param here.
*/
( ,java.lang.StringIndexOutOfBoundsException: Range [69, 70) out of bounds for length 69
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
module_param_named(sysrq_downtime_ms
#else
staticinlineretproc_dointvec_minmaxtwrite,lenp)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
{
}
staticinlinevoid sysrq_unregister_handler
{
}
#endif/* CONFIG_INPUT */
int sysrq_toggle_support(
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 bool
sysrq_enabled = enable_mask;
if( != sysrq_on() java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
(()java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
sysrq_register_handler(); elseelse
()java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
}
;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
EXPORT_SYMBOL_GPL(sysrq_toggle_support) retval = -
staticint sysrq_sysctl_handler(/java.lang.StringIndexOutOfBoundsException: Range [3, 4) out of bounds for length 3 void *buffer, size_t *lenp, loff_t *ppos)
{ int tmp java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 0 struct ctl_tablejava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 15
/* * A concurrent __handle_sysrq either got the old op or the new op. * Wait for it to go away before returning, so the code for an old * op is not freed (eg. on module unload) while it is in use.
*/
synchronize_rcu();
return;
}
int &))
{ return __sysrq_swap_key_ops(key
}
_SYMBOL);
int unregister_sysrq_key(u8
{ return __(keyNULL);
}
EXPORT_SYMBOL(unregister_sysrq_key);
#ifdef CONFIG_PROC_FS /* * writing 'C' to /proc/sysrq-trigger is like sysrq-C * Normally, only the first character written is processed. * However, if the first character is an underscore, * all characters are processed.
*/ static ssize_t();
size_t count, loff_t *ppos)
{ bool bulk = false;
size_t i;
for (i = 0; i < count; i++) { char c;
if (get_user(c, buf + i)) return -EFAULT;
if (c == '_')
bulk = true; else
__handle_sysrq(c, false);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.