From da8ee84f98e4acf98abcc924ca1aa1316f4ce74f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 18 Mar 2024 16:01:27 +0000 Subject: [PATCH] deploy: b073e9e2d9a1eec2c0d203661a7f0b387eba0695 --- 404.html | 8 ++--- .../Asynchronous Web Server/index.html | 8 ++--- .../src/http-parser/index.html | 8 ++--- Assignments/Memory Allocator/index.html | 8 ++--- Assignments/Mini Libc/index.html | 8 ++--- Assignments/Mini Shell/index.html | 8 ++--- Assignments/Mini Shell/util/parser/index.html | 8 ++--- Assignments/Parallel Graph/index.html | 8 ++--- Assignments/index.html | 8 ++--- .../aggregator-application/index.html | 10 +++--- .../application-investigator/index.html | 10 +++--- .../benchmarking-application/index.html | 10 +++--- .../database-application/index.html | 10 +++--- .../digital-forensics/index.html | 10 +++--- .../distributed-system/index.html | 10 +++--- .../faas-application/index.html | 32 +++++++++++++++++++ .../network-configurations-manager/index.html | 12 +++---- .../network-performance-utility/index.html | 10 +++--- .../nightly-builds-system/index.html | 10 +++--- .../system-process-monitoring-tool/index.html | 10 +++--- .../user-level-threading-library/index.html | 10 +++--- Exams/index.html | 10 +++--- Hackathons/Lambda Function Loader/index.html | 8 ++--- Hackathons/index.html | 10 +++--- Lab/Application Interaction/arena/index.html | 8 ++--- Lab/Application Interaction/dbus/index.html | 8 ++--- Lab/Application Interaction/index.html | 8 ++--- .../os-cloud/index.html | 8 ++--- .../overview/index.html | 8 ++--- .../password-cracker/index.html | 8 ++--- .../quiz/cgroups-vs-namespaces/index.html | 8 ++--- .../quiz/container-vs-vm/index.html | 8 ++--- .../quiz/time-server-interop/index.html | 8 ++--- .../quiz/time-server/index.html | 8 ++--- .../quiz/timer/index.html | 8 ++--- .../quiz/vm-creation/index.html | 8 ++--- .../time-server/index.html | 8 ++--- .../x-window-system/index.html | 8 ++--- Lab/Compute/arena/index.html | 8 ++--- Lab/Compute/copy-on-write/index.html | 8 ++--- Lab/Compute/hardware-perspective/index.html | 8 ++--- Lab/Compute/index.html | 8 ++--- Lab/Compute/overview/index.html | 8 ++--- .../processes-threads-apache2/index.html | 8 ++--- Lab/Compute/processes/index.html | 8 ++--- Lab/Compute/quiz/apache2-strace/index.html | 8 ++--- .../cause-of-file-not-found-error/index.html | 8 ++--- .../quiz/child-faults-after-write/index.html | 8 ++--- .../index.html | 8 ++--- .../create-sleepy-process-ending/index.html | 8 ++--- Lab/Compute/quiz/fiber-strace/index.html | 8 ++--- .../mini-shell-stops-after-command/index.html | 8 ++--- Lab/Compute/quiz/mmap-cow-flag/index.html | 8 ++--- .../quiz/notify-only-with-mutex/index.html | 8 ++--- .../quiz/number-of-running-ults/index.html | 8 ++--- .../quiz/parent-faults-before-fork/index.html | 8 ++--- .../quiz/parent-of-sleep-processes/index.html | 8 ++--- Lab/Compute/quiz/processes-speedup/index.html | 8 ++--- .../quiz/seg-fault-exit-code/index.html | 8 ++--- .../quiz/semaphore-equivalent/index.html | 8 ++--- .../quiz/sleeping-on-a-fiber/index.html | 8 ++--- Lab/Compute/quiz/state-of-new-ult/index.html | 8 ++--- .../quiz/tcb-libult-unikraft/index.html | 8 ++--- Lab/Compute/quiz/thread-memory/index.html | 8 ++--- Lab/Compute/quiz/time-slice-value/index.html | 8 ++--- .../quiz/tls-synchronization/index.html | 8 ++--- Lab/Compute/quiz/tls-var-copies/index.html | 8 ++--- .../type-of-scheduler-in-libult/index.html | 8 ++--- Lab/Compute/quiz/ult-thread-ids/index.html | 8 ++--- .../quiz/who-calls-execve-parent/index.html | 8 ++--- .../quiz/why-use-completed-queue/index.html | 8 ++--- Lab/Compute/synchronization/index.html | 8 ++--- Lab/Compute/threads/index.html | 8 ++--- Lab/Compute/user-level-threads/index.html | 8 ++--- Lab/Data/arena/index.html | 8 ++--- Lab/Data/index.html | 8 ++--- Lab/Data/investigate-memory/index.html | 8 ++--- Lab/Data/memory-security/index.html | 8 ++--- Lab/Data/overview/index.html | 8 ++--- Lab/Data/process-memory/index.html | 8 ++--- Lab/Data/quiz/bypass-canary/index.html | 8 ++--- Lab/Data/quiz/half-page/index.html | 8 ++--- Lab/Data/quiz/malloc-brk/index.html | 8 ++--- Lab/Data/quiz/malloc-mmap/index.html | 8 ++--- Lab/Data/quiz/memory-access/index.html | 8 ++--- Lab/Data/quiz/memory-aslr/index.html | 8 ++--- Lab/Data/quiz/memory-granularity/index.html | 8 ++--- Lab/Data/quiz/memory-leaks/index.html | 8 ++--- Lab/Data/quiz/memory-regions-vars/index.html | 8 ++--- .../quiz/memory-stack-protector/index.html | 8 ++--- Lab/Data/quiz/mmap-file/index.html | 8 ++--- Lab/Data/quiz/operators/index.html | 8 ++--- Lab/Data/quiz/page-allocation/index.html | 8 ++--- Lab/Data/quiz/stack-layout/index.html | 8 ++--- Lab/Data/quiz/string-buff-over/index.html | 8 ++--- Lab/Data/quiz/string-strcpy/index.html | 8 ++--- Lab/Data/quiz/valgrind-leaks/index.html | 8 ++--- Lab/Data/working-memory/index.html | 8 ++--- Lab/IO/arena/index.html | 8 ++--- Lab/IO/async-io/index.html | 8 ++--- Lab/IO/beyond-network-sockets/index.html | 8 ++--- Lab/IO/client-server-model/index.html | 8 ++--- Lab/IO/file-descriptors/index.html | 8 ++--- Lab/IO/file-handlers/index.html | 8 ++--- Lab/IO/file-mappings/index.html | 8 ++--- Lab/IO/index.html | 8 ++--- Lab/IO/io-internals/index.html | 8 ++--- Lab/IO/io-multiplexing/index.html | 8 ++--- Lab/IO/local-io-in-action/index.html | 8 ++--- Lab/IO/networking-101/index.html | 8 ++--- Lab/IO/overview/index.html | 8 ++--- Lab/IO/pipes/index.html | 8 ++--- .../anonymous-pipes-limitation/index.html | 8 ++--- Lab/IO/quiz/bind-error-cause/index.html | 8 ++--- .../client-server-sender-receiver/index.html | 8 ++--- Lab/IO/quiz/deluge-tcp-udp/index.html | 8 ++--- Lab/IO/quiz/execve/index.html | 8 ++--- Lab/IO/quiz/fewer-than-2-copies/index.html | 8 ++--- Lab/IO/quiz/file-handler-c/index.html | 8 ++--- Lab/IO/quiz/firefox-tcp-udp/index.html | 8 ++--- Lab/IO/quiz/flush-libc-buffer/index.html | 8 ++--- Lab/IO/quiz/fopen-syscall/index.html | 8 ++--- Lab/IO/quiz/fopen-w/index.html | 8 ++--- Lab/IO/quiz/local-io-errors/index.html | 8 ++--- .../quiz/mmap-read-write-benchmark/index.html | 8 ++--- Lab/IO/quiz/o-trunc/index.html | 8 ++--- Lab/IO/quiz/pipe-ends/index.html | 8 ++--- Lab/IO/quiz/prints-work-no-stdio/index.html | 8 ++--- Lab/IO/quiz/receiver-socket-fd/index.html | 8 ++--- Lab/IO/quiz/server-copies/index.html | 8 ++--- Lab/IO/quiz/stderr-fd/index.html | 8 ++--- Lab/IO/quiz/strace-printf/index.html | 8 ++--- Lab/IO/quiz/syscalls-cp/index.html | 8 ++--- Lab/IO/quiz/write-file-permissions/index.html | 8 ++--- Lab/IO/redirections/index.html | 8 ++--- Lab/IO/remote-io/index.html | 8 ++--- Lab/IO/zero-copy/index.html | 8 ++--- Lab/index.html | 8 ++--- Lab/lab-setup/index.html | 8 ++--- Lecture/Application-Interaction/index.html | 8 ++--- Lecture/Compute/index.html | 8 ++--- Lecture/Data/index.html | 8 ++--- Lecture/IO/index.html | 8 ++--- Lecture/index.html | 8 ++--- .../Modern Software Stacks/index.html | 8 ++--- .../modern-sw-stack/index.html | 8 ++--- .../Overview/Drills/Questions/index.html | 8 ++--- .../Drills/Questions/software/index.html | 8 ++--- .../Overview/Drills/index.html | 8 ++--- .../Overview/index.html | 8 ++--- .../Overview/questions/software/index.html | 8 ++--- .../System Calls/Drills/Questions/index.html | 8 ++--- .../Questions/libcall-syscall/index.html | 8 ++--- .../Drills/Questions/syscall-id/index.html | 8 ++--- .../Questions/syscall-numbers/index.html | 8 ++--- .../Drills/Questions/syscall-tool/index.html | 8 ++--- .../Questions/syscall-wrapper/index.html | 8 ++--- .../Drills/Tasks/Basic Syscall/index.html | 8 ++--- .../Tasks/System Call Wrapper/index.html | 8 ++--- .../System Calls/Drills/Tasks/index.html | 8 ++--- .../System Calls/Drills/index.html | 8 ++--- .../Reading/basic-syscall/index.html | 8 ++--- .../System Calls/Reading/index.html | 8 ++--- .../Reading/libcall-syscall/index.html | 8 ++--- .../Reading/syscall-wrapper/index.html | 8 ++--- .../System Calls/index.html | 8 ++--- .../questions/libcall-syscall/index.html | 8 ++--- .../questions/syscall-id/index.html | 8 ++--- .../questions/syscall-numbers/index.html | 8 ++--- .../questions/syscall-tool/index.html | 8 ++--- .../questions/syscall-wrapper/index.html | 8 ++--- .../tasks/basic-syscall/index.html | 8 ++--- .../tasks/libcall-syscall/index.html | 8 ++--- .../tasks/syscall-wrapper/index.html | 8 ++--- .../index.html | 8 ++--- .../Drills/Tasks/Applications/index.html | 8 ++--- .../Applications/Drills/Tasks/index.html | 8 ++--- .../Applications/Drills/index.html | 8 ++--- .../Reading/app-investigate/index.html | 8 ++--- .../Applications/Reading/index.html | 8 ++--- .../Applications/index.html | 8 ++--- .../Drills/Questions/index.html | 8 ++--- .../Drills/Questions/python-tools/index.html | 8 ++--- .../Tasks/High-Level Languages/index.html | 8 ++--- .../Drills/Tasks/index.html | 8 ++--- .../High-Level Languages/Drills/index.html | 8 ++--- .../Reading/high-level-lang/index.html | 8 ++--- .../High-Level Languages/Reading/index.html | 8 ++--- .../High-Level Languages/index.html | 8 ++--- .../questions/python-tools/index.html | 8 ++--- .../Libc/Drills/Questions/index.html | 8 ++--- .../Libc/Drills/Questions/malloc/index.html | 8 ++--- .../Questions/printf-syscall/index.html | 8 ++--- .../Questions/printf-vs-write/index.html | 8 ++--- .../Questions/strcpy-syscall/index.html | 8 ++--- .../Drills/Questions/syscall-tool/index.html | 8 ++--- .../Drills/Tasks/Common Functions/index.html | 8 ++--- .../Libc/Drills/Tasks/Libc/index.html | 8 ++--- .../Libc/Drills/Tasks/index.html | 8 ++--- .../Libc/Drills/index.html | 8 ++--- .../Libc/Reading/common-functions/index.html | 8 ++--- .../Libc/Reading/index.html | 8 ++--- .../Libc/Reading/libc/index.html | 8 ++--- .../Libc/index.html | 8 ++--- .../Libc/questions/malloc/index.html | 8 ++--- .../Libc/questions/printf-syscall/index.html | 8 ++--- .../Libc/questions/printf-vs-write/index.html | 8 ++--- .../Libc/questions/strcpy-syscall/index.html | 8 ++--- .../Libc/questions/syscall-tool/index.html | 8 ++--- .../Libc/tasks/common-functions/index.html | 8 ++--- .../Libc/tasks/libc/index.html | 8 ++--- .../Questions/dynamic-libraries/index.html | 8 ++--- .../Libraries/Drills/Questions/index.html | 8 ++--- .../Questions/static-executables/index.html | 8 ++--- .../Libraries/Drills/index.html | 8 ++--- .../Guides/Static-Dynamic/index.html | 8 ++--- .../Libraries/Guides/index.html | 8 ++--- .../Libraries/index.html | 8 ++--- .../questions/dynamic-libraries/index.html | 8 ++--- .../questions/static-executables/index.html | 8 ++--- .../Lab 2 - Library Perspective/index.html | 8 ++--- Software Stack/Software-Stack/index.html | 8 ++--- Software Stack/index.html | 8 ++--- assets/js/15d9f00e.c63e5fe2.js | 1 + assets/js/15d9f00e.f7b27611.js | 1 - assets/js/935f2afb.1c218034.js | 1 + assets/js/935f2afb.3c99a76c.js | 1 - assets/js/b4c6c600.e3fe61b0.js | 1 + ...89e97.e45f243f.js => e3a89e97.d5e35e28.js} | 2 +- assets/js/main.538589e8.js | 2 -- assets/js/main.ab0f40bc.js | 2 ++ ...CENSE.txt => main.ab0f40bc.js.LICENSE.txt} | 0 assets/js/runtime~main.26754e92.js | 1 - assets/js/runtime~main.c6ac824b.js | 1 + index.html | 8 ++--- markdown-page/index.html | 8 ++--- resources/index.html | 8 ++--- rules-and-grading/index.html | 8 ++--- sitemap.xml | 2 +- 239 files changed, 958 insertions(+), 925 deletions(-) create mode 100644 Exams/FaaS Application/faas-application/index.html create mode 100644 assets/js/15d9f00e.c63e5fe2.js delete mode 100644 assets/js/15d9f00e.f7b27611.js create mode 100644 assets/js/935f2afb.1c218034.js delete mode 100644 assets/js/935f2afb.3c99a76c.js create mode 100644 assets/js/b4c6c600.e3fe61b0.js rename assets/js/{e3a89e97.e45f243f.js => e3a89e97.d5e35e28.js} (52%) delete mode 100644 assets/js/main.538589e8.js create mode 100644 assets/js/main.ab0f40bc.js rename assets/js/{main.538589e8.js.LICENSE.txt => main.ab0f40bc.js.LICENSE.txt} (100%) delete mode 100644 assets/js/runtime~main.26754e92.js create mode 100644 assets/js/runtime~main.c6ac824b.js diff --git a/404.html b/404.html index b8a55cdeb2..a1d8fdabde 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ Page Not Found | Operating Systems - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - + + \ No newline at end of file diff --git a/Assignments/Asynchronous Web Server/index.html b/Assignments/Asynchronous Web Server/index.html index 2ab03148c8..1d7612ea1a 100644 --- a/Assignments/Asynchronous Web Server/index.html +++ b/Assignments/Asynchronous Web Server/index.html @@ -4,8 +4,8 @@ Asynchronous Web Server | Operating Systems - - + +
@@ -28,7 +28,7 @@ These folders are created and removed using the init and cleanup arguments to _test/run_test.sh.

Behind the Scenes

Tests are basically unit tests.

Each test function follows the unit test patter: initialization, action, evaluation.

Each test starts the server, creates a given context, checks for validity and then terminates the server process.

Debugging

Logs are collected in test.log and wget.log files.

Resources

- - + + \ No newline at end of file diff --git a/Assignments/Asynchronous Web Server/src/http-parser/index.html b/Assignments/Asynchronous Web Server/src/http-parser/index.html index 9b8a600e19..c399dae30b 100644 --- a/Assignments/Asynchronous Web Server/src/http-parser/index.html +++ b/Assignments/Asynchronous Web Server/src/http-parser/index.html @@ -4,8 +4,8 @@ HTTP Parser | Operating Systems - - + +
@@ -48,7 +48,7 @@ buffer to avoid copying memory around if this fits your application.

Reading headers may be a tricky task if you read/parse headers partially. Basically, you need to remember whether last header callback was field or value and apply following logic:

(on_header_field and on_header_value shortened to on_h_*)
------------------------ ------------ --------------------------------------------
| State (prev. callback) | Callback | Description/action |
------------------------ ------------ --------------------------------------------
| nothing (first call) | on_h_field | Allocate new buffer and copy callback data |
| | | into it |
------------------------ ------------ --------------------------------------------
| value | on_h_field | New header started. |
| | | Copy current name,value buffers to headers |
| | | list and allocate new buffer for new name |
------------------------ ------------ --------------------------------------------
| field | on_h_field | Previous name continues. Reallocate name |
| | | buffer and append callback data to it |
------------------------ ------------ --------------------------------------------
| field | on_h_value | Value for current header started. Allocate |
| | | new buffer and copy callback data to it |
------------------------ ------------ --------------------------------------------
| value | on_h_value | Value continues. Reallocate value buffer |
| | | and append callback data to it |
------------------------ ------------ --------------------------------------------

See examples of reading in headers:

- - + + \ No newline at end of file diff --git a/Assignments/Memory Allocator/index.html b/Assignments/Memory Allocator/index.html index 74d7ec9536..3a5da34254 100644 --- a/Assignments/Memory Allocator/index.html +++ b/Assignments/Memory Allocator/index.html @@ -4,8 +4,8 @@ Memory Allocator | Operating Systems - - + +
@@ -52,7 +52,7 @@ Every other address is displayed as <label> + offset, where the label is the closest mapped address.

run_tests.py supports three modes:

If you want to run a single test, you give its name or its path as arguments to run_tests.py:

student@os:~/.../mem-alloc/tests$ python3 run_tests.py test-all
OR
student@os:~/.../mem-alloc/tests$ python3 run_tests.py snippets/test-all

Debugging in VSCode

If you are using Visual Studio Code, you can use the launch.json configurations to run tests.

Setup the breakpoints in the source files or the tests and go to Run and Debug (F5). Select Run test script and press F5. This will enter a dialogue where you can choose which test to run.

You can find more on this in the official documentation: Debugging with VSCode.

If VSCode complains about MAP_ANON argument for mmap() change C_Cpp.default.cStandard option to gnu11.

Resources

- - + + \ No newline at end of file diff --git a/Assignments/Mini Libc/index.html b/Assignments/Mini Libc/index.html index b1d40be380..15714f8772 100644 --- a/Assignments/Mini Libc/index.html +++ b/Assignments/Mini Libc/index.html @@ -4,8 +4,8 @@ Mini-libc | Operating Systems - - + +
@@ -27,7 +27,7 @@ Some tests don't fail because the missing implementation equates to the bad behavior being tested not happening.

Each test is worth a number of points. The total number of points is 900. The maximum grade is obtained by dividing the number of points to 10, for a maximum grade of 90.

A successful run will show the output:

student@so:~/.../assignments/mini-libc/tests$ make check
[...]
test_strcpy ........................ passed ... 9
test_strcpy_append ........................ passed ... 9
test_strncpy ........................ passed ... 9
test_strncpy_cut ........................ passed ... 9
test_strcat ........................ passed ... 9
test_strcat_from_zero ........................ passed ... 9
test_strcat_multiple ........................ passed ... 9
test_strncat ........................ passed ... 9
test_strncat_cut ........................ passed ... 9
test_strcmp_equal ........................ passed ... 9
test_strcmp_same_size_less ........................ passed ... 1
test_strcmp_same_size_greater ........................ passed ... 9
test_strcmp_diff_size_less ........................ passed ... 1
test_strcmp_diff_size_greater ........................ passed ... 9
test_strncmp_equal_size_equal ........................ passed ... 9
test_strncmp_diff_contents_equal ........................ passed ... 9
test_strncmp_diff_size_equal ........................ passed ... 9
test_strchr_exists ........................ passed ... 11
test_strchr_exists_twice ........................ passed ... 9
test_strchr_not_exists ........................ passed ... 1
test_strrchr_exists ........................ passed ... 11
test_strrchr_exists_twice ........................ passed ... 9
test_strrchr_not_exists ........................ passed ... 1
test_strstr_exists ........................ passed ... 11
test_strstr_exists_twice ........................ passed ... 9
test_strstr_not_exists ........................ passed ... 1
test_strrstr_exists ........................ passed ... 11
test_strrstr_exists_twice ........................ passed ... 9
test_strrstr_not_exists ........................ passed ... 1
test_memcpy ........................ passed ... 11
test_memcpy_part ........................ passed ... 9
test_memcmp_equal_size_equal ........................ passed ... 9
test_memcmp_diff_contents_equal ........................ passed ... 9
test_memcmp_diff_size_equal ........................ passed ... 9
test_memset ........................ passed ... 9
test_memset_part ........................ passed ... 9
test_memmove_apart ........................ passed ... 9
test_memmove_src_before_dst ........................ passed ... 9
test_memmove_src_after_dst ........................ passed ... 9
test_open_non_existent_file ........................ passed ... 8
test_open_invalid_access_mode ........................ passed ... 8
test_open_file_as_directory ........................ passed ... 8
test_open_directory_for_writing ........................ passed ... 8
test_open_force_invalid_creation ........................ passed ... 8
test_open_close_existent_file ........................ passed ... 8
test_open_close_create_file ........................ passed ... 8
test_open_read_write_only_mode ........................ passed ... 8
test_open_write_read_only_mode ........................ passed ... 8
test_lseek_invalid_fd ........................ passed ... 8
test_lseek_invalid_whence ........................ passed ... 8
test_lseek_invalid_offset ........................ passed ... 8
test_lseek_set ........................ passed ... 8
test_lseek_cur ........................ passed ... 8
test_lseek_end ........................ passed ... 8
test_lseek_combined ........................ passed ... 8
test_truncate_read_only_file ........................ passed ... 8
test_truncate_invalid_size ........................ passed ... 8
test_truncate_directory ........................ passed ... 8
test_truncate_non_existent_file ........................ passed ... 8
test_truncate_file ........................ passed ... 8
test_ftruncate_read_only_file ........................ passed ... 8
test_ftruncate_invalid_size ........................ passed ... 8
test_ftruncate_directory ........................ passed ... 8
test_ftruncate_bad_fd ........................ passed ... 8
test_ftruncate_file ........................ passed ... 8
test_stat_non_existent_file ........................ passed ... 8
test_stat_regular_file ........................ passed ... 8
test_fstat_bad_fd ........................ passed ... 8
test_fstat_regular_file ........................ passed ... 8
test_puts ........................ passed ... 15
test_open_close_create_file ........................ passed ... 10
test_open_close_read_byte ........................ passed ... 10
test_ftruncate ........................ passed ... 10
test_truncate ........................ passed ... 10
test_fstat ........................ passed ... 10
test_stat ........................ passed ... 10
test_sleep ........................ passed ... 20
test_nanosleep ........................ passed ... 20
test_mmap ........................ passed ... 8
test_mmap_bad_fd ........................ passed ... 8
test_mmap_bad_flags ........................ passed ... 8
test_mremap ........................ passed ... 8
test_malloc ........................ passed ... 8
test_malloc_two ........................ passed ... 8
test_malloc_access ........................ passed ... 8
test_malloc_memset ........................ passed ... 8
test_malloc_memcpy ........................ passed ... 8
test_calloc ........................ passed ... 8
test_realloc ........................ passed ... 8
test_realloc_access ........................ passed ... 8
test_realloc_memset ........................ passed ... 8
test_realloc_array ........................ passed ... 8
test_malloc ........................ passed ... 10
test_multiple_malloc ........................ passed ... 10
test_malloc_free ........................ passed ... 10
test_multiple_malloc_free ........................ passed ... 10
test_malloc_free_sequence ........................ passed ... 10
test_malloc_perm_ok ........................ passed ... 10
test_malloc_perm_notok ........................ passed ... 10
test_mmap ........................ passed ... 10
test_mmap_munmap ........................ passed ... 10
test_mmap_perm_ok ........................ passed ... 10
test_mmap_perm_notok ........................ passed ... 10
test_mmap_perm_none ........................ passed ... 10

Total: 90/100

Behind the Scenes

For a fine grained approach, build tests and ignore errors (due to missing source code and header files) by using:

student@so:~/.../assignments/mini-libc/tests$ make -i

Then run the tests, either individually via executable files and scripts:

student@so:~/.../assignments/mini-libc/tests$ ./test_lseek.sh
test_lseek ........................ passed ... 10

student@so:~/.../assignments/mini-libc/tests$ ./test_memory
test_mmap ........................ passed ... 8
test_mmap_bad_fd ........................ passed ... 8
[...]

Or run them all via the run_all_tests.sh script:

student@so:~/.../assignments/mini-libc/tests$ ./run_all_tests.sh
test_strcpy ........................ passed ... 9
test_strcpy_append ........................ passed ... 9
test_strncpy ........................ passed ... 9
[...]

Resources

- - + + \ No newline at end of file diff --git a/Assignments/Mini Shell/index.html b/Assignments/Mini Shell/index.html index 407a94de81..b4098d51a6 100644 --- a/Assignments/Mini Shell/index.html +++ b/Assignments/Mini Shell/index.html @@ -4,8 +4,8 @@ Minishell | Operating Systems - - + +
@@ -38,7 +38,7 @@ To see the results of the tests, you can check tests/_test/outputs/ directory.

Memory leaks

To inspect the unreleased resources (memory leaks, file descriptors) set USE_VALGRIND=yes and DO_CLEANUP=no in tests/_test/run_test.sh. You can modify both the path to the Valgrind log file and the command parameters. To see the results of the tests, you can check tests/_test/outputs/ directory.

- - + + \ No newline at end of file diff --git a/Assignments/Mini Shell/util/parser/index.html b/Assignments/Mini Shell/util/parser/index.html index f87cd94f8b..469342834e 100644 --- a/Assignments/Mini Shell/util/parser/index.html +++ b/Assignments/Mini Shell/util/parser/index.html @@ -4,8 +4,8 @@ Parser | Operating Systems - - + +
@@ -14,7 +14,7 @@ To use the parser, you need to link the object files parser.yy.o and parser.tab.o with your program.

Example

Tests

More tests can be found in the tests directory:

student@os:/.../minishell/util/parser$ cd tests

student@os:/.../minishell/util/parser/tests$ ../DisplayStructure &>small_tests.out <small_tests.txt

student@os:/.../minishell/util/parser/tests$ cat small_tests.out
> mkdir tmp
Command successfully read!
command_t (
scmd (
simple_command_t (
verb (
'mkdir'
)
params (
'tmp'
)
)
)
)

> cd tmp
Command successfully read!
command_t (
scmd (

...
student@os:/.../minishell/util/parser/tests$ ../DisplayStructure &>ugly_tests.out <ugly_tests.txt

student@os:/.../minishell/util/parser/tests$ ../DisplayStructure &>negative_tests.out <negative_tests.txt

Note

The parser will fail with an error of unknown character if you use the Linux parser (which considers the end of line as \n) on Windows files (end of line as \r\n) because at the end of the lines (returned by getline()) there will be a \r followed by \n. The opposite works (Windows parser with Linux files). The test files use the Linux convention (\n).

Other information

More information about the parser can be found in the file parser.h.

- - + + \ No newline at end of file diff --git a/Assignments/Parallel Graph/index.html b/Assignments/Parallel Graph/index.html index 9db8fb4329..fc48843ef5 100644 --- a/Assignments/Parallel Graph/index.html +++ b/Assignments/Parallel Graph/index.html @@ -4,8 +4,8 @@ Parallel Graph | Operating Systems - - + +
@@ -46,7 +46,7 @@ They also need to have certain configuration options. It's easiest to run them in a Docker-based setup with everything configured.

Fine-Grained Testing

Input tests cases are located in tests/in/. If you want to run a single test, use commands such as below while in the src/ directory:

$./parallel ../tests/in/test5.in
-38

$ ./serial ../tests/in/test5.in
-38

Results provided by the serial and parallel implementation must be the same for the test to successfully pass.

- - + + \ No newline at end of file diff --git a/Assignments/index.html b/Assignments/index.html index 54d1f2133a..7c5238ea7f 100644 --- a/Assignments/index.html +++ b/Assignments/index.html @@ -4,13 +4,13 @@ Assignments | Operating Systems - - + +
Skip to main content
- - + + \ No newline at end of file diff --git a/Exams/Aggregator Application/aggregator-application/index.html b/Exams/Aggregator Application/aggregator-application/index.html index 59d1311b36..09d4ffbc31 100644 --- a/Exams/Aggregator Application/aggregator-application/index.html +++ b/Exams/Aggregator Application/aggregator-application/index.html @@ -4,12 +4,12 @@ Aggregator Application | Operating Systems - - + +
-
Skip to main content

Aggregator Application

Scenario

We are pursuing the design of an aggregator application that interfaces with multiple sites / solutions of Large Language Models (LLMs) like ChatGPT. +

Aggregator Application

Scenario

We are pursuing the design of an aggregator application that interfaces with multiple sites / solutions of Large Language Models (LLMs) like ChatGPT. The application should be portable across different architectures, operating systems, and interfaces: native, web, mobile. The application will receive a query from the user, which it will then transmit to all LLM sites / solutions. Then it will display all their responses, allowing the user to choose a response (from an LLM solution), possibly based on similarity to other responses from other LLM solutions.

Respond to the following questions with "True" or "False" and provide reasoning. @@ -25,7 +25,7 @@ Answer: True

  • The aggregator application's page table DOES NOT contain pages without write permission. Answer: False

  • The system can only function if the communication between the aggregator application and LLM sites is encrypted. Answer: False

  • - - + + \ No newline at end of file diff --git a/Exams/Application Investigator/application-investigator/index.html b/Exams/Application Investigator/application-investigator/index.html index f27aefb0fb..9db9270873 100644 --- a/Exams/Application Investigator/application-investigator/index.html +++ b/Exams/Application Investigator/application-investigator/index.html @@ -4,12 +4,12 @@ Application Investigator | Operating Systems - - + +
    -

    Application Investigator

    Scenario

    We aim to investigate, for security/forensics reasons, applications running on a system. +

    Application Investigator

    Scenario

    We aim to investigate, for security/forensics reasons, applications running on a system. For this purpose, we design an application that, given a PID (or equivalent), suspends the execution of the target process and dumps the memory of that process into a file, using a dedicated interface of the operating system.

    Answer the following questions with "True" or "False" and justify the answer. Justification should be simple, 2-3 sentences for each answer.

    Questions

    1. The application runs in privileged mode. Answer: True

    2. The suspended process must be single-threaded. @@ -23,7 +23,7 @@ Answer: False

    3. The resulting file from the memory dump is a binary file, not text. Answer: True

    4. In principle, with certain adjustments, the application can work on both 32-bit and 64-bit systems. Answer: True

    - - + + \ No newline at end of file diff --git a/Exams/Benchmarking Application/benchmarking-application/index.html b/Exams/Benchmarking Application/benchmarking-application/index.html index c05209fa80..ee2ea91e46 100644 --- a/Exams/Benchmarking Application/benchmarking-application/index.html +++ b/Exams/Benchmarking Application/benchmarking-application/index.html @@ -4,12 +4,12 @@ Benchmarking Application | Operating Systems - - + +
    -

    Benchmarking Application

    Scenario

    We aim to implement a web application benchmarking solution. +

    Benchmarking Application

    Scenario

    We aim to implement a web application benchmarking solution. This application will perform web client actions towards a remote web application to obtain metrics such as response time, scalability (how response time degrades with the number of simultaneous connections to the application), with variations for request or response size.

    Answer the following questions with "True" or "False" and justify the answer. Justification should be simple, 2-3 sentences for each answer.

    Questions

    1. The benchmarking application uses network sockets. Answer: True

    2. The benchmarking application is required to be multi-threaded. @@ -23,7 +23,7 @@ Answer: True

    3. With the necessary modifications, the application can handle both HTTP and HTTPS connections. Answer: True

    4. The benchmarking application can only measure open-source web applications + open-source web servers (with available sources). Answer: False

    - - + + \ No newline at end of file diff --git a/Exams/Database Application/database-application/index.html b/Exams/Database Application/database-application/index.html index c0fa56e56d..726c5326e9 100644 --- a/Exams/Database Application/database-application/index.html +++ b/Exams/Database Application/database-application/index.html @@ -4,12 +4,12 @@ Database Application | Operating Systems - - + +
    -

    Database Application

    Scenario

    We aim to run a database application in a containerized solution (Docker, Podman) for ease of deployment and isolation. +

    Database Application

    Scenario

    We aim to run a database application in a containerized solution (Docker, Podman) for ease of deployment and isolation. Running in a container involves isolating the filesystem (and necessary files), necessary processes, computing resources (CPU, memory, disk), and the network portion. The database application will be accessible from outside the container through a virtual network.

    Answer the following questions with "True" or "False" and justify the answer. Justification should be simple, 2-3 sentences for each answer.

    Questions

    1. The database application can only be implemented as a static executable, not a dynamic one. @@ -24,7 +24,7 @@ Answer: True

    2. Memory within the container cannot be visible from outside the container, even by a privileged account. Answer: False

    3. The application exclusively spends time in user mode, not in kernel mode. Answer: False

    - - + + \ No newline at end of file diff --git a/Exams/Digital Forensics/digital-forensics/index.html b/Exams/Digital Forensics/digital-forensics/index.html index 16749e4831..9d13dbc786 100644 --- a/Exams/Digital Forensics/digital-forensics/index.html +++ b/Exams/Digital Forensics/digital-forensics/index.html @@ -4,12 +4,12 @@ Digital Forensics | Operating Systems - - + +
    -

    Digital Forensics

    Scenario

    For digital forensics operations (digital evidence investigation), we want to develop an application that dumps the entire physical memory (RAM) of a modern operating system (such as Linux, Windows, macOS). +

    Digital Forensics

    Scenario

    For digital forensics operations (digital evidence investigation), we want to develop an application that dumps the entire physical memory (RAM) of a modern operating system (such as Linux, Windows, macOS). We assume there is a dedicated interface of the operating system that allows reading of physical memory for dumping. The application can dump to a file or to standard output (for redirection to a file or network redirection). The result is a dump with the size of the physical memory (RAM) of the system.

    Answer the following questions with "True" or "False" and justify your answer. @@ -25,7 +25,7 @@ Answer: True

  • The application cannot realistically be used on a 64-bit system, only on a 32-bit system. Answer: False

  • As long as the operating system provides support, the application can work on both x86 and ARM processor architectures. Answer: False

  • - - + + \ No newline at end of file diff --git a/Exams/Distributed System/distributed-system/index.html b/Exams/Distributed System/distributed-system/index.html index 6ab04650a8..d3510cbcf6 100644 --- a/Exams/Distributed System/distributed-system/index.html +++ b/Exams/Distributed System/distributed-system/index.html @@ -4,12 +4,12 @@ Distributed system | Operating Systems - - + +
    -

    Distributed system

    Scenario

    We are designing a distributed e-learning system across multiple servers. +

    Distributed system

    Scenario

    We are designing a distributed e-learning system across multiple servers. The system consists of frontend services to handle client requests (for example, when a client accesses https://curs.upb.ro) and backend services for information storage.

    Respond to the following questions with "True" or "False" and provide reasoning for each answer. The explanation should be concise, 2-3 sentences for each response.

    Questions

    1. The backend service will benefit from the use of buffer cache. Answer: True

    2. The frontend application must necessarily be multi-threaded. @@ -23,7 +23,7 @@ Answer: False

    3. SSD storage is required for the frontend service. Answer: False

    4. The backend service uses a lot of memory - almost the entire system memory. Answer: True

    - - + + \ No newline at end of file diff --git a/Exams/FaaS Application/faas-application/index.html b/Exams/FaaS Application/faas-application/index.html new file mode 100644 index 0000000000..c1da387f69 --- /dev/null +++ b/Exams/FaaS Application/faas-application/index.html @@ -0,0 +1,32 @@ + + + + + +FaaS Application | Operating Systems + + + + +
    +

    FaaS Application

    Scenario

    We aim to implement a Function as a Service (FaaS) type service. +This service exposes a REST network API. +With this API, network clients can order the remote execution of programs. +A client sends the program written in a given programming language to be remotely executed, along with the program's arguments. +The FaaS service runs the program and transmits the result to the client.

    Respond to the following questions with "True" or "False" and justify the answer. +The justification should be simple, 2-3 sentences for each response.

    Questions

    1. The service uses shared memory to interact with clients. +Answer: False

    2. The service can run distributed, with client requests being redirected to multiple execution systems. +Answer: True

    3. For security reasons, programs (functions) are executed in isolated contexts, within containers or virtual machines. +Answer: True

    4. In handling requests, the service will benefit from an implementation with a thread pool. +Answer: True

    5. During its execution, the service does NOT generate involuntary context switches. +Answer: False

    6. Among processor, memory, network, and disk resources, the service uses the least disk. +Answer: True

    7. The service does NOT consume file descriptors outside of the standard descriptors 0, 1 and 2. +Answer: False

    8. The service would lead to significant performance improvements if implemented in a low-level language like C compared to a high-level one like Python. +Answer: False

    9. To serve requests and execute programs sent by clients, the service will start new processes. +Answer: True

    10. During the execution of the service, NO hardware interrupts are generated. +Answer: False

    11. The service can only operate on a Linux operating system. +Answer: False

    + + + + \ No newline at end of file diff --git a/Exams/Network Configurations Manager/network-configurations-manager/index.html b/Exams/Network Configurations Manager/network-configurations-manager/index.html index aabba9b2d7..2fb6166cd1 100644 --- a/Exams/Network Configurations Manager/network-configurations-manager/index.html +++ b/Exams/Network Configurations Manager/network-configurations-manager/index.html @@ -4,12 +4,12 @@ Network Configurations Manager | Operating Systems - - + +
    -

    Network Configurations Manager

    Scenario

    We aim to implement an application to run on a home router (Wi-Fi router) to manage network configurations: routing, port forwarding, firewall, Wi-Fi security, etc. +

    Network Configurations Manager

    Scenario

    We aim to implement an application to run on a home router (Wi-Fi router) to manage network configurations: routing, port forwarding, firewall, Wi-Fi security, etc. The router runs a modern operating system - rich OS, like Linux. Other applications, such as a web service providing a user web interface, will interact with the configuration application through IPC mechanisms to query the state of network configurations and/or modify them.

    Answer the following questions with "True" or "False" and justify the answer. Justification should be simple, 2-3 sentences for each answer.

    Questions

    1. The application must be written entirely in a compiled language like C/C++/Rust. @@ -23,8 +23,8 @@ Answer: False

    2. Two instances of the application can be started on the system. Answer: True

    3. In the application's address space, there are memory areas without write permissions. Answer: True

    4. The application process will consistently have the highest priority. -Answer: False

    - - +Answer: False

    + + \ No newline at end of file diff --git a/Exams/Network Performance Utility/network-performance-utility/index.html b/Exams/Network Performance Utility/network-performance-utility/index.html index a805291c7c..9894a05a56 100644 --- a/Exams/Network Performance Utility/network-performance-utility/index.html +++ b/Exams/Network Performance Utility/network-performance-utility/index.html @@ -4,12 +4,12 @@ Network Performance Utility | Operating Systems - - + +
    -

    Network Performance Utility

    Scenario

    We aim to implement a utility to measure network performance similar to tools like iperf or speedtest. +

    Network Performance Utility

    Scenario

    We aim to implement a utility to measure network performance similar to tools like iperf or speedtest. This utility will present metrics such as bandwidth (download and upload), network latency/response time (also known as RTT - round trip time) for various sites. Typically, the utility will establish multiple connections/transfers and display their average.

    Respond to the following questions with "True" or "False" and justify the answer. The justification should be simple, 2-3 sentences for each answer.

    Questions

    1. The utility can use UNIX sockets for measurements. @@ -24,7 +24,7 @@ Answer: True

    2. The process started by the utility will use shared memory mechanisms. Answer: False

    3. The process started by the utility is a component that requires additional security/isolation compared to other processes. Answer: False

    - - + + \ No newline at end of file diff --git a/Exams/Nightly Builds System/nightly-builds-system/index.html b/Exams/Nightly Builds System/nightly-builds-system/index.html index afca288367..8c658da156 100644 --- a/Exams/Nightly Builds System/nightly-builds-system/index.html +++ b/Exams/Nightly Builds System/nightly-builds-system/index.html @@ -4,12 +4,12 @@ Nightly Builds System | Operating Systems - - + +
    -

    Nightly Builds System

    Scenario

    We are designing and implementing a nightly builds system, where different components and versions are compiled. +

    Nightly Builds System

    Scenario

    We are designing and implementing a nightly builds system, where different components and versions are compiled. The system receives build requests in the form of build files (e.g., Makefiles). The reception is done by a dispatcher component, which then forwards the requests to worker components to be executed. The worker components can (and it's recommended) run on other systems @@ -29,7 +29,7 @@ Answer: True

  • The dispatcher component does not cause page faults. Answer: False

  • The dispatcher system can function as both a statically compiled and a dynamically compiled application. Answer: True

  • - - + + \ No newline at end of file diff --git a/Exams/System Process Monitoring Tool/system-process-monitoring-tool/index.html b/Exams/System Process Monitoring Tool/system-process-monitoring-tool/index.html index c76946d347..e9797c4d07 100644 --- a/Exams/System Process Monitoring Tool/system-process-monitoring-tool/index.html +++ b/Exams/System Process Monitoring Tool/system-process-monitoring-tool/index.html @@ -4,12 +4,12 @@ System Process Monitoring Tool | Operating Systems - - + +
    -

    System Process Monitoring Tool

    Scenario

    We want to use a continuous system process monitoring tool that is portable across multiple operating systems. +

    System Process Monitoring Tool

    Scenario

    We want to use a continuous system process monitoring tool that is portable across multiple operating systems. The application shows the resource consumption trends (CPU, memory, disk, network) for all system processes throughout their lifespan. Information is periodically collected using specific operating system interfaces, and it's stored in a database.

    Answer the following questions with "True" or "False" and justify the answer. Justification should be simple, 2-3 sentences for each answer.

    Questions

    1. The application must run in privileged mode. @@ -24,7 +24,7 @@ Answer: False

    2. The application benefits from using the buffer cache. Answer: True

    3. The application can be implemented without using synchronization primitives. Answer: True

    - - + + \ No newline at end of file diff --git a/Exams/User-level Threading Library/user-level-threading-library/index.html b/Exams/User-level Threading Library/user-level-threading-library/index.html index ea60e5624a..edc24ec63a 100644 --- a/Exams/User-level Threading Library/user-level-threading-library/index.html +++ b/Exams/User-level Threading Library/user-level-threading-library/index.html @@ -4,12 +4,12 @@ User-level Threading Library | Operating Systems - - + +
    -

    User-level Threading Library

    Scenario

    We aim to implement a user-level threading library that provides a POSIX Threads (pthreads) API. +

    User-level Threading Library

    Scenario

    We aim to implement a user-level threading library that provides a POSIX Threads (pthreads) API. The library should be portable across different operating systems and architectures and should be usable in programs written in various programming languages.

    Answer the following questions with "True" or "False" and justify the answer. Justification should be simple, 2-3 sentences for each answer.

    Questions

    1. The library can only be used in programs written in compiled languages, NOT interpreted ones. Answer: False

    2. The library can work on operating systems with and without kernel-level thread support. @@ -23,7 +23,7 @@ Answer: True

    3. A program using the library will use only one core/processor. Answer: True

    4. Programs using the library cannot use shared memory to communicate with other processes. Answer: False

    - - + + \ No newline at end of file diff --git a/Exams/index.html b/Exams/index.html index 16cf6776c6..caa0cbe57c 100644 --- a/Exams/index.html +++ b/Exams/index.html @@ -4,13 +4,13 @@ Exams | Operating Systems - - + + - - +
    + + \ No newline at end of file diff --git a/Hackathons/Lambda Function Loader/index.html b/Hackathons/Lambda Function Loader/index.html index 53f0cf1df0..bcde87c4ac 100644 --- a/Hackathons/Lambda Function Loader/index.html +++ b/Hackathons/Lambda Function Loader/index.html @@ -4,8 +4,8 @@ Lambda Function Loader | Operating Systems - - + +
    @@ -42,7 +42,7 @@ Implement measures to prevent data leaks.
  • Conducting performance optimizations.
  • Establishing application logging.
  • Managing configuration files/options: Configure the server during startup based on specified options/configuration files such as maximum client count, socket type preferences, etc.
  • Real-time server monitoring and statistical extraction (e.g. client count, loaded libraries, memory usage, etc.).
  • Adapting the implementation to another programming language (the initial skeleton is in C, but the communication's nature allows implementation in any language meeting project requirements).
  • Generating a suitable response in cases where the requested function exceeds a TIMEOUT or performs actions leading to server shutdown (e.g. invalid memory access, exit/abort calls). The solution's complexity may vary based on how the client's connection termination is handled (whether an error message is conveyed) and how the cause of execution termination is identified.
  • - - + + \ No newline at end of file diff --git a/Hackathons/index.html b/Hackathons/index.html index 3f11491aa2..149b12c7f7 100644 --- a/Hackathons/index.html +++ b/Hackathons/index.html @@ -4,13 +4,13 @@ Hackathons | Operating Systems - - + + - - +
    + + \ No newline at end of file diff --git a/Lab/Application Interaction/arena/index.html b/Lab/Application Interaction/arena/index.html index 369c1b5c3f..d37e58433f 100644 --- a/Lab/Application Interaction/arena/index.html +++ b/Lab/Application Interaction/arena/index.html @@ -4,8 +4,8 @@ Arena | Operating Systems - - + +
    @@ -47,7 +47,7 @@ So, in order to make the internet work, all we have to do is a simple NAT, with a command like:

    root@8333e5cefb0d:/app# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

    Now, the virtual machines should have internet access:

    root@8333e5cefb0d:/app# ssh root@192.168.0.2
    [...]
    root@ubuntu:~# curl google.com
    <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
    <TITLE>301 Moved</TITLE></HEAD><BODY>
    <H1>301 Moved</H1>
    The document has moved
    <A HREF="http://www.google.com/">here</A>.
    </BODY></HTML>

    Now your task is to run the iptables command above automatically when the system starts, so that it's not necessary to run it manually like we did in the above example.

    A good place to do this is in the create_one_network function in network.py. There you can add another subprocess.run call to run iptables. The 192.168.0.0/24 value should not be hardcoded, but you can take it from the ip_with_prefixlen member of the Net object.

    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/dbus/index.html b/Lab/Application Interaction/dbus/index.html index 53d27764d7..005a545e4e 100644 --- a/Lab/Application Interaction/dbus/index.html +++ b/Lab/Application Interaction/dbus/index.html @@ -4,8 +4,8 @@ D-Bus | Operating Systems - - + +
    @@ -38,7 +38,7 @@ Indeed, we see that this object exists in d-feet as well:

    dfeet-firefox

    We can try to call the OpenURL method ourselves, directly from d-feet. The method has only one argument of the type Array of [Byte]. Although there's no documentation for it, we can use the same byte array that we saw in dbus-monitor:

       array of bytes [
    02 00 00 00 1a 00 00 00 2f 00 00 00 2f 68 6f 6d 65 2f 61 64 72 69 61 6e
    73 00 2f 6f 70 74 2f 66 69 72 65 66 6f 78 2f 66 69 72 65 66 6f 78 00 77
    77 77 2e 67 6f 6f 67 6c 65 2e 63 6f 6d 00
    ]

    (Note that 77 77 77 2e 67 6f 6f 67 6c 65 2e 63 6f 6d at the end is the string www.google.com, so that's another confirmation that we're on the right track).

    dfeet-url-open

    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/index.html b/Lab/Application Interaction/index.html index a5ff46c19a..2df0268da5 100644 --- a/Lab/Application Interaction/index.html +++ b/Lab/Application Interaction/index.html @@ -4,13 +4,13 @@ Application Interaction | Operating Systems - - + + - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/os-cloud/index.html b/Lab/Application Interaction/os-cloud/index.html index 279519403d..4a1b372f86 100644 --- a/Lab/Application Interaction/os-cloud/index.html +++ b/Lab/Application Interaction/os-cloud/index.html @@ -4,8 +4,8 @@ OS Cloud | Operating Systems - - + +
    @@ -57,7 +57,7 @@ Then delete all vm disks with sudo rm -rf vm-disks/*.

    With vm_stop implemented, the system should work like this:

    student@os:~/.../support/os-cloud$ curl -s localhost:5000/vm_list | jq .
    [
    {
    "id": 1,
    "name": "my_vm"
    }
    ]
    student@os:~/.../support/os-cloud$ curl -H "Content-Type: application/json" -d '{ "id": 1}' localhost:5000/vm_scurl -s -H "Content-Type: application/json" -d '{ "id": 1 }' localhost:5000/vm_info | jq .
    {
    "disk_size": 10737418240,
    "id": 1,
    "ip": "192.168.0.2",
    "mem_size": 2147483648,
    "name": "my_vm",
    "network": "default",
    "os": "ubuntu_22.04",
    "state": "RUNNING"
    }

    The vm is in the RUNNING state. Now let's stop it:

    student@os:~/.../support/os-cloud$ curl -H "Content-Type: application/json" -d '{ "id": 1}' localhost:5000/vm_stop
    {"status":"ok"}
    student@os:~/.../support/os-cloud$ curl -s -H "Content-Type: application/json" -d '{ "id": 1 }' localhost:5000/vm_info | jq .
    {
    "disk_size": 10737418240,
    "id": 1,
    "ip": "192.168.0.2",
    "mem_size": 2147483648,
    "name": "my_vm",
    "network": "default",
    "os": "ubuntu_22.04",
    "state": "STOPPED"
    }

    Now the state is STOPPED. Inside the container, the qemu process should be gone as well:

    student@os:~/.../support/os-cloud$ docker-compose exec os-cloud bash
    root@b0600eff8903:/app# ps -ef
    UID PID PPID C STIME TTY TIME CMD
    root 1 0 0 10:00 ? 00:00:00 /sbin/docker-init -- python3 -u app.py
    root 7 1 0 10:00 ? 00:00:00 python3 -u app.py
    root 33 0 0 10:00 pts/3 00:00:00 bash
    root 41 33 0 10:00 pts/3 00:00:00 ps -ef

    Finally, the vm can be started again using vm_start:

    student@os:~/.../support/os-cloud$ curl -H "Content-Type: application/json" -d '{ "id": 1}' localhost:5000/vm_start
    {"status":"ok"}
    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/overview/index.html b/Lab/Application Interaction/overview/index.html index be525c40bb..6216b695b9 100644 --- a/Lab/Application Interaction/overview/index.html +++ b/Lab/Application Interaction/overview/index.html @@ -4,14 +4,14 @@ Application Interaction | Operating Systems - - + +

    Application Interaction

    In this chapter, you will discover various mechanisms through which applications on a system can interact. You will see these mechanisms in action in existing applications, but also use them in some code of your own.

    Setup

    Make sure the following packages are installed:

    sudo apt-get -y update; sudo apt-get -y install net-tools x11-apps libssl-dev d-feet firefox

    Contents

    1. Time Server
    2. Password Cracker
    3. The X Window System
    4. D-Bus
    5. OS Cloud
    6. Arena
    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/password-cracker/index.html b/Lab/Application Interaction/password-cracker/index.html index 8e2e4e1bbc..51fd92b58e 100644 --- a/Lab/Application Interaction/password-cracker/index.html +++ b/Lab/Application Interaction/password-cracker/index.html @@ -4,8 +4,8 @@ Password Cracker | Operating Systems - - + +
    @@ -25,7 +25,7 @@ One simple way to do this is to print out the current process ID at the beginning of the function. To get the current process ID, use the getpid function from the os module.

    Multithreaded Version in Python

    Code in support/password-cracker/python/password-cracker-multithread.py.

    The Python equivalent of the previous multithreaded version.

    student@os:~/.../support/password-cracker$ python3 python/password-cracker-multithread.py
    worker 7 found haxx

    This example is given only to provide an idea of how a multithreaded program is written. Remember that CPU-bound threads in python don't actually run in parallel, due to the Global Interpreter Lock.

    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/quiz/cgroups-vs-namespaces/index.html b/Lab/Application Interaction/quiz/cgroups-vs-namespaces/index.html index 92bf00d1b2..61f2ec89b8 100644 --- a/Lab/Application Interaction/quiz/cgroups-vs-namespaces/index.html +++ b/Lab/Application Interaction/quiz/cgroups-vs-namespaces/index.html @@ -4,14 +4,14 @@ Cgroups versus namespaces | Operating Systems - - + +

    Cgroups versus namespaces

    Question Text

    Which of the following affirmations about namespaces and cgroups is correct?

    Question Answers

    • Cgroups provide resource management and namespaces provide isolation and security.
    • Namespaces provide resource management and cgroups provide isolation and security.

    • Both provide resource management.

    • Both provide isolation and security.

    Feedback

    They both serve different purposes, cgroups provide resource management and namespaces provide isolation and security. Cgroups manage resources, while namespaces isolate and secure them.

    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/quiz/container-vs-vm/index.html b/Lab/Application Interaction/quiz/container-vs-vm/index.html index e492ea66f8..63abbe91ff 100644 --- a/Lab/Application Interaction/quiz/container-vs-vm/index.html +++ b/Lab/Application Interaction/quiz/container-vs-vm/index.html @@ -4,13 +4,13 @@ Container versus VM | Operating Systems - - + +

    Container versus VM

    Question Text

    What is one advantage of using containers over VMs in regard to starting times and memory consumption?

    Question Answers

    • VMs can start up faster and use less memory than containers.
    • Containers can start up faster and use less memory than VMs.
    • The comparison cannot be made.

    Feedback

    This means that they impose less resource overhead than virtual machines, which need to run a complete guest operating system on top of the host operating system using a hypervisor.

    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/quiz/time-server-interop/index.html b/Lab/Application Interaction/quiz/time-server-interop/index.html index 1a930c07de..eb65f4e0d2 100644 --- a/Lab/Application Interaction/quiz/time-server-interop/index.html +++ b/Lab/Application Interaction/quiz/time-server-interop/index.html @@ -4,15 +4,15 @@ Time Server Interoperability | Operating Systems - - + +

    Time Server Interoperability

    Question Text

    Is the protocol between the python server and the python client the same? Can we run the python server and connect to it via the C client?

    Question Answers

    • Yes
    • No, the protocols are different

    Feedback

    By doing the same investigation on the python server we discover that the protocol is the same. This means that we can run the python server and the C client, or the C server and python client, and everything will work:

    student@os:~/.../support/time-server/python$ python3 server.py
    student@os:~/.../support/time-server$ ./client 127.0.0.1 2000
    The time is Thu Sep 1 11:48:03 2022
    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/quiz/time-server/index.html b/Lab/Application Interaction/quiz/time-server/index.html index 565629a918..10c0d1d916 100644 --- a/Lab/Application Interaction/quiz/time-server/index.html +++ b/Lab/Application Interaction/quiz/time-server/index.html @@ -4,13 +4,13 @@ Time Server Protocol | Operating Systems - - + +

    Time Server Protocol

    Question Text

    What format does the message exchanged between the server and the client have?

    Question Answers

    • 4 byte length (little endian) followed by 8 byte timestamp (little endian)

    • 8 byte length (little endian) followed by 4 byte timestamp (little endian)

    • 4 byte length (big endian) followed by 8 byte timestamp (big endian)
    • 8 byte length (big endian) followed by 4 byte timestamp (big endian)

    Feedback

    If we consider one output example:

    00000000  00 00 00 08 00 00 00 00  63 1b a9 50              |........c..P|
    0000000c

    We can identify the 4 byte length in big endian (00 00 00 08), then the 8 byte timestamp (00 00 00 00 63 1b a9 50), also in big endian.

    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/quiz/timer/index.html b/Lab/Application Interaction/quiz/timer/index.html index de323c8902..39107114f0 100644 --- a/Lab/Application Interaction/quiz/timer/index.html +++ b/Lab/Application Interaction/quiz/timer/index.html @@ -4,13 +4,13 @@ Oneko Timer | Operating Systems - - + +

    Oneko Timer

    Question Text

    What is the purpose of the timer used in the Oneko's implementantion

    Question Answers

    • Slow down the cat
    • Speed up the cat

    • It server no purpose

    Feedback

    The purpose of the timer is to delay the cat. You can verify this by running

    while true; do kill -14 $(pidof oneko)

    You'll notice the cat is much faster in following your mouse.

    Try and find other ways to "hack" Oneko to make it move faster.

    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/quiz/vm-creation/index.html b/Lab/Application Interaction/quiz/vm-creation/index.html index 4b85b56cdf..5a3d15f5e9 100644 --- a/Lab/Application Interaction/quiz/vm-creation/index.html +++ b/Lab/Application Interaction/quiz/vm-creation/index.html @@ -4,13 +4,13 @@ VM Creation | Operating Systems - - + +

    VM Creation

    Question Text

    How do you create a new virtual machine with a memory of 3GB and disk size of 100 GB?

    Question Answers

    • By running curl -H "Content-Type: application/json" -d '{ "name": "my_vm", "image": "ubuntu_22.04", "network": "default", "mem_size": "3G", "disk_size": "100G"}' localhost:5000/vm_create
    • By running curl -H "Content-Type: application/json" -d '{ "name": "my_vm", "image": "ubuntu_22.04", "network": "default", "mem_size": "3G", "disk_size": "100G"}' localhost:5000/vm_delete

    • By running curl -H "Content-Type: application/json" -d '{ "name": "my_vm", "image": "ubuntu_22.04", "network": "default", "mem_size": "3G", "disk_size": "101G"}' localhost:5000/vm_create

    • By running curl -H "Content-Type: application/json" -d '{ "name": "my_vm", "image": "ubuntu_22.04", "network": "default", "mem_size": "6G", "disk_size": "1000G"}' localhost:5000/vm_delete

    Feedback

    We need to uso curl with the right path localhost:5000/vm_create, specifying the right data { "name": "my_vm", "image": "ubuntu_22.04", "network": "default", "mem_size": "3G", "disk_size": "100G"}.

    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/time-server/index.html b/Lab/Application Interaction/time-server/index.html index acd6519764..e5a4035cbf 100644 --- a/Lab/Application Interaction/time-server/index.html +++ b/Lab/Application Interaction/time-server/index.html @@ -4,8 +4,8 @@ Time Server | Operating Systems - - + +
    @@ -14,7 +14,7 @@ Once a client has connected, the server will send the current time to it. The client will then print the received time to the console.

    Let's build and run this example:

    student@os:~/.../support/time-server$ make
    gcc -Wall -o server server.c
    gcc -Wall -o client client.c
    student@os:~/.../support/time-server$ ./server

    Then, in another terminal:

    student@os:~/.../support/time-server$ ./client 127.0.0.1 2000
    The time is Thu Sep 1 11:48:03 2022

    Python Version

    In support/time-server/python we have the equivalent python implementation for both the server and client:

    student@os:~/.../support/time-server/python$ python3 server.py
    student@os:~/.../support/time-server/python$ python3 client.py 127.0.0.1 2000
    The time is Thu Sep 1 11:58:01 2022

    Practice

    Try to figure out the protocol used by the server and the client. You can do this by reading the source code, corroborated with information obtained at runtime.

    Run the server again (the version in C), but instead of running the client, let's run netcat and pipe the output to hexdump:

    nc -d 127.0.0.1 2000 | hexdump -C

    Quiz

    Quiz

    - - + + \ No newline at end of file diff --git a/Lab/Application Interaction/x-window-system/index.html b/Lab/Application Interaction/x-window-system/index.html index bdafc91490..dabad1a71a 100644 --- a/Lab/Application Interaction/x-window-system/index.html +++ b/Lab/Application Interaction/x-window-system/index.html @@ -4,8 +4,8 @@ The X Window System | Operating Systems - - + +
    @@ -17,7 +17,7 @@ A very simple example is the xeyes application:

    student@os:~$ strace -e trace=socket,connect xeyes
    socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3
    connect(3, {sa_family=AF_UNIX, sun_path=@"/tmp/.X11-unix/X0"}, 20) = 0

    As expected, the application creates a Unix socket, then connects to the path @"/tmp/.X11-unix/X0".

    Furthermore, let's confirm that there is actual communication taking place between xeyes and the X server. We'll run xeyes again, and then we'll keep moving the mouse cursor around. When the mouse is moved, the following events are taking place:

    • The X server captures the mouse movements (since the server is the one that controls the mouse)
    • The X server will pass these "mouse moved" events to the clients (including xeyes)
    • The client (xeyes) uses these events to update its window (changing the position of the pupils inside the eyes)

    So, if we run xeyes under strace, we expect to see some communication on the Unix socket that is created at the beginning:

    strace -e 'trace=!poll' -e trace='socket,connect,recvmsg' xeyes |& grep -v '\-1 EAGAIN'

    strace-xeyes

    - - + + \ No newline at end of file diff --git a/Lab/Compute/arena/index.html b/Lab/Compute/arena/index.html index 63ff9d49a7..c44d717ce3 100644 --- a/Lab/Compute/arena/index.html +++ b/Lab/Compute/arena/index.html @@ -4,8 +4,8 @@ Arena | Operating Systems - - + +
    @@ -130,7 +130,7 @@ Note the second number go up in the monitoring terminal.

    Comment the posix_fadvise() call, recompile the program, and run it again. You won't get any major page fault, because the file contents are cached by the OS, to avoid those page faults. As a rule, the OS will avoid major page faults whenever possible, because they are very costly in terms of running time.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/copy-on-write/index.html b/Lab/Compute/copy-on-write/index.html index 150386b9e1..89053a550d 100644 --- a/Lab/Compute/copy-on-write/index.html +++ b/Lab/Compute/copy-on-write/index.html @@ -4,8 +4,8 @@ Copy-on-Write | Operating Systems - - + +
    @@ -33,7 +33,7 @@ It's a way of marking certain allocated pages so that copy-on-write is disabled. As you may imagine, changes made by the parent to this memory are visible to the child and vice-versa. You can learn more about it in its dedicated section in the Arena.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/hardware-perspective/index.html b/Lab/Compute/hardware-perspective/index.html index e60f7ddb57..9f2ea4784b 100644 --- a/Lab/Compute/hardware-perspective/index.html +++ b/Lab/Compute/hardware-perspective/index.html @@ -4,8 +4,8 @@ Hardware Perspective | Operating Systems - - + +
    @@ -31,7 +31,7 @@ Similarly, each process can spawn however many threads, which are also managed by the OS. The OS decides when and on what CPU core to make each thread run. This is in line with the general interaction between an application and the hardware: it is always mediated by the OS.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/index.html b/Lab/Compute/index.html index ec4da82a85..c7aebd8b96 100644 --- a/Lab/Compute/index.html +++ b/Lab/Compute/index.html @@ -4,13 +4,13 @@ Compute | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Lab/Compute/overview/index.html b/Lab/Compute/overview/index.html index 70295290c2..d9e41e97e6 100644 --- a/Lab/Compute/overview/index.html +++ b/Lab/Compute/overview/index.html @@ -4,13 +4,13 @@ Compute | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Lab/Compute/processes-threads-apache2/index.html b/Lab/Compute/processes-threads-apache2/index.html index 1dbd4555a0..926245e65c 100644 --- a/Lab/Compute/processes-threads-apache2/index.html +++ b/Lab/Compute/processes-threads-apache2/index.html @@ -4,8 +4,8 @@ Usage of Processes and Threads in `apache2` | Operating Systems - - + +
    @@ -37,7 +37,7 @@ This is required by the very large workloads such applications are commonly required to process.

    These rules are not set in stone, though. Like we saw in the apache2 example, the server uses multiple threads as well as multiple processes. This provides a degree of stability - if one worker thread crashes, it will only crash the other threads belonging to the same process - while still taking advantage of the light resource usage inherent to threads.

    These kinds of trade-offs are a normal part of the development of real-world applications.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/processes/index.html b/Lab/Compute/processes/index.html index 3f951dbf06..71be42ffa2 100644 --- a/Lab/Compute/processes/index.html +++ b/Lab/Compute/processes/index.html @@ -4,8 +4,8 @@ Processes | Operating Systems - - + +
    @@ -84,7 +84,7 @@ Use a similar logic and a similar set of prints to those in the support code. Take a look at the printed PIDs. Make sure the PPID of the "grandchild" is the PID of the child, whose PPID is, in turn, the PID of the parent.

    Moral of the story: Usually the execution flow is:

    1. fork(), followed by

    2. wait() (called by the parent)

    3. exit(), called by the child.

    The order of last 2 steps may be swapped.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/apache2-strace/index.html b/Lab/Compute/quiz/apache2-strace/index.html index c9c19de9e7..73043a2825 100644 --- a/Lab/Compute/quiz/apache2-strace/index.html +++ b/Lab/Compute/quiz/apache2-strace/index.html @@ -4,14 +4,14 @@ `apache2` Document Root | Operating Systems - - + +
    Skip to main content

    apache2 Document Root

    Question Text

    What is the document root of the apache2 server?

    Question Answers

    • /etc/apache2
    • /usr/local/apache2/htdocs/
    • /var/www/html

    • /var/www/apache2/htdocs

    Feedback

    In strace we see that the server opens the file /usr/local/apache2/htdocs/index.html. This means that the document root is /usr/local/apache2/htdocs/.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/cause-of-file-not-found-error/index.html b/Lab/Compute/quiz/cause-of-file-not-found-error/index.html index 18cf162f36..f71d7e6c08 100644 --- a/Lab/Compute/quiz/cause-of-file-not-found-error/index.html +++ b/Lab/Compute/quiz/cause-of-file-not-found-error/index.html @@ -4,8 +4,8 @@ Cause of `FileNotFoundError` | Operating Systems - - + +
    @@ -15,7 +15,7 @@ It's impossible to say what kind of data will be used by the first thread. In our case, the data is the file you give to the script as an argument. If scheduling the parent process or its running time takes long enough, the file may have been created by the time the parent needs it, but we can never be sure.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/child-faults-after-write/index.html b/Lab/Compute/quiz/child-faults-after-write/index.html index 65f9676a3b..a0de6ae84e 100644 --- a/Lab/Compute/quiz/child-faults-after-write/index.html +++ b/Lab/Compute/quiz/child-faults-after-write/index.html @@ -4,13 +4,13 @@ Child Faults After Write | Operating Systems - - + +
    Skip to main content

    Child Faults After Write

    Question Text

    What causes the page faults registered by the child after the fifth step?

    Question Answers

    • The child writes data to the frames it previously shared with its parent and the copy-on-write mechanism copies and remaps them before writing said data
    • Demand paging propagates the lazy allocation of pages from the parent to the child

    • Creating the child process inherently duplicates some frames

    • They are caused by the loader forking itself when creating the child process

    • They are caused by the bash process forking itself when creating the child process

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/coarse-vs-granular-critical-section/index.html b/Lab/Compute/quiz/coarse-vs-granular-critical-section/index.html index ee9479ced8..5858356ed9 100644 --- a/Lab/Compute/quiz/coarse-vs-granular-critical-section/index.html +++ b/Lab/Compute/quiz/coarse-vs-granular-critical-section/index.html @@ -4,8 +4,8 @@ Coarse vs Granular Critical Section | Operating Systems - - + +
    @@ -14,7 +14,7 @@ The second thread then finds the mutex locked and enters the WAITING state. When the first thread finishes its loop, it calls unlock() and wakes up the second thread, which acquires the lock and starts its loop.

    In the more granular example, in the worst case, the holder of the mutex can change at every step of the loop. This would mean 1 context switch per step per thread, i.e. 20 million context switches.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/create-sleepy-process-ending/index.html b/Lab/Compute/quiz/create-sleepy-process-ending/index.html index d2d2615684..f42a736301 100644 --- a/Lab/Compute/quiz/create-sleepy-process-ending/index.html +++ b/Lab/Compute/quiz/create-sleepy-process-ending/index.html @@ -4,14 +4,14 @@ `create_sleepy` Process Ending | Operating Systems - - + +
    Skip to main content

    create_sleepy Process Ending

    Question Text

    Why does the create_sleepy process wait a very long time before ending? Use system's man page to find the answer.

    Question Answers

    • Because the code is unoptimised (the default optimisation level is -O0)

    • Because the operating system takes very long to finish the process

    • Because system returns when the command given to it (sleep 1000) ends
    • Because the CPU is very slow

    Feedback

    The man page says it clearly:

    system() returns after the command has been completed.

    Therefore, in our case, it returns after sleep 1000 ends.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/fiber-strace/index.html b/Lab/Compute/quiz/fiber-strace/index.html index 1017983079..f042365c57 100644 --- a/Lab/Compute/quiz/fiber-strace/index.html +++ b/Lab/Compute/quiz/fiber-strace/index.html @@ -4,14 +4,14 @@ Fiber Strace | Operating Systems - - + +
    Skip to main content

    Fiber Strace

    Question Text

    How many clone() system calls are performed when creating a fiber?

    Question Answers

    • none
    • one for each fiber

    • one for every 2 fibers

    • 2 for each fiber

    Feedback

    Being user-level threads, the fibers aren't created by the operating system. The only system calls that you see used are mmap() and munmap(), used to create each fiber's stack.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/mini-shell-stops-after-command/index.html b/Lab/Compute/quiz/mini-shell-stops-after-command/index.html index 7bf088ecf9..bdb1b35d18 100644 --- a/Lab/Compute/quiz/mini-shell-stops-after-command/index.html +++ b/Lab/Compute/quiz/mini-shell-stops-after-command/index.html @@ -4,8 +4,8 @@ Mini-shell Stops After Command | Operating Systems - - + +
    @@ -13,7 +13,7 @@ So when you exec*("ls"), for example, the mini_shell process becomes ls. There is no more mini_shell past this point. So when ls ends, there is no mini_shell process to continue its execution anymore.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/mmap-cow-flag/index.html b/Lab/Compute/quiz/mmap-cow-flag/index.html index 9dde8e9d38..55ee036e1f 100644 --- a/Lab/Compute/quiz/mmap-cow-flag/index.html +++ b/Lab/Compute/quiz/mmap-cow-flag/index.html @@ -4,13 +4,13 @@ Copy-on-write Flag for `mmap()` | Operating Systems - - + +
    Skip to main content

    Copy-on-write Flag for mmap()

    Question Text

    From the description in its man page, what flag should we pass to mmap() in order to mark the mapped pages as copy-on-write?

    Question Answers

    • MAP_SHARED
    • MAP_PRIVATE
    • MAP_ANONYMOUS

    • MAP_POPULATE

    Feedback

    Quoting the man page:

    MAP_PRIVATE
    Create a private copy-on-write mapping.
    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/notify-only-with-mutex/index.html b/Lab/Compute/quiz/notify-only-with-mutex/index.html index 57bb45b0bd..c78e21751d 100644 --- a/Lab/Compute/quiz/notify-only-with-mutex/index.html +++ b/Lab/Compute/quiz/notify-only-with-mutex/index.html @@ -4,8 +4,8 @@ Both Condition and Mutex | Operating Systems - - + +
    @@ -13,7 +13,7 @@ For this reason, it is unsafe to only use a mutex as a notification mechanism. In addition, a mutex cannot notify more than one thread at once, if we so desire. Mutexes are only meant to be used to isolate a critical section within the same thread.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/number-of-running-ults/index.html b/Lab/Compute/quiz/number-of-running-ults/index.html index 46da683cfa..b7192b0068 100644 --- a/Lab/Compute/quiz/number-of-running-ults/index.html +++ b/Lab/Compute/quiz/number-of-running-ults/index.html @@ -4,14 +4,14 @@ Number of RUNNING User-Level Threads | Operating Systems - - + +
    Skip to main content

    Number of RUNNING User-Level Threads

    Question Text

    How many threads can be RUNNING simultaneously if we only create them using the API exposed by libult.so?

    Question Answers

    • Equal to the number of cores on the CPU
    • 1
    • None

    • 2: the main thread and another one for the created threads

    Feedback

    Only kernel-level threads can run in parallel. Since all libult.so threads are user-level threads, they run within the same kernel-level thread, so only one of them can run at any time.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/parent-faults-before-fork/index.html b/Lab/Compute/quiz/parent-faults-before-fork/index.html index e198474c3f..87ccf56976 100644 --- a/Lab/Compute/quiz/parent-faults-before-fork/index.html +++ b/Lab/Compute/quiz/parent-faults-before-fork/index.html @@ -4,13 +4,13 @@ Parent Faults before `fork()` | Operating Systems - - + +
    Skip to main content

    Parent Faults before fork()

    Question Text

    What causes the page faults that occur between the first and second steps?

    Question Answers

    • Calling fork() duplicates the pages previously allocated by the parent
    • Demand paging makes the pages in the p array to be mapped to frames only when written
    • The OS duplicates the parent's pages in preparation for fork()

    • mmap() sets the pages to be mapped at a later time, decided by the OS

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/parent-of-sleep-processes/index.html b/Lab/Compute/quiz/parent-of-sleep-processes/index.html index 58aa0719d7..ece77a0614 100644 --- a/Lab/Compute/quiz/parent-of-sleep-processes/index.html +++ b/Lab/Compute/quiz/parent-of-sleep-processes/index.html @@ -4,8 +4,8 @@ Parent of `sleep` Processes | Operating Systems - - + +
    @@ -13,7 +13,7 @@ Why?

    Question Answers

    Feedback

    When a process dies without waiting for the termination of all its children, those processes are now orphans. Then the systemd process adopts those orphan processes by default. On older Linux systems, it was the init process who adopted orphans.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/processes-speedup/index.html b/Lab/Compute/quiz/processes-speedup/index.html index 8e749f06ae..9c9a5201dd 100644 --- a/Lab/Compute/quiz/processes-speedup/index.html +++ b/Lab/Compute/quiz/processes-speedup/index.html @@ -4,8 +4,8 @@ Processes Speedup | Operating Systems - - + +
    @@ -16,7 +16,7 @@ Therefore there will always be parts of any given program that cannot be run in parallel. As a result, the speedup can never be equal to the number of processes between which we spread the workload.

    It is possible to compute the speedup obtained from parallelising a portion of a given program. The formula is rather simple and is called Amdahl's law

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/seg-fault-exit-code/index.html b/Lab/Compute/quiz/seg-fault-exit-code/index.html index 377abe8cbe..a6dc65c93d 100644 --- a/Lab/Compute/quiz/seg-fault-exit-code/index.html +++ b/Lab/Compute/quiz/seg-fault-exit-code/index.html @@ -4,8 +4,8 @@ Seg Fault Exit Code | Operating Systems - - + +
    @@ -13,7 +13,7 @@ We can use the WIFSIGNALED() and WTERMSIG() marcros. By doing so, we see the exit code of the faulty child process is 11. We can then use the kill -l command to view the code of each signal and SIGSEGV has the code 11.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/semaphore-equivalent/index.html b/Lab/Compute/quiz/semaphore-equivalent/index.html index e0f06ba240..ac8072fa11 100644 --- a/Lab/Compute/quiz/semaphore-equivalent/index.html +++ b/Lab/Compute/quiz/semaphore-equivalent/index.html @@ -4,14 +4,14 @@ Semaphore Equivalent | Operating Systems - - + +
    Skip to main content

    Semaphore Equivalent

    Question Text

    From running and inspecting the code in support/apache2-simulator/apache2_simulator_semaphore.py, which of the following is an an equivalent to the value of the semaphore sem?

    Question Answers

    • The value of msg_mutex

    • The time a worker thread has to wait before running

    • The length of the messages list
    • The number of worker threads

    Feedback

    sem is incremented (release()) upon adding a message to the messages list and decremented (acquire()) when removing a message from said list. So it's a rough equivalent to the length of this list.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/sleeping-on-a-fiber/index.html b/Lab/Compute/quiz/sleeping-on-a-fiber/index.html index 4795f23041..4c321dd40d 100644 --- a/Lab/Compute/quiz/sleeping-on-a-fiber/index.html +++ b/Lab/Compute/quiz/sleeping-on-a-fiber/index.html @@ -4,14 +4,14 @@ Sleeping on a Fiber | Operating Systems - - + +
    Skip to main content

    Sleeping on a Fiber

    Question Text

    What happens if a fiber calls sleep()?

    Question Answers

    • the whole kernel-level thread is blocked
    • only that fiber is blocked, and is scheduled out

    • nothing, a fiber can't sleep

    • the whole process sleeps - regardless of how many threads there are

    Feedback

    The whole thread on which the fiber runs is blocked until the sleep() call is finished. For this reason, the fibers are best used with asynchronous operations, which you will explore in the following weeks.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/state-of-new-ult/index.html b/Lab/Compute/quiz/state-of-new-ult/index.html index 6b0593b506..07106a449e 100644 --- a/Lab/Compute/quiz/state-of-new-ult/index.html +++ b/Lab/Compute/quiz/state-of-new-ult/index.html @@ -4,14 +4,14 @@ State of new ULT | Operating Systems - - + +
    Skip to main content

    State of new ULT

    Question Text

    What is the first state that is assigned to a newly created ULT?

    Question Answers

    • RUNNING
    • READY
    • COMPLETED

    Feedback

    Inside the function threads_create(), we can see the following snippet queue_enqueue(ready, new). Each new thread is thus added to the READY queue.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/tcb-libult-unikraft/index.html b/Lab/Compute/quiz/tcb-libult-unikraft/index.html index ba99943b85..0c55153649 100644 --- a/Lab/Compute/quiz/tcb-libult-unikraft/index.html +++ b/Lab/Compute/quiz/tcb-libult-unikraft/index.html @@ -4,8 +4,8 @@ Similarities Between the TCBs of `libult` and Unikraft | Operating Systems - - + +
    @@ -14,7 +14,7 @@ argument and arg are pointers to the arguments of start_routine and entry, respectively. context and ctx are the contexts in which the new threads run. return_value and prv are both pointers to the values returned by the thread functions.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/thread-memory/index.html b/Lab/Compute/quiz/thread-memory/index.html index baa278d77c..7a754048e2 100644 --- a/Lab/Compute/quiz/thread-memory/index.html +++ b/Lab/Compute/quiz/thread-memory/index.html @@ -4,14 +4,14 @@ Thread Memory | Operating Systems - - + +
    Skip to main content

    Thread Memory

    Question Text

    Is data used by a thread inaccessible from other threads?

    Question Answers

    • Yes, each thread has its own stack
    • No, each thread can access every address from the virtual address space
    • Only the heap is shared

    • Only the heap and the read-only zones are shared

    Feedback

    Each thread has the same perspective on the system memory - it thinks it owns it all. Therefore, it can perform pointer arithmetic to access every memory address.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/time-slice-value/index.html b/Lab/Compute/quiz/time-slice-value/index.html index 5564d48c81..d3baed8fb5 100644 --- a/Lab/Compute/quiz/time-slice-value/index.html +++ b/Lab/Compute/quiz/time-slice-value/index.html @@ -4,13 +4,13 @@ Time Slice Value | Operating Systems - - + +
    Skip to main content

    Time Slice Value

    Question Text

    Using the man page, what is the time slice used by the scheduler in libult.so?

    Question Answers

    • 100 milliseconds

    • 10 microseconds

    • 100 microseconds

    • 10 milliseconds

    Feedback

    The code we're interested in lies in the function init_profiling_timer():

    const struct itimerval timer = {
    { 0, 10000 },
    { 0, 1 } // arms the timer as soon as possible
    };

    The man page gives the following definition the struct itimerval:

    struct itimerval {
    struct timeval it_interval; /* Interval for periodic timer */
    struct timeval it_value; /* Time until next expiration */
    };

    struct timeval {
    time_t tv_sec; /* seconds */
    suseconds_t tv_usec; /* microseconds */
    };

    So when constructing the timer variable, { 0, 10000 } means 0 seconds and 10000 microseconds, i.e. 0 seconds and 10 milliseconds.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/tls-synchronization/index.html b/Lab/Compute/quiz/tls-synchronization/index.html index 61945edb97..5498b2035e 100644 --- a/Lab/Compute/quiz/tls-synchronization/index.html +++ b/Lab/Compute/quiz/tls-synchronization/index.html @@ -4,14 +4,14 @@ TLS Synchronization | Operating Systems - - + +
    Skip to main content

    TLS Synchronization

    Question Text

    Is placing var from support/race-condition/c/race_condition_tls.c in the TLS a valid form of synchronization?

    Question Answers

    • No, because the race condition remains. It just doesn't manifest itself anymore
    • No, because the threads now access different variables, not the same one
    • Yes, because we now remove the race condition

    • Yes, because now the result is correct

    Feedback

    Synchronization means that both threads should access the same variable, whereas placing it in the TLS makes each of them access a copy of the variable.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/tls-var-copies/index.html b/Lab/Compute/quiz/tls-var-copies/index.html index b9f80bdb31..08180091a3 100644 --- a/Lab/Compute/quiz/tls-var-copies/index.html +++ b/Lab/Compute/quiz/tls-var-copies/index.html @@ -4,13 +4,13 @@ TLS `var` Copies | Operating Systems - - + +
    Skip to main content

    TLS var Copies

    Question Text

    How many copies of the var variable from support/race-condition/c/race_condition_tls.c are there after each thread has modified it at leas once?

    Question Answers

    • 1

    • 2

    • 3
    • 5

    Feedback

    There are 3 copies one for the main() thread, another one for increment_var() and the third for decrement_var().

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/type-of-scheduler-in-libult/index.html b/Lab/Compute/quiz/type-of-scheduler-in-libult/index.html index 74841e0a43..e70083c3de 100644 --- a/Lab/Compute/quiz/type-of-scheduler-in-libult/index.html +++ b/Lab/Compute/quiz/type-of-scheduler-in-libult/index.html @@ -4,8 +4,8 @@ Type of Scheduler in `libult.so` | Operating Systems - - + +
    @@ -13,7 +13,7 @@ Which type of scheduler does libult.so use?

    Question Answers

    Feedback

    libult.so uses a preemptive scheduler. Its timer is initialised in the init_profiling_timer() function. The context switch is performed in the handle_sigprof() function.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/ult-thread-ids/index.html b/Lab/Compute/quiz/ult-thread-ids/index.html index 55bdfe5824..ce68aad571 100644 --- a/Lab/Compute/quiz/ult-thread-ids/index.html +++ b/Lab/Compute/quiz/ult-thread-ids/index.html @@ -4,8 +4,8 @@ ULT Thread IDs | Operating Systems - - + +
    @@ -15,7 +15,7 @@ This is needed in order to associate a ucontext_t with the main thread as well, so the main thread can also be run.

    Feedback

    The threads_create() function calls init_first_context(), which, in turn, calls tcb_new(), thus creating the first context associated with the main thread (the one calling threads_create() the first time). Without this, the scheduler in libult.so wouldn't be able to run the main thread.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/who-calls-execve-parent/index.html b/Lab/Compute/quiz/who-calls-execve-parent/index.html index 787306af80..3ef7ea7f10 100644 --- a/Lab/Compute/quiz/who-calls-execve-parent/index.html +++ b/Lab/Compute/quiz/who-calls-execve-parent/index.html @@ -4,13 +4,13 @@ Who Calls `execve` in the Log of the Parent Process? | Operating Systems - - + +
    Skip to main content

    Who Calls execve in the Log of the Parent Process?

    Question Text

    Which process calls execve("sleepy_creator", ["sleepy_creator"], ...), that you found in the log of the parent process?

    Question Answers

    • The kernel because that's where the loader is located

    • The loader because it is the loader who creates new processes

    • The C runtime because this is the C interpreter

    • bash because we run sleepy_creator from terminal, i.e. from bash

    Feedback

    All processes spawned from the command-line are children of the current bash process.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/quiz/why-use-completed-queue/index.html b/Lab/Compute/quiz/why-use-completed-queue/index.html index b9a41d5b3c..16d28d0447 100644 --- a/Lab/Compute/quiz/why-use-completed-queue/index.html +++ b/Lab/Compute/quiz/why-use-completed-queue/index.html @@ -4,8 +4,8 @@ The Need for a COMPLETED Queue | Operating Systems - - + +
    @@ -14,7 +14,7 @@ It is used by threads_create() to start executing the given function. This is a wrapper that calls the function associated with the thread (this->start_routine), saves its result and then calls threads_exit() to store this result in the COMPLETED queue.

    - - + + \ No newline at end of file diff --git a/Lab/Compute/synchronization/index.html b/Lab/Compute/synchronization/index.html index e47bc2b35a..d0595fd891 100644 --- a/Lab/Compute/synchronization/index.html +++ b/Lab/Compute/synchronization/index.html @@ -4,8 +4,8 @@ Synchronization | Operating Systems - - + +
    @@ -134,7 +134,7 @@ See that they differ.

  • Modify the value of var in the main() function before calling pthread_create(). Notice that the value doesn't propagate to the other threads. This is because, upon creating a new thread, its TLS is initialised.

  • - - + + \ No newline at end of file diff --git a/Lab/Compute/threads/index.html b/Lab/Compute/threads/index.html index 34c0dd98f7..20a58fe211 100644 --- a/Lab/Compute/threads/index.html +++ b/Lab/Compute/threads/index.html @@ -4,8 +4,8 @@ Threads | Operating Systems - - + +
    @@ -58,7 +58,7 @@ You can check the executable is statically linked by executing the command ldd multithreaded. Notice the same effect of the thread creation on the process memory layout: the creation of a new stack of 8192 KB.

  • Make a program in another language of your choice that creates threads. Investigate it with pmap.

  • Quiz

    - - + + \ No newline at end of file diff --git a/Lab/Compute/user-level-threads/index.html b/Lab/Compute/user-level-threads/index.html index d0eb158fdf..aea45fc91e 100644 --- a/Lab/Compute/user-level-threads/index.html +++ b/Lab/Compute/user-level-threads/index.html @@ -4,8 +4,8 @@ User-Level Threads | Operating Systems - - + +
    @@ -44,7 +44,7 @@ The work_stealing scheduler, as the name suggests, will "steal" fibers from other schedulers. So, if the shared_work scheduler tried to balance the available work between the available threads, the work_stealing one will focus on having as many threads as possible on 100% workload. Vary the number of threads and fibers, and the workload (maybe put each fibre to do some computational-intensive work), and observe the results.

    C++ unique_lock

    unique_lock is a type of mutex that is unlocked automatically when the end of its scope is reached (end of function or bracket-pair).

    - - + + \ No newline at end of file diff --git a/Lab/Data/arena/index.html b/Lab/Data/arena/index.html index 72133379ee..c2aa2dd178 100644 --- a/Lab/Data/arena/index.html +++ b/Lab/Data/arena/index.html @@ -4,8 +4,8 @@ Arena | Operating Systems - - + +
    @@ -68,7 +68,7 @@ Comment the version(none) annotation for the assignment operator and implement the logic so that the reference counted array is correct. When an object is assigned to another object, we need to first decrement the count for the object that is being assigned to, then fill the fields similarly to the copy constructor case and lastly increment the count for the assigned object. After completing the exercise, make sure that the memory is properly managed.

  • Play with your reference counted array and create different scenarios to test its limits.

  • - - + + \ No newline at end of file diff --git a/Lab/Data/index.html b/Lab/Data/index.html index 0a2cc93629..56ed8dc5fd 100644 --- a/Lab/Data/index.html +++ b/Lab/Data/index.html @@ -4,13 +4,13 @@ Data | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Lab/Data/investigate-memory/index.html b/Lab/Data/investigate-memory/index.html index 069220a2b9..8d85823a06 100644 --- a/Lab/Data/investigate-memory/index.html +++ b/Lab/Data/investigate-memory/index.html @@ -4,8 +4,8 @@ Investigate Memory Actions | Operating Systems - - + +
    @@ -44,7 +44,7 @@ Also, if the XMALLOC_POISON macro is defined, all the allocated data is overwritten with a "poison" value (0xA5). This is useful for early detection of memory-related issues, although, evidently, it adds overhead.

    We can look for parts of the source code with the largest number of uses of xmalloc():

    student@os:~/.../lab/support/git$ grep -rc 'xmalloc(' . | grep -v ':0' | sort -n -t ':' -k 20
    [...]
    ./compat/mingw.c:6
    ./submodule-config.c:6
    ./merge-recursive.c:7

    We can look into the merge-recursive.c file for uses of the xmalloc() function.

    Practice

    1. Do the same actions as above for the mmap() and xmmap() function calls.

      Note that these are not memory allocation calls, since a valid fd file argument is passed. These are file mapping calls, that we will talk more as part of the I/O chapter.

    - - + + \ No newline at end of file diff --git a/Lab/Data/memory-security/index.html b/Lab/Data/memory-security/index.html index 42c3c8027a..a56e412d7d 100644 --- a/Lab/Data/memory-security/index.html +++ b/Lab/Data/memory-security/index.html @@ -4,8 +4,8 @@ Memory Security | Operating Systems - - + +
    @@ -59,7 +59,7 @@ Try to identify the canary value. Using the addr variable, write 2 scanf instructions: one that overwrites the canary with the corect value and one that overwrites the return address with the address of function pawned. In case of a successful exploit a video will be offered as reward.

    Answer this quiz

    - - + + \ No newline at end of file diff --git a/Lab/Data/overview/index.html b/Lab/Data/overview/index.html index 88b8f39849..0248788760 100644 --- a/Lab/Data/overview/index.html +++ b/Lab/Data/overview/index.html @@ -4,8 +4,8 @@ Data | Operating Systems - - + +
    @@ -16,7 +16,7 @@ The programming language analyzes the use of these variables and outputs code that uses an interface provided by the operating system. This interface offers the possibility to allocate/deallocate different variables in certain memory regions. Next, the operating system manages the execution of the program and provides the actual physical addresses that are used to interact with the data.

    Moreover, the operating system governs the competing access of multiple programs to memory, ensuring that a program does not have access to a different program's memory.

    Contents

    1. Working with Memory
    2. Process Memory
    3. Investigate Memory
    4. Memory Security
    5. Arena
    - - + + \ No newline at end of file diff --git a/Lab/Data/process-memory/index.html b/Lab/Data/process-memory/index.html index a7b5de9cca..2a749271e3 100644 --- a/Lab/Data/process-memory/index.html +++ b/Lab/Data/process-memory/index.html @@ -4,8 +4,8 @@ Process Memory | Operating Systems - - + +
    @@ -67,7 +67,7 @@ You will get more detailed information about this in the I/O chapter.

    Browse the two source code files (mmap_copy.c and read_write_copy.c) for a glimpse on how the two types of copies are implemented.

    Quiz

    Practice

    1. Use a different value for BUFSIZE and see if that affects the comparison between the two executables.

    2. Add a sleep() call to the mmap_copy.c file after the files were mapped. Rebuild the program and run it. On a different console, use pmap to view the two new memory regions that were added to the process, by mapping the in.dat and out.dat files.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/bypass-canary/index.html b/Lab/Data/quiz/bypass-canary/index.html index 17103ce56c..140a0762bc 100644 --- a/Lab/Data/quiz/bypass-canary/index.html +++ b/Lab/Data/quiz/bypass-canary/index.html @@ -4,13 +4,13 @@ Bypass Canary | Operating Systems - - + +
    Skip to main content

    Bypass Canary

    Question

    If we enable ASLR, can we still exploit the stack_protector program?

    • no, because the address of pawned is going to be different for every run.

    • yes, because ASLR cannot work well when the canary is activated.

    • yes, because ASLR randomizes the start address of a section, but the offsets remain the same.
    • no, because the address to which addr points to is going to be random
    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/half-page/index.html b/Lab/Data/quiz/half-page/index.html index eb6501a9c9..5ee4641c16 100644 --- a/Lab/Data/quiz/half-page/index.html +++ b/Lab/Data/quiz/half-page/index.html @@ -4,15 +4,15 @@ Half Page | Operating Systems - - + +
    Skip to main content

    Half Page

    Question Text

    char *p = malloc(2 * 1024);

    What is a potential problem when allocating half a page?

    Question Answers

    • It will fragment the virtual memory because users should always request at least one page

    • Asking for less than a page might place the memory on two different pages

    • Writing to the other half may be allowed
    • Allocations smaller than one page should use the stack

    Feedback

    The OS allocates memory in chunks of 4 KB (the page size). If the memory we allocate happens to be placed at the beginning of a page, we have permission to update the second half of this page despite not requesting it. This might be a problem because buffer overflows can pass unnoticed.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/malloc-brk/index.html b/Lab/Data/quiz/malloc-brk/index.html index 261fb30e61..b59bfc5c23 100644 --- a/Lab/Data/quiz/malloc-brk/index.html +++ b/Lab/Data/quiz/malloc-brk/index.html @@ -4,14 +4,14 @@ Malloc `brk()` | Operating Systems - - + +
    Skip to main content

    Malloc brk()

    Question Text

    When does malloc() use brk()?

    Question Answers

    • brk() is outdated, malloc() always uses mmap()
    • When it allocates a small chunk of memory
    • When it allocates an array

    • When it's working with dynamic libraries

    Feedback

    malloc() uses both brk() and mmap(), but preffers brk() for small chunks of memory to keep granular allocations in a contiguous area. This way, free() does not necessarily return the memory to the OS as it might only mark the zone as "free" within libc's allocator and reuse it for later allocations.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/malloc-mmap/index.html b/Lab/Data/quiz/malloc-mmap/index.html index a5718854a1..b6ba9910e6 100644 --- a/Lab/Data/quiz/malloc-mmap/index.html +++ b/Lab/Data/quiz/malloc-mmap/index.html @@ -4,15 +4,15 @@ Malloc `mmap()` | Operating Systems - - + +
    Skip to main content

    Malloc mmap()

    Question Text

    When does malloc() use mmap()?

    Question Answers

    • When it allocates read-only memory

    • When it allocates zeroed memory

    • When it allocates chunks of memory bigger than an internal threshold
    • When the heap is full

    Feedback

    malloc uses both brk() and mmap(), but prefers mmap() for big chunks of memory (by default larger than 128 KB). This value can be altered using mallopt() with the param argument set to M_MMAP_THRESHOLD. These memroy blocks are unlikely to be reused so they are not placed on heap to avoid memory fragmentation.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/memory-access/index.html b/Lab/Data/quiz/memory-access/index.html index 61bc1d3716..c47ec27ea8 100644 --- a/Lab/Data/quiz/memory-access/index.html +++ b/Lab/Data/quiz/memory-access/index.html @@ -4,8 +4,8 @@ Modify String | Operating Systems - - + +
    @@ -13,7 +13,7 @@ One stores a constant pointer, cp, whereas the other stores the actual string. The compiler thinks that cp is able to modify the memory location that it points therefore it passes compilation. But at runtime a segmentation fault is issued because we are accessing data that is stored in read-only memory.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/memory-aslr/index.html b/Lab/Data/quiz/memory-aslr/index.html index 9ff6317876..b6afd29d5d 100644 --- a/Lab/Data/quiz/memory-aslr/index.html +++ b/Lab/Data/quiz/memory-aslr/index.html @@ -4,13 +4,13 @@ ASLR | Operating Systems - - + +
    Skip to main content

    ASLR

    Question Text

    If we enable ASLR and run the bo_write_practice executable with the previously payload what vulnerabilities will we be able to still exploit?

    Question Answers

    • we can still jump to the secret_func

    • we can both still jump to the secret_func and overwrite the local variable

    • we can jump to a library function

    • we can still overwrite the local variable
    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/memory-granularity/index.html b/Lab/Data/quiz/memory-granularity/index.html index f7f19b8ced..6ebe3e9dd9 100644 --- a/Lab/Data/quiz/memory-granularity/index.html +++ b/Lab/Data/quiz/memory-granularity/index.html @@ -4,14 +4,14 @@ Memory Granularity | Operating Systems - - + +
    Skip to main content

    Memory Granularity

    Question Text

    What is the granularity of the size of memory sections?

    Question Answers

    • 4 bytes

    • 4 MB

    • 4 KB
    • 1 KB

    Feedback

    All sizes of memory areas are multiple of 4 KB (the page size). Also, all addresses start at multiple of 4 KB.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/memory-leaks/index.html b/Lab/Data/quiz/memory-leaks/index.html index 54ad122e30..28b7ae4427 100644 --- a/Lab/Data/quiz/memory-leaks/index.html +++ b/Lab/Data/quiz/memory-leaks/index.html @@ -4,14 +4,14 @@ Memory Leaks | Operating Systems - - + +
    Skip to main content

    Memory Leaks

    Question Text

    What happens to the leaked memory when the process finishes execution?

    Question Answers

    • It will be freed by the OS garbage collector

    • It remains unusable until the first restart

    • It is freed alongside all memory used by process
    • It will remain reachable untill another process explicitely frees it

    Feedback

    When a process ends, all its memory zones are freed by the OS to be reused. Leaking memory becomes a major problem in case of programs that run indefinitely, because the leaked memory will stack, causing a memory outage.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/memory-regions-vars/index.html b/Lab/Data/quiz/memory-regions-vars/index.html index 4b88382cc9..339e5075e1 100644 --- a/Lab/Data/quiz/memory-regions-vars/index.html +++ b/Lab/Data/quiz/memory-regions-vars/index.html @@ -4,8 +4,8 @@ Variables in memory regions | Operating Systems - - + +
    @@ -14,7 +14,7 @@ Non-static local variables go on the.stack (c, k). malloc()'ed memory goes on the.heap. For k, the pointer is stored on the.stack, but the allocated memory, to which k points is stored on the.heap.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/memory-stack-protector/index.html b/Lab/Data/quiz/memory-stack-protector/index.html index c43f9a2840..e12a2d3668 100644 --- a/Lab/Data/quiz/memory-stack-protector/index.html +++ b/Lab/Data/quiz/memory-stack-protector/index.html @@ -4,8 +4,8 @@ Stack Protector | Operating Systems - - + +
    @@ -13,7 +13,7 @@ Why is that?

    Question Answers

    Feedback

    When using the canary, to minimize the damage a buffer overflow could cause, the buffers are always placed right below the canary. By doing so, a buffer overflow will not overwrite anything. However, it is still possible to overwrite other local buffers, provided that a function declares more than 1 array or if we use the pointer directly.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/mmap-file/index.html b/Lab/Data/quiz/mmap-file/index.html index 83889283b2..6bd3ddf94e 100644 --- a/Lab/Data/quiz/mmap-file/index.html +++ b/Lab/Data/quiz/mmap-file/index.html @@ -4,14 +4,14 @@ `mmap()` file | Operating Systems - - + +
    Skip to main content

    mmap() file

    Question Text

    What is one advantage of mapping a file in memory?

    Question Answers

    • It reduces interaction with the disk
    • Consumes less memory

    • It is faster because it does not uses the file API

    • Allows all threads to use the same memory area

    Feedback

    After mapping a file in memory, all changes will be visible only in memory. When removing the mapping or explicitely calling msync() the information from memory will be visible on disk.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/operators/index.html b/Lab/Data/quiz/operators/index.html index 304fa1e186..ef8c555716 100644 --- a/Lab/Data/quiz/operators/index.html +++ b/Lab/Data/quiz/operators/index.html @@ -4,13 +4,13 @@ Operator Overloading | Operating Systems - - + +
    Skip to main content

    Operator Overloading

    Question Text

    How many constructor calls, copy constructor calls, assignment operator calls and destructor calls does the following program issue?

    Obj quiz(Obj o1, Obj o2)
    {
    o2 = o1;
    return o2;
    }
    void main()
    {
    Obj b = quiz(o1, o2);
    }

    Question Answers

    • constructor calls = 0, copy constructor calls = 3, assignment operator calls = 1, destructor calls = 3
    • constructor calls = 1, copy constructor calls = 2, assignment operator calls = 1, destructor calls = 2

    • constructor calls = 0, copy constructor calls = 2, assignment operator calls = 1, destructor calls = 2

    • constructor calls = 0, copy constructor calls = 3, assignment operator calls = 1, destructor calls = 1

    Feedback

    • There are no constructor calls because there is no object construction when using int.

    • There are 3 copy constructor calls: for passing o1, for passing o2, and for returning o2.

    • There is 1 assignment operator call for o2 = o1.

    • There are 3 destructor calls, because each constructed object needs to be destroyed.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/page-allocation/index.html b/Lab/Data/quiz/page-allocation/index.html index 759351b774..1313ab6fd5 100644 --- a/Lab/Data/quiz/page-allocation/index.html +++ b/Lab/Data/quiz/page-allocation/index.html @@ -4,14 +4,14 @@ Page Allocation | Operating Systems - - + +
    Skip to main content

    Page Allocation

    Question Text

    student@os:~/.../lab/support/static-dynamic$ size hello-static
    text data bss dec hex filename
    893333 20996 7128 921457 e0f71 hello-static

    How many bytes should we add to the .data section to make its size 28 KB, instead of 24 KB?

    Question Answers

    • 1 KB

    • 4 KB

    • 3580 bytes

    • 3581 bytes

    Feedback

    The total size must be 1 byte over the 24 KB threshold to cause a new page allocation. So in order to get that past the current size of 20996, we need 3581 bytes:

    student@os:~$ echo "24 * 1024 + 1 - 20996" | bc
    3581
    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/stack-layout/index.html b/Lab/Data/quiz/stack-layout/index.html index 14e7b4df99..9c6a26f5d9 100644 --- a/Lab/Data/quiz/stack-layout/index.html +++ b/Lab/Data/quiz/stack-layout/index.html @@ -4,13 +4,13 @@ Stack layout | Operating Systems - - + +
    Skip to main content

    Stack layout

    Question Text

    What is the stack layout for the fun function in the bo_write.c program (starting from a high address)?

    Question Answers

    • return address, old rbp, maybe some padding, variable a, b[0], b[1], b[2]
    • return address, old rbp, maybe some padding, variable a, b[2], b[1], b[0]
    • return address, maybe some padding, variable a, b[0], b[1], b[2]

    • return address, old rbp, maybe some padding, b[0], b[1], b[2], variable a

    Feedback

    Look at the assembly code and notice the exact layout.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/string-buff-over/index.html b/Lab/Data/quiz/string-buff-over/index.html index 08df655e8f..d8ef2281b5 100644 --- a/Lab/Data/quiz/string-buff-over/index.html +++ b/Lab/Data/quiz/string-buff-over/index.html @@ -4,14 +4,14 @@ String Buffer Overflow | Operating Systems - - + +
    Skip to main content

    String Buffer Overflow

    Question Text

    Why does the buffer overflow occur?

    Question Answers

    • the initial string, declared in main(), does not contain a terminating null byte.

    • the buffer is not large enough to store the copied bytes.

    • memcpy() skips the copying of terminating null bytes.

    • memcpy() copies 4 bytes, whereas the size of the string, including the terminating null byte, is 5.

    Feedback

    The string "soso" has length equal to 4, however, 5 bytes are actually used to store it, including the terminating null byte. Even though the buffer declared in fun() is not large enough to store the 5 bytes, the underlying issue is that we copying just 4 bytes, thus skipping the null byte.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/string-strcpy/index.html b/Lab/Data/quiz/string-strcpy/index.html index 5a3d79b0a2..9e74f36c01 100644 --- a/Lab/Data/quiz/string-strcpy/index.html +++ b/Lab/Data/quiz/string-strcpy/index.html @@ -4,13 +4,13 @@ Strcpy Buffer Overflow | Operating Systems - - + +
    Skip to main content

    Strcpy Buffer Overflow

    Question Text

    Does any buffer overflow occur with the latest version of the program?

    Question Answers

    • no, because strcpy() was designed to correctly handle such situations.

    • no, because the string is correctly printed, i.e. no extra characters.

    • we cannot know

    • yes, strcpy() copies the entirety of the source, including the \0; since the size of dst is 4 the null byte overwrites the least significant byte of var

    Feedback

    Print the contents of variable var.

    - - + + \ No newline at end of file diff --git a/Lab/Data/quiz/valgrind-leaks/index.html b/Lab/Data/quiz/valgrind-leaks/index.html index a935db9f66..148689d49e 100644 --- a/Lab/Data/quiz/valgrind-leaks/index.html +++ b/Lab/Data/quiz/valgrind-leaks/index.html @@ -4,15 +4,15 @@ Valgrind Leaks | Operating Systems - - + +
    Skip to main content

    Valgrind Leaks

    Question Text

    struct student {
    char *name;
    int age;
    }

    struct student *s = malloc(sizeof(*s));
    s->name = strdup("Reginald");
    // ...
    free(s);

    What are the leaks in the above c program?

    Question Answers

    • There are no leaks

    • s->name is definitely lost

    • s->name is indirectly lost
    • s->name is still reachable

    Feedback

    strdup() allocates memory for a string so the returned pointer must be freed. Freeing s will leave us unable to free s->name, so s->name is indirectly lost. Find more about valgrind leak categories here.

    - - + + \ No newline at end of file diff --git a/Lab/Data/working-memory/index.html b/Lab/Data/working-memory/index.html index fda35cd4d6..17582b11d8 100644 --- a/Lab/Data/working-memory/index.html +++ b/Lab/Data/working-memory/index.html @@ -4,8 +4,8 @@ Working with Memory | Operating Systems - - + +
    @@ -75,7 +75,7 @@ Note: Although using printf() calls is a viable option, we strongly suggest you use GDB.
  • Fix the program.
  • Analyze the corresponding Python and D implementation.
  • What is the expected result in each case? Why? Run the programs and see what happens.

    - - + + \ No newline at end of file diff --git a/Lab/IO/arena/index.html b/Lab/IO/arena/index.html index 2da8690968..687d3ced9b 100644 --- a/Lab/IO/arena/index.html +++ b/Lab/IO/arena/index.html @@ -4,8 +4,8 @@ Arena | Operating Systems - - + +
    @@ -29,7 +29,7 @@ Look at the buff/cache column. One possible output is shown below. It says the OS is caching 7 GB of data.

    student@os:~$ free -h
    total used free shared buff/cache available
    Mem: 15Gi 8,1Gi 503Mi 691Mi 7,0Gi 6,5Gi
    Swap: 7,6Gi 234Mi 7,4Gi
    - - + + \ No newline at end of file diff --git a/Lab/IO/async-io/index.html b/Lab/IO/async-io/index.html index 78b6e10a8f..1fa6f47879 100644 --- a/Lab/IO/async-io/index.html +++ b/Lab/IO/async-io/index.html @@ -4,8 +4,8 @@ Asynchronous I/O | Operating Systems - - + +
    @@ -35,7 +35,7 @@ not avoiding doing a lot of processing, as is the case with the fibonacci() function. In that particular case, having thread-based asynchronous I/O and the GIL will be a good option, as you rely on the thread scheduler to be able to serve multiple I/O channels simultaneously. This later approach is called I/O multiplexing, discussed in the next section.

    - - + + \ No newline at end of file diff --git a/Lab/IO/beyond-network-sockets/index.html b/Lab/IO/beyond-network-sockets/index.html index 0ad002ff59..d0b8b7e5f8 100644 --- a/Lab/IO/beyond-network-sockets/index.html +++ b/Lab/IO/beyond-network-sockets/index.html @@ -4,8 +4,8 @@ Beyond Network Sockets | Operating Systems - - + +
    @@ -31,7 +31,7 @@ Use the example at the bottom of the UNIX socket man page if you get stuck at bind(). When you're done, compile the code and then run send_unix_socket. If you did this task correctly, receive_unix_socket should display the flag.

    - - + + \ No newline at end of file diff --git a/Lab/IO/client-server-model/index.html b/Lab/IO/client-server-model/index.html index e5ecafd598..06d8225222 100644 --- a/Lab/IO/client-server-model/index.html +++ b/Lab/IO/client-server-model/index.html @@ -4,8 +4,8 @@ Client-Server Model | Operating Systems - - + +
    @@ -40,7 +40,7 @@ If it can't, then that process is not Deluge. Otherwise, it is Deluge and that connection is immediately closed :)) This may sound like a stupid way of checking whether a process is Deluge or not, but if it's stupid and it works, then it's not stupid!

    - - + + \ No newline at end of file diff --git a/Lab/IO/file-descriptors/index.html b/Lab/IO/file-descriptors/index.html index 36a66d316b..6def6269a6 100644 --- a/Lab/IO/file-descriptors/index.html +++ b/Lab/IO/file-descriptors/index.html @@ -4,8 +4,8 @@ File Descriptors | Operating Systems - - + +
    @@ -74,7 +74,7 @@ As usual, use the man pages when in doubt about either of them.

    libcsyscall
    fopen()open()
    fread()read()
    fwrite()write()
    fseek()lseek()
    fclose()close()

    So for most equivalents, just remove the leading f when moving from the libc function to the underlying syscall.

    For a quick recap of the flags we've discussed so far, take a look at the following table. But don't bother memorising it. You can find it any time in by typing man fopen in your terminal.

    fopen() modeopen() flag
    "r"O_RDONLY
    "w"O_WRONLY │ O_CREAT │ O_TRUNC
    "a"O_WRONLY │ O_CREAT │ O_APPEND
    "r+"O_RDWR
    "w+"O_RDWR │ O_CREAT │ O_TRUNC
    "a+"O_RDWR │ O_CREAT │ O_APPEND
    - - + + \ No newline at end of file diff --git a/Lab/IO/file-handlers/index.html b/Lab/IO/file-handlers/index.html index 3c03054e54..afaaed688a 100644 --- a/Lab/IO/file-handlers/index.html +++ b/Lab/IO/file-handlers/index.html @@ -4,8 +4,8 @@ File Handling | Operating Systems - - + +
    @@ -34,7 +34,7 @@ Most of the time, opendir() is used instead. But what does it return? Find out in the "File Descriptors" section.

    - - + + \ No newline at end of file diff --git a/Lab/IO/file-mappings/index.html b/Lab/IO/file-mappings/index.html index 90c66a7992..450718604a 100644 --- a/Lab/IO/file-mappings/index.html +++ b/Lab/IO/file-mappings/index.html @@ -4,8 +4,8 @@ File Mappings | Operating Systems - - + +
    @@ -39,7 +39,7 @@ So file mappings are especially useful for randomly accessing file data. Accessing the i-th byte in a file becomes the same as mapping[i], which is obviously more efficient than calling lseek(). File mappings are also useful when we have to overwrite existing data multiple times or when we read certain chunks multiple times.

    - - + + \ No newline at end of file diff --git a/Lab/IO/index.html b/Lab/IO/index.html index d0acddaff8..5403026fff 100644 --- a/Lab/IO/index.html +++ b/Lab/IO/index.html @@ -4,13 +4,13 @@ IO | Operating Systems - - + +
    Skip to main content

    IO

    - - + + \ No newline at end of file diff --git a/Lab/IO/io-internals/index.html b/Lab/IO/io-internals/index.html index 2d670f0a2a..ee24a8e619 100644 --- a/Lab/IO/io-internals/index.html +++ b/Lab/IO/io-internals/index.html @@ -4,8 +4,8 @@ I/O Internals | Operating Systems - - + +
    @@ -58,7 +58,7 @@ This concept is known as double buffering. In the following section, we will see how to make use of this internal buffering to optimise network requests.

    Notice that the script in support/buffering/benchmark_buffering.sh also uses echo 3 > /proc/sys/vm/drop_caches. That section in the Arena that we mentioned earlier is becoming even more interesting.

    - - + + \ No newline at end of file diff --git a/Lab/IO/io-multiplexing/index.html b/Lab/IO/io-multiplexing/index.html index 9cdec4ef2a..1f13430a7a 100644 --- a/Lab/IO/io-multiplexing/index.html +++ b/Lab/IO/io-multiplexing/index.html @@ -4,8 +4,8 @@ I/O Multiplexing | Operating Systems - - + +
    @@ -23,7 +23,7 @@ The server is now multiplexing both connections.

  • Create a script and / or a program to exercise the server. Create many connections to the server and continuously send messages to the server. See it multiplex the I/O channels (one for each connection - actually two: one for receiving and one for sending).

  • - - + + \ No newline at end of file diff --git a/Lab/IO/local-io-in-action/index.html b/Lab/IO/local-io-in-action/index.html index d0b23af060..0862aede6f 100644 --- a/Lab/IO/local-io-in-action/index.html +++ b/Lab/IO/local-io-in-action/index.html @@ -4,8 +4,8 @@ Local I/O in Action | Operating Systems - - + +
    @@ -32,7 +32,7 @@ For this, it calls lt.bdecode().

    As before, error handling is important:

    try:
    with open(_filepath, 'rb') as _file:
    resume_data = lt.bdecode(_file.read())
    except (OSError, EOFError, RuntimeError) as ex:
    if self.torrents:
    log.warning('Unable to load %s: %s', _filepath, ex)
    resume_data = None

    So now we know how Deluge handles local files. But we still don't know how it gets those files from peers. We'll find out how in the following sections.

    - - + + \ No newline at end of file diff --git a/Lab/IO/networking-101/index.html b/Lab/IO/networking-101/index.html index 224d654d4e..6f751c0bde 100644 --- a/Lab/IO/networking-101/index.html +++ b/Lab/IO/networking-101/index.html @@ -4,8 +4,8 @@ Networking 101 | Operating Systems - - + +
    @@ -46,7 +46,7 @@ What arguments do you need to pass to netstat to see receiver.py? Do you need the whole -tuapn? No.

    Conclusion

    The difference between TCP and UDP can be summarised as follows:

    TCP vs UDP

    - - + + \ No newline at end of file diff --git a/Lab/IO/overview/index.html b/Lab/IO/overview/index.html index bb7f339e7b..31fe3ecd5f 100644 --- a/Lab/IO/overview/index.html +++ b/Lab/IO/overview/index.html @@ -4,8 +4,8 @@ I/O | Operating Systems - - + +
    @@ -16,7 +16,7 @@ It will always run the same code on the same data and, thus, produce the same result. This may be useful in some narrow cases, such as calculating the decimals of Pi. However, for more real-world-facing applications such as web servers, operating systems and databases inputs and outputs are mandatory.

    The most simplistic representation of a compute system is a black box that receives some input and delivers some output.

    Compute System - Oversimplified

    In this session, we will look into how a compute system interacts with the outside world to get and produce these inputs and outputs.

    1. File Handlers
    2. File Descriptors
    3. Redirections
    4. Pipes
    5. Local I/O in Action
    6. Remote I/O
    7. Networking 101
    8. Client-Server Model
    9. Beyond Network Sockets
    10. File Mappings
    11. IO Internals
    12. Zero-copy
    13. Asynchronous I/O
    14. I/O Multiplexing
    15. Arena
    - - + + \ No newline at end of file diff --git a/Lab/IO/pipes/index.html b/Lab/IO/pipes/index.html index 2e8d413511..7a3d00201e 100644 --- a/Lab/IO/pipes/index.html +++ b/Lab/IO/pipes/index.html @@ -4,8 +4,8 @@ Pipes | Operating Systems - - + +
    @@ -64,7 +64,7 @@ This buffer holds the data that is passed between processes, not the filesystem. So we still don't break our 2 desires from the beginning of this section: to allow data transfer and to do so efficiently.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/anonymous-pipes-limitation/index.html b/Lab/IO/quiz/anonymous-pipes-limitation/index.html index ab035a8e92..9100fd22d5 100644 --- a/Lab/IO/quiz/anonymous-pipes-limitation/index.html +++ b/Lab/IO/quiz/anonymous-pipes-limitation/index.html @@ -4,15 +4,15 @@ Limitation of Anonymous Pipes | Operating Systems - - + +
    Skip to main content

    Limitation of Anonymous Pipes

    Question Text

    What of the following is the largest drawback of using anonymous pipes (created with pipe()) for inter-process communication?

    Question Answers

    • they only allow unidirectional communication
    • they only allow IPC between "related" processes (parent - child - grandchild etc.)
    • if more processes use the same end of the same pipe, there may be race conditions

    • a pipe only has 2 file descriptors, but some processes may need more channels to communicate

    Feedback

    Out of the answers above, the only limitation that cannot be overcome by using pipes alone is the requirement for the processes using them to be related. The parent must create the pipes so the children can inherit them. All other downsides can be overcome by using more pipes.

    The answer to this is to employ some filesystem support.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/bind-error-cause/index.html b/Lab/IO/quiz/bind-error-cause/index.html index 4dca1bc959..3abc03ddf0 100644 --- a/Lab/IO/quiz/bind-error-cause/index.html +++ b/Lab/IO/quiz/bind-error-cause/index.html @@ -4,8 +4,8 @@ Cause of `bind()` Error | Operating Systems - - + +
    @@ -13,7 +13,7 @@ You will get an error. What is its cause?

    Question Answers

    Feedback

    One port may only be bound to one socket at a time. The fact that it's the same program (same source code) using it is irrelevant because they're different processes.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/client-server-sender-receiver/index.html b/Lab/IO/quiz/client-server-sender-receiver/index.html index 6a1bb625db..9e2b7cc8f9 100644 --- a/Lab/IO/quiz/client-server-sender-receiver/index.html +++ b/Lab/IO/quiz/client-server-sender-receiver/index.html @@ -4,15 +4,15 @@ `sender.py` and `receiver.py` Client-Server Parallel | Operating Systems - - + +
    Skip to main content

    sender.py and receiver.py Client-Server Parallel

    Question Text

    Drawing a parallel from the UDP examples in support/send-receive/, which of the sender and receiver is similar to the server and which is similar to the client?

    Question Answers

    • both are similar to clients

    • both are similar to servers

    • receiver.py is similar to a server and sender.py is similar to a client
    • receiver.py is similar to a client and sender.py is similar to a server

    Feedback

    receiver.py is the passive component. It has to be started first and then waits for sender.py (the client) to send data. Furthermore, you can only have one receiver.py running at the same time (remember the multiple bind() bug) and multiple sender.pys.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/deluge-tcp-udp/index.html b/Lab/IO/quiz/deluge-tcp-udp/index.html index 3157e97667..19dd893b4f 100644 --- a/Lab/IO/quiz/deluge-tcp-udp/index.html +++ b/Lab/IO/quiz/deluge-tcp-udp/index.html @@ -4,8 +4,8 @@ Deluge: TCP or UDP | Operating Systems - - + +
    @@ -14,7 +14,7 @@ The only situation when correctness may be overlooked is when some given data will be quckly replaced by some other data. But files are persistent. If you download a video game from as a torrent (we've all done that), you want to keep it for a while and first and foremost, it has to work properly, i.e. not be corrupt.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/execve/index.html b/Lab/IO/quiz/execve/index.html index fa94e5990b..ef1efbfe29 100644 --- a/Lab/IO/quiz/execve/index.html +++ b/Lab/IO/quiz/execve/index.html @@ -4,8 +4,8 @@ Effect of `execve()` Syscall | Operating Systems - - + +
    @@ -13,7 +13,7 @@ causes the program that is currently being run by the calling process to be replaced with a new program, with newly initialized stack, heap, and (initialized and uninitialized) data segments.

    Simply put, we can say that execve() replaces the VAS of the current process with that of the program given as argument.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/fewer-than-2-copies/index.html b/Lab/IO/quiz/fewer-than-2-copies/index.html index 42d566e4d5..70ff4ad492 100644 --- a/Lab/IO/quiz/fewer-than-2-copies/index.html +++ b/Lab/IO/quiz/fewer-than-2-copies/index.html @@ -4,8 +4,8 @@ Fewer than Two Copies | Operating Systems - - + +
    @@ -16,7 +16,7 @@ They are both connected to the CPU via the motherboard, so it's the CPU's job to do the transfer. For this, it needs a "temporary buffer". Then the NIC needs its own buffer because the speed of the network may be slower than the speed at which it receives data from the kernel, so it needs some memory where to place the "surplus" while waiting for the network to "clear".

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/file-handler-c/index.html b/Lab/IO/quiz/file-handler-c/index.html index e41863648f..9d7f8a90c0 100644 --- a/Lab/IO/quiz/file-handler-c/index.html +++ b/Lab/IO/quiz/file-handler-c/index.html @@ -4,14 +4,14 @@ File handler in C | Operating Systems - - + +
    Skip to main content

    File handler in C

    Question Text

    What is the type of the file handler in the C code located in support/simple-file-operations/file_operations.c?

    Question Answers

    • File
    • FILE *
    • FILE

    • void *

    • struct file

    Feedaback

    The file is opened using either of the following lines:

    f = fopen(file_name, "r");

    f = fopen(file_name, "w");

    The type of f is FILE *: FILE *f.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/firefox-tcp-udp/index.html b/Lab/IO/quiz/firefox-tcp-udp/index.html index 07c643867e..363a9676c4 100644 --- a/Lab/IO/quiz/firefox-tcp-udp/index.html +++ b/Lab/IO/quiz/firefox-tcp-udp/index.html @@ -4,8 +4,8 @@ Firefox: TCP or UDP? | Operating Systems - - + +
    @@ -16,7 +16,7 @@ We don't update text-based content too often and since it needs to be precise, handling broken packets is important. On the other hand, a streaming-based site, such as YouTube sends data in real time and thus a few errors here and there can be omitted. So https://open-education-hub.github.io/operating-systems is going to be served via TCP, while YouTube videos via UDP.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/flush-libc-buffer/index.html b/Lab/IO/quiz/flush-libc-buffer/index.html index 4835c5e358..177ed35ea7 100644 --- a/Lab/IO/quiz/flush-libc-buffer/index.html +++ b/Lab/IO/quiz/flush-libc-buffer/index.html @@ -4,14 +4,14 @@ Flush Libc Buffer | Operating Systems - - + +
    Skip to main content

    Flush Libc Buffer

    Question Text

    Which of the following is a method of flushing libc's internal buffer?

    Question Answers

    • print a \0 character
    • print a \n character
    • print a space character

    • print a \t character

    Feedback

    Newlines (\n) force printf() to dump the internal buffer associated with the stdout FILE struct. If you place a \n character within one of the strings in support/buffering/printf_buffering.c, a write() syscall will be made right after it.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/fopen-syscall/index.html b/Lab/IO/quiz/fopen-syscall/index.html index d76b93ae4e..41191af8ec 100644 --- a/Lab/IO/quiz/fopen-syscall/index.html +++ b/Lab/IO/quiz/fopen-syscall/index.html @@ -4,14 +4,14 @@ Syscall Used by `fopen()` | Operating Systems - - + +
    Skip to main content

    Syscall Used by fopen()

    Question Text

    Use strace to determine the syscall called by fopen() to access the file. Which one is it?

    Question Answers

    • read()
    • openat()
    • write()

    • fstat()

    Feedaback

    student@os:~/.../lab/support/simple-file-handling$ strace ./file_operations
    [...]
    openat(AT_FDCWD, "file.txt", O_RDONLY) = 3
    fstat(3, {st_mode=S_IFREG|0664, st_size=11, ...}) = 0
    read(3, "C was here!", 4096) = 11
    [...]

    So fopen()'s (main) underlying syscall is openat().

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/fopen-w/index.html b/Lab/IO/quiz/fopen-w/index.html index e21ffe8103..a90c13d617 100644 --- a/Lab/IO/quiz/fopen-w/index.html +++ b/Lab/IO/quiz/fopen-w/index.html @@ -4,14 +4,14 @@ open()` equivalent of `fopen(..., "w") | Operating Systems - - + +
    Skip to main content

    open() equivalent of fopen(..., "w")

    Question Text

    Use strace on the code in support/simple-file-operations/file_operations.c to find the flags used by openat() when calling fopen(file_name, "w"). First, try to make an educated guess and only then verify your answer by running strace.

    Question Answers

    • O_WRONLY | O_CREAT | O_TRUNC
    • O_WRONLY | O_CREAT

    • O_WRONLY

    • O_WRONLY | O_TRUNC

    Feedback

    student@os:~/.../lab/support/simple-file-operations$ strace ./file_operations
    [...]
    openat(AT_FDCWD, "file.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
    [...]
    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/local-io-errors/index.html b/Lab/IO/quiz/local-io-errors/index.html index a903f65e04..3b71c9722e 100644 --- a/Lab/IO/quiz/local-io-errors/index.html +++ b/Lab/IO/quiz/local-io-errors/index.html @@ -4,14 +4,14 @@ I/O Errors | Operating Systems - - + +
    Skip to main content

    I/O Errors

    Question Text

    Which of the following types of errors are unlikely to occur during an I/O operation?

    Question Answers

    • The current user does not have sufficient permisions to access a given file

    • There is not enough space left on the disk

    • The file offset has reached the end of the file when reading
    • Some data blocks in the filesystem are corrupted

    Feedback

    We can always reposition the file offset within a given file with either a fseek() library call or an lseek() syscall, so this is not an error. The others are more difficult to manage, so can be regarded as errors.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/mmap-read-write-benchmark/index.html b/Lab/IO/quiz/mmap-read-write-benchmark/index.html index 04a0519ca7..efc510d0bc 100644 --- a/Lab/IO/quiz/mmap-read-write-benchmark/index.html +++ b/Lab/IO/quiz/mmap-read-write-benchmark/index.html @@ -4,8 +4,8 @@ `mmap()` vs `read()` and `write()` Benchmark | Operating Systems - - + +
    @@ -14,7 +14,7 @@ This depends on your storage device (SSD vs HDD) and its specific speed (like its RPM for an HDD). So the more conservative answer is to say that this depends on external aspects and that, in general, the 2 implementations are more or less equivalent.

    If you want to know why there isn't much of a difference between the 2 implementations, check out this explanation.

    However, some newer Linux systems use an updated cp that doesn't use read and write anymore, but instead uses zero-copy, by means of the copy_file_range() syscall. This implementation is likely going to be significantly faster than the one using mmap, as shown in the snippet below:

    student@os:/.../support/file-mappings$ ./benchmark_cp.sh
    make: Nothing to be done for 'all'.
    Benchmarking mmap_cp on a 1 GB file...

    real 0m1,443s
    user 0m0,429s
    sys 0m0,971s
    Benchmarking cp on a 1 GB file...

    real 0m0,821s
    user 0m0,001s
    sys 0m0,602s
    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/o-trunc/index.html b/Lab/IO/quiz/o-trunc/index.html index 5318a5382b..81a2cbecd2 100644 --- a/Lab/IO/quiz/o-trunc/index.html +++ b/Lab/IO/quiz/o-trunc/index.html @@ -4,13 +4,13 @@ `O_TRUNC` Flag Behaviour | Operating Systems - - + +
    Skip to main content

    O_TRUNC Flag Behaviour

    Question Text

    How does the O_TRUNC flag change the behaviour of open()?

    Question Answers

    • the previous content of the file is deleted
    • new data will be appended to the file

    • newly written data will be ignored

    Feedback

    The man page provides us with unlimited wisdon:

    If the file already exists and is a regular file and the access mode allows writing (i.e., is O_RDWR or O_WRONLY) it will be truncated to length 0.

    Setting the length of the file to 0 is equivalent to deleting the previous content of the file.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/pipe-ends/index.html b/Lab/IO/quiz/pipe-ends/index.html index 17e4b5919d..6bee50e354 100644 --- a/Lab/IO/quiz/pipe-ends/index.html +++ b/Lab/IO/quiz/pipe-ends/index.html @@ -4,8 +4,8 @@ Pipe Ends | Operating Systems - - + +
    @@ -16,7 +16,7 @@ Note each of these numbers is followed by a letter. As you might have guessed:

    Also, the man page is quite clear on this issue:

    pipefd[0] refers to the read end of the pipe. pipefd[1] refers to the write end of the pipe.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/prints-work-no-stdio/index.html b/Lab/IO/quiz/prints-work-no-stdio/index.html index d35534f3b6..dad9e0534c 100644 --- a/Lab/IO/quiz/prints-work-no-stdio/index.html +++ b/Lab/IO/quiz/prints-work-no-stdio/index.html @@ -4,14 +4,14 @@ Prints Working after Closing `stdio` | Operating Systems - - + +
    Skip to main content

    Prints Working after Closing stdio

    Question Text

    Why does support/redirect/redirect.c, still print messages to the console after closing file descriptor 1 (stdout)?

    Question Answers

    • because wait_for_input() calls fprintf(stderr, ...), which prints to stderr (file descriptor 2)
    • because the default file descriptors cannot be "truly" closed

    • because the other two default file descriptors are still linked to the console

    • because the wait_for_input() function started printed before closing the stdout file descriptor

    Feedback

    If you look at wait_for_input() closely, you'll notice it calls fprintf(stderr, ...). stderr is liked to file descriptor 2, which is left unchanged so we can still write data to it.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/receiver-socket-fd/index.html b/Lab/IO/quiz/receiver-socket-fd/index.html index 354cda7229..d918893f84 100644 --- a/Lab/IO/quiz/receiver-socket-fd/index.html +++ b/Lab/IO/quiz/receiver-socket-fd/index.html @@ -4,13 +4,13 @@ Receiver Socked File Descriptor | Operating Systems - - + +
    Skip to main content

    Receiver Socked File Descriptor

    Question Text

    What is the type of the file descriptor that corresponds to the socket created by support/send-receive/receiver.py?

    Question Answers

    • only file descriptors that are linked to files have types

    • DIR

    • REG

    • CHR

    • IPv4

    Feedback

    Running lsof yields the following output:

    student@os:~$ lsof -p 59681
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    python3 59681 student cwd DIR 8,1 0 559322 /home/student/operating-systems-oer/content/chapters/io/lab/support/send-receive
    python3 59681 student rtd DIR 259,6 4096 2 /
    python3 59681 student txt REG 259,6 5502744 1835857 /usr/bin/python3.8
    python3 59681 student mem REG 259,6 8631488 1835827 /usr/lib/locale/locale-archive
    python3 59681 student mem REG 259,6 108936 1835887 /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
    python3 59681 student mem REG 259,6 182560 1836149 /usr/lib/x86_64-linux-gnu/libexpat.so.1.6.11
    python3 59681 student mem REG 259,6 1369384 1857443 /usr/lib/x86_64-linux-gnu/libm-2.31.so
    python3 59681 student mem REG 259,6 14880 1857476 /usr/lib/x86_64-linux-gnu/libutil-2.31.so
    python3 59681 student mem REG 259,6 18848 1857439 /usr/lib/x86_64-linux-gnu/libdl-2.31.so
    python3 59681 student mem REG 259,6 157224 1857471 /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
    python3 59681 student mem REG 259,6 2029592 1857435 /usr/lib/x86_64-linux-gnu/libc-2.31.so
    python3 59681 student mem REG 259,6 27002 2506848 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
    python3 59681 student mem REG 259,6 191504 1835092 /usr/lib/x86_64-linux-gnu/ld-2.31.so
    python3 59681 student 0u CHR 136,1 0t0 4 /dev/pts/1
    python3 59681 student 1u CHR 136,1 0t0 4 /dev/pts/1
    python3 59681 student 2u CHR 136,1 0t0 4 /dev/pts/1
    python3 59681 student 3u IPv4 588386 0t0 UDP localhost:5000

    The last line displays the socket:

    python3 59681  student    3u  IPv4 588386      0t0     UDP localhost:5000

    Its type is written on the the 5th column: IPv4 because it's a network socket.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/server-copies/index.html b/Lab/IO/quiz/server-copies/index.html index 5d066fba6c..2110729d46 100644 --- a/Lab/IO/quiz/server-copies/index.html +++ b/Lab/IO/quiz/server-copies/index.html @@ -4,8 +4,8 @@ Client-Server Number of Copies | Operating Systems - - + +
    @@ -16,7 +16,7 @@ Following this step, the app will call send(), which will first copy the file to a buffer in the kernel. From this buffer, the kernel itself will copy the file to another buffer on the NIC (Network Interface Card). In total, there the file is copied 4 times, as outlined in the image below.

    Server Copies - Read-Send

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/stderr-fd/index.html b/Lab/IO/quiz/stderr-fd/index.html index 3d988a80d3..2d9d9c8c41 100644 --- a/Lab/IO/quiz/stderr-fd/index.html +++ b/Lab/IO/quiz/stderr-fd/index.html @@ -4,15 +4,15 @@ File Descriptor of `stderr` | Operating Systems - - + +
    Skip to main content

    File Descriptor of stderr

    Question Text

    Which file descriptor is associated by default to stderr?

    Question Answers

    • it varies from process to process

    • it varies from one Linux distribution to another

    • stderr has no associated file descriptor

    • 2
    • 0

    • 1

    Feedaback

    You would type ls 2> /dev/null to ignore ls's errors. This equates to redirecting stderr to /dev/null. The number 2 in 2> hints that stderr is by default associated with file descriptor 2.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/strace-printf/index.html b/Lab/IO/quiz/strace-printf/index.html index 9d69dc36cc..17f9d1ab73 100644 --- a/Lab/IO/quiz/strace-printf/index.html +++ b/Lab/IO/quiz/strace-printf/index.html @@ -4,13 +4,13 @@ `printf()` Under Strace | Operating Systems - - + +
    Skip to main content

    printf() Under Strace

    Question Text

    How many calls to write() does the code in support/buffering/printf_buffering.c do?

    Question Answers

    • none
    • 1
    • 6

    • 5

    Feedback

    Just run the binary under strace:

    student@os:/.../support/buffering$ strace -e write ./printf_buffering
    write(1, "Dovahkiin, Dovahkiin Naal ok zin"..., 169Dovahkiin, Dovahkiin Naal ok zin los vahriin Wah dein vokul mahfaeraak ahst vaal! Ahrk fin norok paal graan Fod nust hon zindro zaan Dovahkiin, fah hin kogaan mu draal! ) = 169
    +++ exited with 0 +++

    There's one call to write().

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/syscalls-cp/index.html b/Lab/IO/quiz/syscalls-cp/index.html index 38b0f63e40..5e81e85a9b 100644 --- a/Lab/IO/quiz/syscalls-cp/index.html +++ b/Lab/IO/quiz/syscalls-cp/index.html @@ -4,14 +4,14 @@ Syscalls Used by `cp` | Operating Systems - - + +
    Skip to main content

    Syscalls Used by cp

    Question Text

    What syscalls does cp use to copy files?

    Question Answers

    • mmap()
    • read() and write()

    • copy_file_range()

    • a combination of read() - write() and mmap()

    Feedback

    It suffices to use strace to see that cp uses read() and write().

    student@os:/.../support/file-mappings$ strace cp test-file.txt output.txt
    openat(AT_FDCWD, "test-file.txt", O_RDONLY) = 3
    fstat(3, {st_mode=S_IFREG|0664, st_size=1048576, ...}) = 0
    openat(AT_FDCWD, "output.txt", O_WRONLY|O_CREAT|O_EXCL, 0664) = 4
    fstat(4, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
    [...]
    read(3, "@Y\344\0025\317\27\243\23\201:\27\342\356\240\345\331Nq\v/\36\244\200\301\247\3152\35WZ\337"..., 131072) = 131072
    write(4, "@Y\344\0025\317\27\243\23\201:\27\342\356\240\345\331Nq\v/\36\244\200\301\247\3152\35WZ\337"..., 131072) = 131072
    read(3, "\201\240J7x\275\257Z\343\334\307d<\321U\275\337\10\233j\222\313,##cQD\268e\324"..., 131072) = 131072
    write(4, "\201\240J7x\275\257Z\343\334\307d<\321U\275\337\10\233j\222\313,##cQD\268e\324"..., 131072) = 131072
    read(3, "\371\3244=\17\300L9\243\201\362\25\273\37\326\323\362\200\1T\310N\316\305\253\331\331Nt\346\3369"..., 131072) = 131072
    write(4, "\371\3244=\17\300L9\243\201\362\25\273\37\326\323\362\200\1T\310N\316\305\253\331\331Nt\346\3369"..., 131072) = 131072
    read(3, "\350\304\345f\16\305V\356\371\263?+\355{\16\235\344\310P4}\2043%\0052\345D\265\243t\354"..., 131072) = 131072
    write(4, "\350\304\345f\16\305V\356\371\263?+\355{\16\235\344\310P4}\2043%\0052\345D\265\243t\354"..., 131072) = 131072
    read(3, "\277\226\315\226\n\37\337;N*\211\352\254$\273\2\351\30a\254\ta\352R\25-\23\274\376zy\211"..., 131072) = 131072
    write(4, "\277\226\315\226\n\37\337;N*\211\352\254$\273\2\351\30a\254\ta\352R\25-\23\274\376zy\211"..., 131072) = 131072
    read(3, "}\245\356;\222\327\204\242u\26dy%\346\374\201ndT\226\233\3575\345\247\356\362\344\350\354\17\261"..., 131072) = 131072
    write(4, "}\245\356;\222\327\204\242u\26dy%\346\374\201ndT\226\233\3575\345\247\356\362\344\350\354\17\261"..., 131072) = 131072
    read(3, "\35\277\207\243~\355(i\351^\1\346\312V\232\204\32\230~\376\20\245\"\305\344d\304\304B\272\346\332"..., 131072) = 131072
    write(4, "\35\277\207\243~\355(i\351^\1\346\312V\232\204\32\230~\376\20\245\"\305\344d\304\304B\272\346\332"..., 131072) = 131072
    read(3, "\n)\334\275\331:R\236O\231\243\302\314\267\326\"\rY\262\21\374\305\275\3\332\23\345\16>\214\210\235"..., 131072) = 131072
    write(4, "\n)\334\275\331:R\236O\231\243\302\314\267\326\"\rY\262\21\374\305\275\3\332\23\345\16>\214\210\235"..., 131072) = 131072

    Alternatively, if your kernel version is 5.19 or newer, it's likely that cp will use copy_file_range():

    student@os:/.../support/file-mappings$ strace cp test-file.txt output.txt
    openat(AT_FDCWD, "test-file.txt", O_RDONLY) = 3
    newfstatat(3, "", {st_mode=S_IFREG|0664, st_size=1048576, ...}, AT_EMPTY_PATH) = 0
    openat(AT_FDCWD, "output.txt", O_WRONLY|O_CREAT|O_EXCL, 0664) = 4
    ioctl(4, BTRFS_IOC_CLONE or FICLONE, 3) = -1 EOPNOTSUPP (Operation not supported)
    newfstatat(4, "", {st_mode=S_IFREG|0644, st_size=0, ...}, AT_EMPTY_PATH) = 0
    fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
    copy_file_range(3, NULL, 4, NULL, 9223372035781033984, 0) = 1048576
    copy_file_range(3, NULL, 4, NULL, 9223372035781033984, 0) = 0

    This syscall copies files inside the kernel without having the data pass through the user space. This procedure is called zero-copy.

    - - + + \ No newline at end of file diff --git a/Lab/IO/quiz/write-file-permissions/index.html b/Lab/IO/quiz/write-file-permissions/index.html index e4b322bc5f..51898d6d8f 100644 --- a/Lab/IO/quiz/write-file-permissions/index.html +++ b/Lab/IO/quiz/write-file-permissions/index.html @@ -4,8 +4,8 @@ `write_file.txt` Permissions | Operating Systems - - + +
    @@ -15,7 +15,7 @@ specified in flags; if it is not supplied, some arbitrary bytes from the stack will be applied as the file mode.

    The wording "arbitrary bytes from the stack" is a bit obsolete on x86-64 systems.

    The x86 calling convention specifies that arguments are pushed on the stack, and because the open() wrapper is a variadic function in libc this would result in arbitrary bytes being read from the stack when mode is required but not provided.

    On the other hand, the x86-64 calling convention places arguments in registers.

    A correct open() call would look something like this:

    open("write_file.txt", O_WRONLY | O_CREAT, 0644).

    0644 is the octal representation of rw-r--r--. The approximate x86-64 assembly code for this function call would look like this:

    mov rdi, path_to_file   ; first argument: path

    mov rsi, O_WRONLY
    or rsi, O_CREAT ; second argument: flags

    mov rdx, 0644 ; third argument: mode

    call open

    When we don't specify a mode argument, the open() function simply takes this value from rdx as it was before the function call, resulting in undefined behavior.

    - - + + \ No newline at end of file diff --git a/Lab/IO/redirections/index.html b/Lab/IO/redirections/index.html index 3be6c19825..93b29c7aea 100644 --- a/Lab/IO/redirections/index.html +++ b/Lab/IO/redirections/index.html @@ -4,8 +4,8 @@ Redirections | Operating Systems - - + +
    @@ -54,7 +54,7 @@ It is capable of fork()-ing itself and execvp()-ing commands, just like Bash. We can now extend it to allow redirecting stdout to a file.

    Use what you've learnt so far in this section to allow this mini-shell to redirect the output of its commands to files. Redirection is performed just like in bash via >.

    - - + + \ No newline at end of file diff --git a/Lab/IO/remote-io/index.html b/Lab/IO/remote-io/index.html index 97ec316f0f..db7315abe6 100644 --- a/Lab/IO/remote-io/index.html +++ b/Lab/IO/remote-io/index.html @@ -4,8 +4,8 @@ Remote I/O | Operating Systems - - + +
    @@ -80,7 +80,7 @@ If everything is right, each sender should be able to communicate with each receiver.

  • Use the API you've just learned about to fill in the TODOs in support/receive-challenges/receive_net_dgram_socket.c.

    This is like receiver.py. For it to run properly, you should compile it using make, then run it and after that run send_net_dgram_socket. If you solved the challenge correctly, receive_net_dgram_socket should display the flag.

  • - - + + \ No newline at end of file diff --git a/Lab/IO/zero-copy/index.html b/Lab/IO/zero-copy/index.html index 55feedf162..0a66b38491 100644 --- a/Lab/IO/zero-copy/index.html +++ b/Lab/IO/zero-copy/index.html @@ -4,8 +4,8 @@ Zero-Copy | Operating Systems - - + +
    @@ -27,7 +27,7 @@ Yours might differ by quite a lot, as they depend on your disk, your NIC, your kernel, your Python version, the load on your system etc.

    student@os:/.../support/zero-copy$ python3 benchmark_client.py read-send
    Time taken: 7.175773588009179 seconds

    student@os:/.../support/zero-copy$ python3 benchmark_client.py sendfile
    Time taken: 3.71454380400246 seconds

    This is quite good! Using sendfile() halves the number of copies needed from 4 to 2. Thus, it makes sense for the running time to roughly halve as well.

    Quiz

    You can read a slightly more detailed article about zero-copy here.

    - - + + \ No newline at end of file diff --git a/Lab/index.html b/Lab/index.html index 26eaa989eb..3b2ce7d389 100644 --- a/Lab/index.html +++ b/Lab/index.html @@ -4,13 +4,13 @@ Lab | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Lab/lab-setup/index.html b/Lab/lab-setup/index.html index 4aa213317b..28c0f1b2f4 100644 --- a/Lab/lab-setup/index.html +++ b/Lab/lab-setup/index.html @@ -4,14 +4,14 @@ Setting up the Lab Environment | Operating Systems - - + +
    Skip to main content

    Setting up the Lab Environment

    If you have already cloned the repository, make sure it is updated:

    student@os:~$ cd operating-systems

    student@os:~/operating-systems$ git pull --rebase

    The command may fail if you have uncommitted changes. If that is the case, stash your changes, retry, and pop the stash:

    student@os:~/operating-systems$ git stash

    student@os:~/operating-systems$ git pull --rebase

    student@os:~/operating-systems$ git stash pop

    If you haven't already cloned the repository, do so and then enter the repository:

    student@os:~$ git clone https://github.com/cs-pub-ro/operating-systems

    student@os:~$ cd operating-systems

    Navigate to a chapter's lab directory:

    student@os:~/operating-systems$ cd content/chapters/<chapter-name>/lab/

    The possible options are: software-stack, data, compute, io and app-interact.

    If you're using the OS-runner Docker container, you can use the following shortcuts:

    go-ss - changes directory to Software Stack lab

    go-data - changes directory to Data lab

    go-compute - changes directory to Compute lab

    go-io - changes directory to IO lab

    go-appInt - changes directory to App Interaction lab

    - - + + \ No newline at end of file diff --git a/Lecture/Application-Interaction/index.html b/Lecture/Application-Interaction/index.html index 583240e8cc..f469363217 100644 --- a/Lecture/Application-Interaction/index.html +++ b/Lecture/Application-Interaction/index.html @@ -4,13 +4,13 @@ Application-Interaction | Operating Systems - - + +
    Skip to main content

    Application-Interaction


    tip

    Focus the slides and press F for fullscreen viewing.

    - - + + \ No newline at end of file diff --git a/Lecture/Compute/index.html b/Lecture/Compute/index.html index 7896b7ba87..72de46ed7e 100644 --- a/Lecture/Compute/index.html +++ b/Lecture/Compute/index.html @@ -4,13 +4,13 @@ Compute | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Lecture/Data/index.html b/Lecture/Data/index.html index 973e3fad23..35d8697c00 100644 --- a/Lecture/Data/index.html +++ b/Lecture/Data/index.html @@ -4,13 +4,13 @@ Data | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Lecture/IO/index.html b/Lecture/IO/index.html index fccf6eb554..6c140cd40f 100644 --- a/Lecture/IO/index.html +++ b/Lecture/IO/index.html @@ -4,13 +4,13 @@ IO | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Lecture/index.html b/Lecture/index.html index 295be229c8..24864c9156 100644 --- a/Lecture/index.html +++ b/Lecture/index.html @@ -4,13 +4,13 @@ Lecture | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/index.html b/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/index.html index 7bb751b4ac..3dac5654c2 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/index.html @@ -4,13 +4,13 @@ Modern Software Stacks | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack/index.html b/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack/index.html index 84f18022bc..77e9fd63d1 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack/index.html @@ -4,8 +4,8 @@ Modern Software Stacks | Operating Systems - - + +
    @@ -19,7 +19,7 @@ Part of the API exposed by the standard C library is the standard C API, also called ANSI C*- or ISO C; this API is typically portable across all platforms (operating systems and hardware). This API, going beyond system call wrappers, has several advantages:

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/index.html b/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/index.html index d58800a406..913eeab3c1 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/index.html @@ -4,13 +4,13 @@ Questions | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software/index.html b/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software/index.html index dad8f3dffb..03be0b8ee9 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software/index.html @@ -4,15 +4,15 @@ Software Properties | Operating Systems - - + +
    Skip to main content

    Software Properties

    Question Text

    Which of the following is *not- an advantage of software when compared to hardware?

    Question Answers

    • reusability
    • performance
    • portability

    • flexibility

    Feedback

    Software is reusable and flexible, unlike physical hardware that's rigid and used-once. Software is also portable across different hardware (and software platforms). However, software relies on hardware for running, so software will never beat hardware in terms of sheer speed / performance.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/index.html b/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/index.html index 1a91869527..2daaff1d1c 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/index.html @@ -4,13 +4,13 @@ Drills | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/Overview/index.html b/Software Stack/Lab 1 - Operating System Perspective/Overview/index.html index 42248cb885..b3a0d05cf9 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/Overview/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/Overview/index.html @@ -4,8 +4,8 @@ Software Stack | Operating Systems - - + +
    @@ -24,7 +24,7 @@ These generic interfaces "hides" possible differences in the even lower layers. This way, a software stack ensures portability across different other parts of software (and hardware as well). For example, the standard C library, that we will present shortly, ensures portability across different operating systems.

    Software Stack

    Quiz

    Contents

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software/index.html b/Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software/index.html index 02bbd0bd4c..6db39f993b 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software/index.html @@ -4,15 +4,15 @@ Software Properties | Operating Systems - - + +
    Skip to main content

    Software Properties

    Question Text

    Which of the following is *not- an advantage of software when compared to hardware?

    Question Answers

    • reusability
    • performance
    • portability

    • flexibility

    Feedback

    Software is reusable and flexible, unlike physical hardware that's rigid and used-once. Software is also portable across different hardware (and software platforms). However, software relies on hardware for running, so software will never beat hardware in terms of sheer speed / performance.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/index.html index cc82b0cbf3..cc9789974a 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/index.html @@ -4,13 +4,13 @@ Questions | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall/index.html index e58fcf8a94..76dffa1e23 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall/index.html @@ -4,14 +4,14 @@ Libcall with Syscall | Operating Systems - - + +
    Skip to main content

    Libcall with Syscall

    Question Text

    Which of the following library calls will for sure invoke a system call?

    Question Answers

    • fopen()
    • fwrite()

    • printf()

    • strcpy()

    Feedback

    fopen() requires opening a file and access to the operating system (for filesystem access). The others may not require a system call (strcpy()) or may use buffering to delay the invocation of a system call (fwrite(), printf()).

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id/index.html index dc1c363760..c61b9ee24a 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id/index.html @@ -4,13 +4,13 @@ Syscall ID | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers/index.html index 04deb8a126..645384a233 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers/index.html @@ -4,13 +4,13 @@ Syscall Numbers | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool/index.html index 836a9374b0..967ccd4062 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool/index.html @@ -4,13 +4,13 @@ Syscall Tool | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper/index.html index 56a04fd550..fab0cddbda 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper/index.html @@ -4,13 +4,13 @@ Syscall Wrappers | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/index.html index e030521a4e..7bea01c931 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/index.html @@ -4,8 +4,8 @@ System Calls | Operating Systems - - + +
    @@ -21,7 +21,7 @@ Some system calls you could try: open(), rename(), mkdir(). Create a Makefile for that program. Run the resulting program with strace to see the actual system calls being made (and their arguments).

    If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/index.html index 86bf0c2083..d6690907c3 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/index.html @@ -4,8 +4,8 @@ System Call Wrappers | Operating Systems - - + +
    @@ -18,7 +18,7 @@ For example, it will convert the number 1234 to the string "1234" string (NULL-terminated, 5 bytes long); the return value is 4 (the number of digits of the "1234" string).

    Then make the call to getpid; it gets no arguments and returns an integer (the PID - *process ID- of the current process).

    If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/index.html index 60f7b772fc..8c6bec80f0 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/index.html @@ -4,13 +4,13 @@ Tasks | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/index.html index 321119067b..1283385a9d 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/index.html @@ -4,13 +4,13 @@ Drills | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall/index.html index 0e33d236b3..960b3ac51d 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall/index.html @@ -4,8 +4,8 @@ Analyzing the Software Stack | Operating Systems - - + +
    @@ -26,7 +26,7 @@ Obviously, this is not portable (specific to a given CPU architecture, x86_64 in our case) and too verbose and difficult to maintain. For portability and maintainability, we require a higher level language, such as C. In order to use C, we need function wrappers around system calls.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/index.html index d501137b01..93a6d4a635 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/index.html @@ -4,13 +4,13 @@ Reading | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall/index.html index 2d9cb337f8..76a4f57285 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall/index.html @@ -4,8 +4,8 @@ Library calls vs System Calls | Operating Systems - - + +
    @@ -18,7 +18,7 @@ Actual system calls are made either when the standard C library buffer is full or when an fflush() library call is made.

    Note that on some systems, ltrace does not work*- as expected, due to now binding. To avoid this behaviour, you can force the lazy binding- (based on which ltrace is constructed to work). An example can be found in libcall-syscall/support/Makefile, however for system binaries, such as ls or pwd, the only alternative is to add the `-x ""` argument to force the command to trace all symbols in the symbol table:

    student@os:~$ ltrace -x "*" ls

    You can always choose what library functions ltrace is investigating, by replacing the wildcard with their name:

    student@os:~$ ltrace -x "malloc" -x "free" ls
    malloc@libc.so.6(5) = 0x55c42b2b8910
    free@libc.so.6(0x55c42b2b8910) = <void>
    malloc@libc.so.6(120) = 0x55c42b2b8480
    malloc@libc.so.6(12) = 0x55c42b2b8910
    malloc@libc.so.6(776) = 0x55c42b2b8930
    malloc@libc.so.6(112) = 0x55c42b2b8c40
    malloc@libc.so.6(1336) = 0x55c42b2b8cc0
    malloc@libc.so.6(216) = 0x55c42b2b9200
    malloc@libc.so.6(432) = 0x55c42b2b92e0
    malloc@libc.so.6(104) = 0x55c42b2b94a0
    malloc@libc.so.6(88) = 0x55c42b2b9510
    malloc@libc.so.6(120) = 0x55c42b2b9570
    [...]

    If you would like to know more about lazy binding, now binding*- or PLT*- entries, check out this blog post.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper/index.html index 9f058d515b..08bdafecc6 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper/index.html @@ -4,8 +4,8 @@ System Call Wrappers | Operating Systems - - + +
    @@ -16,7 +16,7 @@ This way, C programs can be written that make function calls that end up making system calls.

    Let's build, run and trace system calls for the program:

    student@os:~/.../tasks/syscall-wrapper/support$ ls
    main.c Makefile syscall.h syscall.s

    student@os:~/.../tasks/syscall-wrapper/support$ make
    gcc -c -o main.o main.c
    nasm -f elf64 -o syscall.o syscall.s
    cc -nostdlib -no-pie -Wl,--entry=main -Wl,--build-id=none main.o syscall.o -o main

    student@os:~/.../tasks/syscall-wrapper/support$ ls
    main main.c main.o Makefile syscall.h syscall.o syscall.s

    student@os:~/.../software-stack/lab/syscall-wrapper$ ./main
    Hello, world!

    student@os:~/.../tasks/syscall-wrapper/support$ strace ./main
    execve("./main", ["./main"], 0x7ffee60fb590 /- 63 vars */) = 0
    write(1, "Hello, world!\n", 14Hello, world!
    ) = 14
    exit(0) = ?
    +++ exited with 0 +++

    The trace is similar to the previous example, showing the write() and exit() system calls.

    By creating system call wrappers as C functions, we are now relieved of the burden of writing assembly language code. Of course, there has to be an initial implementation of wrapper functions written in assembly language; but, after that, we can use C only.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/index.html index c92c92b1d4..ce12f5aa95 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/index.html @@ -4,13 +4,13 @@ System Calls | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall/index.html index f6f7057ac7..c6e5a057b3 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall/index.html @@ -4,14 +4,14 @@ Libcall with Syscall | Operating Systems - - + +
    Skip to main content

    Libcall with Syscall

    Question Text

    Which of the following library calls will for sure invoke a system call?

    Question Answers

    • fopen()
    • fwrite()

    • printf()

    • strcpy()

    Feedback

    fopen() requires opening a file and access to the operating system (for filesystem access). The others may not require a system call (strcpy()) or may use buffering to delay the invocation of a system call (fwrite(), printf()).

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id/index.html index 3dca8c4a2e..35d795e8b2 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id/index.html @@ -4,13 +4,13 @@ Syscall ID | Operating Systems - - + +
    Skip to main content

    Syscall ID

    Question Text

    What register stores the system call ID on x86_64?

    Question Answers

    • RIP

    • RSP

    • RAX
    • RDX

    Feedback

    RAX is the register used for passing the syscall ID and the result code.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers/index.html index 81b45147d0..64c3817062 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers/index.html @@ -4,13 +4,13 @@ Syscall Numbers | Operating Systems - - + +
    Skip to main content

    Syscall Numbers

    Question Text

    What is the approximate number of system call numbers in Linux?

    Question Answers

    • 3

    • 30

    • 300
    • 3000

    Feedback

    As show here, they're about 300 system calls in Linux.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool/index.html index f4e6937c6e..3a5a90365d 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool/index.html @@ -4,13 +4,13 @@ Syscall Tool | Operating Systems - - + +
    Skip to main content

    Syscall Tool

    Question Text

    What tool do we use to capture system calls?

    Question Answers

    • strace
    • make

    • gcc

    • ./exec

    Feedback

    strace is used to trace system calls invoked by a running program.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper/index.html index cae6297ead..816965acea 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper/index.html @@ -4,13 +4,13 @@ Syscall Wrappers | Operating Systems - - + +
    Skip to main content

    Syscall Wrappers

    Question Text

    What language do we use to invoke system calls?

    Question Answers

    • assembly
    • C

    • C++

    • Go

    Feedback

    System calls require setting of registers that can only be done in assembly language.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/index.html index bb00138131..11b951325c 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/index.html @@ -4,8 +4,8 @@ System Calls | Operating Systems - - + +
    @@ -21,7 +21,7 @@ Some system calls you could try: open(), rename(), mkdir(). Create a Makefile for that program. Run the resulting program with strace to see the actual system calls being made (and their arguments).

    If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/index.html index 8b4a330ee2..adf2c4b118 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/index.html @@ -4,14 +4,14 @@ Library calls vs System Calls | Operating Systems - - + +
    Skip to main content

    Library calls vs System Calls

    Enter the libcall-syscall/support/ folder and go through the practice items below.

    1. Check library calls and system calls for the call2.c file. Use ltrace and strace.

      Find explanations for the calls being made and the library call to system call mapping.

      Quiz

    If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/index.html b/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/index.html index 4ecf9d42cd..c88f13258f 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/index.html @@ -4,8 +4,8 @@ System Call Wrappers | Operating Systems - - + +
    @@ -18,7 +18,7 @@ For example, it will convert the number 1234 to the string "1234" string (NULL-terminated, 5 bytes long); the return value is 4 (the number of digits of the "1234" string).

    Then make the call to getpid; it gets no arguments and returns an integer (the PID - *process ID- of the current process).

    If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 1 - Operating System Perspective/index.html b/Software Stack/Lab 1 - Operating System Perspective/index.html index f9ba4d9bb3..4bb2851fb9 100644 --- a/Software Stack/Lab 1 - Operating System Perspective/index.html +++ b/Software Stack/Lab 1 - Operating System Perspective/index.html @@ -4,13 +4,13 @@ Lab 1 - Operating System Perspective | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/index.html b/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/index.html index 6268d32120..359bf68306 100644 --- a/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/index.html @@ -4,8 +4,8 @@ App Investigation | Operating Systems - - + +
    @@ -16,7 +16,7 @@ The file command tells if the file passed as argument is a statically-linked executable. If you can't find one, install the busybox-static package.

  • Look into what busybox is and explain why it's custom to have it as statically-linked executable.

  • Run ldd, nm, strace, ltrace on a statically-linked application executable. Explain the results.

  • If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/index.html b/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/index.html index 01b91a1469..631cb141bf 100644 --- a/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/index.html @@ -4,13 +4,13 @@ Tasks | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Applications/Drills/index.html b/Software Stack/Lab 2 - Library Perspective/Applications/Drills/index.html index a1a6a5f3e4..fbb8528997 100644 --- a/Software Stack/Lab 2 - Library Perspective/Applications/Drills/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Applications/Drills/index.html @@ -4,13 +4,13 @@ Drills | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate/index.html b/Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate/index.html index 7110a52201..4f74e11092 100644 --- a/Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate/index.html @@ -4,15 +4,15 @@ App Investigation | Operating Systems - - + +
    Skip to main content

    App Investigation

    Let's spend some time investigating actual applications residing on the local system. For now, we know that applications are developed using high-level languages and then compiled or interpreted to use the lower-layer interfaces of the software stack, such as the system call API.

    Let's enter the app-investigation/support/ folder and run the get_app_types.sh script:

    student@os:~/.../tasks/app-investigation/support/$ ./get_app_types.sh
    binary apps: 2223
    Perl apps: 256
    Shell apps: 454
    Python apps: 123
    Other apps: 27

    The script prints the types of the application executables in the system. The output will differ between systems, given each has particular types of applications installed.

    We list them by running the command inside the get_app_types.sh script:

    student@os:~/.../tasks/app-investigation/support/$ find /usr/bin /bin /usr/sbin /sbin -type f -exec file {} \;
    [...]
    /usr/bin/qpdldecode: ELF 64-bit LSB shared object, x86-64 [...]
    /usr/bin/mimeopen: Perl script text executable
    [...]

    As above, the output will differ between systems.

    So, depending on the developers' choice, applications may be:

    • compiled into executables, from compiled languages such as C, C++, Go, Rust, D
    • developed as scripts, from interpreted languages such as Python, Perl, JavaScript
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Applications/Reading/index.html b/Software Stack/Lab 2 - Library Perspective/Applications/Reading/index.html index 31e3b68c69..485d90c0f7 100644 --- a/Software Stack/Lab 2 - Library Perspective/Applications/Reading/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Applications/Reading/index.html @@ -4,13 +4,13 @@ Reading | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Applications/index.html b/Software Stack/Lab 2 - Library Perspective/Applications/index.html index e5b2bc881f..c3928a9774 100644 --- a/Software Stack/Lab 2 - Library Perspective/Applications/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Applications/index.html @@ -4,13 +4,13 @@ Applications | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/index.html b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/index.html index ed3f3ac144..06cc798307 100644 --- a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/index.html +++ b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/index.html @@ -4,13 +4,13 @@ Questions | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools/index.html b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools/index.html index 8e2c3ca5d6..2b0901117c 100644 --- a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools/index.html +++ b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools/index.html @@ -4,14 +4,14 @@ Python Tools | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/index.html b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/index.html index 42af6da722..c0f579ddc1 100644 --- a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/index.html +++ b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/index.html @@ -4,8 +4,8 @@ High-Level Languages | Operating Systems - - + +
    @@ -20,7 +20,7 @@ Use perf to measure the running time. Use source files of different sizes. Compare the outputs of these commands on the three programs.

    If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/index.html b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/index.html index 60a20dcb49..cf0c759150 100644 --- a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/index.html +++ b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/index.html @@ -4,13 +4,13 @@ Tasks | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/index.html b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/index.html index 5b752badf9..1d567c5b0b 100644 --- a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/index.html +++ b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/index.html @@ -4,13 +4,13 @@ Drills | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang/index.html b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang/index.html index 2f66ed5166..85dc5962c5 100644 --- a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang/index.html +++ b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang/index.html @@ -4,8 +4,8 @@ High-Level Languages | Operating Systems - - + +
    @@ -20,7 +20,7 @@ The Python code takes 69 milliseconds, whereas the C code runs in less than 1 millisecond.

    When deciding what programming language and what libraries and software components to use, you have to balance requirements for fast development and increased safety (inherent to higher-level programming languages) with requirements for speed or efficiency (common to lower-level programming languages such as C). Newer modern programming languages such as Go, Rust, D aim to add the benefits of high-level programming languages and keep efficiency close to the C programming language. Generally, additional software layers (libraries, language environments, interpreters) simplify development but decrease speed and efficiency.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/index.html b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/index.html index 466aa158f1..7896f6c9ac 100644 --- a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/index.html +++ b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/index.html @@ -4,13 +4,13 @@ Reading | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/index.html b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/index.html index 6623fc7833..92bf596262 100644 --- a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/index.html +++ b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/index.html @@ -4,13 +4,13 @@ High-Level Languages | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools/index.html b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools/index.html index 907f82b14b..f4da8ced48 100644 --- a/Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools/index.html +++ b/Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools/index.html @@ -4,14 +4,14 @@ Python Tools | Operating Systems - - + +
    Skip to main content

    Python Tools

    Question Text

    A Python program is not a proper argument for ...

    Question Answers

    • ltrace

    • strace

    • rm

    • ldd

    Feedback

    Because a Python program is a script to be interpreted, it won't be usable by ldd. ldd is passed a binary executable to look for library dependencies.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/index.html index 772cc17202..8c0d41a84e 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/index.html @@ -4,13 +4,13 @@ Questions | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc/index.html index d726c368a8..e12ee03827 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc/index.html @@ -4,13 +4,13 @@ malloc() | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall/index.html index bea72cc00d..1bc996b7e7 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall/index.html @@ -4,13 +4,13 @@ printf() System Call | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write/index.html index d2dfb6c1b6..bc0174c6a6 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write/index.html @@ -4,14 +4,14 @@ printf() vs write | Operating Systems - - + +
    Skip to main content

    printf() vs write

    Question Text

    What are features provided by printf() when compared to write? (choose 2 answers)

    Question Answers

    • buffering
    • outputs to standard output

    • may write to file

    • does output formatting
    • can work with binary data

    Feedback

    printf() can do buffering to reduce the number of system calls. Also, printf(), as it name suggests (the f suffix), does output formatting.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall/index.html index 6a7dbc3b2b..2acd4ee1cc 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall/index.html @@ -4,13 +4,13 @@ strcpy() System Call | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool/index.html index 46b65115ec..748dc2176c 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool/index.html @@ -4,13 +4,13 @@ Syscall Tool | Operating Systems - - + +
    Skip to main content

    Syscall Tool

    Question Text

    Which of following is *not- and advantage of using libc for programs?

    Question Answers

    • increased portability
    • reduced executable size
    • richer set of features

    • easier development

    Feedback

    When using libc, because we add a new software component, the size of the resulting executable increases.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/index.html index b6f1670a7f..1d9a96ab68 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/index.html @@ -4,8 +4,8 @@ Common Functions | Operating Systems - - + +
    @@ -21,7 +21,7 @@ Use strace to confirm the reduction of the number of write system calls.

  • Update the main_printf.c file to also feature a flush() function that forces the flushing of the static global buffer and a write system call. Make calls to printf() and flush() to validate the implementation. Use strace to inspect the write system calls invoked by printf() and flush().

  • If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/index.html index 9d0237b703..c5fd1e0491 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/index.html @@ -4,8 +4,8 @@ Libraries and libc | Operating Systems - - + +
    @@ -20,7 +20,7 @@ Make sure you include all required headers. Check the system call being made.

    Make an fopen() with the proper arguments that gets as close as possible to the open() call, i.e. the system call arguments are as close as possible.

  • Inside the vendetta.c file make a call to sin() function (for sine). Compute sin(0) and sin(PI/2).

  • If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/index.html index dcf4440cbe..f62ae83584 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/index.html @@ -4,13 +4,13 @@ Tasks | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/index.html index d2728a9382..cb1acda400 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Drills/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Drills/index.html @@ -4,13 +4,13 @@ Drills | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions/index.html index 0aef732782..891fcb866e 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions/index.html @@ -4,8 +4,8 @@ Common Functions | Operating Systems - - + +
    @@ -22,7 +22,7 @@ printf() offers a more powerful printing interface, allowing us to print addresses and integers.

    Let's build and run the program:

    student@os:~/.../tasks/common-functions/support$ make main_printf
    gcc -fno-stack-protector -c -o printf.o printf.c
    gcc -nostdlib -no-pie -Wl,--entry=main -Wl,--build-id=none main_printf.o printf.o string.o syscall.o -o main_printf

    student@os:~/.../tasks/common-functions/support$ ./main_printf
    [before] src is at 00000000004026A0, len is 12, content: "warhammer40k"
    [before] dest is at 0000000000603000, len is 0, content: ""
    copying src to dest
    [after] src is at 00000000004026A0, len is 12, content: "warhammer40k"
    [after] dest is at 0000000000603000, len is 12, content: "warhammer40k"

    student@os:~/.../tasks/common-functions/support$ strace ./main_printf
    execve("./main_printf", ["./main_printf"], 0x7ffcaaa1d660 /- 63 vars */) = 0
    write(1, "[", 1[) = 1
    write(1, "b", 1b) = 1
    write(1, "e", 1e) = 1
    write(1, "f", 1f) = 1
    write(1, "o", 1o) = 1
    write(1, "r", 1r) = 1
    write(1, "e", 1e) = 1
    write(1, "]", 1]) = 1
    write(1, " ", 1 ) = 1
    write(1, "s", 1s) = 1
    write(1, "r", 1r) = 1
    [...]

    We see that we have greater printing flexibility with the printf() function. However, one downside of the current implementation is that it makes a system call for each character. This is inefficient and could be improved by printing a whole string.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Reading/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Reading/index.html index 090fce9e30..7523c18381 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Reading/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Reading/index.html @@ -4,13 +4,13 @@ Reading | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc/index.html index 89128d16a4..99b50da9d6 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc/index.html @@ -4,8 +4,8 @@ Libraries and libc | Operating Systems - - + +
    @@ -30,7 +30,7 @@ And, given that almost all programs make use of the basic features of the standard C library, libc is almost always used. We can say the above were exceptions to the rule, where we didn't make use of the standard C library.

    Summarizing, the advantages and disadvantages of using the standard C library are:

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/index.html index 5ce0a4977e..cc6b5e3833 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/index.html @@ -4,13 +4,13 @@ Libc | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc/index.html index 685b433365..958b1ec69a 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc/index.html @@ -4,13 +4,13 @@ malloc() | Operating Systems - - + +
    Skip to main content

    malloc()

    Question Text

    What system calls are invoked by the malloc() library call for Linux libc? (choose 2 answers)

    Question Answers

    • brk
    • free

    • dup

    • mmap
    • copy

    Feedback

    Depending on the allocation size, malloc() invokes brk or mmap.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall/index.html index e49e9c4abf..4d16766b3f 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall/index.html @@ -4,13 +4,13 @@ printf() System Call | Operating Systems - - + +
    Skip to main content

    printf() System Call

    Question Text

    What system call does the printf() function invoke?

    Question Answers

    • read
    • write
    • exec

    • exit

    Feedback

    printf() invokes the write system call to print messages to standard output.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write/index.html index f9fbca2649..31c810e68d 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write/index.html @@ -4,14 +4,14 @@ printf() vs write | Operating Systems - - + +
    Skip to main content

    printf() vs write

    Question Text

    What are features provided by printf() when compared to write? (choose 2 answers)

    Question Answers

    • buffering
    • outputs to standard output

    • may write to file

    • does output formatting
    • can work with binary data

    Feedback

    printf() can do buffering to reduce the number of system calls. Also, printf(), as it name suggests (the f suffix), does output formatting.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall/index.html index 73abb81816..ab52e163c0 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall/index.html @@ -4,13 +4,13 @@ strcpy() System Call | Operating Systems - - + +
    Skip to main content

    strcpy() System Call

    Question Text

    What system call does the strcpy() function invoke?

    Question Answers

    • cpy

    • touch

    • memcpy

    • no system call

    Feedback

    strcpy() doesn't invoke system calls, because it doesn't require any feature that is only provided by the operating system.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool/index.html index c372e81a41..6fc1563430 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool/index.html @@ -4,13 +4,13 @@ Syscall Tool | Operating Systems - - + +
    Skip to main content

    Syscall Tool

    Question Text

    Which of following is *not- and advantage of using libc for programs?

    Question Answers

    • increased portability
    • reduced executable size
    • richer set of features

    • easier development

    Feedback

    When using libc, because we add a new software component, the size of the resulting executable increases.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/index.html index 006a4f0fa2..cdca9452d5 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/index.html @@ -4,8 +4,8 @@ Common Functions | Operating Systems - - + +
    @@ -21,7 +21,7 @@ Use strace to confirm the reduction of the number of write system calls.

  • Update the main_printf.c file to also feature a flush() function that forces the flushing of the static global buffer and a write system call. Make calls to printf() and flush() to validate the implementation. Use strace to inspect the write system calls invoked by printf() and flush().

  • If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/index.html b/Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/index.html index b276ff8586..8eadcb18e1 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/index.html @@ -4,8 +4,8 @@ Libraries and libc | Operating Systems - - + +
    @@ -20,7 +20,7 @@ Make sure you include all required headers. Check the system call being made.

    Make an fopen() with the proper arguments that gets as close as possible to the open() call, i.e. the system call arguments are as close as possible.

  • Inside the vendetta.c file make a call to sin() function (for sine). Compute sin(0) and sin(PI/2).

  • If you're having difficulties solving this exercise, go through this reading material.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries/index.html b/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries/index.html index 59ec029a70..ad859462dd 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries/index.html @@ -4,13 +4,13 @@ Dynamic Libraries | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/index.html b/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/index.html index 82122954e3..89231f931a 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/index.html @@ -4,13 +4,13 @@ Questions | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables/index.html b/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables/index.html index 373bd902fb..e4c94dffcc 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables/index.html @@ -4,14 +4,14 @@ Static Executables | Operating Systems - - + +
    Skip to main content

    Static Executables

    Question Text

    Which of the following tools has no influence over statically-linked executables? (choose 2 answers)

    Question Answers

    • ltrace
    • strace

    • nm

    • ldd
    • rm

    Feedback

    ltrace and ldd are used to capture connections to dynamic libraries. They have no effect on statically-linked executables.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/index.html b/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/index.html index 45627350a5..00a09c7956 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/index.html @@ -4,13 +4,13 @@ Drills | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/index.html b/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/index.html index 5e6dcd5982..a313358814 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/index.html @@ -4,8 +4,8 @@ Statically-linked and Dynamically-linked Libraries | Operating Systems - - + +
    @@ -14,7 +14,7 @@ Let's build and run the two executables:

    student@os:~/.../tasks/static-dynamic/support$ ls
    hello.c Makefile

    student@os:~/.../tasks/static-dynamic/support$ make
    cc -Wall -c -o hello.o hello.c
    cc hello.o -o hello
    cc -static -o hello_static hello.o

    student@os:~/.../tasks/static-dynamic/support$ ls -lh
    total 852K
    -rwxrwxr-x 1 razvan razvan 8.2K Aug 2 15:53 hello
    -rw-rw-r-- 1 razvan razvan 76 Aug 2 15:51 hello.c
    -rw-rw-r-- 1 razvan razvan 1.6K Aug 2 15:53 hello.o
    -rwxrwxr-x 1 razvan razvan 827K Aug 2 15:53 hello_static
    -rw-rw-r-- 1 razvan razvan 237 Aug 2 15:53 Makefile

    student@os:~/.../tasks/static-dynamic/support$ ./hello
    Hello, World!

    student@os:~/.../tasks/static-dynamic/support$ ./hello_static
    Hello, World!

    The two executables (hello and hello_static) behave similarly, despite having vastly different sizes (8.2K vs. 827K - 100 times larger).

    We use nm and ldd to catch differences between the two types of resulting executables:

    student@os:~/.../tasks/static-dynamic/support$ ldd hello
    linux-vdso.so.1 (0x00007ffc8d9b2000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f10d1d88000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f10d237b000)

    student@os:~/.../tasks/static-dynamic/support$ ldd hello_static
    not a dynamic executable

    student@os:~/.../tasks/static-dynamic/support$ nm hello | wc -l
    33

    student@os:~/.../tasks/static-dynamic/support$ nm hello_static | wc -l
    1674

    The dynamic executable references the dynamically-linked libc library (/lib/x86_64-linux-gnu/libc.so.6), while the statically-linked executable has no references. Also, given the statically-linked executable integrated entire parts of statically-linked libraries, there are many more symbols than in the case of a dynamically-linked executable (1674 vs. 33).

    We can use strace to see that there are differences in the preparatory system calls for each type of executables. For the dynamically-linked executable, the dynamically-linked library (/lib/x86_64-linux-gnu/libc.so.6) is opened during runtime:

    student@os:~/.../tasks/static-dynamic/support$ strace ./hello
    execve("./hello", ["./hello"], 0x7ffc409c6640 /- 66 vars */) = 0
    brk(NULL) = 0x55a72eda6000
    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
    access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=198014, ...}) = 0
    mmap(NULL, 198014, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f3136a41000
    close(3) = 0
    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
    read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\35\2\0\0\0\0\0"..., 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=2030928, ...}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3136a3f000
    mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f3136458000
    mprotect(0x7f313663f000, 2097152, PROT_NONE) = 0
    mmap(0x7f313683f000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f313683f000
    mmap(0x7f3136845000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f3136845000
    close(3) = 0
    arch_prctl(ARCH_SET_FS, 0x7f3136a404c0) = 0
    mprotect(0x7f313683f000, 16384, PROT_READ) = 0
    mprotect(0x55a72d1bb000, 4096, PROT_READ) = 0
    mprotect(0x7f3136a72000, 4096, PROT_READ) = 0
    munmap(0x7f3136a41000, 198014) = 0
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 18), ...}) = 0
    brk(NULL) = 0x55a72eda6000
    brk(0x55a72edc7000) = 0x55a72edc7000
    write(1, "Hello, World!\n", 14Hello, World!
    ) = 14
    exit_group(0) = ?
    +++ exited with 0 +++

    student@os:~/.../tasks/static-dynamic/support$ strace ./hello_static
    execve("./hello_static", ["./hello_static"], 0x7ffc9fd45400 /- 66 vars */) = 0
    brk(NULL) = 0xff8000
    brk(0xff91c0) = 0xff91c0
    arch_prctl(ARCH_SET_FS, 0xff8880) = 0
    uname({sysname="Linux", nodename="yggdrasil", ...}) = 0
    readlink("/proc/self/exe", "/home/razvan/school/so/operating"..., 4096) = 116
    brk(0x101a1c0) = 0x101a1c0
    brk(0x101b000) = 0x101b000
    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 18), ...}) = 0
    write(1, "Hello, World!\n", 14Hello, World!
    ) = 14
    exit_group(0) = ?
    +++ exited with 0 +++

    Similarly, we can investigate a system executable (/bin/ls) to see that indeed all referenced dynamically-linked libraries are opened (via the openat system call) at runtime:

    student@os:~/.../tasks/static-dynamic/support$ ldd $(which ls)
    linux-vdso.so.1 (0x00007ffc3bdf3000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f092bd88000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f092b997000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f092b726000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f092b522000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f092c1d2000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f092b303000)

    student@os:~/.../tasks/static-dynamic/support$ strace -e openat ls
    openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
    community docs _index.html search.md
    +++ exited with 0 +++

    Quiz 1

    Quiz 2

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/index.html b/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/index.html index af63d6111a..ea6494ebc8 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/index.html @@ -4,13 +4,13 @@ Guides | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libraries/index.html b/Software Stack/Lab 2 - Library Perspective/Libraries/index.html index 40b26cc951..62504b0d3b 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libraries/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libraries/index.html @@ -4,13 +4,13 @@ Libraries | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries/index.html b/Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries/index.html index 9ea4af1247..6be6dbe6c0 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries/index.html @@ -4,13 +4,13 @@ Dynamic Libraries | Operating Systems - - + +
    Skip to main content

    Dynamic Libraries

    Question Text

    Which of the following is a dynamic library?

    Question Answers

    • libc.a
    • libc.so
    • libc.exe

    • libc.c

    Feedback

    The .so (shared object) extension is used for dynamic libraries in Linux.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables/index.html b/Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables/index.html index d1138e41fe..118ba5ad9e 100644 --- a/Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables/index.html +++ b/Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables/index.html @@ -4,14 +4,14 @@ Static Executables | Operating Systems - - + +
    Skip to main content

    Static Executables

    Question Text

    Which of the following tools has no influence over statically-linked executables? (choose 2 answers)

    Question Answers

    • ltrace
    • strace

    • nm

    • ldd
    • rm

    Feedback

    ltrace and ldd are used to capture connections to dynamic libraries. They have no effect on statically-linked executables.

    - - + + \ No newline at end of file diff --git a/Software Stack/Lab 2 - Library Perspective/index.html b/Software Stack/Lab 2 - Library Perspective/index.html index 2afe013430..633554e0d7 100644 --- a/Software Stack/Lab 2 - Library Perspective/index.html +++ b/Software Stack/Lab 2 - Library Perspective/index.html @@ -4,13 +4,13 @@ Lab 2 - Library Perspective | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/Software-Stack/index.html b/Software Stack/Software-Stack/index.html index c187303876..6ad6ed97eb 100644 --- a/Software Stack/Software-Stack/index.html +++ b/Software Stack/Software-Stack/index.html @@ -4,13 +4,13 @@ Software-Stack | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/Software Stack/index.html b/Software Stack/index.html index ff6d8a4592..8602bad5d8 100644 --- a/Software Stack/index.html +++ b/Software Stack/index.html @@ -4,13 +4,13 @@ Software Stack | Operating Systems - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/assets/js/15d9f00e.c63e5fe2.js b/assets/js/15d9f00e.c63e5fe2.js new file mode 100644 index 0000000000..3e7c7befdc --- /dev/null +++ b/assets/js/15d9f00e.c63e5fe2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkso=self.webpackChunkso||[]).push([[8435],{7604:a=>{a.exports=JSON.parse('{"title":"Hackathons","slug":"/Hackathons/","permalink":"/operating-systems/Hackathons/","navigation":{"previous":{"title":"FaaS Application","permalink":"/operating-systems/Exams/FaaS Application/faas-application"},"next":{"title":"Lambda Function Loader","permalink":"/operating-systems/Hackathons/Lambda Function Loader/"}}}')}}]); \ No newline at end of file diff --git a/assets/js/15d9f00e.f7b27611.js b/assets/js/15d9f00e.f7b27611.js deleted file mode 100644 index 0a900804d0..0000000000 --- a/assets/js/15d9f00e.f7b27611.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkso=self.webpackChunkso||[]).push([[8435],{7604:a=>{a.exports=JSON.parse('{"title":"Hackathons","slug":"/Hackathons/","permalink":"/operating-systems/Hackathons/","navigation":{"previous":{"title":"Network Configurations Manager","permalink":"/operating-systems/Exams/Network Configurations Manager/network-configurations-manager"},"next":{"title":"Lambda Function Loader","permalink":"/operating-systems/Hackathons/Lambda Function Loader/"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.1c218034.js b/assets/js/935f2afb.1c218034.js new file mode 100644 index 0000000000..a4b15329f9 --- /dev/null +++ b/assets/js/935f2afb.1c218034.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkso=self.webpackChunkso||[]).push([[8581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"sidebar":[{"type":"link","label":"Introduction","href":"/operating-systems/","docId":"README"},{"type":"category","label":"Software Stack","items":[{"type":"link","label":"Slides","href":"/operating-systems/Software Stack/Software-Stack","docId":"Software Stack/Software-Stack"},{"type":"category","label":"Lab 1 - Operating System Perspective","items":[{"type":"category","label":"Overview","items":[{"type":"link","label":"Reading","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/","docId":"Software Stack/Lab 1 - Operating System Perspective/Overview/overview"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Questions","items":[{"type":"link","label":"Software","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software","docId":"Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/"},{"type":"category","label":"Modern Software Stacks","items":[{"type":"link","label":"Reading","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack","docId":"Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/"},{"type":"category","label":"System Calls","items":[{"type":"category","label":"Reading","items":[{"type":"link","label":"Basic System Calls","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall"},{"type":"link","label":"System Call Wrapper","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper"},{"type":"link","label":"Libcall-Syscall","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Tasks","items":[{"type":"link","label":"Basic Syscall","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/README"},{"type":"link","label":"System Call Wrapper","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/"},{"type":"category","label":"Questions","items":[{"type":"link","label":"Libcall with Syscall","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall"},{"type":"link","label":"Syscall Wrappers","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper"},{"type":"link","label":"Syscall ID","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id"},{"type":"link","label":"Syscall Tool","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool"},{"type":"link","label":"Syscall Numbers","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/"},{"type":"category","label":"Lab 2 - Library Perspective","items":[{"type":"category","label":"Libraries","items":[{"type":"category","label":"Guides","items":[{"type":"link","label":"Static-Dynamic","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/","docId":"Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Questions","items":[{"type":"link","label":"Dynamic Libraries","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries","docId":"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries"},{"type":"link","label":"Static Executables","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables","docId":"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/"},{"type":"category","label":"Libc","items":[{"type":"category","label":"Reading","items":[{"type":"link","label":"Common Functions","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions"},{"type":"link","label":"Libc","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Tasks","items":[{"type":"link","label":"Common Functions","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/README"},{"type":"link","label":"Libc","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/"},{"type":"category","label":"Questions","items":[{"type":"link","label":"printf System Call","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall"},{"type":"link","label":"strcpy System Call","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall"},{"type":"link","label":"printf vs write","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write"},{"type":"link","label":"malloc","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc"},{"type":"link","label":"Syscall Tool","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/"},{"type":"category","label":"High-Level Languages","items":[{"type":"category","label":"Reading","items":[{"type":"link","label":"High-Level Languages","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang","docId":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Tasks","items":[{"type":"link","label":"High-Level Languages","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/","docId":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/"},{"type":"category","label":"Questions","items":[{"type":"link","label":"Python Tools","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools","docId":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/"},{"type":"category","label":"Applications","items":[{"type":"category","label":"Reading","items":[{"type":"link","label":"Applications","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate","docId":"Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Reading/"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Tasks","items":[{"type":"link","label":"Applications","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/","docId":"Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/"},{"type":"category","label":"Lecture","items":[{"type":"link","label":"Data","href":"/operating-systems/Lecture/Data","docId":"Lecture/Data"},{"type":"link","label":"Compute","href":"/operating-systems/Lecture/Compute","docId":"Lecture/Compute"},{"type":"link","label":"IO","href":"/operating-systems/Lecture/IO","docId":"Lecture/IO"},{"type":"link","label":"Application Interaction","href":"/operating-systems/Lecture/Application-Interaction","docId":"Lecture/Application-Interaction"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lecture/"},{"type":"category","label":"Lab","items":[{"type":"link","label":"Setting up the Lab Environment","href":"/operating-systems/Lab/lab-setup","docId":"Lab/lab-setup"},{"type":"category","label":"Data","items":[{"type":"link","label":"Overview","href":"/operating-systems/Lab/Data/overview","docId":"Lab/Data/overview"},{"type":"link","label":"Working with Memory","href":"/operating-systems/Lab/Data/working-memory","docId":"Lab/Data/working-memory"},{"type":"link","label":"Process Memory","href":"/operating-systems/Lab/Data/process-memory","docId":"Lab/Data/process-memory"},{"type":"link","label":"Investigate Memory","href":"/operating-systems/Lab/Data/investigate-memory","docId":"Lab/Data/investigate-memory"},{"type":"link","label":"Memory Security","href":"/operating-systems/Lab/Data/memory-security","docId":"Lab/Data/memory-security"},{"type":"link","label":"Arena","href":"/operating-systems/Lab/Data/arena","docId":"Lab/Data/arena"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lab/Data/"},{"type":"category","label":"Compute","items":[{"type":"link","label":"Overview","href":"/operating-systems/Lab/Compute/overview","docId":"Lab/Compute/overview"},{"type":"link","label":"Hardware Perspective","href":"/operating-systems/Lab/Compute/hardware-perspective","docId":"Lab/Compute/hardware-perspective"},{"type":"link","label":"Processes","href":"/operating-systems/Lab/Compute/processes","docId":"Lab/Compute/processes"},{"type":"link","label":"Threads","href":"/operating-systems/Lab/Compute/threads","docId":"Lab/Compute/threads"},{"type":"link","label":"Processes-threads-apache2","href":"/operating-systems/Lab/Compute/processes-threads-apache2","docId":"Lab/Compute/processes-threads-apache2"},{"type":"link","label":"Copy-on-Write","href":"/operating-systems/Lab/Compute/copy-on-write","docId":"Lab/Compute/copy-on-write"},{"type":"link","label":"Synchronization","href":"/operating-systems/Lab/Compute/synchronization","docId":"Lab/Compute/synchronization"},{"type":"link","label":"User-Level Threads","href":"/operating-systems/Lab/Compute/user-level-threads","docId":"Lab/Compute/user-level-threads"},{"type":"link","label":"Arena","href":"/operating-systems/Lab/Compute/arena","docId":"Lab/Compute/arena"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lab/Compute/"},{"type":"category","label":"IO","items":[{"type":"link","label":"Overview","href":"/operating-systems/Lab/IO/overview","docId":"Lab/IO/overview"},{"type":"link","label":"File Handlers","href":"/operating-systems/Lab/IO/file-handlers","docId":"Lab/IO/file-handlers"},{"type":"link","label":"File Descriptors","href":"/operating-systems/Lab/IO/file-descriptors","docId":"Lab/IO/file-descriptors"},{"type":"link","label":"Redirections","href":"/operating-systems/Lab/IO/redirections","docId":"Lab/IO/redirections"},{"type":"link","label":"Pipes","href":"/operating-systems/Lab/IO/pipes","docId":"Lab/IO/pipes"},{"type":"link","label":"Local IO in Action","href":"/operating-systems/Lab/IO/local-io-in-action","docId":"Lab/IO/local-io-in-action"},{"type":"link","label":"Remote IO","href":"/operating-systems/Lab/IO/remote-io","docId":"Lab/IO/remote-io"},{"type":"link","label":"Networking 101","href":"/operating-systems/Lab/IO/networking-101","docId":"Lab/IO/networking-101"},{"type":"link","label":"Client-Server Model","href":"/operating-systems/Lab/IO/client-server-model","docId":"Lab/IO/client-server-model"},{"type":"link","label":"Beyond Network Sockets","href":"/operating-systems/Lab/IO/beyond-network-sockets","docId":"Lab/IO/beyond-network-sockets"},{"type":"link","label":"File Mappings","href":"/operating-systems/Lab/IO/file-mappings","docId":"Lab/IO/file-mappings"},{"type":"link","label":"IO Internals","href":"/operating-systems/Lab/IO/io-internals","docId":"Lab/IO/io-internals"},{"type":"link","label":"Zero-Copy","href":"/operating-systems/Lab/IO/zero-copy","docId":"Lab/IO/zero-copy"},{"type":"link","label":"Asynchronous IO","href":"/operating-systems/Lab/IO/async-io","docId":"Lab/IO/async-io"},{"type":"link","label":"IO Multiplexing","href":"/operating-systems/Lab/IO/io-multiplexing","docId":"Lab/IO/io-multiplexing"},{"type":"link","label":"Arena","href":"/operating-systems/Lab/IO/arena","docId":"Lab/IO/arena"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lab/IO/"},{"type":"category","label":"Application Interaction","items":[{"type":"link","label":"Overview","href":"/operating-systems/Lab/Application Interaction/overview","docId":"Lab/Application Interaction/overview"},{"type":"link","label":"Time Server","href":"/operating-systems/Lab/Application Interaction/time-server","docId":"Lab/Application Interaction/time-server"},{"type":"link","label":"Password Cracker","href":"/operating-systems/Lab/Application Interaction/password-cracker","docId":"Lab/Application Interaction/password-cracker"},{"type":"link","label":"The X Window System","href":"/operating-systems/Lab/Application Interaction/x-window-system","docId":"Lab/Application Interaction/x-window-system"},{"type":"link","label":"D-Bus","href":"/operating-systems/Lab/Application Interaction/dbus","docId":"Lab/Application Interaction/dbus"},{"type":"link","label":"OS Cloud","href":"/operating-systems/Lab/Application Interaction/os-cloud","docId":"Lab/Application Interaction/os-cloud"},{"type":"link","label":"Arena","href":"/operating-systems/Lab/Application Interaction/arena","docId":"Lab/Application Interaction/arena"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lab/Application Interaction/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lab/"},{"type":"category","label":"Assignments","items":[{"type":"link","label":"Mini Libc","href":"/operating-systems/Assignments/Mini Libc/","docId":"Assignments/Mini Libc/README"},{"type":"link","label":"Memory Allocator","href":"/operating-systems/Assignments/Memory Allocator/","docId":"Assignments/Memory Allocator/README"},{"type":"link","label":"Parallel Graph","href":"/operating-systems/Assignments/Parallel Graph/","docId":"Assignments/Parallel Graph/README"},{"type":"link","label":"Mini Shell","href":"/operating-systems/Assignments/Mini Shell/","docId":"Assignments/Mini Shell/README"},{"type":"link","label":"Asynchronous Web Server","href":"/operating-systems/Assignments/Asynchronous Web Server/","docId":"Assignments/Asynchronous Web Server/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Assignments/"},{"type":"category","label":"Exams","items":[{"type":"link","label":"Digital Forensics","href":"/operating-systems/Exams/Digital Forensics/digital-forensics","docId":"Exams/Digital Forensics/digital-forensics"},{"type":"link","label":"Distributed System","href":"/operating-systems/Exams/Distributed System/distributed-system","docId":"Exams/Distributed System/distributed-system"},{"type":"link","label":"Aggregator Application","href":"/operating-systems/Exams/Aggregator Application/aggregator-application","docId":"Exams/Aggregator Application/aggregator-application"},{"type":"link","label":"Benchmarking Application","href":"/operating-systems/Exams/Benchmarking Application/benchmarking-application","docId":"Exams/Benchmarking Application/benchmarking-application"},{"type":"link","label":"Database Application","href":"/operating-systems/Exams/Database Application/database-application","docId":"Exams/Database Application/database-application"},{"type":"link","label":"Application Investigator","href":"/operating-systems/Exams/Application Investigator/application-investigator","docId":"Exams/Application Investigator/application-investigator"},{"type":"link","label":"Network Performance Utility","href":"/operating-systems/Exams/Network Performance Utility/network-performance-utility","docId":"Exams/Network Performance Utility/network-performance-utility"},{"type":"link","label":"Nightly Builds System","href":"/operating-systems/Exams/Nightly Builds System/nightly-builds-system","docId":"Exams/Nightly Builds System/nightly-builds-system"},{"type":"link","label":"User-level Threading Library","href":"/operating-systems/Exams/User-level Threading Library/user-level-threading-library","docId":"Exams/User-level Threading Library/user-level-threading-library"},{"type":"link","label":"System Process Monitoring Tool","href":"/operating-systems/Exams/System Process Monitoring Tool/system-process-monitoring-tool","docId":"Exams/System Process Monitoring Tool/system-process-monitoring-tool"},{"type":"link","label":"Network Configurations Manager","href":"/operating-systems/Exams/Network Configurations Manager/network-configurations-manager","docId":"Exams/Network Configurations Manager/network-configurations-manager"},{"type":"link","label":"FaaS Application","href":"/operating-systems/Exams/FaaS Application/faas-application","docId":"Exams/FaaS Application/faas-application"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Exams/"},{"type":"category","label":"Hackathons","items":[{"type":"link","label":"Lambda Function Loader","href":"/operating-systems/Hackathons/Lambda Function Loader/","docId":"Hackathons/Lambda Function Loader/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Hackathons/"},{"type":"link","label":"Rules and Grading","href":"/operating-systems/rules-and-grading","docId":"rules-and-grading"},{"type":"link","label":"Resources","href":"/operating-systems/resources","docId":"resources"}]},"docs":{"Assignments/Asynchronous Web Server/README":{"id":"Assignments/Asynchronous Web Server/README","title":"Asynchronous Web Server","description":"Objectives","sidebar":"sidebar"},"Assignments/Asynchronous Web Server/src/http-parser/README":{"id":"Assignments/Asynchronous Web Server/src/http-parser/README","title":"HTTP Parser","description":"This is a parser for HTTP messages written in C. It parses both requests and"},"Assignments/Memory Allocator/README":{"id":"Assignments/Memory Allocator/README","title":"Memory Allocator","description":"Objectives","sidebar":"sidebar"},"Assignments/Mini Libc/README":{"id":"Assignments/Mini Libc/README","title":"Mini-libc","description":"Objectives","sidebar":"sidebar"},"Assignments/Mini Shell/README":{"id":"Assignments/Mini Shell/README","title":"Minishell","description":"Objectives","sidebar":"sidebar"},"Assignments/Mini Shell/util/parser/README":{"id":"Assignments/Mini Shell/util/parser/README","title":"Parser","description":"The parser is made using Bison and Flex."},"Assignments/Parallel Graph/README":{"id":"Assignments/Parallel Graph/README","title":"Parallel Graph","description":"Objectives","sidebar":"sidebar"},"Exams/Aggregator Application/aggregator-application":{"id":"Exams/Aggregator Application/aggregator-application","title":"Aggregator Application","description":"Scenario","sidebar":"sidebar"},"Exams/Application Investigator/application-investigator":{"id":"Exams/Application Investigator/application-investigator","title":"Application Investigator","description":"Scenario","sidebar":"sidebar"},"Exams/Benchmarking Application/benchmarking-application":{"id":"Exams/Benchmarking Application/benchmarking-application","title":"Benchmarking Application","description":"Scenario","sidebar":"sidebar"},"Exams/Database Application/database-application":{"id":"Exams/Database Application/database-application","title":"Database Application","description":"Scenario","sidebar":"sidebar"},"Exams/Digital Forensics/digital-forensics":{"id":"Exams/Digital Forensics/digital-forensics","title":"Digital Forensics","description":"Scenario","sidebar":"sidebar"},"Exams/Distributed System/distributed-system":{"id":"Exams/Distributed System/distributed-system","title":"Distributed system","description":"Scenario","sidebar":"sidebar"},"Exams/FaaS Application/faas-application":{"id":"Exams/FaaS Application/faas-application","title":"FaaS Application","description":"Scenario","sidebar":"sidebar"},"Exams/Network Configurations Manager/network-configurations-manager":{"id":"Exams/Network Configurations Manager/network-configurations-manager","title":"Network Configurations Manager","description":"Scenario","sidebar":"sidebar"},"Exams/Network Performance Utility/network-performance-utility":{"id":"Exams/Network Performance Utility/network-performance-utility","title":"Network Performance Utility","description":"Scenario","sidebar":"sidebar"},"Exams/Nightly Builds System/nightly-builds-system":{"id":"Exams/Nightly Builds System/nightly-builds-system","title":"Nightly Builds System","description":"Scenario","sidebar":"sidebar"},"Exams/System Process Monitoring Tool/system-process-monitoring-tool":{"id":"Exams/System Process Monitoring Tool/system-process-monitoring-tool","title":"System Process Monitoring Tool","description":"Scenario","sidebar":"sidebar"},"Exams/User-level Threading Library/user-level-threading-library":{"id":"Exams/User-level Threading Library/user-level-threading-library","title":"User-level Threading Library","description":"Scenario","sidebar":"sidebar"},"Hackathons/Lambda Function Loader/README":{"id":"Hackathons/Lambda Function Loader/README","title":"Lambda Function Loader","description":"Application Development","sidebar":"sidebar"},"Lab/Application Interaction/arena":{"id":"Lab/Application Interaction/arena","title":"Arena","description":"Oneko","sidebar":"sidebar"},"Lab/Application Interaction/dbus":{"id":"Lab/Application Interaction/dbus","title":"D-Bus","description":"D-Bus is an Inter-Process Communication (IPC) mechanism that is commonly present on Linux.","sidebar":"sidebar"},"Lab/Application Interaction/os-cloud":{"id":"Lab/Application Interaction/os-cloud","title":"OS Cloud","description":"In this section, we are going to build a \\"toy cloud\\" called OS Cloud.","sidebar":"sidebar"},"Lab/Application Interaction/overview":{"id":"Lab/Application Interaction/overview","title":"Application Interaction","description":"In this chapter, you will discover various mechanisms through which applications on a system can interact.","sidebar":"sidebar"},"Lab/Application Interaction/password-cracker":{"id":"Lab/Application Interaction/password-cracker","title":"Password Cracker","description":"In this example, we will solve the following problem: given the sha512 hash of a password, we want to obtain the password that generated the hash.","sidebar":"sidebar"},"Lab/Application Interaction/quiz/cgroups-vs-namespaces":{"id":"Lab/Application Interaction/quiz/cgroups-vs-namespaces","title":"Cgroups versus namespaces","description":"Question Text"},"Lab/Application Interaction/quiz/container-vs-vm":{"id":"Lab/Application Interaction/quiz/container-vs-vm","title":"Container versus VM","description":"Question Text"},"Lab/Application Interaction/quiz/time-server":{"id":"Lab/Application Interaction/quiz/time-server","title":"Time Server Protocol","description":"Question Text"},"Lab/Application Interaction/quiz/time-server-interop":{"id":"Lab/Application Interaction/quiz/time-server-interop","title":"Time Server Interoperability","description":"Question Text"},"Lab/Application Interaction/quiz/timer":{"id":"Lab/Application Interaction/quiz/timer","title":"Oneko Timer","description":"Question Text"},"Lab/Application Interaction/quiz/vm-creation":{"id":"Lab/Application Interaction/quiz/vm-creation","title":"VM Creation","description":"Question Text"},"Lab/Application Interaction/time-server":{"id":"Lab/Application Interaction/time-server","title":"Time Server","description":"Check out the code in support/time-server/server.c and support/time-server/client.c.","sidebar":"sidebar"},"Lab/Application Interaction/x-window-system":{"id":"Lab/Application Interaction/x-window-system","title":"The X Window System","description":"Unix-like systems that support a Graphical User Interface usually do this through the X Window System.","sidebar":"sidebar"},"Lab/Compute/arena":{"id":"Lab/Compute/arena","title":"Arena","description":"Threads and Processes: clone","sidebar":"sidebar"},"Lab/Compute/copy-on-write":{"id":"Lab/Compute/copy-on-write","title":"Copy-on-Write","description":"So far, you know that the parent and child process have separate virtual address spaces.","sidebar":"sidebar"},"Lab/Compute/hardware-perspective":{"id":"Lab/Compute/hardware-perspective","title":"Hardware Perspective","description":"The main criterion we use to rank CPUs is their computation power, i.e. their ability to crunch numbers and do math.","sidebar":"sidebar"},"Lab/Compute/overview":{"id":"Lab/Compute/overview","title":"Compute","description":"Contents","sidebar":"sidebar"},"Lab/Compute/processes":{"id":"Lab/Compute/processes","title":"Processes","description":"A process is simply a running program.","sidebar":"sidebar"},"Lab/Compute/processes-threads-apache2":{"id":"Lab/Compute/processes-threads-apache2","title":"Usage of Processes and Threads in `apache2`","description":"We\'ll take a look at how a real-world application - the apache2 HTTP server - makes use of processes and threads.","sidebar":"sidebar"},"Lab/Compute/quiz/apache2-strace":{"id":"Lab/Compute/quiz/apache2-strace","title":"`apache2` Document Root","description":"Question Text"},"Lab/Compute/quiz/cause-of-file-not-found-error":{"id":"Lab/Compute/quiz/cause-of-file-not-found-error","title":"Cause of `FileNotFoundError`","description":"Question Text"},"Lab/Compute/quiz/child-faults-after-write":{"id":"Lab/Compute/quiz/child-faults-after-write","title":"Child Faults After Write","description":"Question Text"},"Lab/Compute/quiz/coarse-vs-granular-critical-section":{"id":"Lab/Compute/quiz/coarse-vs-granular-critical-section","title":"Coarse vs Granular Critical Section","description":"Question Text"},"Lab/Compute/quiz/create-sleepy-process-ending":{"id":"Lab/Compute/quiz/create-sleepy-process-ending","title":"`create_sleepy` Process Ending","description":"Question Text"},"Lab/Compute/quiz/fiber-strace":{"id":"Lab/Compute/quiz/fiber-strace","title":"Fiber Strace","description":"Question Text"},"Lab/Compute/quiz/mini-shell-stops-after-command":{"id":"Lab/Compute/quiz/mini-shell-stops-after-command","title":"Mini-shell Stops After Command","description":"Question Text"},"Lab/Compute/quiz/mmap-cow-flag":{"id":"Lab/Compute/quiz/mmap-cow-flag","title":"Copy-on-write Flag for `mmap()`","description":"Question Text"},"Lab/Compute/quiz/notify-only-with-mutex":{"id":"Lab/Compute/quiz/notify-only-with-mutex","title":"Both Condition and Mutex","description":"Question Text"},"Lab/Compute/quiz/number-of-running-ults":{"id":"Lab/Compute/quiz/number-of-running-ults","title":"Number of RUNNING User-Level Threads","description":"Question Text"},"Lab/Compute/quiz/parent-faults-before-fork":{"id":"Lab/Compute/quiz/parent-faults-before-fork","title":"Parent Faults before `fork()`","description":"Question Text"},"Lab/Compute/quiz/parent-of-sleep-processes":{"id":"Lab/Compute/quiz/parent-of-sleep-processes","title":"Parent of `sleep` Processes","description":"Question Text"},"Lab/Compute/quiz/processes-speedup":{"id":"Lab/Compute/quiz/processes-speedup","title":"Processes Speedup","description":"Question Text"},"Lab/Compute/quiz/seg-fault-exit-code":{"id":"Lab/Compute/quiz/seg-fault-exit-code","title":"Seg Fault Exit Code","description":"Question Text"},"Lab/Compute/quiz/semaphore-equivalent":{"id":"Lab/Compute/quiz/semaphore-equivalent","title":"Semaphore Equivalent","description":"Question Text"},"Lab/Compute/quiz/sleeping-on-a-fiber":{"id":"Lab/Compute/quiz/sleeping-on-a-fiber","title":"Sleeping on a Fiber","description":"Question Text"},"Lab/Compute/quiz/state-of-new-ult":{"id":"Lab/Compute/quiz/state-of-new-ult","title":"State of new ULT","description":"Question Text"},"Lab/Compute/quiz/tcb-libult-unikraft":{"id":"Lab/Compute/quiz/tcb-libult-unikraft","title":"Similarities Between the TCBs of `libult` and Unikraft","description":"Question Text"},"Lab/Compute/quiz/thread-memory":{"id":"Lab/Compute/quiz/thread-memory","title":"Thread Memory","description":"Question Text"},"Lab/Compute/quiz/time-slice-value":{"id":"Lab/Compute/quiz/time-slice-value","title":"Time Slice Value","description":"Question Text"},"Lab/Compute/quiz/tls-synchronization":{"id":"Lab/Compute/quiz/tls-synchronization","title":"TLS Synchronization","description":"Question Text"},"Lab/Compute/quiz/tls-var-copies":{"id":"Lab/Compute/quiz/tls-var-copies","title":"TLS `var` Copies","description":"Question Text"},"Lab/Compute/quiz/type-of-scheduler-in-libult":{"id":"Lab/Compute/quiz/type-of-scheduler-in-libult","title":"Type of Scheduler in `libult.so`","description":"Question Text"},"Lab/Compute/quiz/ult-thread-ids":{"id":"Lab/Compute/quiz/ult-thread-ids","title":"ULT Thread IDs","description":"Question Text"},"Lab/Compute/quiz/who-calls-execve-parent":{"id":"Lab/Compute/quiz/who-calls-execve-parent","title":"Who Calls `execve` in the Log of the Parent Process?","description":"Question Text"},"Lab/Compute/quiz/why-use-completed-queue":{"id":"Lab/Compute/quiz/why-use-completed-queue","title":"The Need for a COMPLETED Queue","description":"Question Text"},"Lab/Compute/synchronization":{"id":"Lab/Compute/synchronization","title":"Synchronization","description":"So far, we\'ve used threads and processes without wondering how to \\"tell\\" them how to access shared data.","sidebar":"sidebar"},"Lab/Compute/threads":{"id":"Lab/Compute/threads","title":"Threads","description":"Spreading the Work Among Other Threads","sidebar":"sidebar"},"Lab/Compute/user-level-threads":{"id":"Lab/Compute/user-level-threads","title":"User-Level Threads","description":"User-level threads differ from the threads you are used to (kernel-level threads, those created by pthread_create).","sidebar":"sidebar"},"Lab/Data/arena":{"id":"Lab/Data/arena","title":"Arena","description":"Go through the practice items below to hone your skills in working with data and memory.","sidebar":"sidebar"},"Lab/Data/investigate-memory":{"id":"Lab/Data/investigate-memory","title":"Investigate Memory Actions","description":"Memory actions generally mean:","sidebar":"sidebar"},"Lab/Data/memory-security":{"id":"Lab/Data/memory-security","title":"Memory Security","description":"Memory security is one of the most important aspects in today\'s computer systems.","sidebar":"sidebar"},"Lab/Data/overview":{"id":"Lab/Data/overview","title":"Data","description":"Data represents information that is to be processed to produce a final result or more data.","sidebar":"sidebar"},"Lab/Data/process-memory":{"id":"Lab/Data/process-memory","title":"Process Memory","description":"Memory Regions","sidebar":"sidebar"},"Lab/Data/quiz/bypass-canary":{"id":"Lab/Data/quiz/bypass-canary","title":"Bypass Canary","description":"Question"},"Lab/Data/quiz/half-page":{"id":"Lab/Data/quiz/half-page","title":"Half Page","description":"Question Text"},"Lab/Data/quiz/malloc-brk":{"id":"Lab/Data/quiz/malloc-brk","title":"Malloc `brk()`","description":"Question Text"},"Lab/Data/quiz/malloc-mmap":{"id":"Lab/Data/quiz/malloc-mmap","title":"Malloc `mmap()`","description":"Question Text"},"Lab/Data/quiz/memory-access":{"id":"Lab/Data/quiz/memory-access","title":"Modify String","description":"Question Text"},"Lab/Data/quiz/memory-aslr":{"id":"Lab/Data/quiz/memory-aslr","title":"ASLR","description":"Question Text"},"Lab/Data/quiz/memory-granularity":{"id":"Lab/Data/quiz/memory-granularity","title":"Memory Granularity","description":"Question Text"},"Lab/Data/quiz/memory-leaks":{"id":"Lab/Data/quiz/memory-leaks","title":"Memory Leaks","description":"Question Text"},"Lab/Data/quiz/memory-regions-vars":{"id":"Lab/Data/quiz/memory-regions-vars","title":"Variables in memory regions","description":"Question Text"},"Lab/Data/quiz/memory-stack-protector":{"id":"Lab/Data/quiz/memory-stack-protector","title":"Stack Protector","description":"Question Text"},"Lab/Data/quiz/mmap-file":{"id":"Lab/Data/quiz/mmap-file","title":"`mmap()` file","description":"Question Text"},"Lab/Data/quiz/operators":{"id":"Lab/Data/quiz/operators","title":"Operator Overloading","description":"Question Text"},"Lab/Data/quiz/page-allocation":{"id":"Lab/Data/quiz/page-allocation","title":"Page Allocation","description":"Question Text"},"Lab/Data/quiz/stack-layout":{"id":"Lab/Data/quiz/stack-layout","title":"Stack layout","description":"Question Text"},"Lab/Data/quiz/string-buff-over":{"id":"Lab/Data/quiz/string-buff-over","title":"String Buffer Overflow","description":"Question Text"},"Lab/Data/quiz/string-strcpy":{"id":"Lab/Data/quiz/string-strcpy","title":"Strcpy Buffer Overflow","description":"Question Text"},"Lab/Data/quiz/valgrind-leaks":{"id":"Lab/Data/quiz/valgrind-leaks","title":"Valgrind Leaks","description":"Question Text"},"Lab/Data/working-memory":{"id":"Lab/Data/working-memory","title":"Working with Memory","description":"As previously stated, from a programmer\'s perspective, memory is abstracted into variables.","sidebar":"sidebar"},"Lab/IO/arena":{"id":"Lab/IO/arena","title":"Arena","description":"Open File Structure in the Kernel","sidebar":"sidebar"},"Lab/IO/async-io":{"id":"Lab/IO/async-io","title":"Asynchronous I/O","description":"When doing I/O, the major issue we are facing is that I/O operations are typically much slower than CPU operations.","sidebar":"sidebar"},"Lab/IO/beyond-network-sockets":{"id":"Lab/IO/beyond-network-sockets","title":"Beyond Network Sockets","description":"Up until this point, we first learned how to use the Berkeley Sockets API, then we learned about the client-server model, based on this API.","sidebar":"sidebar"},"Lab/IO/client-server-model":{"id":"Lab/IO/client-server-model","title":"Client-Server Model","description":"Up to now, we\'ve avoided code snippets using TCP.","sidebar":"sidebar"},"Lab/IO/file-descriptors":{"id":"Lab/IO/file-descriptors","title":"File Descriptors","description":"After running the code in the \\"File Handlers\\" section, you saw that open() returns a number.","sidebar":"sidebar"},"Lab/IO/file-handlers":{"id":"Lab/IO/file-handlers","title":"File Handling","description":"You\'ve most likely had to deal with files in the past.","sidebar":"sidebar"},"Lab/IO/file-mappings":{"id":"Lab/IO/file-mappings","title":"File Mappings","description":"Mapping a file to the VAS of a process is similar to how shared libraries are loaded into the same VAS.","sidebar":"sidebar"},"Lab/IO/io-internals":{"id":"Lab/IO/io-internals","title":"I/O Internals","description":"Now, we will take a short look at how the file descriptors you\'ve just learnt about are handled in libc.","sidebar":"sidebar"},"Lab/IO/io-multiplexing":{"id":"Lab/IO/io-multiplexing","title":"I/O Multiplexing","description":"I/O multiplexing is the ability to serve multiple I/O channels (or anything that can be referenced via a file descriptor / handle) simultaneously.","sidebar":"sidebar"},"Lab/IO/local-io-in-action":{"id":"Lab/IO/local-io-in-action","title":"Local I/O in Action","description":"Most of the time, file handling is a simple operation from the perspective of the application.","sidebar":"sidebar"},"Lab/IO/networking-101":{"id":"Lab/IO/networking-101","title":"Networking 101","description":"In this section, we will briefly explore how networking works in general, from the perspective of the application.","sidebar":"sidebar"},"Lab/IO/overview":{"id":"Lab/IO/overview","title":"I/O","description":"We know that a compute system is a collection of hardware and software that modifies data.","sidebar":"sidebar"},"Lab/IO/pipes":{"id":"Lab/IO/pipes","title":"Pipes","description":"When it comes to inter-process communication, so far we know that 2 different processes can mmap() the same file and use that as some sort of shared memory, but this requires writing data to the disk which is slow.","sidebar":"sidebar"},"Lab/IO/quiz/anonymous-pipes-limitation":{"id":"Lab/IO/quiz/anonymous-pipes-limitation","title":"Limitation of Anonymous Pipes","description":"Question Text"},"Lab/IO/quiz/bind-error-cause":{"id":"Lab/IO/quiz/bind-error-cause","title":"Cause of `bind()` Error","description":"Question Text"},"Lab/IO/quiz/client-server-sender-receiver":{"id":"Lab/IO/quiz/client-server-sender-receiver","title":"`sender.py` and `receiver.py` Client-Server Parallel","description":"Question Text"},"Lab/IO/quiz/deluge-tcp-udp":{"id":"Lab/IO/quiz/deluge-tcp-udp","title":"Deluge: TCP or UDP","description":"Question Text"},"Lab/IO/quiz/execve":{"id":"Lab/IO/quiz/execve","title":"Effect of `execve()` Syscall","description":"Question Text"},"Lab/IO/quiz/fewer-than-2-copies":{"id":"Lab/IO/quiz/fewer-than-2-copies","title":"Fewer than Two Copies","description":"Question Text"},"Lab/IO/quiz/file-handler-c":{"id":"Lab/IO/quiz/file-handler-c","title":"File handler in C","description":"Question Text"},"Lab/IO/quiz/firefox-tcp-udp":{"id":"Lab/IO/quiz/firefox-tcp-udp","title":"Firefox: TCP or UDP?","description":"Question Text"},"Lab/IO/quiz/flush-libc-buffer":{"id":"Lab/IO/quiz/flush-libc-buffer","title":"Flush Libc Buffer","description":"Question Text"},"Lab/IO/quiz/fopen-syscall":{"id":"Lab/IO/quiz/fopen-syscall","title":"Syscall Used by `fopen()`","description":"Question Text"},"Lab/IO/quiz/fopen-w":{"id":"Lab/IO/quiz/fopen-w","title":"open()` equivalent of `fopen(..., \\"w\\")","description":"Question Text"},"Lab/IO/quiz/local-io-errors":{"id":"Lab/IO/quiz/local-io-errors","title":"I/O Errors","description":"Question Text"},"Lab/IO/quiz/mmap-read-write-benchmark":{"id":"Lab/IO/quiz/mmap-read-write-benchmark","title":"`mmap()` vs `read()` and `write()` Benchmark","description":"Question Text"},"Lab/IO/quiz/o-trunc":{"id":"Lab/IO/quiz/o-trunc","title":"`O_TRUNC` Flag Behaviour","description":"Question Text"},"Lab/IO/quiz/pipe-ends":{"id":"Lab/IO/quiz/pipe-ends","title":"Pipe Ends","description":"Question Text"},"Lab/IO/quiz/prints-work-no-stdio":{"id":"Lab/IO/quiz/prints-work-no-stdio","title":"Prints Working after Closing `stdio`","description":"Question Text"},"Lab/IO/quiz/receiver-socket-fd":{"id":"Lab/IO/quiz/receiver-socket-fd","title":"Receiver Socked File Descriptor","description":"Question Text"},"Lab/IO/quiz/server-copies":{"id":"Lab/IO/quiz/server-copies","title":"Client-Server Number of Copies","description":"Question Text"},"Lab/IO/quiz/stderr-fd":{"id":"Lab/IO/quiz/stderr-fd","title":"File Descriptor of `stderr`","description":"Question Text"},"Lab/IO/quiz/strace-printf":{"id":"Lab/IO/quiz/strace-printf","title":"`printf()` Under Strace","description":"Question Text"},"Lab/IO/quiz/syscalls-cp":{"id":"Lab/IO/quiz/syscalls-cp","title":"Syscalls Used by `cp`","description":"Question Text"},"Lab/IO/quiz/write-file-permissions":{"id":"Lab/IO/quiz/write-file-permissions","title":"`write_file.txt` Permissions","description":"Question Text"},"Lab/IO/redirections":{"id":"Lab/IO/redirections","title":"Redirections","description":"In the File Descriptors section, we mentioned redirections such as ls > file.txt.","sidebar":"sidebar"},"Lab/IO/remote-io":{"id":"Lab/IO/remote-io","title":"Remote I/O","description":"In the previous sections, we started looking into how applications interact with the outside world.","sidebar":"sidebar"},"Lab/IO/zero-copy":{"id":"Lab/IO/zero-copy","title":"Zero-Copy","description":"Imagine a server that responds with files that it stores locally.","sidebar":"sidebar"},"Lab/lab-setup":{"id":"Lab/lab-setup","title":"Setting up the Lab Environment","description":"If you have already cloned the repository, make sure it is updated:","sidebar":"sidebar"},"Lecture/Application-Interaction":{"id":"Lecture/Application-Interaction","title":"Application-Interaction","description":"Focus the slides and press F for fullscreen viewing.","sidebar":"sidebar"},"Lecture/Compute":{"id":"Lecture/Compute","title":"Compute","description":"Focus the slides and press F for fullscreen viewing.","sidebar":"sidebar"},"Lecture/Data":{"id":"Lecture/Data","title":"Data","description":"Focus the slides and press F for fullscreen viewing.","sidebar":"sidebar"},"Lecture/IO":{"id":"Lecture/IO","title":"IO","description":"Focus the slides and press F for fullscreen viewing.","sidebar":"sidebar"},"README":{"id":"README","title":"Intro","description":"This is a landing page for your course.","sidebar":"sidebar"},"resources":{"id":"resources","title":"Resources and Useful Links","description":"Need to Know","sidebar":"sidebar"},"rules-and-grading":{"id":"rules-and-grading","title":"Rules and Grading","description":"Grading","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack":{"id":"Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack","title":"Modern Software Stacks","description":"Most modern computing systems use a software stack such as the one in the figure below:","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software":{"id":"Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software","title":"Software Properties","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/Overview/overview":{"id":"Software Stack/Lab 1 - Operating System Perspective/Overview/overview","title":"Software Stack","description":"Software comprises of code and data that is loaded in memory and used by the CPU.","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software":{"id":"Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software","title":"Software Properties","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall","title":"Libcall with Syscall","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id","title":"Syscall ID","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers","title":"Syscall Numbers","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool","title":"Syscall Tool","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper","title":"Syscall Wrappers","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/README":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/README","title":"System Calls","description":"Enter the basic-syscall/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/README":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/README","title":"System Call Wrappers","description":"Enter the syscall-wrapper/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall","title":"Libcall with Syscall","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id","title":"Syscall ID","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers","title":"Syscall Numbers","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool","title":"Syscall Tool","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper","title":"Syscall Wrappers","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall","title":"Analyzing the Software Stack","description":"To get a better grasp on how the software stack works, let\'s do a bottom-up approach:","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall","title":"Library calls vs System Calls","description":"The standard C library has primarily two uses:","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper","title":"System Call Wrappers","description":"The syscall-wrapper/support/ folder stores the implementation of a simple program written in C (main.c) that calls the write() and exit() functions.","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/README":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/README","title":"System Calls","description":"Enter the basic-syscall/support/ folder and go through the practice items below."},"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/README":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/README","title":"Library calls vs System Calls","description":"Enter the libcall-syscall/support/ folder and go through the practice items below."},"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/README":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/README","title":"System Call Wrappers","description":"Enter the syscall-wrapper/support/ folder and go through the practice items below."},"Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/README":{"id":"Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/README","title":"App Investigation","description":"Enter the app-investigation/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate":{"id":"Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate","title":"App Investigation","description":"Let\'s spend some time investigating actual applications residing on the local system.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools":{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools","title":"Python Tools","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/README":{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/README","title":"High-Level Languages","description":"Enter the high-level-lang/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools":{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools","title":"Python Tools","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang":{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang","title":"High-Level Languages","description":"Using the standard C library (libc) frees the programmer from the cumbersome steps of invoking system calls and reimplementing common features.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc","title":"malloc()","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall","title":"printf() System Call","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write","title":"printf() vs write","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall","title":"strcpy() System Call","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool","title":"Syscall Tool","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/README":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/README","title":"Common Functions","description":"Enter the common-functions/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/README":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/README","title":"Libraries and libc","description":"Enter the libc/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc","title":"malloc()","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall","title":"printf() System Call","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write","title":"printf() vs write","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall","title":"strcpy() System Call","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool","title":"Syscall Tool","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions","title":"Common Functions","description":"By using wrapper calls, we are able to write our programs in C.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc","title":"Libraries and libc","description":"Once we have common functions implemented, we can reuse them at any time.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/README":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/README","title":"Common Functions","description":"Enter the common-functions/support/ folder and go through the practice items below."},"Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/README":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/README","title":"Libraries and libc","description":"Enter the libc/support/ folder and go through the practice items below."},"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries":{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries","title":"Dynamic Libraries","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables":{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables","title":"Static Executables","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/README":{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/README","title":"Statically-linked and Dynamically-linked Libraries","description":"Libraries can be statically-linked or dynamically-linked, creating statically-linked executables and dynamically-linked executables.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries":{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries","title":"Dynamic Libraries","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables":{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables","title":"Static Executables","description":"Question Text"},"Software Stack/Software-Stack":{"id":"Software Stack/Software-Stack","title":"Software-Stack","description":"Focus the slides and press F for fullscreen viewing.","sidebar":"sidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.3c99a76c.js b/assets/js/935f2afb.3c99a76c.js deleted file mode 100644 index 70040e23b4..0000000000 --- a/assets/js/935f2afb.3c99a76c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkso=self.webpackChunkso||[]).push([[8581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"sidebar":[{"type":"link","label":"Introduction","href":"/operating-systems/","docId":"README"},{"type":"category","label":"Software Stack","items":[{"type":"link","label":"Slides","href":"/operating-systems/Software Stack/Software-Stack","docId":"Software Stack/Software-Stack"},{"type":"category","label":"Lab 1 - Operating System Perspective","items":[{"type":"category","label":"Overview","items":[{"type":"link","label":"Reading","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/","docId":"Software Stack/Lab 1 - Operating System Perspective/Overview/overview"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Questions","items":[{"type":"link","label":"Software","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software","docId":"Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/"},{"type":"category","label":"Modern Software Stacks","items":[{"type":"link","label":"Reading","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack","docId":"Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/"},{"type":"category","label":"System Calls","items":[{"type":"category","label":"Reading","items":[{"type":"link","label":"Basic System Calls","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall"},{"type":"link","label":"System Call Wrapper","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper"},{"type":"link","label":"Libcall-Syscall","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Tasks","items":[{"type":"link","label":"Basic Syscall","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/README"},{"type":"link","label":"System Call Wrapper","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/"},{"type":"category","label":"Questions","items":[{"type":"link","label":"Libcall with Syscall","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall"},{"type":"link","label":"Syscall Wrappers","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper"},{"type":"link","label":"Syscall ID","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id"},{"type":"link","label":"Syscall Tool","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool"},{"type":"link","label":"Syscall Numbers","href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers","docId":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/"},{"type":"category","label":"Lab 2 - Library Perspective","items":[{"type":"category","label":"Libraries","items":[{"type":"category","label":"Guides","items":[{"type":"link","label":"Static-Dynamic","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/","docId":"Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Questions","items":[{"type":"link","label":"Dynamic Libraries","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries","docId":"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries"},{"type":"link","label":"Static Executables","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables","docId":"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/"},{"type":"category","label":"Libc","items":[{"type":"category","label":"Reading","items":[{"type":"link","label":"Common Functions","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions"},{"type":"link","label":"Libc","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Tasks","items":[{"type":"link","label":"Common Functions","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/README"},{"type":"link","label":"Libc","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/"},{"type":"category","label":"Questions","items":[{"type":"link","label":"printf System Call","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall"},{"type":"link","label":"strcpy System Call","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall"},{"type":"link","label":"printf vs write","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write"},{"type":"link","label":"malloc","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc"},{"type":"link","label":"Syscall Tool","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool","docId":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/"},{"type":"category","label":"High-Level Languages","items":[{"type":"category","label":"Reading","items":[{"type":"link","label":"High-Level Languages","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang","docId":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Tasks","items":[{"type":"link","label":"High-Level Languages","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/","docId":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/"},{"type":"category","label":"Questions","items":[{"type":"link","label":"Python Tools","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools","docId":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/"},{"type":"category","label":"Applications","items":[{"type":"category","label":"Reading","items":[{"type":"link","label":"Applications","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate","docId":"Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Reading/"},{"type":"category","label":"Drills","items":[{"type":"category","label":"Tasks","items":[{"type":"link","label":"Applications","href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/","docId":"Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/Lab 2 - Library Perspective/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Software Stack/"},{"type":"category","label":"Lecture","items":[{"type":"link","label":"Data","href":"/operating-systems/Lecture/Data","docId":"Lecture/Data"},{"type":"link","label":"Compute","href":"/operating-systems/Lecture/Compute","docId":"Lecture/Compute"},{"type":"link","label":"IO","href":"/operating-systems/Lecture/IO","docId":"Lecture/IO"},{"type":"link","label":"Application Interaction","href":"/operating-systems/Lecture/Application-Interaction","docId":"Lecture/Application-Interaction"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lecture/"},{"type":"category","label":"Lab","items":[{"type":"link","label":"Setting up the Lab Environment","href":"/operating-systems/Lab/lab-setup","docId":"Lab/lab-setup"},{"type":"category","label":"Data","items":[{"type":"link","label":"Overview","href":"/operating-systems/Lab/Data/overview","docId":"Lab/Data/overview"},{"type":"link","label":"Working with Memory","href":"/operating-systems/Lab/Data/working-memory","docId":"Lab/Data/working-memory"},{"type":"link","label":"Process Memory","href":"/operating-systems/Lab/Data/process-memory","docId":"Lab/Data/process-memory"},{"type":"link","label":"Investigate Memory","href":"/operating-systems/Lab/Data/investigate-memory","docId":"Lab/Data/investigate-memory"},{"type":"link","label":"Memory Security","href":"/operating-systems/Lab/Data/memory-security","docId":"Lab/Data/memory-security"},{"type":"link","label":"Arena","href":"/operating-systems/Lab/Data/arena","docId":"Lab/Data/arena"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lab/Data/"},{"type":"category","label":"Compute","items":[{"type":"link","label":"Overview","href":"/operating-systems/Lab/Compute/overview","docId":"Lab/Compute/overview"},{"type":"link","label":"Hardware Perspective","href":"/operating-systems/Lab/Compute/hardware-perspective","docId":"Lab/Compute/hardware-perspective"},{"type":"link","label":"Processes","href":"/operating-systems/Lab/Compute/processes","docId":"Lab/Compute/processes"},{"type":"link","label":"Threads","href":"/operating-systems/Lab/Compute/threads","docId":"Lab/Compute/threads"},{"type":"link","label":"Processes-threads-apache2","href":"/operating-systems/Lab/Compute/processes-threads-apache2","docId":"Lab/Compute/processes-threads-apache2"},{"type":"link","label":"Copy-on-Write","href":"/operating-systems/Lab/Compute/copy-on-write","docId":"Lab/Compute/copy-on-write"},{"type":"link","label":"Synchronization","href":"/operating-systems/Lab/Compute/synchronization","docId":"Lab/Compute/synchronization"},{"type":"link","label":"User-Level Threads","href":"/operating-systems/Lab/Compute/user-level-threads","docId":"Lab/Compute/user-level-threads"},{"type":"link","label":"Arena","href":"/operating-systems/Lab/Compute/arena","docId":"Lab/Compute/arena"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lab/Compute/"},{"type":"category","label":"IO","items":[{"type":"link","label":"Overview","href":"/operating-systems/Lab/IO/overview","docId":"Lab/IO/overview"},{"type":"link","label":"File Handlers","href":"/operating-systems/Lab/IO/file-handlers","docId":"Lab/IO/file-handlers"},{"type":"link","label":"File Descriptors","href":"/operating-systems/Lab/IO/file-descriptors","docId":"Lab/IO/file-descriptors"},{"type":"link","label":"Redirections","href":"/operating-systems/Lab/IO/redirections","docId":"Lab/IO/redirections"},{"type":"link","label":"Pipes","href":"/operating-systems/Lab/IO/pipes","docId":"Lab/IO/pipes"},{"type":"link","label":"Local IO in Action","href":"/operating-systems/Lab/IO/local-io-in-action","docId":"Lab/IO/local-io-in-action"},{"type":"link","label":"Remote IO","href":"/operating-systems/Lab/IO/remote-io","docId":"Lab/IO/remote-io"},{"type":"link","label":"Networking 101","href":"/operating-systems/Lab/IO/networking-101","docId":"Lab/IO/networking-101"},{"type":"link","label":"Client-Server Model","href":"/operating-systems/Lab/IO/client-server-model","docId":"Lab/IO/client-server-model"},{"type":"link","label":"Beyond Network Sockets","href":"/operating-systems/Lab/IO/beyond-network-sockets","docId":"Lab/IO/beyond-network-sockets"},{"type":"link","label":"File Mappings","href":"/operating-systems/Lab/IO/file-mappings","docId":"Lab/IO/file-mappings"},{"type":"link","label":"IO Internals","href":"/operating-systems/Lab/IO/io-internals","docId":"Lab/IO/io-internals"},{"type":"link","label":"Zero-Copy","href":"/operating-systems/Lab/IO/zero-copy","docId":"Lab/IO/zero-copy"},{"type":"link","label":"Asynchronous IO","href":"/operating-systems/Lab/IO/async-io","docId":"Lab/IO/async-io"},{"type":"link","label":"IO Multiplexing","href":"/operating-systems/Lab/IO/io-multiplexing","docId":"Lab/IO/io-multiplexing"},{"type":"link","label":"Arena","href":"/operating-systems/Lab/IO/arena","docId":"Lab/IO/arena"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lab/IO/"},{"type":"category","label":"Application Interaction","items":[{"type":"link","label":"Overview","href":"/operating-systems/Lab/Application Interaction/overview","docId":"Lab/Application Interaction/overview"},{"type":"link","label":"Time Server","href":"/operating-systems/Lab/Application Interaction/time-server","docId":"Lab/Application Interaction/time-server"},{"type":"link","label":"Password Cracker","href":"/operating-systems/Lab/Application Interaction/password-cracker","docId":"Lab/Application Interaction/password-cracker"},{"type":"link","label":"The X Window System","href":"/operating-systems/Lab/Application Interaction/x-window-system","docId":"Lab/Application Interaction/x-window-system"},{"type":"link","label":"D-Bus","href":"/operating-systems/Lab/Application Interaction/dbus","docId":"Lab/Application Interaction/dbus"},{"type":"link","label":"OS Cloud","href":"/operating-systems/Lab/Application Interaction/os-cloud","docId":"Lab/Application Interaction/os-cloud"},{"type":"link","label":"Arena","href":"/operating-systems/Lab/Application Interaction/arena","docId":"Lab/Application Interaction/arena"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lab/Application Interaction/"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Lab/"},{"type":"category","label":"Assignments","items":[{"type":"link","label":"Mini Libc","href":"/operating-systems/Assignments/Mini Libc/","docId":"Assignments/Mini Libc/README"},{"type":"link","label":"Memory Allocator","href":"/operating-systems/Assignments/Memory Allocator/","docId":"Assignments/Memory Allocator/README"},{"type":"link","label":"Parallel Graph","href":"/operating-systems/Assignments/Parallel Graph/","docId":"Assignments/Parallel Graph/README"},{"type":"link","label":"Mini Shell","href":"/operating-systems/Assignments/Mini Shell/","docId":"Assignments/Mini Shell/README"},{"type":"link","label":"Asynchronous Web Server","href":"/operating-systems/Assignments/Asynchronous Web Server/","docId":"Assignments/Asynchronous Web Server/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Assignments/"},{"type":"category","label":"Exams","items":[{"type":"link","label":"Digital Forensics","href":"/operating-systems/Exams/Digital Forensics/digital-forensics","docId":"Exams/Digital Forensics/digital-forensics"},{"type":"link","label":"Distributed System","href":"/operating-systems/Exams/Distributed System/distributed-system","docId":"Exams/Distributed System/distributed-system"},{"type":"link","label":"Aggregator Application","href":"/operating-systems/Exams/Aggregator Application/aggregator-application","docId":"Exams/Aggregator Application/aggregator-application"},{"type":"link","label":"Benchmarking Application","href":"/operating-systems/Exams/Benchmarking Application/benchmarking-application","docId":"Exams/Benchmarking Application/benchmarking-application"},{"type":"link","label":"Database Application","href":"/operating-systems/Exams/Database Application/database-application","docId":"Exams/Database Application/database-application"},{"type":"link","label":"Application Investigator","href":"/operating-systems/Exams/Application Investigator/application-investigator","docId":"Exams/Application Investigator/application-investigator"},{"type":"link","label":"Network Performance Utility","href":"/operating-systems/Exams/Network Performance Utility/network-performance-utility","docId":"Exams/Network Performance Utility/network-performance-utility"},{"type":"link","label":"Nightly Builds System","href":"/operating-systems/Exams/Nightly Builds System/nightly-builds-system","docId":"Exams/Nightly Builds System/nightly-builds-system"},{"type":"link","label":"User-level Threading Library","href":"/operating-systems/Exams/User-level Threading Library/user-level-threading-library","docId":"Exams/User-level Threading Library/user-level-threading-library"},{"type":"link","label":"System Process Monitoring Tool","href":"/operating-systems/Exams/System Process Monitoring Tool/system-process-monitoring-tool","docId":"Exams/System Process Monitoring Tool/system-process-monitoring-tool"},{"type":"link","label":"Network Configurations Manager","href":"/operating-systems/Exams/Network Configurations Manager/network-configurations-manager","docId":"Exams/Network Configurations Manager/network-configurations-manager"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Exams/"},{"type":"category","label":"Hackathons","items":[{"type":"link","label":"Lambda Function Loader","href":"/operating-systems/Hackathons/Lambda Function Loader/","docId":"Hackathons/Lambda Function Loader/README"}],"collapsed":true,"collapsible":true,"href":"/operating-systems/Hackathons/"},{"type":"link","label":"Rules and Grading","href":"/operating-systems/rules-and-grading","docId":"rules-and-grading"},{"type":"link","label":"Resources","href":"/operating-systems/resources","docId":"resources"}]},"docs":{"Assignments/Asynchronous Web Server/README":{"id":"Assignments/Asynchronous Web Server/README","title":"Asynchronous Web Server","description":"Objectives","sidebar":"sidebar"},"Assignments/Asynchronous Web Server/src/http-parser/README":{"id":"Assignments/Asynchronous Web Server/src/http-parser/README","title":"HTTP Parser","description":"This is a parser for HTTP messages written in C. It parses both requests and"},"Assignments/Memory Allocator/README":{"id":"Assignments/Memory Allocator/README","title":"Memory Allocator","description":"Objectives","sidebar":"sidebar"},"Assignments/Mini Libc/README":{"id":"Assignments/Mini Libc/README","title":"Mini-libc","description":"Objectives","sidebar":"sidebar"},"Assignments/Mini Shell/README":{"id":"Assignments/Mini Shell/README","title":"Minishell","description":"Objectives","sidebar":"sidebar"},"Assignments/Mini Shell/util/parser/README":{"id":"Assignments/Mini Shell/util/parser/README","title":"Parser","description":"The parser is made using Bison and Flex."},"Assignments/Parallel Graph/README":{"id":"Assignments/Parallel Graph/README","title":"Parallel Graph","description":"Objectives","sidebar":"sidebar"},"Exams/Aggregator Application/aggregator-application":{"id":"Exams/Aggregator Application/aggregator-application","title":"Aggregator Application","description":"Scenario","sidebar":"sidebar"},"Exams/Application Investigator/application-investigator":{"id":"Exams/Application Investigator/application-investigator","title":"Application Investigator","description":"Scenario","sidebar":"sidebar"},"Exams/Benchmarking Application/benchmarking-application":{"id":"Exams/Benchmarking Application/benchmarking-application","title":"Benchmarking Application","description":"Scenario","sidebar":"sidebar"},"Exams/Database Application/database-application":{"id":"Exams/Database Application/database-application","title":"Database Application","description":"Scenario","sidebar":"sidebar"},"Exams/Digital Forensics/digital-forensics":{"id":"Exams/Digital Forensics/digital-forensics","title":"Digital Forensics","description":"Scenario","sidebar":"sidebar"},"Exams/Distributed System/distributed-system":{"id":"Exams/Distributed System/distributed-system","title":"Distributed system","description":"Scenario","sidebar":"sidebar"},"Exams/Network Configurations Manager/network-configurations-manager":{"id":"Exams/Network Configurations Manager/network-configurations-manager","title":"Network Configurations Manager","description":"Scenario","sidebar":"sidebar"},"Exams/Network Performance Utility/network-performance-utility":{"id":"Exams/Network Performance Utility/network-performance-utility","title":"Network Performance Utility","description":"Scenario","sidebar":"sidebar"},"Exams/Nightly Builds System/nightly-builds-system":{"id":"Exams/Nightly Builds System/nightly-builds-system","title":"Nightly Builds System","description":"Scenario","sidebar":"sidebar"},"Exams/System Process Monitoring Tool/system-process-monitoring-tool":{"id":"Exams/System Process Monitoring Tool/system-process-monitoring-tool","title":"System Process Monitoring Tool","description":"Scenario","sidebar":"sidebar"},"Exams/User-level Threading Library/user-level-threading-library":{"id":"Exams/User-level Threading Library/user-level-threading-library","title":"User-level Threading Library","description":"Scenario","sidebar":"sidebar"},"Hackathons/Lambda Function Loader/README":{"id":"Hackathons/Lambda Function Loader/README","title":"Lambda Function Loader","description":"Application Development","sidebar":"sidebar"},"Lab/Application Interaction/arena":{"id":"Lab/Application Interaction/arena","title":"Arena","description":"Oneko","sidebar":"sidebar"},"Lab/Application Interaction/dbus":{"id":"Lab/Application Interaction/dbus","title":"D-Bus","description":"D-Bus is an Inter-Process Communication (IPC) mechanism that is commonly present on Linux.","sidebar":"sidebar"},"Lab/Application Interaction/os-cloud":{"id":"Lab/Application Interaction/os-cloud","title":"OS Cloud","description":"In this section, we are going to build a \\"toy cloud\\" called OS Cloud.","sidebar":"sidebar"},"Lab/Application Interaction/overview":{"id":"Lab/Application Interaction/overview","title":"Application Interaction","description":"In this chapter, you will discover various mechanisms through which applications on a system can interact.","sidebar":"sidebar"},"Lab/Application Interaction/password-cracker":{"id":"Lab/Application Interaction/password-cracker","title":"Password Cracker","description":"In this example, we will solve the following problem: given the sha512 hash of a password, we want to obtain the password that generated the hash.","sidebar":"sidebar"},"Lab/Application Interaction/quiz/cgroups-vs-namespaces":{"id":"Lab/Application Interaction/quiz/cgroups-vs-namespaces","title":"Cgroups versus namespaces","description":"Question Text"},"Lab/Application Interaction/quiz/container-vs-vm":{"id":"Lab/Application Interaction/quiz/container-vs-vm","title":"Container versus VM","description":"Question Text"},"Lab/Application Interaction/quiz/time-server":{"id":"Lab/Application Interaction/quiz/time-server","title":"Time Server Protocol","description":"Question Text"},"Lab/Application Interaction/quiz/time-server-interop":{"id":"Lab/Application Interaction/quiz/time-server-interop","title":"Time Server Interoperability","description":"Question Text"},"Lab/Application Interaction/quiz/timer":{"id":"Lab/Application Interaction/quiz/timer","title":"Oneko Timer","description":"Question Text"},"Lab/Application Interaction/quiz/vm-creation":{"id":"Lab/Application Interaction/quiz/vm-creation","title":"VM Creation","description":"Question Text"},"Lab/Application Interaction/time-server":{"id":"Lab/Application Interaction/time-server","title":"Time Server","description":"Check out the code in support/time-server/server.c and support/time-server/client.c.","sidebar":"sidebar"},"Lab/Application Interaction/x-window-system":{"id":"Lab/Application Interaction/x-window-system","title":"The X Window System","description":"Unix-like systems that support a Graphical User Interface usually do this through the X Window System.","sidebar":"sidebar"},"Lab/Compute/arena":{"id":"Lab/Compute/arena","title":"Arena","description":"Threads and Processes: clone","sidebar":"sidebar"},"Lab/Compute/copy-on-write":{"id":"Lab/Compute/copy-on-write","title":"Copy-on-Write","description":"So far, you know that the parent and child process have separate virtual address spaces.","sidebar":"sidebar"},"Lab/Compute/hardware-perspective":{"id":"Lab/Compute/hardware-perspective","title":"Hardware Perspective","description":"The main criterion we use to rank CPUs is their computation power, i.e. their ability to crunch numbers and do math.","sidebar":"sidebar"},"Lab/Compute/overview":{"id":"Lab/Compute/overview","title":"Compute","description":"Contents","sidebar":"sidebar"},"Lab/Compute/processes":{"id":"Lab/Compute/processes","title":"Processes","description":"A process is simply a running program.","sidebar":"sidebar"},"Lab/Compute/processes-threads-apache2":{"id":"Lab/Compute/processes-threads-apache2","title":"Usage of Processes and Threads in `apache2`","description":"We\'ll take a look at how a real-world application - the apache2 HTTP server - makes use of processes and threads.","sidebar":"sidebar"},"Lab/Compute/quiz/apache2-strace":{"id":"Lab/Compute/quiz/apache2-strace","title":"`apache2` Document Root","description":"Question Text"},"Lab/Compute/quiz/cause-of-file-not-found-error":{"id":"Lab/Compute/quiz/cause-of-file-not-found-error","title":"Cause of `FileNotFoundError`","description":"Question Text"},"Lab/Compute/quiz/child-faults-after-write":{"id":"Lab/Compute/quiz/child-faults-after-write","title":"Child Faults After Write","description":"Question Text"},"Lab/Compute/quiz/coarse-vs-granular-critical-section":{"id":"Lab/Compute/quiz/coarse-vs-granular-critical-section","title":"Coarse vs Granular Critical Section","description":"Question Text"},"Lab/Compute/quiz/create-sleepy-process-ending":{"id":"Lab/Compute/quiz/create-sleepy-process-ending","title":"`create_sleepy` Process Ending","description":"Question Text"},"Lab/Compute/quiz/fiber-strace":{"id":"Lab/Compute/quiz/fiber-strace","title":"Fiber Strace","description":"Question Text"},"Lab/Compute/quiz/mini-shell-stops-after-command":{"id":"Lab/Compute/quiz/mini-shell-stops-after-command","title":"Mini-shell Stops After Command","description":"Question Text"},"Lab/Compute/quiz/mmap-cow-flag":{"id":"Lab/Compute/quiz/mmap-cow-flag","title":"Copy-on-write Flag for `mmap()`","description":"Question Text"},"Lab/Compute/quiz/notify-only-with-mutex":{"id":"Lab/Compute/quiz/notify-only-with-mutex","title":"Both Condition and Mutex","description":"Question Text"},"Lab/Compute/quiz/number-of-running-ults":{"id":"Lab/Compute/quiz/number-of-running-ults","title":"Number of RUNNING User-Level Threads","description":"Question Text"},"Lab/Compute/quiz/parent-faults-before-fork":{"id":"Lab/Compute/quiz/parent-faults-before-fork","title":"Parent Faults before `fork()`","description":"Question Text"},"Lab/Compute/quiz/parent-of-sleep-processes":{"id":"Lab/Compute/quiz/parent-of-sleep-processes","title":"Parent of `sleep` Processes","description":"Question Text"},"Lab/Compute/quiz/processes-speedup":{"id":"Lab/Compute/quiz/processes-speedup","title":"Processes Speedup","description":"Question Text"},"Lab/Compute/quiz/seg-fault-exit-code":{"id":"Lab/Compute/quiz/seg-fault-exit-code","title":"Seg Fault Exit Code","description":"Question Text"},"Lab/Compute/quiz/semaphore-equivalent":{"id":"Lab/Compute/quiz/semaphore-equivalent","title":"Semaphore Equivalent","description":"Question Text"},"Lab/Compute/quiz/sleeping-on-a-fiber":{"id":"Lab/Compute/quiz/sleeping-on-a-fiber","title":"Sleeping on a Fiber","description":"Question Text"},"Lab/Compute/quiz/state-of-new-ult":{"id":"Lab/Compute/quiz/state-of-new-ult","title":"State of new ULT","description":"Question Text"},"Lab/Compute/quiz/tcb-libult-unikraft":{"id":"Lab/Compute/quiz/tcb-libult-unikraft","title":"Similarities Between the TCBs of `libult` and Unikraft","description":"Question Text"},"Lab/Compute/quiz/thread-memory":{"id":"Lab/Compute/quiz/thread-memory","title":"Thread Memory","description":"Question Text"},"Lab/Compute/quiz/time-slice-value":{"id":"Lab/Compute/quiz/time-slice-value","title":"Time Slice Value","description":"Question Text"},"Lab/Compute/quiz/tls-synchronization":{"id":"Lab/Compute/quiz/tls-synchronization","title":"TLS Synchronization","description":"Question Text"},"Lab/Compute/quiz/tls-var-copies":{"id":"Lab/Compute/quiz/tls-var-copies","title":"TLS `var` Copies","description":"Question Text"},"Lab/Compute/quiz/type-of-scheduler-in-libult":{"id":"Lab/Compute/quiz/type-of-scheduler-in-libult","title":"Type of Scheduler in `libult.so`","description":"Question Text"},"Lab/Compute/quiz/ult-thread-ids":{"id":"Lab/Compute/quiz/ult-thread-ids","title":"ULT Thread IDs","description":"Question Text"},"Lab/Compute/quiz/who-calls-execve-parent":{"id":"Lab/Compute/quiz/who-calls-execve-parent","title":"Who Calls `execve` in the Log of the Parent Process?","description":"Question Text"},"Lab/Compute/quiz/why-use-completed-queue":{"id":"Lab/Compute/quiz/why-use-completed-queue","title":"The Need for a COMPLETED Queue","description":"Question Text"},"Lab/Compute/synchronization":{"id":"Lab/Compute/synchronization","title":"Synchronization","description":"So far, we\'ve used threads and processes without wondering how to \\"tell\\" them how to access shared data.","sidebar":"sidebar"},"Lab/Compute/threads":{"id":"Lab/Compute/threads","title":"Threads","description":"Spreading the Work Among Other Threads","sidebar":"sidebar"},"Lab/Compute/user-level-threads":{"id":"Lab/Compute/user-level-threads","title":"User-Level Threads","description":"User-level threads differ from the threads you are used to (kernel-level threads, those created by pthread_create).","sidebar":"sidebar"},"Lab/Data/arena":{"id":"Lab/Data/arena","title":"Arena","description":"Go through the practice items below to hone your skills in working with data and memory.","sidebar":"sidebar"},"Lab/Data/investigate-memory":{"id":"Lab/Data/investigate-memory","title":"Investigate Memory Actions","description":"Memory actions generally mean:","sidebar":"sidebar"},"Lab/Data/memory-security":{"id":"Lab/Data/memory-security","title":"Memory Security","description":"Memory security is one of the most important aspects in today\'s computer systems.","sidebar":"sidebar"},"Lab/Data/overview":{"id":"Lab/Data/overview","title":"Data","description":"Data represents information that is to be processed to produce a final result or more data.","sidebar":"sidebar"},"Lab/Data/process-memory":{"id":"Lab/Data/process-memory","title":"Process Memory","description":"Memory Regions","sidebar":"sidebar"},"Lab/Data/quiz/bypass-canary":{"id":"Lab/Data/quiz/bypass-canary","title":"Bypass Canary","description":"Question"},"Lab/Data/quiz/half-page":{"id":"Lab/Data/quiz/half-page","title":"Half Page","description":"Question Text"},"Lab/Data/quiz/malloc-brk":{"id":"Lab/Data/quiz/malloc-brk","title":"Malloc `brk()`","description":"Question Text"},"Lab/Data/quiz/malloc-mmap":{"id":"Lab/Data/quiz/malloc-mmap","title":"Malloc `mmap()`","description":"Question Text"},"Lab/Data/quiz/memory-access":{"id":"Lab/Data/quiz/memory-access","title":"Modify String","description":"Question Text"},"Lab/Data/quiz/memory-aslr":{"id":"Lab/Data/quiz/memory-aslr","title":"ASLR","description":"Question Text"},"Lab/Data/quiz/memory-granularity":{"id":"Lab/Data/quiz/memory-granularity","title":"Memory Granularity","description":"Question Text"},"Lab/Data/quiz/memory-leaks":{"id":"Lab/Data/quiz/memory-leaks","title":"Memory Leaks","description":"Question Text"},"Lab/Data/quiz/memory-regions-vars":{"id":"Lab/Data/quiz/memory-regions-vars","title":"Variables in memory regions","description":"Question Text"},"Lab/Data/quiz/memory-stack-protector":{"id":"Lab/Data/quiz/memory-stack-protector","title":"Stack Protector","description":"Question Text"},"Lab/Data/quiz/mmap-file":{"id":"Lab/Data/quiz/mmap-file","title":"`mmap()` file","description":"Question Text"},"Lab/Data/quiz/operators":{"id":"Lab/Data/quiz/operators","title":"Operator Overloading","description":"Question Text"},"Lab/Data/quiz/page-allocation":{"id":"Lab/Data/quiz/page-allocation","title":"Page Allocation","description":"Question Text"},"Lab/Data/quiz/stack-layout":{"id":"Lab/Data/quiz/stack-layout","title":"Stack layout","description":"Question Text"},"Lab/Data/quiz/string-buff-over":{"id":"Lab/Data/quiz/string-buff-over","title":"String Buffer Overflow","description":"Question Text"},"Lab/Data/quiz/string-strcpy":{"id":"Lab/Data/quiz/string-strcpy","title":"Strcpy Buffer Overflow","description":"Question Text"},"Lab/Data/quiz/valgrind-leaks":{"id":"Lab/Data/quiz/valgrind-leaks","title":"Valgrind Leaks","description":"Question Text"},"Lab/Data/working-memory":{"id":"Lab/Data/working-memory","title":"Working with Memory","description":"As previously stated, from a programmer\'s perspective, memory is abstracted into variables.","sidebar":"sidebar"},"Lab/IO/arena":{"id":"Lab/IO/arena","title":"Arena","description":"Open File Structure in the Kernel","sidebar":"sidebar"},"Lab/IO/async-io":{"id":"Lab/IO/async-io","title":"Asynchronous I/O","description":"When doing I/O, the major issue we are facing is that I/O operations are typically much slower than CPU operations.","sidebar":"sidebar"},"Lab/IO/beyond-network-sockets":{"id":"Lab/IO/beyond-network-sockets","title":"Beyond Network Sockets","description":"Up until this point, we first learned how to use the Berkeley Sockets API, then we learned about the client-server model, based on this API.","sidebar":"sidebar"},"Lab/IO/client-server-model":{"id":"Lab/IO/client-server-model","title":"Client-Server Model","description":"Up to now, we\'ve avoided code snippets using TCP.","sidebar":"sidebar"},"Lab/IO/file-descriptors":{"id":"Lab/IO/file-descriptors","title":"File Descriptors","description":"After running the code in the \\"File Handlers\\" section, you saw that open() returns a number.","sidebar":"sidebar"},"Lab/IO/file-handlers":{"id":"Lab/IO/file-handlers","title":"File Handling","description":"You\'ve most likely had to deal with files in the past.","sidebar":"sidebar"},"Lab/IO/file-mappings":{"id":"Lab/IO/file-mappings","title":"File Mappings","description":"Mapping a file to the VAS of a process is similar to how shared libraries are loaded into the same VAS.","sidebar":"sidebar"},"Lab/IO/io-internals":{"id":"Lab/IO/io-internals","title":"I/O Internals","description":"Now, we will take a short look at how the file descriptors you\'ve just learnt about are handled in libc.","sidebar":"sidebar"},"Lab/IO/io-multiplexing":{"id":"Lab/IO/io-multiplexing","title":"I/O Multiplexing","description":"I/O multiplexing is the ability to serve multiple I/O channels (or anything that can be referenced via a file descriptor / handle) simultaneously.","sidebar":"sidebar"},"Lab/IO/local-io-in-action":{"id":"Lab/IO/local-io-in-action","title":"Local I/O in Action","description":"Most of the time, file handling is a simple operation from the perspective of the application.","sidebar":"sidebar"},"Lab/IO/networking-101":{"id":"Lab/IO/networking-101","title":"Networking 101","description":"In this section, we will briefly explore how networking works in general, from the perspective of the application.","sidebar":"sidebar"},"Lab/IO/overview":{"id":"Lab/IO/overview","title":"I/O","description":"We know that a compute system is a collection of hardware and software that modifies data.","sidebar":"sidebar"},"Lab/IO/pipes":{"id":"Lab/IO/pipes","title":"Pipes","description":"When it comes to inter-process communication, so far we know that 2 different processes can mmap() the same file and use that as some sort of shared memory, but this requires writing data to the disk which is slow.","sidebar":"sidebar"},"Lab/IO/quiz/anonymous-pipes-limitation":{"id":"Lab/IO/quiz/anonymous-pipes-limitation","title":"Limitation of Anonymous Pipes","description":"Question Text"},"Lab/IO/quiz/bind-error-cause":{"id":"Lab/IO/quiz/bind-error-cause","title":"Cause of `bind()` Error","description":"Question Text"},"Lab/IO/quiz/client-server-sender-receiver":{"id":"Lab/IO/quiz/client-server-sender-receiver","title":"`sender.py` and `receiver.py` Client-Server Parallel","description":"Question Text"},"Lab/IO/quiz/deluge-tcp-udp":{"id":"Lab/IO/quiz/deluge-tcp-udp","title":"Deluge: TCP or UDP","description":"Question Text"},"Lab/IO/quiz/execve":{"id":"Lab/IO/quiz/execve","title":"Effect of `execve()` Syscall","description":"Question Text"},"Lab/IO/quiz/fewer-than-2-copies":{"id":"Lab/IO/quiz/fewer-than-2-copies","title":"Fewer than Two Copies","description":"Question Text"},"Lab/IO/quiz/file-handler-c":{"id":"Lab/IO/quiz/file-handler-c","title":"File handler in C","description":"Question Text"},"Lab/IO/quiz/firefox-tcp-udp":{"id":"Lab/IO/quiz/firefox-tcp-udp","title":"Firefox: TCP or UDP?","description":"Question Text"},"Lab/IO/quiz/flush-libc-buffer":{"id":"Lab/IO/quiz/flush-libc-buffer","title":"Flush Libc Buffer","description":"Question Text"},"Lab/IO/quiz/fopen-syscall":{"id":"Lab/IO/quiz/fopen-syscall","title":"Syscall Used by `fopen()`","description":"Question Text"},"Lab/IO/quiz/fopen-w":{"id":"Lab/IO/quiz/fopen-w","title":"open()` equivalent of `fopen(..., \\"w\\")","description":"Question Text"},"Lab/IO/quiz/local-io-errors":{"id":"Lab/IO/quiz/local-io-errors","title":"I/O Errors","description":"Question Text"},"Lab/IO/quiz/mmap-read-write-benchmark":{"id":"Lab/IO/quiz/mmap-read-write-benchmark","title":"`mmap()` vs `read()` and `write()` Benchmark","description":"Question Text"},"Lab/IO/quiz/o-trunc":{"id":"Lab/IO/quiz/o-trunc","title":"`O_TRUNC` Flag Behaviour","description":"Question Text"},"Lab/IO/quiz/pipe-ends":{"id":"Lab/IO/quiz/pipe-ends","title":"Pipe Ends","description":"Question Text"},"Lab/IO/quiz/prints-work-no-stdio":{"id":"Lab/IO/quiz/prints-work-no-stdio","title":"Prints Working after Closing `stdio`","description":"Question Text"},"Lab/IO/quiz/receiver-socket-fd":{"id":"Lab/IO/quiz/receiver-socket-fd","title":"Receiver Socked File Descriptor","description":"Question Text"},"Lab/IO/quiz/server-copies":{"id":"Lab/IO/quiz/server-copies","title":"Client-Server Number of Copies","description":"Question Text"},"Lab/IO/quiz/stderr-fd":{"id":"Lab/IO/quiz/stderr-fd","title":"File Descriptor of `stderr`","description":"Question Text"},"Lab/IO/quiz/strace-printf":{"id":"Lab/IO/quiz/strace-printf","title":"`printf()` Under Strace","description":"Question Text"},"Lab/IO/quiz/syscalls-cp":{"id":"Lab/IO/quiz/syscalls-cp","title":"Syscalls Used by `cp`","description":"Question Text"},"Lab/IO/quiz/write-file-permissions":{"id":"Lab/IO/quiz/write-file-permissions","title":"`write_file.txt` Permissions","description":"Question Text"},"Lab/IO/redirections":{"id":"Lab/IO/redirections","title":"Redirections","description":"In the File Descriptors section, we mentioned redirections such as ls > file.txt.","sidebar":"sidebar"},"Lab/IO/remote-io":{"id":"Lab/IO/remote-io","title":"Remote I/O","description":"In the previous sections, we started looking into how applications interact with the outside world.","sidebar":"sidebar"},"Lab/IO/zero-copy":{"id":"Lab/IO/zero-copy","title":"Zero-Copy","description":"Imagine a server that responds with files that it stores locally.","sidebar":"sidebar"},"Lab/lab-setup":{"id":"Lab/lab-setup","title":"Setting up the Lab Environment","description":"If you have already cloned the repository, make sure it is updated:","sidebar":"sidebar"},"Lecture/Application-Interaction":{"id":"Lecture/Application-Interaction","title":"Application-Interaction","description":"Focus the slides and press F for fullscreen viewing.","sidebar":"sidebar"},"Lecture/Compute":{"id":"Lecture/Compute","title":"Compute","description":"Focus the slides and press F for fullscreen viewing.","sidebar":"sidebar"},"Lecture/Data":{"id":"Lecture/Data","title":"Data","description":"Focus the slides and press F for fullscreen viewing.","sidebar":"sidebar"},"Lecture/IO":{"id":"Lecture/IO","title":"IO","description":"Focus the slides and press F for fullscreen viewing.","sidebar":"sidebar"},"README":{"id":"README","title":"Intro","description":"This is a landing page for your course.","sidebar":"sidebar"},"resources":{"id":"resources","title":"Resources and Useful Links","description":"Need to Know","sidebar":"sidebar"},"rules-and-grading":{"id":"rules-and-grading","title":"Rules and Grading","description":"Grading","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack":{"id":"Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack","title":"Modern Software Stacks","description":"Most modern computing systems use a software stack such as the one in the figure below:","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software":{"id":"Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software","title":"Software Properties","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/Overview/overview":{"id":"Software Stack/Lab 1 - Operating System Perspective/Overview/overview","title":"Software Stack","description":"Software comprises of code and data that is loaded in memory and used by the CPU.","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software":{"id":"Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software","title":"Software Properties","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall","title":"Libcall with Syscall","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id","title":"Syscall ID","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers","title":"Syscall Numbers","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool","title":"Syscall Tool","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper","title":"Syscall Wrappers","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/README":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/README","title":"System Calls","description":"Enter the basic-syscall/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/README":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/README","title":"System Call Wrappers","description":"Enter the syscall-wrapper/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall","title":"Libcall with Syscall","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id","title":"Syscall ID","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers","title":"Syscall Numbers","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool","title":"Syscall Tool","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper","title":"Syscall Wrappers","description":"Question Text"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall","title":"Analyzing the Software Stack","description":"To get a better grasp on how the software stack works, let\'s do a bottom-up approach:","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall","title":"Library calls vs System Calls","description":"The standard C library has primarily two uses:","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper","title":"System Call Wrappers","description":"The syscall-wrapper/support/ folder stores the implementation of a simple program written in C (main.c) that calls the write() and exit() functions.","sidebar":"sidebar"},"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/README":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/README","title":"System Calls","description":"Enter the basic-syscall/support/ folder and go through the practice items below."},"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/README":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/README","title":"Library calls vs System Calls","description":"Enter the libcall-syscall/support/ folder and go through the practice items below."},"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/README":{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/README","title":"System Call Wrappers","description":"Enter the syscall-wrapper/support/ folder and go through the practice items below."},"Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/README":{"id":"Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/README","title":"App Investigation","description":"Enter the app-investigation/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate":{"id":"Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate","title":"App Investigation","description":"Let\'s spend some time investigating actual applications residing on the local system.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools":{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools","title":"Python Tools","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/README":{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/README","title":"High-Level Languages","description":"Enter the high-level-lang/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools":{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools","title":"Python Tools","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang":{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang","title":"High-Level Languages","description":"Using the standard C library (libc) frees the programmer from the cumbersome steps of invoking system calls and reimplementing common features.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc","title":"malloc()","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall","title":"printf() System Call","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write","title":"printf() vs write","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall","title":"strcpy() System Call","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool","title":"Syscall Tool","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/README":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/README","title":"Common Functions","description":"Enter the common-functions/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/README":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/README","title":"Libraries and libc","description":"Enter the libc/support/ folder and go through the practice items below.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc","title":"malloc()","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall","title":"printf() System Call","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write","title":"printf() vs write","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall","title":"strcpy() System Call","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool","title":"Syscall Tool","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions","title":"Common Functions","description":"By using wrapper calls, we are able to write our programs in C.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc","title":"Libraries and libc","description":"Once we have common functions implemented, we can reuse them at any time.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/README":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/README","title":"Common Functions","description":"Enter the common-functions/support/ folder and go through the practice items below."},"Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/README":{"id":"Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/README","title":"Libraries and libc","description":"Enter the libc/support/ folder and go through the practice items below."},"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries":{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries","title":"Dynamic Libraries","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables":{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables","title":"Static Executables","description":"Question Text","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/README":{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/README","title":"Statically-linked and Dynamically-linked Libraries","description":"Libraries can be statically-linked or dynamically-linked, creating statically-linked executables and dynamically-linked executables.","sidebar":"sidebar"},"Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries":{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries","title":"Dynamic Libraries","description":"Question Text"},"Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables":{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables","title":"Static Executables","description":"Question Text"},"Software Stack/Software-Stack":{"id":"Software Stack/Software-Stack","title":"Software-Stack","description":"Focus the slides and press F for fullscreen viewing.","sidebar":"sidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/b4c6c600.e3fe61b0.js b/assets/js/b4c6c600.e3fe61b0.js new file mode 100644 index 0000000000..3a8e9b969e --- /dev/null +++ b/assets/js/b4c6c600.e3fe61b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkso=self.webpackChunkso||[]).push([[805],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),g=a,y=u["".concat(l,".").concat(g)]||u[g]||m[g]||i;return n?r.createElement(y,o(o({ref:t},c),{},{components:n})):r.createElement(y,o({ref:t},c))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=n(8168),a=(n(6540),n(5680));const i={},o="FaaS Application",s={unversionedId:"Exams/FaaS Application/faas-application",id:"Exams/FaaS Application/faas-application",title:"FaaS Application",description:"Scenario",source:"@site/docs/Exams/FaaS Application/faas-application.md",sourceDirName:"Exams/FaaS Application",slug:"/Exams/FaaS Application/faas-application",permalink:"/operating-systems/Exams/FaaS Application/faas-application",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"sidebar",previous:{title:"Network Configurations Manager",permalink:"/operating-systems/Exams/Network Configurations Manager/network-configurations-manager"},next:{title:"Hackathons",permalink:"/operating-systems/Hackathons/"}},l={},p=[{value:"Scenario",id:"scenario",level:2},{value:"Questions",id:"questions",level:2}],c={toc:p},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"faas-application"},"FaaS Application"),(0,a.yg)("h2",{id:"scenario"},"Scenario"),(0,a.yg)("p",null,"We aim to implement a Function as a Service (FaaS) type service.\nThis service exposes a REST network API.\nWith this API, network clients can order the remote execution of programs.\nA client sends the program written in a given programming language to be remotely executed, along with the program's arguments.\nThe FaaS service runs the program and transmits the result to the client."),(0,a.yg)("p",null,'Respond to the following questions with "True" or "False" and justify the answer.\nThe justification should be simple, 2-3 sentences for each response.'),(0,a.yg)("h2",{id:"questions"},"Questions"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The service uses shared memory to interact with clients.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The service can run distributed, with client requests being redirected to multiple execution systems.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For security reasons, programs (functions) are executed in isolated contexts, within containers or virtual machines.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"In handling requests, the service will benefit from an implementation with a thread pool.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"During its execution, the service does NOT generate involuntary context switches.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Among processor, memory, network, and disk resources, the service uses the least disk.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The service does NOT consume file descriptors outside of the standard descriptors 0, 1 and 2.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The service would lead to significant performance improvements if implemented in a low-level language like C compared to a high-level one like Python.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"To serve requests and execute programs sent by clients, the service will start new processes.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"During the execution of the service, NO hardware interrupts are generated.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The service can only operate on a Linux operating system.\nAnswer: False"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e3a89e97.e45f243f.js b/assets/js/e3a89e97.d5e35e28.js similarity index 52% rename from assets/js/e3a89e97.e45f243f.js rename to assets/js/e3a89e97.d5e35e28.js index cc80075afb..acfcf49a6e 100644 --- a/assets/js/e3a89e97.e45f243f.js +++ b/assets/js/e3a89e97.d5e35e28.js @@ -1 +1 @@ -"use strict";(self.webpackChunkso=self.webpackChunkso||[]).push([[4126],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>y});var r=t(6540);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var l=r.createContext({}),p=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},c=function(e){var n=p(e.components);return r.createElement(l.Provider,{value:n},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(t),m=a,y=u["".concat(l,".").concat(m)]||u[m]||g[m]||o;return t?r.createElement(y,i(i({ref:n},c),{},{components:t})):r.createElement(y,i({ref:n},c))}));function y(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=m;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var r=t(8168),a=(t(6540),t(5680));const o={},i="Network Configurations Manager",s={unversionedId:"Exams/Network Configurations Manager/network-configurations-manager",id:"Exams/Network Configurations Manager/network-configurations-manager",title:"Network Configurations Manager",description:"Scenario",source:"@site/docs/Exams/Network Configurations Manager/network-configurations-manager.md",sourceDirName:"Exams/Network Configurations Manager",slug:"/Exams/Network Configurations Manager/network-configurations-manager",permalink:"/operating-systems/Exams/Network Configurations Manager/network-configurations-manager",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"sidebar",previous:{title:"System Process Monitoring Tool",permalink:"/operating-systems/Exams/System Process Monitoring Tool/system-process-monitoring-tool"},next:{title:"Hackathons",permalink:"/operating-systems/Hackathons/"}},l={},p=[{value:"Scenario",id:"scenario",level:2},{value:"Questions",id:"questions",level:2}],c={toc:p},u="wrapper";function g(e){let{components:n,...t}=e;return(0,a.yg)(u,(0,r.A)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"network-configurations-manager"},"Network Configurations Manager"),(0,a.yg)("h2",{id:"scenario"},"Scenario"),(0,a.yg)("p",null,"We aim to implement an application to run on a home router (Wi-Fi router) to manage network configurations: routing, port forwarding, firewall, Wi-Fi security, etc.\nThe router runs a modern operating system - rich OS, like Linux.\nOther applications, such as a web service providing a user web interface, will interact with the configuration application through IPC mechanisms to query the state of network configurations and/or modify them."),(0,a.yg)("p",null,'Answer the following questions with "True" or "False" and justify the answer.\nJustification should be simple, 2-3 sentences for each answer.'),(0,a.yg)("h2",{id:"questions"},"Questions"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application must be written entirely in a compiled language like C/C++/Rust.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application can be multi-threaded.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application is portable to other operating systems.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application must run in privileged mode.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For security reasons, the application cannot use demand paging.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application does not have a file descriptor table.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Interaction between the application and other services (such as the web) can be achieved through anonymous pipes.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application is CPU intensive.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Two instances of the application can be started on the system.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"In the application's address space, there are memory areas without write permissions.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application process will consistently have the highest priority.\nAnswer: False"))))}g.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkso=self.webpackChunkso||[]).push([[4126],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>y});var r=t(6540);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var l=r.createContext({}),p=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},c=function(e){var n=p(e.components);return r.createElement(l.Provider,{value:n},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(t),m=a,y=u["".concat(l,".").concat(m)]||u[m]||g[m]||o;return t?r.createElement(y,i(i({ref:n},c),{},{components:t})):r.createElement(y,i({ref:n},c))}));function y(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=m;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var r=t(8168),a=(t(6540),t(5680));const o={},i="Network Configurations Manager",s={unversionedId:"Exams/Network Configurations Manager/network-configurations-manager",id:"Exams/Network Configurations Manager/network-configurations-manager",title:"Network Configurations Manager",description:"Scenario",source:"@site/docs/Exams/Network Configurations Manager/network-configurations-manager.md",sourceDirName:"Exams/Network Configurations Manager",slug:"/Exams/Network Configurations Manager/network-configurations-manager",permalink:"/operating-systems/Exams/Network Configurations Manager/network-configurations-manager",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"sidebar",previous:{title:"System Process Monitoring Tool",permalink:"/operating-systems/Exams/System Process Monitoring Tool/system-process-monitoring-tool"},next:{title:"FaaS Application",permalink:"/operating-systems/Exams/FaaS Application/faas-application"}},l={},p=[{value:"Scenario",id:"scenario",level:2},{value:"Questions",id:"questions",level:2}],c={toc:p},u="wrapper";function g(e){let{components:n,...t}=e;return(0,a.yg)(u,(0,r.A)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"network-configurations-manager"},"Network Configurations Manager"),(0,a.yg)("h2",{id:"scenario"},"Scenario"),(0,a.yg)("p",null,"We aim to implement an application to run on a home router (Wi-Fi router) to manage network configurations: routing, port forwarding, firewall, Wi-Fi security, etc.\nThe router runs a modern operating system - rich OS, like Linux.\nOther applications, such as a web service providing a user web interface, will interact with the configuration application through IPC mechanisms to query the state of network configurations and/or modify them."),(0,a.yg)("p",null,'Answer the following questions with "True" or "False" and justify the answer.\nJustification should be simple, 2-3 sentences for each answer.'),(0,a.yg)("h2",{id:"questions"},"Questions"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application must be written entirely in a compiled language like C/C++/Rust.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application can be multi-threaded.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application is portable to other operating systems.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application must run in privileged mode.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For security reasons, the application cannot use demand paging.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application does not have a file descriptor table.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Interaction between the application and other services (such as the web) can be achieved through anonymous pipes.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application is CPU intensive.\nAnswer: False")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Two instances of the application can be started on the system.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"In the application's address space, there are memory areas without write permissions.\nAnswer: True")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"The application process will consistently have the highest priority.\nAnswer: False"))))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.538589e8.js b/assets/js/main.538589e8.js deleted file mode 100644 index 4676706441..0000000000 --- a/assets/js/main.538589e8.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.538589e8.js.LICENSE.txt */ -(self.webpackChunkso=self.webpackChunkso||[]).push([[8792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var a=n(6540),r=n(8168),i=n(3259),s=n.n(i),o=n(4054);const l={"007cf997":[()=>n.e(1410).then(n.bind(n,7418)),"@site/docs/Lab/Compute/quiz/coarse-vs-granular-critical-section.md",7418],"009e58e9":[()=>n.e(2608).then(n.bind(n,2376)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/README.md",2376],"0275a3b2":[()=>n.e(1169).then(n.bind(n,7281)),"@site/docs/Lab/Compute/quiz/mini-shell-stops-after-command.md",7281],"0277d735":[()=>n.e(9352).then(n.bind(n,5839)),"@site/docs/Lab/IO/quiz/flush-libc-buffer.md",5839],"02997193":[()=>n.e(227).then(n.t.bind(n,3633,19)),"~docs/default/category-operating-systems-sidebar-category-drills-2-94d.json",3633],"0316924f":[()=>n.e(830).then(n.t.bind(n,4539,19)),"~docs/default/category-operating-systems-sidebar-category-overview-298.json",4539],"03dc0c9b":[()=>n.e(9113).then(n.bind(n,9972)),"@site/docs/Lab/Data/process-memory.md",9972],"0438abee":[()=>n.e(4201).then(n.bind(n,9120)),"@site/docs/Lab/IO/redirections.md",9120],"05813244":[()=>n.e(2036).then(n.bind(n,8333)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/README.md",8333],"092edce8":[()=>n.e(8665).then(n.bind(n,9010)),"@site/docs/Lab/Compute/user-level-threads.md",9010],"09e11287":[()=>n.e(6082).then(n.bind(n,4612)),"@site/docs/Lab/Compute/synchronization.md",4612],"0b4c16a1":[()=>n.e(1209).then(n.bind(n,5226)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc.md",5226],"0b9ed770":[()=>n.e(6001).then(n.bind(n,5255)),"@site/docs/Exams/Database Application/database-application.md",5255],"0bbd68f9":[()=>n.e(7354).then(n.bind(n,6521)),"@site/docs/Lab/Data/quiz/malloc-brk.md",6521],"0c19000f":[()=>n.e(8800).then(n.bind(n,3241)),"@site/docs/Lab/lab-setup.md",3241],"0d65b9df":[()=>n.e(3301).then(n.bind(n,4670)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write.md",4670],"0e4a2f10":[()=>n.e(4944).then(n.t.bind(n,7390,19)),"~docs/default/category-operating-systems-sidebar-category-questions-1-7c8.json",7390],"0e5263e1":[()=>n.e(748).then(n.bind(n,1984)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall.md",1984],"0f890721":[()=>n.e(5044).then(n.bind(n,5844)),"@site/docs/Lab/IO/async-io.md",5844],"0fa0bebd":[()=>n.e(2851).then(n.bind(n,3268)),"@site/docs/Lab/IO/quiz/stderr-fd.md",3268],"10a540c5":[()=>n.e(7742).then(n.bind(n,8186)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software.md",8186],"144ccec8":[()=>n.e(2122).then(n.bind(n,8894)),"@site/docs/Lab/Data/investigate-memory.md",8894],14580385:[()=>n.e(7841).then(n.bind(n,8964)),"@site/docs/Lab/IO/arena.md",8964],"14eb3368":[()=>Promise.all([n.e(1869),n.e(6969)]).then(n.bind(n,4136)),"@theme/DocCategoryGeneratedIndexPage",4136],"14ee73ae":[()=>n.e(8134).then(n.bind(n,1072)),"@site/docs/Lab/IO/quiz/firefox-tcp-udp.md",1072],"1532e76f":[()=>n.e(6506).then(n.bind(n,7801)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall.md",7801],"1548d5c7":[()=>n.e(1370).then(n.bind(n,6752)),"@site/docs/Lab/IO/overview.md",6752],"15d9f00e":[()=>n.e(8435).then(n.t.bind(n,7604,19)),"~docs/default/category-operating-systems-sidebar-category-hackathons-c57.json",7604],"15f618ea":[()=>n.e(4060).then(n.bind(n,8840)),"@site/docs/Lab/IO/beyond-network-sockets.md",8840],17896441:[()=>Promise.all([n.e(1869),n.e(4567),n.e(8401)]).then(n.bind(n,3761)),"@theme/DocItem",3761],18331331:[()=>n.e(5150).then(n.t.bind(n,1966,19)),"/build/docusaurus/SO/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",1966],"18519af9":[()=>n.e(4639).then(n.bind(n,6839)),"@site/docs/Exams/System Process Monitoring Tool/system-process-monitoring-tool.md",6839],"1891e676":[()=>n.e(3972).then(n.bind(n,2135)),"@site/docs/Lab/IO/quiz/local-io-errors.md",2135],"1ae4d9c9":[()=>n.e(8139).then(n.bind(n,2025)),"@site/docs/Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools.md",2025],"1be78505":[()=>Promise.all([n.e(1869),n.e(8714)]).then(n.bind(n,10)),"@theme/DocPage",10],"1dccb566":[()=>n.e(8697).then(n.bind(n,2634)),"@site/docs/Lab/IO/quiz/file-handler-c.md",2634],"1e0b7734":[()=>n.e(2360).then(n.bind(n,3684)),"@site/docs/Lab/Data/quiz/operators.md",3684],"1ef36804":[()=>n.e(7858).then(n.bind(n,2907)),"@site/docs/Lab/IO/quiz/fewer-than-2-copies.md",2907],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(4567),n.e(6061)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],"1ffc5c5f":[()=>n.e(414).then(n.bind(n,2020)),"@site/docs/Lab/Compute/processes-threads-apache2.md",2020],"21e67fd6":[()=>n.e(9332).then(n.bind(n,9695)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries.md",9695],"232c749b":[()=>n.e(9347).then(n.bind(n,107)),"@site/docs/Lab/IO/quiz/fopen-syscall.md",107],"23374ca6":[()=>n.e(2278).then(n.bind(n,3502)),"@site/docs/README.md",3502],"2641b427":[()=>n.e(7957).then(n.bind(n,29)),"@site/docs/Lab/Compute/processes.md",29],"267b5415":[()=>n.e(7173).then(n.bind(n,9365)),"@site/docs/Lab/Compute/quiz/tcb-libult-unikraft.md",9365],"2760b5dd":[()=>n.e(9979).then(n.bind(n,6184)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables.md",6184],"2828cd91":[()=>n.e(6976).then(n.bind(n,4231)),"@site/docs/Lab/IO/quiz/prints-work-no-stdio.md",4231],"2895d02b":[()=>n.e(5347).then(n.bind(n,5806)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/README.md",5806],"2bde47d5":[()=>n.e(5652).then(n.bind(n,8937)),"@site/docs/Lab/Data/quiz/page-allocation.md",8937],"2c270c24":[()=>n.e(662).then(n.bind(n,2095)),"@site/docs/Lab/Compute/arena.md",2095],"2cea7b84":[()=>n.e(7791).then(n.t.bind(n,6487,19)),"~docs/default/category-operating-systems-sidebar-category-application-interaction-96b.json",6487],"2de4f0c7":[()=>n.e(8850).then(n.t.bind(n,6641,19)),"~docs/default/category-operating-systems-sidebar-category-drills-3-f5a.json",6641],"2e030903":[()=>n.e(3193).then(n.bind(n,2540)),"@site/docs/Lab/Data/quiz/memory-stack-protector.md",2540],"2e088525":[()=>n.e(8338).then(n.bind(n,9172)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool.md",9172],"31a6b50d":[()=>n.e(6889).then(n.bind(n,464)),"@site/docs/Lab/Application Interaction/x-window-system.md",464],"31b22d21":[()=>n.e(9462).then(n.bind(n,7215)),"@site/docs/Exams/Aggregator Application/aggregator-application.md",7215],32839693:[()=>n.e(298).then(n.bind(n,4878)),"@site/docs/Lab/Compute/quiz/why-use-completed-queue.md",4878],"32a6404a":[()=>n.e(2308).then(n.t.bind(n,2459,19)),"~docs/default/category-operating-systems-sidebar-category-drills-4-55c.json",2459],"33496c9c":[()=>n.e(9737).then(n.t.bind(n,5430,19)),"~docs/default/category-operating-systems-sidebar-category-questions-f5e.json",5430],"34746f8c":[()=>n.e(4512).then(n.bind(n,7483)),"@site/docs/Lab/Compute/quiz/ult-thread-ids.md",7483],"35edd654":[()=>n.e(8065).then(n.bind(n,1163)),"@site/docs/Lab/Data/quiz/valgrind-leaks.md",1163],"374a2386":[()=>n.e(923).then(n.bind(n,2725)),"@site/docs/Lab/IO/quiz/anonymous-pipes-limitation.md",2725],"392776e2":[()=>n.e(2464).then(n.bind(n,7885)),"@site/docs/Lab/Data/quiz/malloc-mmap.md",7885],"393be207":[()=>n.e(4134).then(n.bind(n,2189)),"@site/src/pages/markdown-page.md",2189],"3b144757":[()=>n.e(6204).then(n.t.bind(n,9980,19)),"~docs/default/category-operating-systems-sidebar-category-reading-1-6e6.json",9980],"3c30233f":[()=>n.e(6434).then(n.bind(n,3993)),"@site/docs/Lab/Compute/hardware-perspective.md",3993],"3d15bb58":[()=>n.e(3167).then(n.t.bind(n,4951,19)),"~docs/default/category-operating-systems-sidebar-category-lab-17e.json",4951],"3e17b32d":[()=>n.e(7824).then(n.bind(n,3202)),"@site/docs/Lab/Data/quiz/string-strcpy.md",3202],"3e3393a3":[()=>n.e(1193).then(n.bind(n,1467)),"@site/docs/Lab/Compute/quiz/child-faults-after-write.md",1467],"3e478533":[()=>n.e(9795).then(n.bind(n,9343)),"@site/docs/Assignments/Mini Libc/README.md",9343],"3e9c7513":[()=>n.e(1843).then(n.t.bind(n,7477,19)),"~docs/default/category-operating-systems-sidebar-category-tasks-668.json",7477],"41c8b4f1":[()=>n.e(9614).then(n.bind(n,2219)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/Overview/overview.md",2219],"45bf5b15":[()=>n.e(446).then(n.bind(n,4533)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables.md",4533],"463aadd7":[()=>n.e(2213).then(n.bind(n,6139)),"@site/docs/Assignments/Mini Shell/README.md",6139],"473ad4cf":[()=>n.e(2419).then(n.t.bind(n,1738,19)),"~docs/default/category-operating-systems-sidebar-category-lecture-c9e.json",1738],"49cee3f0":[()=>n.e(6504).then(n.bind(n,8542)),"@site/docs/Lab/Data/quiz/half-page.md",8542],"4bb7e290":[()=>n.e(9446).then(n.bind(n,7076)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper.md",7076],"4c165629":[()=>n.e(9647).then(n.bind(n,5432)),"@site/docs/Lab/IO/quiz/pipe-ends.md",5432],"4c341edc":[()=>n.e(1392).then(n.bind(n,7992)),"@site/docs/Assignments/Mini Shell/util/parser/README.md",7992],"4c750841":[()=>n.e(3885).then(n.t.bind(n,5563,19)),"~docs/default/category-operating-systems-sidebar-category-lab-1-operating-system-perspective-c6e.json",5563],"4d19100c":[()=>n.e(289).then(n.bind(n,1594)),"@site/docs/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang.md",1594],"4e29cae1":[()=>n.e(99).then(n.bind(n,4986)),"@site/docs/Lab/Compute/quiz/processes-speedup.md",4986],"50ed9da3":[()=>n.e(8060).then(n.bind(n,5215)),"@site/docs/Lab/Compute/quiz/semaphore-equivalent.md",5215],"5104295a":[()=>n.e(6980).then(n.t.bind(n,5196,19)),"~docs/default/category-operating-systems-sidebar-category-applications-79d.json",5196],"51e1f46b":[()=>n.e(3645).then(n.t.bind(n,3843,19)),"~docs/default/category-operating-systems-sidebar-category-tasks-3-0c3.json",3843],"51e6f6aa":[()=>n.e(3946).then(n.bind(n,5316)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/README.md",5316],"577dcf4c":[()=>n.e(5918).then(n.bind(n,1930)),"@site/docs/Lab/Application Interaction/quiz/time-server-interop.md",1930],"5894dc17":[()=>n.e(1092).then(n.bind(n,5440)),"@site/docs/Lab/Application Interaction/arena.md",5440],"58ae093f":[()=>n.e(6388).then(n.t.bind(n,3902,19)),"~docs/default/category-operating-systems-sidebar-category-system-calls-aa2.json",3902],"59897f9f":[()=>n.e(6822).then(n.bind(n,3047)),"@site/docs/Lab/IO/quiz/o-trunc.md",3047],"59ad4d8f":[()=>n.e(3284).then(n.bind(n,2896)),"@site/docs/Lab/IO/quiz/write-file-permissions.md",2896],"5b157b4b":[()=>n.e(8393).then(n.bind(n,303)),"@site/docs/Lab/Compute/copy-on-write.md",303],"5d7f8186":[()=>n.e(6248).then(n.bind(n,6319)),"@site/docs/Lab/Data/quiz/string-buff-over.md",6319],"5ebe6805":[()=>n.e(517).then(n.bind(n,5418)),"@site/docs/Lecture/Compute.mdx",5418],"5f61d8dd":[()=>n.e(729).then(n.bind(n,1958)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall.md",1958],"60905a9d":[()=>n.e(6627).then(n.bind(n,387)),"@site/docs/Lab/IO/quiz/strace-printf.md",387],"625a19b4":[()=>n.e(8661).then(n.bind(n,1365)),"@site/docs/Lab/Compute/quiz/fiber-strace.md",1365],"634f10a7":[()=>n.e(879).then(n.bind(n,9221)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc.md",9221],"63c434c4":[()=>n.e(1643).then(n.bind(n,9620)),"@site/docs/Exams/Nightly Builds System/nightly-builds-system.md",9620],"64caa483":[()=>n.e(4933).then(n.t.bind(n,1325,19)),"~docs/default/category-operating-systems-sidebar-category-questions-2-307.json",1325],"6523baf0":[()=>n.e(1280).then(n.bind(n,5353)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers.md",5353],"65687b6f":[()=>n.e(8629).then(n.bind(n,1535)),"@site/docs/Lab/IO/quiz/bind-error-cause.md",1535],"65ab3714":[()=>n.e(4836).then(n.bind(n,1052)),"@site/docs/Lab/Application Interaction/quiz/container-vs-vm.md",1052],"677bfb31":[()=>n.e(6241).then(n.bind(n,5986)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall.md",5986],"6b326dfe":[()=>n.e(1269).then(n.t.bind(n,4061,19)),"/build/docusaurus/SO/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",4061],"6bda9475":[()=>n.e(1085).then(n.bind(n,7044)),"@site/docs/Lab/Data/overview.md",7044],"6c180aec":[()=>n.e(9088).then(n.bind(n,9198)),"@site/docs/Exams/User-level Threading Library/user-level-threading-library.md",9198],"6e6dee7f":[()=>n.e(5623).then(n.bind(n,3412)),"@site/docs/Lab/Compute/quiz/parent-of-sleep-processes.md",3412],"6e77dc18":[()=>n.e(8566).then(n.bind(n,1614)),"@site/docs/Lab/Application Interaction/password-cracker.md",1614],"6e8edd23":[()=>n.e(5232).then(n.bind(n,4308)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/README.md",4308],"6e95b748":[()=>n.e(1759).then(n.bind(n,2921)),"@site/docs/Lab/Application Interaction/quiz/time-server.md",2921],"70ad9ac2":[()=>n.e(4932).then(n.bind(n,3608)),"@site/docs/Lab/Compute/quiz/time-slice-value.md",3608],"71907c1d":[()=>n.e(3385).then(n.bind(n,6901)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall.md",6901],"71aa02c5":[()=>n.e(8815).then(n.bind(n,5272)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall.md",5272],"721e21bc":[()=>n.e(4268).then(n.t.bind(n,8652,19)),"~docs/default/category-operating-systems-sidebar-category-questions-4-980.json",8652],"747ded37":[()=>n.e(3706).then(n.bind(n,4358)),"@site/docs/Hackathons/Lambda Function Loader/README.md",4358],"7543d96b":[()=>n.e(6581).then(n.t.bind(n,145,19)),"~docs/default/category-operating-systems-sidebar-category-reading-2-649.json",145],78095748:[()=>n.e(9619).then(n.bind(n,68)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/README.md",68],"7ce52f14":[()=>n.e(1920).then(n.t.bind(n,76,19)),"~docs/default/category-operating-systems-sidebar-category-reading-66e.json",76],"7e98c1d8":[()=>n.e(3700).then(n.bind(n,1854)),"@site/docs/Lab/Compute/quiz/state-of-new-ult.md",1854],"7f023807":[()=>n.e(6152).then(n.bind(n,4938)),"@site/docs/Lab/IO/quiz/server-copies.md",4938],"81b85611":[()=>n.e(9759).then(n.bind(n,8339)),"@site/docs/Lab/IO/file-handlers.md",8339],"81ef98dd":[()=>n.e(5824).then(n.bind(n,7550)),"@site/docs/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools.md",7550],"8209a29d":[()=>n.e(8838).then(n.bind(n,1994)),"@site/docs/Lab/IO/pipes.md",1994],"83d110b2":[()=>n.e(4298).then(n.bind(n,9690)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate.md",9690],"83d94817":[()=>n.e(1101).then(n.t.bind(n,8092,19)),"~docs/default/category-operating-systems-sidebar-category-drills-1-1dd.json",8092],"88170a0d":[()=>n.e(622).then(n.t.bind(n,2130,19)),"~docs/default/category-operating-systems-sidebar-category-exams-9e1.json",2130],"89d3ad7d":[()=>n.e(8871).then(n.bind(n,6031)),"@site/docs/Lab/IO/quiz/syscalls-cp.md",6031],"8c873eb8":[()=>n.e(545).then(n.bind(n,6012)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/README.md",6012],"8ca589d3":[()=>n.e(9620).then(n.bind(n,4464)),"@site/docs/Lab/IO/io-internals.md",4464],"8d5b82ca":[()=>n.e(3092).then(n.bind(n,4381)),"@site/docs/Lab/Compute/overview.md",4381],"8de34314":[()=>n.e(1727).then(n.bind(n,8382)),"@site/docs/Lab/IO/file-descriptors.md",8382],"8ec866b0":[()=>n.e(4789).then(n.bind(n,8131)),"@site/docs/Assignments/Asynchronous Web Server/README.md",8131],"8f35a413":[()=>n.e(7778).then(n.bind(n,8248)),"@site/docs/Lab/Data/quiz/stack-layout.md",8248],"918b3e21":[()=>n.e(3508).then(n.bind(n,7272)),"@site/docs/Lecture/Application-Interaction.mdx",7272],"91ac0728":[()=>n.e(9704).then(n.bind(n,1077)),"@site/docs/Lecture/IO.mdx",1077],"924f80ad":[()=>n.e(4035).then(n.bind(n,7927)),"@site/docs/Lab/Application Interaction/quiz/cgroups-vs-namespaces.md",7927],"926d7fb7":[()=>n.e(5214).then(n.bind(n,5348)),"@site/docs/Lab/Application Interaction/quiz/vm-creation.md",5348],"928d0c11":[()=>n.e(9223).then(n.bind(n,6124)),"@site/docs/Lab/Compute/quiz/sleeping-on-a-fiber.md",6124],"935f2afb":[()=>n.e(8581).then(n.t.bind(n,5610,19)),"~docs/default/version-current-metadata-prop-751.json",5610],94458749:[()=>n.e(4907).then(n.bind(n,260)),"@site/docs/Lab/IO/networking-101.md",260],"94806a34":[()=>n.e(770).then(n.bind(n,2556)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers.md",2556],"95637cbd":[()=>n.e(7360).then(n.bind(n,7321)),"@site/docs/Lab/IO/quiz/deluge-tcp-udp.md",7321],"96a31749":[()=>n.e(3163).then(n.bind(n,7341)),"@site/docs/Lab/Data/quiz/memory-aslr.md",7341],"96f28031":[()=>n.e(5046).then(n.bind(n,7997)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper.md",7997],"97fe4cb3":[()=>n.e(3686).then(n.bind(n,6764)),"@site/docs/Lab/IO/quiz/client-server-sender-receiver.md",6764],"9846e945":[()=>n.e(7341).then(n.bind(n,5579)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/README.md",5579],"98c71577":[()=>n.e(4226).then(n.bind(n,6807)),"@site/docs/Lab/IO/zero-copy.md",6807],"997e6ee2":[()=>n.e(3127).then(n.bind(n,7105)),"@site/docs/Lab/Compute/quiz/notify-only-with-mutex.md",7105],"9b172a36":[()=>n.e(1918).then(n.bind(n,2937)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall.md",2937],"9f880d5b":[()=>n.e(7087).then(n.t.bind(n,6190,19)),"~docs/default/category-operating-systems-sidebar-category-data-feb.json",6190],"9f99d3fc":[()=>n.e(4886).then(n.bind(n,2865)),"@site/docs/Lab/Compute/quiz/parent-faults-before-fork.md",2865],"9fb23397":[()=>n.e(3204).then(n.bind(n,8311)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/README.md",8311],a0ac5395:[()=>n.e(4222).then(n.bind(n,6903)),"@site/docs/Lab/Compute/quiz/apache2-strace.md",6903],a0d8a9b9:[()=>n.e(3005).then(n.bind(n,7623)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions.md",7623],a1687474:[()=>n.e(7763).then(n.t.bind(n,5212,19)),"~docs/default/category-operating-systems-sidebar-category-lab-2-library-perspective-aad.json",5212],a191e07d:[()=>n.e(5557).then(n.bind(n,5070)),"@site/docs/Lab/Data/quiz/bypass-canary.md",5070],a210c167:[()=>n.e(728).then(n.bind(n,7377)),"@site/docs/Assignments/Asynchronous Web Server/src/http-parser/README.md",7377],a22b4475:[()=>n.e(7678).then(n.t.bind(n,1721,19)),"~docs/default/category-operating-systems-sidebar-category-reading-3-323.json",1721],a2a02518:[()=>n.e(1961).then(n.bind(n,7639)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool.md",7639],a315d4d8:[()=>n.e(5653).then(n.bind(n,1128)),"@site/docs/Lab/Application Interaction/time-server.md",1128],a3f724e5:[()=>n.e(6142).then(n.bind(n,9211)),"@site/docs/Exams/Digital Forensics/digital-forensics.md",9211],a4b6fafb:[()=>n.e(975).then(n.t.bind(n,779,19)),"~docs/default/category-operating-systems-sidebar-category-assignments-c09.json",779],a53bb361:[()=>n.e(152).then(n.t.bind(n,2268,19)),"~docs/default/category-operating-systems-sidebar-category-high-level-languages-8a1.json",2268],a76a4d9b:[()=>n.e(8365).then(n.bind(n,3968)),"@site/docs/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/README.md",3968],a7bc80c4:[()=>n.e(675).then(n.bind(n,3708)),"@site/docs/Lab/IO/io-multiplexing.md",3708],a8d01eab:[()=>n.e(3403).then(n.bind(n,924)),"@site/docs/Lab/Application Interaction/quiz/timer.md",924],ab4aa734:[()=>n.e(1078).then(n.bind(n,9749)),"@site/docs/Lab/IO/remote-io.md",9749],ac5c3a27:[()=>n.e(7010).then(n.bind(n,6285)),"@site/docs/Lab/Compute/quiz/create-sleepy-process-ending.md",6285],ade537b6:[()=>n.e(5064).then(n.bind(n,2256)),"@site/docs/Lab/Compute/quiz/tls-synchronization.md",2256],aecc3d85:[()=>n.e(6311).then(n.bind(n,2368)),"@site/docs/Lab/Data/arena.md",2368],b0d828e0:[()=>n.e(6020).then(n.bind(n,4818)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id.md",4818],b407248a:[()=>n.e(2429).then(n.bind(n,854)),"@site/docs/Assignments/Memory Allocator/README.md",854],b5c587af:[()=>n.e(2334).then(n.bind(n,5173)),"@site/docs/Assignments/Parallel Graph/README.md",5173],b86e143e:[()=>n.e(2257).then(n.t.bind(n,5768,19)),"~docs/default/category-operating-systems-sidebar-category-tasks-1-e53.json",5768],b95e0710:[()=>n.e(22).then(n.bind(n,1090)),"@site/docs/Lab/Compute/quiz/mmap-cow-flag.md",1090],ba943973:[()=>n.e(1461).then(n.t.bind(n,1919,19)),"~docs/default/category-operating-systems-sidebar-category-compute-f05.json",1919],bc288ac4:[()=>n.e(7188).then(n.bind(n,2215)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/README.md",2215],bdd18817:[()=>n.e(8899).then(n.bind(n,5147)),"@site/docs/Exams/Distributed System/distributed-system.md",5147],be36e4af:[()=>n.e(4641).then(n.bind(n,5459)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write.md",5459],bf7b3d34:[()=>n.e(8912).then(n.t.bind(n,5464,19)),"~docs/default/category-operating-systems-sidebar-category-guides-d06.json",5464],c2609098:[()=>n.e(4338).then(n.bind(n,5896)),"@site/docs/Lab/IO/local-io-in-action.md",5896],c4d6228b:[()=>n.e(2242).then(n.bind(n,551)),"@site/docs/Lab/Compute/quiz/tls-var-copies.md",551],c54826dc:[()=>n.e(9544).then(n.bind(n,6055)),"@site/docs/Lab/Data/quiz/memory-granularity.md",6055],c68dd727:[()=>n.e(8262).then(n.t.bind(n,4635,19)),"~docs/default/category-operating-systems-sidebar-category-drills-f44.json",4635],c762571b:[()=>n.e(4800).then(n.t.bind(n,935,19)),"~docs/default/category-operating-systems-sidebar-category-drills-5-a41.json",935],c7d5d005:[()=>n.e(37).then(n.bind(n,5846)),"@site/docs/Lab/IO/client-server-model.md",5846],c92640ae:[()=>n.e(3501).then(n.bind(n,9850)),"@site/docs/Lab/Compute/quiz/cause-of-file-not-found-error.md",9850],ca6b73ec:[()=>n.e(6669).then(n.bind(n,6029)),"@site/docs/Lecture/Data.mdx",6029],ca978206:[()=>n.e(4467).then(n.bind(n,8711)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software.md",8711],cbc996c5:[()=>n.e(2289).then(n.bind(n,6808)),"@site/docs/Lab/Compute/quiz/number-of-running-ults.md",6808],cc8fb1fa:[()=>n.e(7271).then(n.bind(n,4001)),"@site/docs/Lab/Application Interaction/os-cloud.md",4001],cd9eb992:[()=>n.e(1714).then(n.bind(n,4564)),"@site/docs/Software Stack/Software-Stack.mdx",4564],ce0d7f6c:[()=>n.e(4245).then(n.bind(n,8421)),"@site/docs/Lab/Application Interaction/dbus.md",8421],ce181f15:[()=>n.e(651).then(n.bind(n,5607)),"@site/docs/Lab/IO/quiz/mmap-read-write-benchmark.md",5607],ce1cacf4:[()=>n.e(1349).then(n.bind(n,3998)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc.md",3998],d2954435:[()=>n.e(1419).then(n.bind(n,7555)),"@site/docs/Lab/Data/memory-security.md",7555],d309dd16:[()=>n.e(584).then(n.bind(n,5077)),"@site/docs/Lab/Data/quiz/memory-access.md",5077],d45c1699:[()=>n.e(480).then(n.bind(n,6213)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper.md",6213],d5aa9830:[()=>n.e(3270).then(n.bind(n,4456)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries.md",4456],d6e5c209:[()=>n.e(4757).then(n.bind(n,7151)),"@site/docs/Lab/Compute/quiz/seg-fault-exit-code.md",7151],d6fc9938:[()=>n.e(4711).then(n.bind(n,295)),"@site/docs/Exams/Benchmarking Application/benchmarking-application.md",295],d754500f:[()=>n.e(8334).then(n.bind(n,1293)),"@site/docs/Lab/IO/quiz/execve.md",1293],d89f6589:[()=>n.e(2968).then(n.t.bind(n,9577,19)),"~docs/default/category-operating-systems-sidebar-category-libraries-069.json",9577],d92a3c43:[()=>n.e(8864).then(n.bind(n,5855)),"@site/docs/resources.md",5855],dade2520:[()=>n.e(9482).then(n.bind(n,7414)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool.md",7414],dca082a0:[()=>n.e(5286).then(n.t.bind(n,3026,19)),"~docs/default/category-operating-systems-sidebar-category-libc-66c.json",3026],dd1898d3:[()=>n.e(9680).then(n.t.bind(n,8602,19)),"~docs/default/category-operating-systems-sidebar-category-tasks-2-b02.json",8602],ddc3a2ab:[()=>n.e(333).then(n.bind(n,865)),"@site/docs/Lab/Compute/threads.md",865],de2a6172:[()=>n.e(1693).then(n.bind(n,3937)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall.md",3937],e0921ae2:[()=>n.e(9034).then(n.bind(n,5905)),"@site/docs/Lab/Data/quiz/memory-regions-vars.md",5905],e34aa1dc:[()=>n.e(1119).then(n.t.bind(n,9432,19)),"~docs/default/category-operating-systems-sidebar-category-software-stack-0b7.json",9432],e3a89e97:[()=>n.e(4126).then(n.bind(n,2506)),"@site/docs/Exams/Network Configurations Manager/network-configurations-manager.md",2506],e46ccb2a:[()=>n.e(1841).then(n.bind(n,607)),"@site/docs/Lab/Compute/quiz/type-of-scheduler-in-libult.md",607],e4b3f4c8:[()=>n.e(342).then(n.bind(n,3471)),"@site/docs/Lab/IO/quiz/receiver-socket-fd.md",3471],e7d4c09c:[()=>n.e(9278).then(n.bind(n,9813)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack.md",9813],e88d4a6f:[()=>n.e(7753).then(n.bind(n,5057)),"@site/docs/Lab/IO/file-mappings.md",5057],ea490624:[()=>n.e(4144).then(n.bind(n,4553)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id.md",4553],ebab4897:[()=>n.e(4423).then(n.t.bind(n,7764,19)),"~docs/default/category-operating-systems-sidebar-category-modern-software-stacks-6b0.json",7764],ebbaca72:[()=>n.e(2306).then(n.bind(n,5945)),"@site/docs/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool.md",5945],ed4e77cc:[()=>n.e(8361).then(n.bind(n,8798)),"@site/docs/Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/README.md",8798],ed8bb14c:[()=>n.e(1118).then(n.bind(n,5368)),"@site/docs/rules-and-grading.md",5368],ef38b4a8:[()=>n.e(9594).then(n.t.bind(n,8650,19)),"~docs/default/category-operating-systems-sidebar-category-questions-3-4c1.json",8650],ef7ad362:[()=>n.e(941).then(n.bind(n,2549)),"@site/docs/Exams/Application Investigator/application-investigator.md",2549],f4dcab90:[()=>n.e(9612).then(n.bind(n,919)),"@site/docs/Lab/IO/quiz/fopen-w.md",919],f54b55c1:[()=>n.e(7476).then(n.bind(n,968)),"@site/docs/Lab/Compute/quiz/thread-memory.md",968],f6eb4965:[()=>n.e(8892).then(n.bind(n,9332)),"@site/docs/Lab/Application Interaction/overview.md",9332],f8a820d6:[()=>n.e(6258).then(n.t.bind(n,7582,19)),"~docs/default/category-operating-systems-sidebar-category-io-1b4.json",7582],fbc1cab8:[()=>n.e(3537).then(n.bind(n,3049)),"@site/docs/Lab/Data/working-memory.md",3049],fc7881a9:[()=>n.e(5004).then(n.bind(n,5102)),"@site/docs/Lab/Compute/quiz/who-calls-execve-parent.md",5102],fdef1607:[()=>n.e(2026).then(n.bind(n,3865)),"@site/docs/Lab/Data/quiz/mmap-file.md",3865],fecbe7cc:[()=>n.e(3305).then(n.bind(n,4127)),"@site/docs/Lab/Data/quiz/memory-leaks.md",4127],fedaf6f6:[()=>n.e(7657).then(n.bind(n,7122)),"@site/docs/Exams/Network Performance Utility/network-performance-utility.md",7122]};function c(e){let{error:t,retry:n,pastDelay:r}=e;return t?a.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},a.createElement("p",null,String(t)),a.createElement("div",null,a.createElement("button",{type:"button",onClick:n},"Retry"))):r?a.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},a.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},a.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"8"},a.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(6921),p=n(3102);function d(e,t){if("*"===e)return s()({loading:c,loader:()=>n.e(1774).then(n.bind(n,1774)),modules:["@theme/NotFound"],webpack:()=>[1774],render(e,t){const n=e.default;return a.createElement(p.W,{value:{plugin:{name:"native",id:"default"}}},a.createElement(n,t))}});const i=o[`${e}-${t}`],d={},m=[],f=[],b=(0,u.A)(i);return Object.entries(b).forEach((e=>{let[t,n]=e;const a=l[n];a&&(d[t]=a[0],m.push(a[1]),f.push(a[2]))})),s().Map({loading:c,loader:d,modules:m,webpack:()=>f,render(t,n){const s=JSON.parse(JSON.stringify(i));Object.entries(t).forEach((t=>{let[n,a]=t;const r=a.default;if(!r)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof r&&"function"!=typeof r||Object.keys(a).filter((e=>"default"!==e)).forEach((e=>{r[e]=a[e]}));let i=s;const o=n.split(".");o.slice(0,-1).forEach((e=>{i=i[e]})),i[o[o.length-1]]=r}));const o=s.__comp;delete s.__comp;const l=s.__context;return delete s.__context,a.createElement(p.W,{value:l},a.createElement(o,(0,r.A)({},s,n)))}})}const m=[{path:"/operating-systems/markdown-page",component:d("/operating-systems/markdown-page","5f8"),exact:!0},{path:"/operating-systems/",component:d("/operating-systems/","6ea"),routes:[{path:"/operating-systems/",component:d("/operating-systems/","a5c"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Assignments/",component:d("/operating-systems/Assignments/","d7b"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Assignments/Asynchronous Web Server/",component:d("/operating-systems/Assignments/Asynchronous Web Server/","fab"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Assignments/Asynchronous Web Server/src/http-parser/",component:d("/operating-systems/Assignments/Asynchronous Web Server/src/http-parser/","f1e"),exact:!0},{path:"/operating-systems/Assignments/Memory Allocator/",component:d("/operating-systems/Assignments/Memory Allocator/","3b7"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Assignments/Mini Libc/",component:d("/operating-systems/Assignments/Mini Libc/","b0e"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Assignments/Mini Shell/",component:d("/operating-systems/Assignments/Mini Shell/","922"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Assignments/Mini Shell/util/parser/",component:d("/operating-systems/Assignments/Mini Shell/util/parser/","268"),exact:!0},{path:"/operating-systems/Assignments/Parallel Graph/",component:d("/operating-systems/Assignments/Parallel Graph/","873"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/",component:d("/operating-systems/Exams/","ae4"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/Aggregator Application/aggregator-application",component:d("/operating-systems/Exams/Aggregator Application/aggregator-application","be1"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/Application Investigator/application-investigator",component:d("/operating-systems/Exams/Application Investigator/application-investigator","fa5"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/Benchmarking Application/benchmarking-application",component:d("/operating-systems/Exams/Benchmarking Application/benchmarking-application","108"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/Database Application/database-application",component:d("/operating-systems/Exams/Database Application/database-application","25e"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/Digital Forensics/digital-forensics",component:d("/operating-systems/Exams/Digital Forensics/digital-forensics","073"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/Distributed System/distributed-system",component:d("/operating-systems/Exams/Distributed System/distributed-system","fbd"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/Network Configurations Manager/network-configurations-manager",component:d("/operating-systems/Exams/Network Configurations Manager/network-configurations-manager","f96"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/Network Performance Utility/network-performance-utility",component:d("/operating-systems/Exams/Network Performance Utility/network-performance-utility","2ff"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/Nightly Builds System/nightly-builds-system",component:d("/operating-systems/Exams/Nightly Builds System/nightly-builds-system","5be"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/System Process Monitoring Tool/system-process-monitoring-tool",component:d("/operating-systems/Exams/System Process Monitoring Tool/system-process-monitoring-tool","739"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Exams/User-level Threading Library/user-level-threading-library",component:d("/operating-systems/Exams/User-level Threading Library/user-level-threading-library","b5c"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Hackathons/",component:d("/operating-systems/Hackathons/","07a"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Hackathons/Lambda Function Loader/",component:d("/operating-systems/Hackathons/Lambda Function Loader/","ca8"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/",component:d("/operating-systems/Lab/","72f"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Application Interaction/",component:d("/operating-systems/Lab/Application Interaction/","a72"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Application Interaction/arena",component:d("/operating-systems/Lab/Application Interaction/arena","58b"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Application Interaction/dbus",component:d("/operating-systems/Lab/Application Interaction/dbus","2fc"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Application Interaction/os-cloud",component:d("/operating-systems/Lab/Application Interaction/os-cloud","3ec"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Application Interaction/overview",component:d("/operating-systems/Lab/Application Interaction/overview","e76"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Application Interaction/password-cracker",component:d("/operating-systems/Lab/Application Interaction/password-cracker","1ae"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Application Interaction/quiz/cgroups-vs-namespaces",component:d("/operating-systems/Lab/Application Interaction/quiz/cgroups-vs-namespaces","710"),exact:!0},{path:"/operating-systems/Lab/Application Interaction/quiz/container-vs-vm",component:d("/operating-systems/Lab/Application Interaction/quiz/container-vs-vm","735"),exact:!0},{path:"/operating-systems/Lab/Application Interaction/quiz/time-server",component:d("/operating-systems/Lab/Application Interaction/quiz/time-server","d60"),exact:!0},{path:"/operating-systems/Lab/Application Interaction/quiz/time-server-interop",component:d("/operating-systems/Lab/Application Interaction/quiz/time-server-interop","201"),exact:!0},{path:"/operating-systems/Lab/Application Interaction/quiz/timer",component:d("/operating-systems/Lab/Application Interaction/quiz/timer","316"),exact:!0},{path:"/operating-systems/Lab/Application Interaction/quiz/vm-creation",component:d("/operating-systems/Lab/Application Interaction/quiz/vm-creation","479"),exact:!0},{path:"/operating-systems/Lab/Application Interaction/time-server",component:d("/operating-systems/Lab/Application Interaction/time-server","99b"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Application Interaction/x-window-system",component:d("/operating-systems/Lab/Application Interaction/x-window-system","f0f"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Compute/",component:d("/operating-systems/Lab/Compute/","07d"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Compute/arena",component:d("/operating-systems/Lab/Compute/arena","9dd"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Compute/copy-on-write",component:d("/operating-systems/Lab/Compute/copy-on-write","fbe"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Compute/hardware-perspective",component:d("/operating-systems/Lab/Compute/hardware-perspective","57e"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Compute/overview",component:d("/operating-systems/Lab/Compute/overview","a35"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Compute/processes",component:d("/operating-systems/Lab/Compute/processes","0fd"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Compute/processes-threads-apache2",component:d("/operating-systems/Lab/Compute/processes-threads-apache2","cc5"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Compute/quiz/apache2-strace",component:d("/operating-systems/Lab/Compute/quiz/apache2-strace","40a"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/cause-of-file-not-found-error",component:d("/operating-systems/Lab/Compute/quiz/cause-of-file-not-found-error","d06"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/child-faults-after-write",component:d("/operating-systems/Lab/Compute/quiz/child-faults-after-write","66f"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/coarse-vs-granular-critical-section",component:d("/operating-systems/Lab/Compute/quiz/coarse-vs-granular-critical-section","f32"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/create-sleepy-process-ending",component:d("/operating-systems/Lab/Compute/quiz/create-sleepy-process-ending","43d"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/fiber-strace",component:d("/operating-systems/Lab/Compute/quiz/fiber-strace","c39"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/mini-shell-stops-after-command",component:d("/operating-systems/Lab/Compute/quiz/mini-shell-stops-after-command","fca"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/mmap-cow-flag",component:d("/operating-systems/Lab/Compute/quiz/mmap-cow-flag","494"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/notify-only-with-mutex",component:d("/operating-systems/Lab/Compute/quiz/notify-only-with-mutex","e61"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/number-of-running-ults",component:d("/operating-systems/Lab/Compute/quiz/number-of-running-ults","9e1"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/parent-faults-before-fork",component:d("/operating-systems/Lab/Compute/quiz/parent-faults-before-fork","5f0"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/parent-of-sleep-processes",component:d("/operating-systems/Lab/Compute/quiz/parent-of-sleep-processes","829"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/processes-speedup",component:d("/operating-systems/Lab/Compute/quiz/processes-speedup","d96"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/seg-fault-exit-code",component:d("/operating-systems/Lab/Compute/quiz/seg-fault-exit-code","939"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/semaphore-equivalent",component:d("/operating-systems/Lab/Compute/quiz/semaphore-equivalent","2aa"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/sleeping-on-a-fiber",component:d("/operating-systems/Lab/Compute/quiz/sleeping-on-a-fiber","bba"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/state-of-new-ult",component:d("/operating-systems/Lab/Compute/quiz/state-of-new-ult","e91"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/tcb-libult-unikraft",component:d("/operating-systems/Lab/Compute/quiz/tcb-libult-unikraft","cd4"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/thread-memory",component:d("/operating-systems/Lab/Compute/quiz/thread-memory","78c"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/time-slice-value",component:d("/operating-systems/Lab/Compute/quiz/time-slice-value","f86"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/tls-synchronization",component:d("/operating-systems/Lab/Compute/quiz/tls-synchronization","bc2"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/tls-var-copies",component:d("/operating-systems/Lab/Compute/quiz/tls-var-copies","b83"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/type-of-scheduler-in-libult",component:d("/operating-systems/Lab/Compute/quiz/type-of-scheduler-in-libult","0c6"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/ult-thread-ids",component:d("/operating-systems/Lab/Compute/quiz/ult-thread-ids","8e9"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/who-calls-execve-parent",component:d("/operating-systems/Lab/Compute/quiz/who-calls-execve-parent","474"),exact:!0},{path:"/operating-systems/Lab/Compute/quiz/why-use-completed-queue",component:d("/operating-systems/Lab/Compute/quiz/why-use-completed-queue","58f"),exact:!0},{path:"/operating-systems/Lab/Compute/synchronization",component:d("/operating-systems/Lab/Compute/synchronization","2d2"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Compute/threads",component:d("/operating-systems/Lab/Compute/threads","0ca"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Compute/user-level-threads",component:d("/operating-systems/Lab/Compute/user-level-threads","754"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Data/",component:d("/operating-systems/Lab/Data/","6b6"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Data/arena",component:d("/operating-systems/Lab/Data/arena","756"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Data/investigate-memory",component:d("/operating-systems/Lab/Data/investigate-memory","536"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Data/memory-security",component:d("/operating-systems/Lab/Data/memory-security","e03"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Data/overview",component:d("/operating-systems/Lab/Data/overview","529"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Data/process-memory",component:d("/operating-systems/Lab/Data/process-memory","43c"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/Data/quiz/bypass-canary",component:d("/operating-systems/Lab/Data/quiz/bypass-canary","a3c"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/half-page",component:d("/operating-systems/Lab/Data/quiz/half-page","bfa"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/malloc-brk",component:d("/operating-systems/Lab/Data/quiz/malloc-brk","6fc"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/malloc-mmap",component:d("/operating-systems/Lab/Data/quiz/malloc-mmap","35a"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/memory-access",component:d("/operating-systems/Lab/Data/quiz/memory-access","be7"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/memory-aslr",component:d("/operating-systems/Lab/Data/quiz/memory-aslr","990"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/memory-granularity",component:d("/operating-systems/Lab/Data/quiz/memory-granularity","b46"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/memory-leaks",component:d("/operating-systems/Lab/Data/quiz/memory-leaks","4cb"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/memory-regions-vars",component:d("/operating-systems/Lab/Data/quiz/memory-regions-vars","b6b"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/memory-stack-protector",component:d("/operating-systems/Lab/Data/quiz/memory-stack-protector","bb8"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/mmap-file",component:d("/operating-systems/Lab/Data/quiz/mmap-file","456"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/operators",component:d("/operating-systems/Lab/Data/quiz/operators","848"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/page-allocation",component:d("/operating-systems/Lab/Data/quiz/page-allocation","2f8"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/stack-layout",component:d("/operating-systems/Lab/Data/quiz/stack-layout","d80"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/string-buff-over",component:d("/operating-systems/Lab/Data/quiz/string-buff-over","95b"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/string-strcpy",component:d("/operating-systems/Lab/Data/quiz/string-strcpy","944"),exact:!0},{path:"/operating-systems/Lab/Data/quiz/valgrind-leaks",component:d("/operating-systems/Lab/Data/quiz/valgrind-leaks","128"),exact:!0},{path:"/operating-systems/Lab/Data/working-memory",component:d("/operating-systems/Lab/Data/working-memory","3fb"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/",component:d("/operating-systems/Lab/IO/","21b"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/arena",component:d("/operating-systems/Lab/IO/arena","d31"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/async-io",component:d("/operating-systems/Lab/IO/async-io","1d1"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/beyond-network-sockets",component:d("/operating-systems/Lab/IO/beyond-network-sockets","adb"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/client-server-model",component:d("/operating-systems/Lab/IO/client-server-model","6b7"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/file-descriptors",component:d("/operating-systems/Lab/IO/file-descriptors","fee"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/file-handlers",component:d("/operating-systems/Lab/IO/file-handlers","d98"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/file-mappings",component:d("/operating-systems/Lab/IO/file-mappings","9d9"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/io-internals",component:d("/operating-systems/Lab/IO/io-internals","d00"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/io-multiplexing",component:d("/operating-systems/Lab/IO/io-multiplexing","b3a"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/local-io-in-action",component:d("/operating-systems/Lab/IO/local-io-in-action","fd1"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/networking-101",component:d("/operating-systems/Lab/IO/networking-101","c75"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/overview",component:d("/operating-systems/Lab/IO/overview","cd1"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/pipes",component:d("/operating-systems/Lab/IO/pipes","6c3"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/quiz/anonymous-pipes-limitation",component:d("/operating-systems/Lab/IO/quiz/anonymous-pipes-limitation","cbd"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/bind-error-cause",component:d("/operating-systems/Lab/IO/quiz/bind-error-cause","475"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/client-server-sender-receiver",component:d("/operating-systems/Lab/IO/quiz/client-server-sender-receiver","2f1"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/deluge-tcp-udp",component:d("/operating-systems/Lab/IO/quiz/deluge-tcp-udp","a26"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/execve",component:d("/operating-systems/Lab/IO/quiz/execve","520"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/fewer-than-2-copies",component:d("/operating-systems/Lab/IO/quiz/fewer-than-2-copies","6f3"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/file-handler-c",component:d("/operating-systems/Lab/IO/quiz/file-handler-c","8fb"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/firefox-tcp-udp",component:d("/operating-systems/Lab/IO/quiz/firefox-tcp-udp","06d"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/flush-libc-buffer",component:d("/operating-systems/Lab/IO/quiz/flush-libc-buffer","9fe"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/fopen-syscall",component:d("/operating-systems/Lab/IO/quiz/fopen-syscall","3af"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/fopen-w",component:d("/operating-systems/Lab/IO/quiz/fopen-w","f58"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/local-io-errors",component:d("/operating-systems/Lab/IO/quiz/local-io-errors","364"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/mmap-read-write-benchmark",component:d("/operating-systems/Lab/IO/quiz/mmap-read-write-benchmark","622"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/o-trunc",component:d("/operating-systems/Lab/IO/quiz/o-trunc","6da"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/pipe-ends",component:d("/operating-systems/Lab/IO/quiz/pipe-ends","066"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/prints-work-no-stdio",component:d("/operating-systems/Lab/IO/quiz/prints-work-no-stdio","855"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/receiver-socket-fd",component:d("/operating-systems/Lab/IO/quiz/receiver-socket-fd","ecb"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/server-copies",component:d("/operating-systems/Lab/IO/quiz/server-copies","530"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/stderr-fd",component:d("/operating-systems/Lab/IO/quiz/stderr-fd","fa6"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/strace-printf",component:d("/operating-systems/Lab/IO/quiz/strace-printf","1d4"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/syscalls-cp",component:d("/operating-systems/Lab/IO/quiz/syscalls-cp","678"),exact:!0},{path:"/operating-systems/Lab/IO/quiz/write-file-permissions",component:d("/operating-systems/Lab/IO/quiz/write-file-permissions","f2d"),exact:!0},{path:"/operating-systems/Lab/IO/redirections",component:d("/operating-systems/Lab/IO/redirections","446"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/remote-io",component:d("/operating-systems/Lab/IO/remote-io","cf2"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/IO/zero-copy",component:d("/operating-systems/Lab/IO/zero-copy","b3c"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lab/lab-setup",component:d("/operating-systems/Lab/lab-setup","264"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lecture/",component:d("/operating-systems/Lecture/","f17"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lecture/Application-Interaction",component:d("/operating-systems/Lecture/Application-Interaction","4ae"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lecture/Compute",component:d("/operating-systems/Lecture/Compute","44f"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lecture/Data",component:d("/operating-systems/Lecture/Data","48e"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Lecture/IO",component:d("/operating-systems/Lecture/IO","57b"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/resources",component:d("/operating-systems/resources","9f3"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/rules-and-grading",component:d("/operating-systems/rules-and-grading","127"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/",component:d("/operating-systems/Software Stack/","72b"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/","f27"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/","e6f"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack","961"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/","48f"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/","ca7"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/","849"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/","347"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software","a33"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software","0c7"),exact:!0},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/","004"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/","3ac"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/","f3c"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall","a0d"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id","e45"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers","b06"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool","a3d"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper","0af"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/","2e7"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/","7a9"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/","24f"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall","927"),exact:!0},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id","859"),exact:!0},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers","9a2"),exact:!0},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool","4f9"),exact:!0},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper","dce"),exact:!0},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/","95b"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall","b39"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall","b0d"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper","e65"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/","5aa"),exact:!0},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/","2de"),exact:!0},{path:"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/",component:d("/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/","adb"),exact:!0},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/","f04"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/","699"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/","d5c"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/","64d"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/","156"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Reading/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Reading/","3d3"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate","a4a"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/","42f"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/","c49"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/","a75"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools","475"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/","99b"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/","4ae"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools","56f"),exact:!0},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/","9aa"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang","bc6"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/","70e"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/","a94"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/","62a"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc","eee"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall","1ee"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write","503"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall","282"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool","a4f"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/","b23"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/","417"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/","7ee"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc","860"),exact:!0},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall","c32"),exact:!0},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write","f77"),exact:!0},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall","ad4"),exact:!0},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool","00b"),exact:!0},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/","3b8"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions","8bc"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc","bd0"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/","62b"),exact:!0},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/","122"),exact:!0},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/","a57"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/","6f0"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/","d30"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries","1de"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables","c83"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/","cae"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/","177"),exact:!0,sidebar:"sidebar"},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries","1a6"),exact:!0},{path:"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables",component:d("/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables","1a2"),exact:!0},{path:"/operating-systems/Software Stack/Software-Stack",component:d("/operating-systems/Software Stack/Software-Stack","798"),exact:!0,sidebar:"sidebar"}]},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>r,x:()=>i});var a=n(6540);const r=a.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{i(!0)}),[]),a.createElement(r.Provider,{value:n},t)}},5660:(e,t,n)=>{"use strict";var a=n(6540),r=n(961),i=n(4625),s=n(545),o=n(8193);const l=[n(119),n(6134),n(6294),n(1043)];var c=n(8328),u=n(6347),p=n(2831);function d(e){let{children:t}=e;return a.createElement(a.Fragment,null,t)}var m=n(8168),f=n(5260),b=n(4586),g=n(6025),y=n(6342),h=n(1003),v=n(2131),w=n(4090),S=n(2967),L=n(1463);function k(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,b.A)(),n=(0,v.o)();return a.createElement(f.A,null,Object.entries(t).map((e=>{let[t,{htmlLang:r}]=e;return a.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:r})})),a.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,b.A)(),r=function(){const{siteConfig:{url:e}}=(0,b.A)(),{pathname:t}=(0,u.zy)();return e+(0,g.A)(t)}(),i=t?`${n}${t}`:r;return a.createElement(f.A,null,a.createElement("meta",{property:"og:url",content:i}),a.createElement("link",{rel:"canonical",href:i}))}function x(){const{i18n:{currentLocale:e}}=(0,b.A)(),{metadata:t,image:n}=(0,y.p)();return a.createElement(a.Fragment,null,a.createElement(f.A,null,a.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),a.createElement("body",{className:w.w})),n&&a.createElement(h.be,{image:n}),a.createElement(E,null),a.createElement(k,null),a.createElement(L.A,{tag:S.Cy,locale:e}),a.createElement(f.A,null,t.map(((e,t)=>a.createElement("meta",(0,m.A)({key:t},e))))))}const _=new Map;function C(e){if(_.has(e.pathname))return{...e,pathname:_.get(e.pathname)};if((0,p.u)(c.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return _.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return _.set(e.pathname,t),{...e,pathname:t}}var A=n(6125),O=n(6988);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a{const a=t.default?.[e]??t[e];return a?.(...n)}));return()=>r.forEach((e=>e?.()))}const D=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,a.useLayoutEffect)((()=>{r!==n&&(r&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1)),n=document.getElementById(e);n?.scrollIntoView()}else window.scrollTo(0,0)}(n),P("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function I(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(c.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class T extends a.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=o.A.canUseDOM?P("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),I(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return a.createElement(D,{previousLocation:this.previousLocation,location:t},a.createElement(u.qh,{location:t,render:()=>e}))}}const z=T,q="docusaurus-base-url-issue-banner-container",R="docusaurus-base-url-issue-banner",N="docusaurus-base-url-issue-banner-suggestion-container",M="__DOCUSAURUS_INSERT_BASEURL_BANNER";function F(e){return`\nwindow['${M}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${M}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${q}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
    \n

    Your Docusaurus site did not load properly.

    \n

    A very common reason is a wrong site baseUrl configuration.

    \n

    Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

    \n

    We suggest trying baseUrl =

    \n
    \n`}(e)).replace(/{window[M]=!1}),[]),a.createElement(a.Fragment,null,!o.A.canUseDOM&&a.createElement(f.A,null,a.createElement("script",null,F(e))),a.createElement("div",{id:q}))}function j(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,b.A)(),{pathname:n}=(0,u.zy)();return t&&n===e?a.createElement(B,null):null}function U(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:i}}=(0,b.A)(),s=(0,g.A)(e),{htmlLang:o,direction:l}=i[r];return a.createElement(f.A,null,a.createElement("html",{lang:o,dir:l}),a.createElement("title",null,t),a.createElement("meta",{property:"og:title",content:t}),a.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&a.createElement("link",{rel:"icon",href:s}))}var $=n(7489);function G(){const e=(0,p.v)(c.A),t=(0,u.zy)();return a.createElement($.A,null,a.createElement(O.l,null,a.createElement(A.x,null,a.createElement(d,null,a.createElement(U,null),a.createElement(x,null),a.createElement(j,null),a.createElement(z,{location:C(t)},e)))))}var H=n(4054);const W=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const a=document.createElement("link");a.setAttribute("rel","prefetch"),a.setAttribute("href",e),a.onload=()=>t(),a.onerror=()=>n();const r=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;r?.appendChild(a)}))}:function(e){return new Promise(((t,n)=>{const a=new XMLHttpRequest;a.open("GET",e,!0),a.withCredentials=!0,a.onload=()=>{200===a.status?t():n()},a.send(null)}))};var Q=n(6921);const V=new Set,K=new Set,Y=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,X={prefetch(e){if(!(e=>!Y()&&!K.has(e)&&!V.has(e))(e))return!1;V.add(e);const t=(0,p.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(H).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Q.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?W(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Y()&&!K.has(e))(e)&&(K.add(e),I(e))},Z=Object.freeze(X);if(o.A.canUseDOM){window.docusaurus=Z;const e=r.hydrate;I(window.location.pathname).then((()=>{e(a.createElement(s.vd,null,a.createElement(i.Kd,null,a.createElement(G,null))),document.getElementById("__docusaurus"))}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>u,l:()=>p});var a=n(6540),r=n(4784);const i=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/operating-systems/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/operating-systems/","mainDocId":"README","docs":[{"id":"Assignments/Asynchronous Web Server/README","path":"/operating-systems/Assignments/Asynchronous Web Server/","sidebar":"sidebar"},{"id":"Assignments/Asynchronous Web Server/src/http-parser/README","path":"/operating-systems/Assignments/Asynchronous Web Server/src/http-parser/"},{"id":"Assignments/Memory Allocator/README","path":"/operating-systems/Assignments/Memory Allocator/","sidebar":"sidebar"},{"id":"Assignments/Mini Libc/README","path":"/operating-systems/Assignments/Mini Libc/","sidebar":"sidebar"},{"id":"Assignments/Mini Shell/README","path":"/operating-systems/Assignments/Mini Shell/","sidebar":"sidebar"},{"id":"Assignments/Mini Shell/util/parser/README","path":"/operating-systems/Assignments/Mini Shell/util/parser/"},{"id":"Assignments/Parallel Graph/README","path":"/operating-systems/Assignments/Parallel Graph/","sidebar":"sidebar"},{"id":"Exams/Aggregator Application/aggregator-application","path":"/operating-systems/Exams/Aggregator Application/aggregator-application","sidebar":"sidebar"},{"id":"Exams/Application Investigator/application-investigator","path":"/operating-systems/Exams/Application Investigator/application-investigator","sidebar":"sidebar"},{"id":"Exams/Benchmarking Application/benchmarking-application","path":"/operating-systems/Exams/Benchmarking Application/benchmarking-application","sidebar":"sidebar"},{"id":"Exams/Database Application/database-application","path":"/operating-systems/Exams/Database Application/database-application","sidebar":"sidebar"},{"id":"Exams/Digital Forensics/digital-forensics","path":"/operating-systems/Exams/Digital Forensics/digital-forensics","sidebar":"sidebar"},{"id":"Exams/Distributed System/distributed-system","path":"/operating-systems/Exams/Distributed System/distributed-system","sidebar":"sidebar"},{"id":"Exams/Network Configurations Manager/network-configurations-manager","path":"/operating-systems/Exams/Network Configurations Manager/network-configurations-manager","sidebar":"sidebar"},{"id":"Exams/Network Performance Utility/network-performance-utility","path":"/operating-systems/Exams/Network Performance Utility/network-performance-utility","sidebar":"sidebar"},{"id":"Exams/Nightly Builds System/nightly-builds-system","path":"/operating-systems/Exams/Nightly Builds System/nightly-builds-system","sidebar":"sidebar"},{"id":"Exams/System Process Monitoring Tool/system-process-monitoring-tool","path":"/operating-systems/Exams/System Process Monitoring Tool/system-process-monitoring-tool","sidebar":"sidebar"},{"id":"Exams/User-level Threading Library/user-level-threading-library","path":"/operating-systems/Exams/User-level Threading Library/user-level-threading-library","sidebar":"sidebar"},{"id":"Hackathons/Lambda Function Loader/README","path":"/operating-systems/Hackathons/Lambda Function Loader/","sidebar":"sidebar"},{"id":"Lab/Application Interaction/arena","path":"/operating-systems/Lab/Application Interaction/arena","sidebar":"sidebar"},{"id":"Lab/Application Interaction/dbus","path":"/operating-systems/Lab/Application Interaction/dbus","sidebar":"sidebar"},{"id":"Lab/Application Interaction/os-cloud","path":"/operating-systems/Lab/Application Interaction/os-cloud","sidebar":"sidebar"},{"id":"Lab/Application Interaction/overview","path":"/operating-systems/Lab/Application Interaction/overview","sidebar":"sidebar"},{"id":"Lab/Application Interaction/password-cracker","path":"/operating-systems/Lab/Application Interaction/password-cracker","sidebar":"sidebar"},{"id":"Lab/Application Interaction/quiz/cgroups-vs-namespaces","path":"/operating-systems/Lab/Application Interaction/quiz/cgroups-vs-namespaces"},{"id":"Lab/Application Interaction/quiz/container-vs-vm","path":"/operating-systems/Lab/Application Interaction/quiz/container-vs-vm"},{"id":"Lab/Application Interaction/quiz/time-server","path":"/operating-systems/Lab/Application Interaction/quiz/time-server"},{"id":"Lab/Application Interaction/quiz/time-server-interop","path":"/operating-systems/Lab/Application Interaction/quiz/time-server-interop"},{"id":"Lab/Application Interaction/quiz/timer","path":"/operating-systems/Lab/Application Interaction/quiz/timer"},{"id":"Lab/Application Interaction/quiz/vm-creation","path":"/operating-systems/Lab/Application Interaction/quiz/vm-creation"},{"id":"Lab/Application Interaction/time-server","path":"/operating-systems/Lab/Application Interaction/time-server","sidebar":"sidebar"},{"id":"Lab/Application Interaction/x-window-system","path":"/operating-systems/Lab/Application Interaction/x-window-system","sidebar":"sidebar"},{"id":"Lab/Compute/arena","path":"/operating-systems/Lab/Compute/arena","sidebar":"sidebar"},{"id":"Lab/Compute/copy-on-write","path":"/operating-systems/Lab/Compute/copy-on-write","sidebar":"sidebar"},{"id":"Lab/Compute/hardware-perspective","path":"/operating-systems/Lab/Compute/hardware-perspective","sidebar":"sidebar"},{"id":"Lab/Compute/overview","path":"/operating-systems/Lab/Compute/overview","sidebar":"sidebar"},{"id":"Lab/Compute/processes","path":"/operating-systems/Lab/Compute/processes","sidebar":"sidebar"},{"id":"Lab/Compute/processes-threads-apache2","path":"/operating-systems/Lab/Compute/processes-threads-apache2","sidebar":"sidebar"},{"id":"Lab/Compute/quiz/apache2-strace","path":"/operating-systems/Lab/Compute/quiz/apache2-strace"},{"id":"Lab/Compute/quiz/cause-of-file-not-found-error","path":"/operating-systems/Lab/Compute/quiz/cause-of-file-not-found-error"},{"id":"Lab/Compute/quiz/child-faults-after-write","path":"/operating-systems/Lab/Compute/quiz/child-faults-after-write"},{"id":"Lab/Compute/quiz/coarse-vs-granular-critical-section","path":"/operating-systems/Lab/Compute/quiz/coarse-vs-granular-critical-section"},{"id":"Lab/Compute/quiz/create-sleepy-process-ending","path":"/operating-systems/Lab/Compute/quiz/create-sleepy-process-ending"},{"id":"Lab/Compute/quiz/fiber-strace","path":"/operating-systems/Lab/Compute/quiz/fiber-strace"},{"id":"Lab/Compute/quiz/mini-shell-stops-after-command","path":"/operating-systems/Lab/Compute/quiz/mini-shell-stops-after-command"},{"id":"Lab/Compute/quiz/mmap-cow-flag","path":"/operating-systems/Lab/Compute/quiz/mmap-cow-flag"},{"id":"Lab/Compute/quiz/notify-only-with-mutex","path":"/operating-systems/Lab/Compute/quiz/notify-only-with-mutex"},{"id":"Lab/Compute/quiz/number-of-running-ults","path":"/operating-systems/Lab/Compute/quiz/number-of-running-ults"},{"id":"Lab/Compute/quiz/parent-faults-before-fork","path":"/operating-systems/Lab/Compute/quiz/parent-faults-before-fork"},{"id":"Lab/Compute/quiz/parent-of-sleep-processes","path":"/operating-systems/Lab/Compute/quiz/parent-of-sleep-processes"},{"id":"Lab/Compute/quiz/processes-speedup","path":"/operating-systems/Lab/Compute/quiz/processes-speedup"},{"id":"Lab/Compute/quiz/seg-fault-exit-code","path":"/operating-systems/Lab/Compute/quiz/seg-fault-exit-code"},{"id":"Lab/Compute/quiz/semaphore-equivalent","path":"/operating-systems/Lab/Compute/quiz/semaphore-equivalent"},{"id":"Lab/Compute/quiz/sleeping-on-a-fiber","path":"/operating-systems/Lab/Compute/quiz/sleeping-on-a-fiber"},{"id":"Lab/Compute/quiz/state-of-new-ult","path":"/operating-systems/Lab/Compute/quiz/state-of-new-ult"},{"id":"Lab/Compute/quiz/tcb-libult-unikraft","path":"/operating-systems/Lab/Compute/quiz/tcb-libult-unikraft"},{"id":"Lab/Compute/quiz/thread-memory","path":"/operating-systems/Lab/Compute/quiz/thread-memory"},{"id":"Lab/Compute/quiz/time-slice-value","path":"/operating-systems/Lab/Compute/quiz/time-slice-value"},{"id":"Lab/Compute/quiz/tls-synchronization","path":"/operating-systems/Lab/Compute/quiz/tls-synchronization"},{"id":"Lab/Compute/quiz/tls-var-copies","path":"/operating-systems/Lab/Compute/quiz/tls-var-copies"},{"id":"Lab/Compute/quiz/type-of-scheduler-in-libult","path":"/operating-systems/Lab/Compute/quiz/type-of-scheduler-in-libult"},{"id":"Lab/Compute/quiz/ult-thread-ids","path":"/operating-systems/Lab/Compute/quiz/ult-thread-ids"},{"id":"Lab/Compute/quiz/who-calls-execve-parent","path":"/operating-systems/Lab/Compute/quiz/who-calls-execve-parent"},{"id":"Lab/Compute/quiz/why-use-completed-queue","path":"/operating-systems/Lab/Compute/quiz/why-use-completed-queue"},{"id":"Lab/Compute/synchronization","path":"/operating-systems/Lab/Compute/synchronization","sidebar":"sidebar"},{"id":"Lab/Compute/threads","path":"/operating-systems/Lab/Compute/threads","sidebar":"sidebar"},{"id":"Lab/Compute/user-level-threads","path":"/operating-systems/Lab/Compute/user-level-threads","sidebar":"sidebar"},{"id":"Lab/Data/arena","path":"/operating-systems/Lab/Data/arena","sidebar":"sidebar"},{"id":"Lab/Data/investigate-memory","path":"/operating-systems/Lab/Data/investigate-memory","sidebar":"sidebar"},{"id":"Lab/Data/memory-security","path":"/operating-systems/Lab/Data/memory-security","sidebar":"sidebar"},{"id":"Lab/Data/overview","path":"/operating-systems/Lab/Data/overview","sidebar":"sidebar"},{"id":"Lab/Data/process-memory","path":"/operating-systems/Lab/Data/process-memory","sidebar":"sidebar"},{"id":"Lab/Data/quiz/bypass-canary","path":"/operating-systems/Lab/Data/quiz/bypass-canary"},{"id":"Lab/Data/quiz/half-page","path":"/operating-systems/Lab/Data/quiz/half-page"},{"id":"Lab/Data/quiz/malloc-brk","path":"/operating-systems/Lab/Data/quiz/malloc-brk"},{"id":"Lab/Data/quiz/malloc-mmap","path":"/operating-systems/Lab/Data/quiz/malloc-mmap"},{"id":"Lab/Data/quiz/memory-access","path":"/operating-systems/Lab/Data/quiz/memory-access"},{"id":"Lab/Data/quiz/memory-aslr","path":"/operating-systems/Lab/Data/quiz/memory-aslr"},{"id":"Lab/Data/quiz/memory-granularity","path":"/operating-systems/Lab/Data/quiz/memory-granularity"},{"id":"Lab/Data/quiz/memory-leaks","path":"/operating-systems/Lab/Data/quiz/memory-leaks"},{"id":"Lab/Data/quiz/memory-regions-vars","path":"/operating-systems/Lab/Data/quiz/memory-regions-vars"},{"id":"Lab/Data/quiz/memory-stack-protector","path":"/operating-systems/Lab/Data/quiz/memory-stack-protector"},{"id":"Lab/Data/quiz/mmap-file","path":"/operating-systems/Lab/Data/quiz/mmap-file"},{"id":"Lab/Data/quiz/operators","path":"/operating-systems/Lab/Data/quiz/operators"},{"id":"Lab/Data/quiz/page-allocation","path":"/operating-systems/Lab/Data/quiz/page-allocation"},{"id":"Lab/Data/quiz/stack-layout","path":"/operating-systems/Lab/Data/quiz/stack-layout"},{"id":"Lab/Data/quiz/string-buff-over","path":"/operating-systems/Lab/Data/quiz/string-buff-over"},{"id":"Lab/Data/quiz/string-strcpy","path":"/operating-systems/Lab/Data/quiz/string-strcpy"},{"id":"Lab/Data/quiz/valgrind-leaks","path":"/operating-systems/Lab/Data/quiz/valgrind-leaks"},{"id":"Lab/Data/working-memory","path":"/operating-systems/Lab/Data/working-memory","sidebar":"sidebar"},{"id":"Lab/IO/arena","path":"/operating-systems/Lab/IO/arena","sidebar":"sidebar"},{"id":"Lab/IO/async-io","path":"/operating-systems/Lab/IO/async-io","sidebar":"sidebar"},{"id":"Lab/IO/beyond-network-sockets","path":"/operating-systems/Lab/IO/beyond-network-sockets","sidebar":"sidebar"},{"id":"Lab/IO/client-server-model","path":"/operating-systems/Lab/IO/client-server-model","sidebar":"sidebar"},{"id":"Lab/IO/file-descriptors","path":"/operating-systems/Lab/IO/file-descriptors","sidebar":"sidebar"},{"id":"Lab/IO/file-handlers","path":"/operating-systems/Lab/IO/file-handlers","sidebar":"sidebar"},{"id":"Lab/IO/file-mappings","path":"/operating-systems/Lab/IO/file-mappings","sidebar":"sidebar"},{"id":"Lab/IO/io-internals","path":"/operating-systems/Lab/IO/io-internals","sidebar":"sidebar"},{"id":"Lab/IO/io-multiplexing","path":"/operating-systems/Lab/IO/io-multiplexing","sidebar":"sidebar"},{"id":"Lab/IO/local-io-in-action","path":"/operating-systems/Lab/IO/local-io-in-action","sidebar":"sidebar"},{"id":"Lab/IO/networking-101","path":"/operating-systems/Lab/IO/networking-101","sidebar":"sidebar"},{"id":"Lab/IO/overview","path":"/operating-systems/Lab/IO/overview","sidebar":"sidebar"},{"id":"Lab/IO/pipes","path":"/operating-systems/Lab/IO/pipes","sidebar":"sidebar"},{"id":"Lab/IO/quiz/anonymous-pipes-limitation","path":"/operating-systems/Lab/IO/quiz/anonymous-pipes-limitation"},{"id":"Lab/IO/quiz/bind-error-cause","path":"/operating-systems/Lab/IO/quiz/bind-error-cause"},{"id":"Lab/IO/quiz/client-server-sender-receiver","path":"/operating-systems/Lab/IO/quiz/client-server-sender-receiver"},{"id":"Lab/IO/quiz/deluge-tcp-udp","path":"/operating-systems/Lab/IO/quiz/deluge-tcp-udp"},{"id":"Lab/IO/quiz/execve","path":"/operating-systems/Lab/IO/quiz/execve"},{"id":"Lab/IO/quiz/fewer-than-2-copies","path":"/operating-systems/Lab/IO/quiz/fewer-than-2-copies"},{"id":"Lab/IO/quiz/file-handler-c","path":"/operating-systems/Lab/IO/quiz/file-handler-c"},{"id":"Lab/IO/quiz/firefox-tcp-udp","path":"/operating-systems/Lab/IO/quiz/firefox-tcp-udp"},{"id":"Lab/IO/quiz/flush-libc-buffer","path":"/operating-systems/Lab/IO/quiz/flush-libc-buffer"},{"id":"Lab/IO/quiz/fopen-syscall","path":"/operating-systems/Lab/IO/quiz/fopen-syscall"},{"id":"Lab/IO/quiz/fopen-w","path":"/operating-systems/Lab/IO/quiz/fopen-w"},{"id":"Lab/IO/quiz/local-io-errors","path":"/operating-systems/Lab/IO/quiz/local-io-errors"},{"id":"Lab/IO/quiz/mmap-read-write-benchmark","path":"/operating-systems/Lab/IO/quiz/mmap-read-write-benchmark"},{"id":"Lab/IO/quiz/o-trunc","path":"/operating-systems/Lab/IO/quiz/o-trunc"},{"id":"Lab/IO/quiz/pipe-ends","path":"/operating-systems/Lab/IO/quiz/pipe-ends"},{"id":"Lab/IO/quiz/prints-work-no-stdio","path":"/operating-systems/Lab/IO/quiz/prints-work-no-stdio"},{"id":"Lab/IO/quiz/receiver-socket-fd","path":"/operating-systems/Lab/IO/quiz/receiver-socket-fd"},{"id":"Lab/IO/quiz/server-copies","path":"/operating-systems/Lab/IO/quiz/server-copies"},{"id":"Lab/IO/quiz/stderr-fd","path":"/operating-systems/Lab/IO/quiz/stderr-fd"},{"id":"Lab/IO/quiz/strace-printf","path":"/operating-systems/Lab/IO/quiz/strace-printf"},{"id":"Lab/IO/quiz/syscalls-cp","path":"/operating-systems/Lab/IO/quiz/syscalls-cp"},{"id":"Lab/IO/quiz/write-file-permissions","path":"/operating-systems/Lab/IO/quiz/write-file-permissions"},{"id":"Lab/IO/redirections","path":"/operating-systems/Lab/IO/redirections","sidebar":"sidebar"},{"id":"Lab/IO/remote-io","path":"/operating-systems/Lab/IO/remote-io","sidebar":"sidebar"},{"id":"Lab/IO/zero-copy","path":"/operating-systems/Lab/IO/zero-copy","sidebar":"sidebar"},{"id":"Lab/lab-setup","path":"/operating-systems/Lab/lab-setup","sidebar":"sidebar"},{"id":"Lecture/Application-Interaction","path":"/operating-systems/Lecture/Application-Interaction","sidebar":"sidebar"},{"id":"Lecture/Compute","path":"/operating-systems/Lecture/Compute","sidebar":"sidebar"},{"id":"Lecture/Data","path":"/operating-systems/Lecture/Data","sidebar":"sidebar"},{"id":"Lecture/IO","path":"/operating-systems/Lecture/IO","sidebar":"sidebar"},{"id":"README","path":"/operating-systems/","sidebar":"sidebar"},{"id":"resources","path":"/operating-systems/resources","sidebar":"sidebar"},{"id":"rules-and-grading","path":"/operating-systems/rules-and-grading","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/modern-sw-stack","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/software","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/Overview/overview","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/questions/software"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/libcall-syscall","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-id","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-numbers","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-tool","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/syscall-wrapper","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/README","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/Basic Syscall/","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/README","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/System Call Wrapper/","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/libcall-syscall"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-id"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-numbers"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-tool"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/questions/syscall-wrapper"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/basic-syscall","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/libcall-syscall","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/syscall-wrapper","sidebar":"sidebar"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/README","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/basic-syscall/"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/README","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/libcall-syscall/"},{"id":"Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/README","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/tasks/syscall-wrapper/"},{"id":"Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/README","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/Applications/","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Reading/app-investigate","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/python-tools","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/README","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/High-Level Languages/","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/questions/python-tools"},{"id":"Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/high-level-lang","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/malloc","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-syscall","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/printf-vs-write","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/strcpy-syscall","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/syscall-tool","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/README","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Common Functions/","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/README","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/Libc/","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/malloc"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-syscall"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/printf-vs-write"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/strcpy-syscall"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/questions/syscall-tool"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/common-functions","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/libc","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/README","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/tasks/common-functions/"},{"id":"Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/README","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/tasks/libc/"},{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/dynamic-libraries","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/static-executables","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/README","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/Static-Dynamic/","sidebar":"sidebar"},{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/questions/dynamic-libraries"},{"id":"Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/questions/static-executables"},{"id":"Software Stack/Software-Stack","path":"/operating-systems/Software Stack/Software-Stack","sidebar":"sidebar"},{"id":"/Software Stack/","path":"/operating-systems/Software Stack/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 1 - Operating System Perspective/","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 1 - Operating System Perspective/Overview/","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Overview/Drills/Questions/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/Modern Software Stacks/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 1 - Operating System Perspective/System Calls/","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Reading/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Tasks/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/","path":"/operating-systems/Software Stack/Lab 1 - Operating System Perspective/System Calls/Drills/Questions/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Libraries/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Guides/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libraries/Drills/Questions/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Libc/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Libc/Reading/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Reading/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Libc/Drills/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Tasks/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Libc/Drills/Questions/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/High-Level Languages/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Reading/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Tasks/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/High-Level Languages/Drills/Questions/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Applications/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Applications/Reading/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Reading/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Applications/Drills/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/","sidebar":"sidebar"},{"id":"/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/","path":"/operating-systems/Software Stack/Lab 2 - Library Perspective/Applications/Drills/Tasks/","sidebar":"sidebar"},{"id":"/Lecture/","path":"/operating-systems/Lecture/","sidebar":"sidebar"},{"id":"/Lab/","path":"/operating-systems/Lab/","sidebar":"sidebar"},{"id":"/Lab/Data/","path":"/operating-systems/Lab/Data/","sidebar":"sidebar"},{"id":"/Lab/Compute/","path":"/operating-systems/Lab/Compute/","sidebar":"sidebar"},{"id":"/Lab/IO/","path":"/operating-systems/Lab/IO/","sidebar":"sidebar"},{"id":"/Lab/Application Interaction/","path":"/operating-systems/Lab/Application Interaction/","sidebar":"sidebar"},{"id":"/Assignments/","path":"/operating-systems/Assignments/","sidebar":"sidebar"},{"id":"/Exams/","path":"/operating-systems/Exams/","sidebar":"sidebar"},{"id":"/Hackathons/","path":"/operating-systems/Hackathons/","sidebar":"sidebar"}],"draftIds":[],"sidebars":{"sidebar":{"link":{"path":"/operating-systems/","label":"Introduction"}}}}],"breadcrumbs":true}}}'),s=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var o=n(2654);const l=JSON.parse('{"docusaurusVersion":"2.1.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.1.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.1.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.1.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.1.0"}}}'),c={siteConfig:r.A,siteMetadata:l,globalData:i,i18n:s,codeTranslations:o},u=a.createContext(c);function p(e){let{children:t}=e;return a.createElement(u.Provider,{value:c},t)}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var a=n(6540),r=n(8193),i=n(5260),s=n(2316);function o(e){let{error:t,tryAgain:n}=e;return a.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},a.createElement("h1",null,"This page crashed."),a.createElement("p",null,t.message),a.createElement("button",{type:"button",onClick:n},"Try again"))}function l(e){let{error:t,tryAgain:n}=e;return a.createElement(u,{fallback:()=>a.createElement(o,{error:t,tryAgain:n})},a.createElement(i.A,null,a.createElement("title",null,"Page Error")),a.createElement(s.A,null,a.createElement(o,{error:t,tryAgain:n})))}const c=e=>a.createElement(l,e);class u extends a.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){r.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??c)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const a="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,r={canUseDOM:a,canUseEventListeners:a&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:a&&"IntersectionObserver"in window,canUseViewport:a&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var a=n(6540),r=n(545);function i(e){return a.createElement(r.mg,e)}},5489:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var a=n(8168),r=n(6540),i=n(4625),s=n(440),o=n(4586),l=n(6654),c=n(8193);const u=r.createContext({collectLink:()=>{}});var p=n(6025);function d(e,t){let{isNavLink:n,to:d,href:m,activeClassName:f,isActive:b,"data-noBrokenLinkCheck":g,autoAddBaseUrl:y=!0,...h}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,o.A)(),{withBaseUrl:S}=(0,p.h)(),L=(0,r.useContext)(u),k=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>k.current));const E=d||m;const x=(0,l.A)(E),_=E?.replace("pathname://","");let C=void 0!==_?(A=_,y&&(e=>e.startsWith("/"))(A)?S(A):A):void 0;var A;C&&x&&(C=(0,s.applyTrailingSlash)(C,{trailingSlash:v,baseUrl:w}));const O=(0,r.useRef)(!1),P=n?i.k2:i.N_,D=c.A.canUseIntersectionObserver,I=(0,r.useRef)();(0,r.useEffect)((()=>(!D&&x&&null!=C&&window.docusaurus.prefetch(C),()=>{D&&I.current&&I.current.disconnect()})),[I,C,D,x]);const T=C?.startsWith("#")??!1,z=!C||!x||T;return z||g||L.collectLink(C),z?r.createElement("a",(0,a.A)({ref:k,href:C},E&&!x&&{target:"_blank",rel:"noopener noreferrer"},h)):r.createElement(P,(0,a.A)({},h,{onMouseEnter:()=>{O.current||null==C||(window.docusaurus.preload(C),O.current=!0)},innerRef:e=>{k.current=e,D&&e&&x&&(I.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(I.current.unobserve(e),I.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))}))})),I.current.observe(e))},to:C},n&&{isActive:b,activeClassName:f}))}const m=r.forwardRef(d)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>l,T:()=>o});var a=n(6540);function r(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,a.isValidElement)(e)))?n.map(((e,t)=>(0,a.isValidElement)(e)?a.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function o(e,t){let{message:n,id:a}=e;return r(s({message:n,id:a}),t)}function l(e){let{children:t,id:n,values:i}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const o=s({message:t,id:n});return a.createElement(a.Fragment,null,r(o,i))}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});const a="default"},6654:(e,t,n)=>{"use strict";function a(e){return/^(?:\w*:|\/\/)/.test(e)}function r(e){return void 0!==e&&!a(e)}n.d(t,{A:()=>r,z:()=>a})},6025:(e,t,n)=>{"use strict";n.d(t,{A:()=>s,h:()=>i});var a=n(4586),r=n(6654);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.A)();return{withBaseUrl:(n,a)=>function(e,t,n,a){let{forcePrependBaseUrl:i=!1,absolute:s=!1}=void 0===a?{}:a;if(!n||n.startsWith("#")||(0,r.z)(n))return n;if(i)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const o=n.startsWith(t)?n:t+n.replace(/^\//,"");return s?e+o:o}(t,e,n,a)}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var a=n(6540),r=n(6988);function i(){return(0,a.useContext)(r.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var a=n(6540),r=n(6125);function i(){return(0,a.useContext)(r.o)}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const a=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[i,s]=n;const o=r?`${r}.${i}`:i;a(s)?e(s,o):t[o]=s}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>r});var a=n(6540);const r=a.createContext(null);function i(e){let{children:t,value:n}=e;const i=a.useContext(r),s=(0,a.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const a={...t.data,...n?.data};return{plugin:t.plugin,data:a}}({parent:i,value:n})),[i,n]);return a.createElement(r.Provider,{value:s},t)}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>b,vT:()=>d,Gy:()=>u,HW:()=>g,ht:()=>p,r7:()=>f,jh:()=>m});var a=n(6347),r=n(4586),i=n(7065);function s(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const o=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=o(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,a.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),r=n?.docs.find((e=>!!(0,a.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:r,alternateDocVersions:r?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((a=>{a.id===t&&(n[e.name]=a)}))})),n}(r.id):{}}}const c={},u=()=>s("docusaurus-plugin-content-docs")??c,p=e=>function(e,t,n){void 0===t&&(t=i.W),void 0===n&&(n={});const a=s(e),r=a?.[t];if(!r&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return r}("docusaurus-plugin-content-docs",e,{failfast:!0});function d(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,a.zy)();return function(e,t,n){void 0===n&&(n={});const r=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,a.B6)(t,{path:n.path,exact:!1,strict:!1})})),i=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!i&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return i}(t,n,e)}function m(e){return p(e).versions}function f(e){const t=p(e);return o(t)}function b(e){const t=p(e),{pathname:n}=(0,a.zy)();return l(t,n)}function g(e){const t=p(e),{pathname:n}=(0,a.zy)();return function(e,t){const n=o(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>i});var a=n(5947),r=n.n(a);r().configure({showSpinner:!1});const i={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{r().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){r().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var a=n(1258),r=n(4784);!function(e){const{themeConfig:{prism:t}}=r.A,{additionalLanguages:a}=t;globalThis.Prism=e,a.forEach((e=>{n(8692)(`./prism-${e}`)})),delete globalThis.Prism}(a.A)},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var a=n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};function i(e){let{width:t=13.5,height:n=13.5}=e;return a.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink},a.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},2316:(e,t,n)=>{"use strict";n.d(t,{A:()=>rt});var a=n(6540),r=n(53),i=n(7489),s=n(1003),o=n(7559),l=n(4090),c=n(1312),u=n(6347),p=n(5062);function d(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}const m={skipToContent:"skipToContent_fXgn"};function f(){const{containerRef:e,handleSkip:t}=function(){const e=(0,a.useRef)(null),{action:t}=(0,u.W6)(),n=(0,a.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.querySelector(`.${o.G.wrapper.main}`);t&&d(t)}),[]);return(0,p.$)((n=>{let{location:a}=n;e.current&&!a.hash&&"PUSH"===t&&d(e.current)})),{containerRef:e,handleSkip:n}}();return a.createElement("div",{ref:e,role:"region","aria-label":(0,c.T)({id:"theme.common.skipToMainContent"})},a.createElement("a",{href:"#",className:m.skipToContent,onClick:t},a.createElement(c.A,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))}var b=n(6342),g=n(5041),y=n(8168);function h(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:i=1.2,className:s,...o}=e;return a.createElement("svg",(0,y.A)({viewBox:"0 0 15 15",width:t,height:n},o),a.createElement("g",{stroke:r,strokeWidth:i},a.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const v={closeButton:"closeButton_CVFx"};function w(e){return a.createElement("button",(0,y.A)({type:"button","aria-label":(0,c.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,r.A)("clean-btn close",v.closeButton,e.className)}),a.createElement(h,{width:14,height:14,strokeWidth:3.1}))}const S={content:"content_knG7"};function L(e){const{announcementBar:t}=(0,b.p)(),{content:n}=t;return a.createElement("div",(0,y.A)({},e,{className:(0,r.A)(S.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const k={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function E(){const{announcementBar:e}=(0,b.p)(),{isActive:t,close:n}=(0,g.Mj)();if(!t)return null;const{backgroundColor:r,textColor:i,isCloseable:s}=e;return a.createElement("div",{className:k.announcementBar,style:{backgroundColor:r,color:i},role:"banner"},s&&a.createElement("div",{className:k.announcementBarPlaceholder}),a.createElement(L,{className:k.announcementBarContent}),s&&a.createElement(w,{onClick:n,className:k.announcementBarClose}))}var x=n(9876),_=n(3104);var C=n(9532),A=n(5600);const O=a.createContext(null);function P(e){let{children:t}=e;const n=function(){const e=(0,x.M)(),t=(0,A.YL)(),[n,r]=(0,a.useState)(!1),i=null!==t.component,s=(0,C.ZC)(i);return(0,a.useEffect)((()=>{i&&!s&&r(!0)}),[i,s]),(0,a.useEffect)((()=>{i?e.shown||r(!0):r(!1)}),[e.shown,i]),(0,a.useMemo)((()=>[n,r]),[n])}();return a.createElement(O.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return a.createElement(t,e.props)}}function I(){const e=(0,a.useContext)(O);if(!e)throw new C.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,r=(0,a.useCallback)((()=>n(!1)),[n]),i=(0,A.YL)();return(0,a.useMemo)((()=>({shown:t,hide:r,content:D(i)})),[r,i,t])}function T(e){let{header:t,primaryMenu:n,secondaryMenu:i}=e;const{shown:s}=I();return a.createElement("div",{className:"navbar-sidebar"},t,a.createElement("div",{className:(0,r.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":s})},a.createElement("div",{className:"navbar-sidebar__item menu"},n),a.createElement("div",{className:"navbar-sidebar__item menu"},i)))}var z=n(5293),q=n(2303);function R(e){return a.createElement("svg",(0,y.A)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function N(e){return a.createElement("svg",(0,y.A)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const M={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function F(e){let{className:t,value:n,onChange:i}=e;const s=(0,q.A)(),o=(0,c.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,c.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return a.createElement("div",{className:(0,r.A)(M.toggle,t)},a.createElement("button",{className:(0,r.A)("clean-btn",M.toggleButton,!s&&M.toggleButtonDisabled),type:"button",onClick:()=>i("dark"===n?"light":"dark"),disabled:!s,title:o,"aria-label":o},a.createElement(R,{className:(0,r.A)(M.toggleIcon,M.lightToggleIcon)}),a.createElement(N,{className:(0,r.A)(M.toggleIcon,M.darkToggleIcon)})))}const B=a.memo(F);function j(e){let{className:t}=e;const n=(0,b.p)().colorMode.disableSwitch,{colorMode:r,setColorMode:i}=(0,z.G)();return n?null:a.createElement(B,{className:t,value:r,onChange:i})}var U=n(3465);function $(){return a.createElement(U.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function G(){const e=(0,x.M)();return a.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},a.createElement(h,{color:"var(--ifm-color-emphasis-600)"}))}function H(){return a.createElement("div",{className:"navbar-sidebar__brand"},a.createElement($,null),a.createElement(j,{className:"margin-right--md"}),a.createElement(G,null))}var W=n(5489),Q=n(6025),V=n(6654);function K(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var Y=n(3186);function X(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:i,label:s,html:o,isDropdownLink:l,prependBaseUrlToHref:c,...u}=e;const p=(0,Q.A)(r),d=(0,Q.A)(t),m=(0,Q.A)(i,{forcePrependBaseUrl:!0}),f=s&&i&&!(0,V.A)(i),b=o?{dangerouslySetInnerHTML:{__html:o}}:{children:a.createElement(a.Fragment,null,s,f&&a.createElement(Y.A,l&&{width:12,height:12}))};return i?a.createElement(W.A,(0,y.A)({href:c?m:i},u,b)):a.createElement(W.A,(0,y.A)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?K(n,t.pathname):t.pathname.startsWith(d)},u,b))}function Z(e){let{className:t,isDropdownItem:n=!1,...i}=e;const s=a.createElement(X,(0,y.A)({className:(0,r.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},i));return n?a.createElement("li",null,s):s}function J(e){let{className:t,isDropdownItem:n,...i}=e;return a.createElement("li",{className:"menu__list-item"},a.createElement(X,(0,y.A)({className:(0,r.A)("menu__link",t)},i)))}function ee(e){let{mobile:t=!1,position:n,...r}=e;const i=t?J:Z;return a.createElement(i,(0,y.A)({},r,{activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var te=n(1422),ne=n(9169),ae=n(4586);function re(e,t){return e.some((e=>function(e,t){return!!(0,ne.ys)(e.to,t)||!!K(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ie(e){let{items:t,position:n,className:i,onClick:s,...o}=e;const l=(0,a.useRef)(null),[c,u]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&u(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[l]),a.createElement("div",{ref:l,className:(0,r.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},a.createElement(X,(0,y.A)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:o.to?void 0:"#",className:(0,r.A)("navbar__link",i)},o,{onClick:o.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),u(!c))}}),o.children??o.label),a.createElement("ul",{className:"dropdown__menu"},t.map(((e,n)=>a.createElement(ve,(0,y.A)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),u(!1);const t=l.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function se(e){let{items:t,className:n,position:i,onClick:s,...o}=e;const l=function(){const{siteConfig:{baseUrl:e}}=(0,ae.A)(),{pathname:t}=(0,u.zy)();return t.replace(e,"/")}(),c=re(t,l),{collapsed:p,toggleCollapsed:d,setCollapsed:m}=(0,te.u)({initialState:()=>!c});return(0,a.useEffect)((()=>{c&&m(!c)}),[l,c,m]),a.createElement("li",{className:(0,r.A)("menu__list-item",{"menu__list-item--collapsed":p})},a.createElement(X,(0,y.A)({role:"button",className:(0,r.A)("menu__link menu__link--sublist menu__link--sublist-caret",n)},o,{onClick:e=>{e.preventDefault(),d()}}),o.children??o.label),a.createElement(te.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>a.createElement(ve,(0,y.A)({mobile:!0,isDropdownItem:!0,onClick:s,activeClassName:"menu__link--active"},e,{key:t}))))))}function oe(e){let{mobile:t=!1,...n}=e;const r=t?se:ie;return a.createElement(r,n)}var le=n(2131);function ce(e){let{width:t=20,height:n=20,...r}=e;return a.createElement("svg",(0,y.A)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},r),a.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ue="iconLanguage_nlXk";const pe=()=>null,de={searchBox:"searchBox_ZlJk"};function me(e){let{children:t,className:n}=e;return a.createElement("div",{className:(0,r.A)(n,de.searchBox)},t)}var fe=n(4070),be=n(1754);var ge=n(5597);const ye=e=>e.docs.find((t=>t.id===e.mainDocId));const he={default:ee,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,...i}=e;const{i18n:{currentLocale:s,locales:o,localeConfigs:l}}=(0,ae.A)(),u=(0,le.o)(),p=[...n,...o.map((e=>{const n=`pathname://${u.createUrl({locale:e,fullyQualified:!1})}`;return{label:l[e].label,lang:l[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===s?t?"menu__link--active":"dropdown__link--active":""}})),...r],d=t?(0,c.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):l[s].label;return a.createElement(oe,(0,y.A)({},i,{mobile:t,label:a.createElement(a.Fragment,null,a.createElement(ce,{className:ue}),d),items:p}))},search:function(e){let{mobile:t,className:n}=e;return t?null:a.createElement(me,{className:n},a.createElement(pe,null))},dropdown:oe,html:function(e){let{value:t,className:n,mobile:i=!1,isDropdownItem:s=!1}=e;const o=s?"li":"div";return a.createElement(o,{className:(0,r.A)({navbar__item:!i&&!s,"menu__list-item":i},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...i}=e;const{activeDoc:s}=(0,fe.zK)(r),o=(0,be.QB)(t,r);return null===o?null:a.createElement(ee,(0,y.A)({exact:!0},i,{isActive:()=>s?.path===o.path||!!s?.sidebar&&s.sidebar===o.sidebar,label:n??o.id,to:o.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...i}=e;const{activeDoc:s}=(0,fe.zK)(r),o=(0,be.fW)(t,r).link;if(!o)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return a.createElement(ee,(0,y.A)({exact:!0},i,{isActive:()=>s?.sidebar===t,label:n??o.label,to:o.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...i}=e;const s=(0,be.Vd)(r)[0],o=t??s.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(s).path;return a.createElement(ee,(0,y.A)({},i,{label:o,to:l}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:i,dropdownItemsAfter:s,...o}=e;const l=(0,fe.zK)(n),u=(0,fe.jh)(n),{savePreferredVersionName:p}=(0,ge.g1)(n),d=[...i,...u.map((e=>{const t=l.alternateDocVersions[e.name]??ye(e);return{label:e.label,to:t.path,isActive:()=>e===l.activeVersion,onClick:()=>p(e.name)}})),...s],m=(0,be.Vd)(n)[0],f=t&&d.length>1?(0,c.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,b=t&&d.length>1?void 0:ye(m).path;return d.length<=1?a.createElement(ee,(0,y.A)({},o,{mobile:t,label:f,to:b,isActive:r?()=>!1:void 0})):a.createElement(oe,(0,y.A)({},o,{mobile:t,label:f,to:b,items:d,isActive:r?()=>!1:void 0}))}};function ve(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),i=he[r];if(!i)throw new Error(`No NavbarItem component found for type "${t}".`);return a.createElement(i,n)}function we(){const e=(0,x.M)(),t=(0,b.p)().navbar.items;return a.createElement("ul",{className:"menu__list"},t.map(((t,n)=>a.createElement(ve,(0,y.A)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Se(e){return a.createElement("button",(0,y.A)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),a.createElement(c.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Le(){const e=0===(0,b.p)().navbar.items.length,t=I();return a.createElement(a.Fragment,null,!e&&a.createElement(Se,{onClick:()=>t.hide()}),t.content)}function ke(){const e=(0,x.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,a.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?a.createElement(T,{header:a.createElement(H,null),primaryMenu:a.createElement(we,null),secondaryMenu:a.createElement(Le,null)}):null}const Ee={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function xe(e){return a.createElement("div",(0,y.A)({role:"presentation"},e,{className:(0,r.A)("navbar-sidebar__backdrop",e.className)}))}function _e(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:i}}=(0,b.p)(),s=(0,x.M)(),{navbarRef:o,isNavbarVisible:l}=function(e){const[t,n]=(0,a.useState)(e),r=(0,a.useRef)(!1),i=(0,a.useRef)(0),s=(0,a.useCallback)((e=>{null!==e&&(i.current=e.getBoundingClientRect().height)}),[]);return(0,_.Mq)(((t,a)=>{let{scrollY:s}=t;if(!e)return;if(s=o?n(!1):s+c{if(e)return t.location.hash?(r.current=!0,void n(!1)):void n(!0)})),{navbarRef:s,isNavbarVisible:t}}(n);return a.createElement("nav",{ref:o,className:(0,r.A)("navbar","navbar--fixed-top",n&&[Ee.navbarHideable,!l&&Ee.navbarHidden],{"navbar--dark":"dark"===i,"navbar--primary":"primary"===i,"navbar-sidebar--show":s.shown})},t,a.createElement(xe,{onClick:s.toggle}),a.createElement(ke,null))}const Ce="right";function Ae(e){let{width:t=30,height:n=30,className:r,...i}=e;return a.createElement("svg",(0,y.A)({className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},i),a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Oe(){const e=(0,x.M)();return a.createElement("button",{onClick:e.toggle,onKeyDown:e.toggle,"aria-label":"Navigation bar toggle",className:"navbar__toggle clean-btn",type:"button",tabIndex:0},a.createElement(Ae,null))}const Pe={colorModeToggle:"colorModeToggle_DEke"};function De(e){let{items:t}=e;return a.createElement(a.Fragment,null,t.map(((e,t)=>a.createElement(ve,(0,y.A)({},e,{key:t})))))}function Ie(e){let{left:t,right:n}=e;return a.createElement("div",{className:"navbar__inner"},a.createElement("div",{className:"navbar__items"},t),a.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Te(){const e=(0,x.M)(),t=(0,b.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Ce)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),i=t.find((e=>"search"===e.type));return a.createElement(Ie,{left:a.createElement(a.Fragment,null,!e.disabled&&a.createElement(Oe,null),a.createElement($,null),a.createElement(De,{items:n})),right:a.createElement(a.Fragment,null,a.createElement(De,{items:r}),a.createElement(j,{className:Pe.colorModeToggle}),!i&&a.createElement(me,null,a.createElement(pe,null)))})}function ze(){return a.createElement(_e,null,a.createElement(Te,null))}function qe(e){let{item:t}=e;const{to:n,href:r,label:i,prependBaseUrlToHref:s,...o}=t,l=(0,Q.A)(n),c=(0,Q.A)(r,{forcePrependBaseUrl:!0});return a.createElement(W.A,(0,y.A)({className:"footer__link-item"},r?{href:s?c:r}:{to:l},o),i,r&&!(0,V.A)(r)&&a.createElement(Y.A,null))}function Re(e){let{item:t}=e;return t.html?a.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement("li",{key:t.href??t.to,className:"footer__item"},a.createElement(qe,{item:t}))}function Ne(e){let{column:t}=e;return a.createElement("div",{className:"col footer__col"},a.createElement("div",{className:"footer__title"},t.title),a.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>a.createElement(Re,{key:t,item:e})))))}function Me(e){let{columns:t}=e;return a.createElement("div",{className:"row footer__links"},t.map(((e,t)=>a.createElement(Ne,{key:t,column:e}))))}function Fe(){return a.createElement("span",{className:"footer__link-separator"},"\xb7")}function Be(e){let{item:t}=e;return t.html?a.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement(qe,{item:t})}function je(e){let{links:t}=e;return a.createElement("div",{className:"footer__links text--center"},a.createElement("div",{className:"footer__links"},t.map(((e,n)=>a.createElement(a.Fragment,{key:n},a.createElement(Be,{item:e}),t.length!==n+1&&a.createElement(Fe,null))))))}function Ue(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?a.createElement(Me,{columns:t}):a.createElement(je,{links:t})}var $e=n(1653);const Ge={footerLogoLink:"footerLogoLink_BH7S"};function He(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.h)(),i={light:n(t.src),dark:n(t.srcDark??t.src)};return a.createElement($e.A,{className:(0,r.A)("footer__logo",t.className),alt:t.alt,sources:i,width:t.width,height:t.height,style:t.style})}function We(e){let{logo:t}=e;return t.href?a.createElement(W.A,{href:t.href,className:Ge.footerLogoLink,target:t.target},a.createElement(He,{logo:t})):a.createElement(He,{logo:t})}function Qe(e){let{copyright:t}=e;return a.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ve(e){let{style:t,links:n,logo:i,copyright:s}=e;return a.createElement("footer",{className:(0,r.A)("footer",{"footer--dark":"dark"===t})},a.createElement("div",{className:"container container-fluid"},n,(i||s)&&a.createElement("div",{className:"footer__bottom text--center"},i&&a.createElement("div",{className:"margin-bottom--sm"},i),s)))}function Ke(){const{footer:e}=(0,b.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:i}=e;return a.createElement(Ve,{style:i,links:n&&n.length>0&&a.createElement(Ue,{links:n}),logo:r&&a.createElement(We,{logo:r}),copyright:t&&a.createElement(Qe,{copyright:t})})}const Ye=a.memo(Ke);var Xe=n(9466);const Ze="docusaurus.tab.",Je=a.createContext(void 0);const et=(0,C.fM)([z.a,g.oq,function(e){let{children:t}=e;const n=function(){const[e,t]=(0,a.useState)({}),n=(0,a.useCallback)(((e,t)=>{(0,Xe.W)(`${Ze}${e}`).set(t)}),[]);(0,a.useEffect)((()=>{try{const e={};(0,Xe.E)().forEach((t=>{if(t.startsWith(Ze)){const n=t.substring(Ze.length);e[n]=(0,Xe.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const r=(0,a.useCallback)(((e,a)=>{t((t=>({...t,[e]:a}))),n(e,a)}),[n]);return(0,a.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:r})),[e,r])}();return a.createElement(Je.Provider,{value:n},t)},_.Tv,ge.VQ,s.Jx,function(e){let{children:t}=e;return a.createElement(A.y_,null,a.createElement(x.e,null,a.createElement(P,null,t)))}]);function tt(e){let{children:t}=e;return a.createElement(et,null,t)}function nt(e){let{error:t,tryAgain:n}=e;return a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(c.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),a.createElement("p",null,t.message),a.createElement("div",null,a.createElement("button",{type:"button",onClick:n},a.createElement(c.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const at={mainWrapper:"mainWrapper_z2l0"};function rt(e){const{children:t,noFooter:n,wrapperClassName:c,title:u,description:p}=e;return(0,l.J)(),a.createElement(tt,null,a.createElement(s.be,{title:u,description:p}),a.createElement(f,null),a.createElement(E,null),a.createElement(ze,null),a.createElement("div",{className:(0,r.A)(o.G.wrapper.main,at.mainWrapper,c)},a.createElement(i.A,{fallback:e=>a.createElement(nt,e)},t)),!n&&a.createElement(Ye,null))}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var a=n(8168),r=n(6540),i=n(5489),s=n(6025),o=n(4586),l=n(6342),c=n(1653);function u(e){let{logo:t,alt:n,imageClassName:a}=e;const i={light:(0,s.A)(t.src),dark:(0,s.A)(t.srcDark||t.src)},o=r.createElement(c.A,{className:t.className,sources:i,height:t.height,width:t.width,alt:n,style:t.style});return a?r.createElement("div",{className:a},o):o}function p(e){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:c}}=(0,l.p)(),{imageClassName:p,titleClassName:d,...m}=e,f=(0,s.A)(c?.href||"/"),b=n?"":t,g=c?.alt??b;return r.createElement(i.A,(0,a.A)({to:f},m,c?.target&&{target:c.target}),c&&r.createElement(u,{logo:c,alt:g,imageClassName:p}),null!=n&&r.createElement("b",{className:d},n))}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var a=n(6540),r=n(5260);function i(e){let{locale:t,version:n,tag:i}=e;const s=t;return a.createElement(r.A,null,t&&a.createElement("meta",{name:"docusaurus_locale",content:t}),n&&a.createElement("meta",{name:"docusaurus_version",content:n}),i&&a.createElement("meta",{name:"docusaurus_tag",content:i}),s&&a.createElement("meta",{name:"docsearch:language",content:s}),n&&a.createElement("meta",{name:"docsearch:version",content:n}),i&&a.createElement("meta",{name:"docsearch:docusaurus_tag",content:i}))}},1653:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var a=n(8168),r=n(6540),i=n(53),s=n(2303),o=n(5293);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,s.A)(),{colorMode:n}=(0,o.G)(),{sources:c,className:u,alt:p,...d}=e,m=t?"dark"===n?["dark"]:["light"]:["light","dark"];return r.createElement(r.Fragment,null,m.map((e=>r.createElement("img",(0,a.A)({key:e,src:c[e],alt:p,className:(0,i.A)(l.themedImage,l[`themedImage--${e}`],u)},d)))))}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>o});var a=n(8168),r=n(6540),i=n(8193);const s="ease-in-out";function o(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),i=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:i}}const l={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function u(e,t){const n=t?l:c;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const i=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??s}`,height:`${t}px`}}function o(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!i.current)return u(e,n),void(i.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(o(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{o()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function d(e){if(!i.A.canUseDOM)return e?l:c}function m(e){let{as:t="div",collapsed:n,children:a,animation:i,onCollapseTransitionEnd:s,className:o,disableSSRStyle:l}=e;const c=(0,r.useRef)(null);return p({collapsibleRef:c,collapsed:n,animation:i}),r.createElement(t,{ref:c,style:l?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(u(c.current,n),s?.(n))},className:o},a)}function f(e){let{collapsed:t,...n}=e;const[i,s]=(0,r.useState)(!t),[o,l]=(0,r.useState)(t);return(0,r.useLayoutEffect)((()=>{t||s(!0)}),[t]),(0,r.useLayoutEffect)((()=>{i&&l(t)}),[i,t]),i?r.createElement(m,(0,a.A)({},n,{collapsed:o})):null}function b(e){let{lazy:t,...n}=e;const a=t?f:m;return r.createElement(a,n)}},5041:(e,t,n)=>{"use strict";n.d(t,{Mj:()=>f,oq:()=>m});var a=n(6540),r=n(2303),i=n(9466),s=n(9532),o=n(6342);const l=(0,i.W)("docusaurus.announcement.dismiss"),c=(0,i.W)("docusaurus.announcement.id"),u=()=>"true"===l.get(),p=e=>l.set(String(e)),d=a.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,o.p)(),t=(0,r.A)(),[n,i]=(0,a.useState)((()=>!!t&&u()));(0,a.useEffect)((()=>{i(u())}),[]);const s=(0,a.useCallback)((()=>{p(!0),i(!0)}),[]);return(0,a.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const a=t!==n;c.set(t),a&&p(!1),!a&&u()||i(!1)}),[e]),(0,a.useMemo)((()=>({isActive:!!e&&!n,close:s})),[e,n,s])}();return a.createElement(d.Provider,{value:n},t)}function f(){const e=(0,a.useContext)(d);if(!e)throw new s.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>g,a:()=>b});var a=n(6540),r=n(8193),i=n(9532),s=n(9466),o=n(6342);const l=a.createContext(void 0),c="theme",u=(0,s.W)(c),p={light:"light",dark:"dark"},d=e=>e===p.dark?p.dark:p.light,m=e=>r.A.canUseDOM?d(document.documentElement.getAttribute("data-theme")):d(e),f=e=>{u.set(d(e))};function b(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,o.p)(),[r,i]=(0,a.useState)(m(e));(0,a.useEffect)((()=>{t&&u.del()}),[t]);const s=(0,a.useCallback)((function(t,a){void 0===a&&(a={});const{persist:r=!0}=a;t?(i(t),r&&f(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),u.del())}),[n,e]);(0,a.useEffect)((()=>{document.documentElement.setAttribute("data-theme",d(r))}),[r]),(0,a.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&s(d(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const l=(0,a.useRef)(!1);return(0,a.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),a=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:s(null)};return e.addListener(a),()=>e.removeListener(a)}),[s,t,n]),(0,a.useMemo)((()=>({colorMode:r,setColorMode:s,get isDarkTheme(){return r===p.dark},setLightTheme(){s(p.light)},setDarkTheme(){s(p.dark)}})),[r,s])}();return a.createElement(l.Provider,{value:n},t)}function g(){const e=(0,a.useContext)(l);if(null==e)throw new i.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>g,g1:()=>h});var a=n(6540),r=n(4070),i=n(7065),s=n(6342),o=n(1754),l=n(9532),c=n(9466);const u=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.W)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.W)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.W)(u(e),{persistence:t}).del()}},d=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=a.createContext(null);function f(){const e=(0,r.Gy)(),t=(0,s.p)().docs.versionPersistence,n=(0,a.useMemo)((()=>Object.keys(e)),[e]),[i,o]=(0,a.useState)((()=>d(n)));(0,a.useEffect)((()=>{o(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:a}=e;function r(e){const t=p.read(e,n);return a[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,r(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[i,(0,a.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),o((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function b(e){let{children:t}=e;const n=f();return a.createElement(m.Provider,{value:n},t)}function g(e){let{children:t}=e;return o.C5?a.createElement(b,null,t):a.createElement(a.Fragment,null,t)}function y(){const e=(0,a.useContext)(m);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function h(e){void 0===e&&(e=i.W);const t=(0,r.ht)(e),[n,s]=y(),{preferredVersionName:o}=n[e];return{preferredVersion:t.versions.find((e=>e.name===o))??null,savePreferredVersionName:(0,a.useCallback)((t=>{s.savePreferredVersion(e,t)}),[s,e])}}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>o,t:()=>l});var a=n(6540),r=n(9532);const i=Symbol("EmptyContext"),s=a.createContext(i);function o(e){let{children:t,name:n,items:r}=e;const i=(0,a.useMemo)((()=>n&&r?{name:n,items:r}:null),[n,r]);return a.createElement(s.Provider,{value:i},t)}function l(){const e=(0,a.useContext)(s);if(e===i)throw new r.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>o});var a=n(6540),r=n(9532);const i=a.createContext(null);function s(e){let{children:t,version:n}=e;return a.createElement(i.Provider,{value:n},t)}function o(){const e=(0,a.useContext)(i);if(null===e)throw new r.dV("DocsVersionProvider");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>d,M:()=>m});var a=n(6540),r=n(5600),i=n(4581),s=n(6347),o=n(9532);function l(e){!function(e){const t=(0,s.W6)(),n=(0,o._q)(e);(0,a.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var c=n(6342);const u=a.createContext(void 0);function p(){const e=function(){const e=(0,r.YL)(),{items:t}=(0,c.p)().navbar;return 0===t.length&&!e.component}(),t=(0,i.l)(),n=!e&&"mobile"===t,[s,o]=(0,a.useState)(!1);l((()=>{if(s)return o(!1),!1}));const u=(0,a.useCallback)((()=>{o((e=>!e))}),[]);return(0,a.useEffect)((()=>{"desktop"===t&&o(!1)}),[t]),(0,a.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:s})),[e,n,u,s])}function d(e){let{children:t}=e;const n=p();return a.createElement(u.Provider,{value:n},t)}function m(){const e=a.useContext(u);if(void 0===e)throw new o.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>l,YL:()=>o,y_:()=>s});var a=n(6540),r=n(9532);const i=a.createContext(null);function s(e){let{children:t}=e;const n=(0,a.useState)({component:null,props:null});return a.createElement(i.Provider,{value:n},t)}function o(){const e=(0,a.useContext)(i);if(!e)throw new r.dV("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const s=(0,a.useContext)(i);if(!s)throw new r.dV("NavbarSecondaryMenuContentProvider");const[,o]=s,l=(0,r.Be)(n);return(0,a.useEffect)((()=>{o({component:t,props:l})}),[o,t,l]),(0,a.useEffect)((()=>()=>o({component:null,props:null})),[o]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>r,J:()=>i});var a=n(6540);const r="navigation-with-keyboard";function i(){(0,a.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(r),"mousedown"===e.type&&document.body.classList.remove(r)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(r),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>c});var a=n(6540),r=n(8193);const i={desktop:"desktop",mobile:"mobile",ssr:"ssr"},s=996;function o(){return r.A.canUseDOM?window.innerWidth>s?i.desktop:i.mobile:i.ssr}const l=!1;function c(){const[e,t]=(0,a.useState)((()=>l?"ssr":o()));return(0,a.useEffect)((()=>{function e(){t(o())}const n=l?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>a});const a={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1754:(e,t,n)=>{"use strict";n.d(t,{d1:()=>x,_o:()=>f,w8:()=>h,C5:()=>d,$S:()=>b,cC:()=>m,mz:()=>E,Vd:()=>S,QB:()=>k,fW:()=>L,OF:()=>w});var a=n(6540),r=n(6347),i=n(2831),s=n(4070),o=n(5597),l=n(2252),c=n(6588);function u(e){return Array.from(new Set(e))}var p=n(9169);const d=!!s.Gy;function m(e){const t=(0,l.r)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}function b(){const{pathname:e}=(0,r.zy)(),t=(0,c.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const g=(e,t)=>void 0!==e&&(0,p.ys)(e,t),y=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||y(e.items,t))}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:a=!1}=e;const r=[];return function e(t){for(const i of t)if("category"===i.type&&((0,p.ys)(i.href,n)||e(i.items))||"link"===i.type&&(0,p.ys)(i.href,n)){return a&&"category"!==i.type||r.unshift(i),!0}return!1}(t),r}function w(){const e=(0,c.t)(),{pathname:t}=(0,r.zy)(),n=(0,s.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function S(e){const{activeVersion:t}=(0,s.zK)(e),{preferredVersion:n}=(0,o.g1)(e),r=(0,s.r7)(e);return(0,a.useMemo)((()=>u([t,n,r].filter(Boolean))),[t,n,r])}function L(e,t){const n=S(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),a=t.find((t=>t[0]===e));if(!a)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\n Available sidebar ids are:\n - ${Object.keys(t).join("\n- ")}`);return a[1]}),[e,n])}function k(e,t){const n=S(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),a=t.find((t=>t.id===e));if(!a){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`DocNavbarItem: couldn't find any doc with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return a}),[e,n])}function E(e){let{route:t,versionMetadata:n}=e;const a=(0,r.zy)(),s=t.routes,o=s.find((e=>(0,r.B6)(a.pathname,e)));if(!o)return null;const l=o.sidebar,c=l?n.docsSidebars[l]:void 0;return{docElement:(0,i.v)(s),sidebarName:l,sidebarItems:c}}function x(e){return e.filter((e=>"category"!==e.type||!!f(e)))}},1003:(e,t,n)=>{"use strict";n.d(t,{e3:()=>d,be:()=>u,Jx:()=>m});var a=n(6540),r=n(53),i=n(5260),s=n(3102);function o(){const e=a.useContext(s.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(6025),c=n(4586);function u(e){let{title:t,description:n,keywords:r,image:s,children:o}=e;const u=function(e){const{siteConfig:t}=(0,c.A)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}(t),{withBaseUrl:p}=(0,l.h)(),d=s?p(s,{absolute:!0}):void 0;return a.createElement(i.A,null,t&&a.createElement("title",null,u),t&&a.createElement("meta",{property:"og:title",content:u}),n&&a.createElement("meta",{name:"description",content:n}),n&&a.createElement("meta",{property:"og:description",content:n}),r&&a.createElement("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),d&&a.createElement("meta",{property:"og:image",content:d}),d&&a.createElement("meta",{name:"twitter:image",content:d}),o)}const p=a.createContext(void 0);function d(e){let{className:t,children:n}=e;const s=a.useContext(p),o=(0,r.A)(s,t);return a.createElement(p.Provider,{value:o},a.createElement(i.A,null,a.createElement("html",{className:o})),n)}function m(e){let{children:t}=e;const n=o(),i=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const s=`plugin-id-${n.plugin.id}`;return a.createElement(d,{className:(0,r.A)(i,s)},t)}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>l,ZC:()=>s,_q:()=>i,dV:()=>o,fM:()=>c});var a=n(6540);const r=n(8193).A.canUseDOM?a.useLayoutEffect:a.useEffect;function i(e){const t=(0,a.useRef)(e);return r((()=>{t.current=e}),[e]),(0,a.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,a.useRef)();return r((()=>{t.current=e})),t.current}class o extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function l(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,a.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return a.createElement(a.Fragment,null,e.reduceRight(((e,t)=>a.createElement(t,null,e)),n))}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>o,ys:()=>s});var a=n(6540),r=n(8328),i=n(4586);function s(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function o(){const{baseUrl:e}=(0,i.A)().siteConfig;return(0,a.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function a(e){return e.path===t&&!0===e.exact}function r(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(a)||e(t.filter(r).flatMap((e=>e.routes??[])))}(n)}({routes:r.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>l,gk:()=>d});var a=n(6540),r=n(8193),i=n(2303),s=n(9532);const o=a.createContext(void 0);function l(e){let{children:t}=e;const n=function(){const e=(0,a.useRef)(!0);return(0,a.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return a.createElement(o.Provider,{value:n},t)}function c(){const e=(0,a.useContext)(o);if(null==e)throw new s.dV("ScrollControllerProvider");return e}const u=()=>r.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),r=(0,a.useRef)(u()),i=(0,s._q)(e);(0,a.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();i(e,r.current),r.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[i,n,...t])}function d(){const e=(0,a.useRef)(null),t=(0,i.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function a(){const r=document.documentElement.scrollTop;(n&&r>e||!n&&rt&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>a,tU:()=>r});n(4586);const a="default";function r(e,t){return`docs-${e}-${t}`}},9466:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,W:()=>o});const a="localStorage";function r(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const s={get:()=>null,set:()=>{},del:()=>{}};function o(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t}}(e);const n=r(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{n.setItem(e,t)}catch(a){console.error(`Docusaurus storage error, can't set ${e}=${t}`,a)}},del:()=>{try{n.removeItem(e)}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}}}}function l(e){void 0===e&&(e=a);const t=r(e);if(!t)return[];const n=[];for(let a=0;a{"use strict";n.d(t,{o:()=>i});var a=n(4586),r=n(6347);function i(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:i}}=(0,a.A)(),{pathname:s}=(0,r.zy)(),o=i===n?e:e.replace(`/${i}/`,"/"),l=s.replace(e,"");return{createUrl:function(e){let{locale:a,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===n?`${o}`:`${o}${e}/`}(a)}${l}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>s});var a=n(6540),r=n(6347),i=n(9532);function s(e){const t=(0,r.zy)(),n=(0,i.ZC)(t),s=(0,i._q)(e);(0,a.useEffect)((()=>{n&&t!==n&&s({location:t,previousLocation:n})}),[s,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>r});var a=n(4586);function r(){return(0,a.A)().siteConfig.themeConfig}},2983:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:a}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[r]=e.split(/[#?]/),i="/"===r||r===a?r:(s=r,n?function(e){return e.endsWith("/")?e:`${e}/`}(s):function(e){return e.endsWith("/")?e.slice(0,-1):e}(s));var s;return e.replace(r,i)}},440:function(e,t,n){"use strict";var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var r=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return a(r).default}})},53:(e,t,n)=>{"use strict";function a(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;tr});const r=function(){for(var e,t,n=0,r="";n{"use strict";n.d(t,{zR:()=>w,TM:()=>_,yJ:()=>m,sC:()=>A,AO:()=>d});var a=n(8168);function r(e){return"/"===e.charAt(0)}function i(e,t){for(var n=t,a=n+1,r=e.length;a=0;d--){var m=s[d];"."===m?i(s,d):".."===m?(i(s,d),p++):p&&(i(s,d),p--)}if(!c)for(;p--;p)s.unshift("..");!c||""===s[0]||s[0]&&r(s[0])||s.unshift("");var f=s.join("/");return n&&"/"!==f.substr(-1)&&(f+="/"),f};var o=n(1561);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function d(e){var t=e.pathname,n=e.search,a=e.hash,r=t||"/";return n&&"?"!==n&&(r+="?"===n.charAt(0)?n:"?"+n),a&&"#"!==a&&(r+="#"===a.charAt(0)?a:"#"+a),r}function m(e,t,n,r){var i;"string"==typeof e?(i=function(e){var t=e||"/",n="",a="",r=t.indexOf("#");-1!==r&&(a=t.substr(r),t=t.substr(0,r));var i=t.indexOf("?");return-1!==i&&(n=t.substr(i),t=t.substr(0,i)),{pathname:t,search:"?"===n?"":n,hash:"#"===a?"":a}}(e),i.state=t):(void 0===(i=(0,a.A)({},e)).pathname&&(i.pathname=""),i.search?"?"!==i.search.charAt(0)&&(i.search="?"+i.search):i.search="",i.hash?"#"!==i.hash.charAt(0)&&(i.hash="#"+i.hash):i.hash="",void 0!==t&&void 0===i.state&&(i.state=t));try{i.pathname=decodeURI(i.pathname)}catch(o){throw o instanceof URIError?new URIError('Pathname "'+i.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):o}return n&&(i.key=n),r?i.pathname?"/"!==i.pathname.charAt(0)&&(i.pathname=s(i.pathname,r.pathname)):i.pathname=r.pathname:i.pathname||(i.pathname="/"),i}function f(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,a,r){if(null!=e){var i="function"==typeof e?e(t,n):e;"string"==typeof i?"function"==typeof a?a(i,r):r(!0):r(!1!==i)}else r(!0)},appendListener:function(e){var n=!0;function a(){n&&e.apply(void 0,arguments)}return t.push(a),function(){n=!1,t=t.filter((function(e){return e!==a}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),a=0;at?n.splice(t,n.length-t,r):n.push(r),p({action:a,location:r,index:t,entries:n})}}))},replace:function(e,t){var a="REPLACE",r=m(e,t,b(),w.location);u.confirmTransitionTo(r,a,n,(function(e){e&&(w.entries[w.index]=r,p({action:a,location:r}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var a=n(4363),r={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},s={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},o={};function l(e){return a.isMemo(e)?s:o[e.$$typeof]||r}o[a.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},o[a.Memo]=s;var c=Object.defineProperty,u=Object.getOwnPropertyNames,p=Object.getOwnPropertySymbols,d=Object.getOwnPropertyDescriptor,m=Object.getPrototypeOf,f=Object.prototype;e.exports=function e(t,n,a){if("string"!=typeof n){if(f){var r=m(n);r&&r!==f&&e(t,r,a)}var s=u(n);p&&(s=s.concat(p(n)));for(var o=l(t),b=l(n),g=0;g{"use strict";e.exports=function(e,t,n,a,r,i,s,o){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,a,r,i,s,o],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var a,r;a=function(){var e,t,n={version:"0.2.0"},a=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
    '};function r(e,t,n){return en?n:e}function i(e){return 100*(-1+e)}function s(e,t,n){var r;return(r="translate3d"===a.positionUsing?{transform:"translate3d("+i(e)+"%,0,0)"}:"translate"===a.positionUsing?{transform:"translate("+i(e)+"%,0)"}:{"margin-left":i(e)+"%"}).transition="all "+t+"ms "+n,r}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(a[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=r(e,a.minimum,1),n.status=1===e?null:e;var i=n.render(!t),c=i.querySelector(a.barSelector),u=a.speed,p=a.easing;return i.offsetWidth,o((function(t){""===a.positionUsing&&(a.positionUsing=n.getPositioningCSS()),l(c,s(e,u,p)),1===e?(l(i,{transition:"none",opacity:1}),i.offsetWidth,setTimeout((function(){l(i,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),a.trickleSpeed)};return a.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*r(Math.random()*t,.1,.95)),t=r(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*a.trickleRate)},e=0,t=0,n.promise=function(a){return a&&"resolved"!==a.state()?(0===t&&n.start(),e++,t++,a.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=a.template;var r,s=t.querySelector(a.barSelector),o=e?"-100":i(n.status||0),c=document.querySelector(a.parent);return l(s,{transition:"all 0 linear",transform:"translate3d("+o+"%,0,0)"}),a.showSpinner||(r=t.querySelector(a.spinnerSelector))&&m(r),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){p(document.documentElement,"nprogress-busy"),p(document.querySelector(a.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&m(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var o=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function a(t){var n=document.body.style;if(t in n)return t;for(var a,r=e.length,i=t.charAt(0).toUpperCase()+t.slice(1);r--;)if((a=e[r]+i)in n)return a;return t}function r(e){return e=n(e),t[e]||(t[e]=a(e))}function i(e,t,n){t=r(t),e.style[t]=n}return function(e,t){var n,a,r=arguments;if(2==r.length)for(n in t)void 0!==(a=t[n])&&t.hasOwnProperty(n)&&i(e,n,a);else i(e,r[1],r[2])}}();function c(e,t){return("string"==typeof e?e:d(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=d(e),a=n+t;c(n,t)||(e.className=a.substring(1))}function p(e,t){var n,a=d(e);c(e,t)&&(n=a.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function d(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function m(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(r="function"==typeof a?a.call(t,n,t,e):a)||(e.exports=r)},5228:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach((function(e){a[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},a)).join("")}catch(r){return!1}}()?Object.assign:function(e,r){for(var i,s,o=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l{var a=n(4634);e.exports=m,e.exports.parse=i,e.exports.compile=function(e,t){return o(i(e,t),t)},e.exports.tokensToFunction=o,e.exports.tokensToRegExp=d;var r=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function i(e,t){for(var n,a=[],i=0,s=0,o="",u=t&&t.delimiter||"/";null!=(n=r.exec(e));){var p=n[0],d=n[1],m=n.index;if(o+=e.slice(s,m),s=m+p.length,d)o+=d[1];else{var f=e[s],b=n[2],g=n[3],y=n[4],h=n[5],v=n[6],w=n[7];o&&(a.push(o),o="");var S=null!=b&&null!=f&&f!==b,L="+"===v||"*"===v,k="?"===v||"*"===v,E=n[2]||u,x=y||h;a.push({name:g||i++,prefix:b||"",delimiter:E,optional:k,repeat:L,partial:S,asterisk:!!w,pattern:x?c(x):w?".*":"[^"+l(E)+"]+?"})}}return s{"use strict";n.d(t,{A:()=>i});var a=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},a={util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=p.reach);k+=L.value.length,L=L.next){var E=L.value;if(t.length>e.length)return;if(!(E instanceof r)){var x,_=1;if(h){if(!(x=i(S,k,e,y))||x.index>=e.length)break;var C=x.index,A=x.index+x[0].length,O=k;for(O+=L.value.length;C>=O;)O+=(L=L.next).value.length;if(k=O-=L.value.length,L.value instanceof r)continue;for(var P=L;P!==t.tail&&(Op.reach&&(p.reach=z);var q=L.prev;if(I&&(q=l(t,q,I),k+=I.length),c(t,q,_),L=l(t,q,new r(d,g?a.tokenize(D,g):D,v,D)),T&&l(t,L,T),_>1){var R={cause:d+","+f,reach:z};s(e,t,n,L.prev,k,R),p&&R.reach>p.reach&&(p.reach=R.reach)}}}}}}function o(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var a=t.next,r={value:n,prev:t,next:a};return t.next=r,a.prev=r,e.length++,r}function c(e,t,n){for(var a=t.next,r=0;r"+i.content+""},a}(),r=a;a.default=a,r.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},r.languages.markup.tag.inside["attr-value"].inside.entity=r.languages.markup.entity,r.languages.markup.doctype.inside["internal-subset"].inside=r.languages.markup,r.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(r.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:r.languages[t]},n.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:r.languages[t]};var i={};i[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},r.languages.insertBefore("markup","cdata",i)}}),Object.defineProperty(r.languages.markup.tag,"addAttribute",{value:function(e,t){r.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:r.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),r.languages.html=r.languages.markup,r.languages.mathml=r.languages.markup,r.languages.svg=r.languages.markup,r.languages.xml=r.languages.extend("markup",{}),r.languages.ssml=r.languages.xml,r.languages.atom=r.languages.xml,r.languages.rss=r.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var r=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],i=a.variable[1].inside,s=0;s]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},r.languages.c=r.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),r.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),r.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},r.languages.c.string],char:r.languages.c.char,comment:r.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:r.languages.c}}}}),r.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete r.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(r),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(r),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var a={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:a,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:a,number:r})}(r),r.languages.javascript=r.languages.extend("clike",{"class-name":[r.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),r.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,r.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:r.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:r.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:r.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:r.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:r.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),r.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:r.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),r.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),r.languages.markup&&(r.languages.markup.tag.addInlined("script","javascript"),r.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),r.languages.js=r.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(r),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),i=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function s(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return"(?:"+r+"|"+i+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:s(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:s(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:s(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:s(i),lookbehind:!0,greedy:!0},number:{pattern:s(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(r),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var a=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,r=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return a})),i=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+r+i+"(?:"+r+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+r+i+")(?:"+r+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(a),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+r+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+r+"$"),inside:{"table-header":{pattern:RegExp(a),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,a=t.length;n",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(r),r.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:r.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},r.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var o=d(/^\{$/,/^\}$/);if(-1===o)continue;for(var l=n;l=0&&m(c,"variable-input")}}}}function u(e){return t[n+e]}function p(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,a=t.inside.interpolation,r=a.inside["interpolation-punctuation"],i=a.pattern.source;function s(t,a){if(e.languages[t])return{pattern:RegExp("((?:"+a+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function o(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(t,n,a){var r={code:t,grammar:n,language:a};return e.hooks.run("before-tokenize",r),r.tokens=e.tokenize(r.code,r.grammar),e.hooks.run("after-tokenize",r),r.tokens}function c(t){var n={};n["interpolation-punctuation"]=r;var i=e.tokenize(t,n);if(3===i.length){var s=[1,1];s.push.apply(s,l(i[1],e.languages.javascript,"javascript")),i.splice.apply(i,s)}return new e.Token("interpolation",i,a.alias,t)}function u(t,n,a){var r=e.tokenize(t,{interpolation:{pattern:RegExp(i),lookbehind:!0}}),s=0,u={},p=l(r.map((function(e){if("string"==typeof e)return e;for(var n,r=e.content;-1!==t.indexOf(n=o(s++,a)););return u[n]=r,n})).join(""),n,a),d=Object.keys(u);return s=0,function e(t){for(var n=0;n=d.length)return;var a=t[n];if("string"==typeof a||"string"==typeof a.content){var r=d[s],i="string"==typeof a?a:a.content,o=i.indexOf(r);if(-1!==o){++s;var l=i.substring(0,o),p=c(u[r]),m=i.substring(o+r.length),f=[];if(l&&f.push(l),f.push(p),m){var b=[m];e(b),f.push.apply(f,b)}"string"==typeof a?(t.splice.apply(t,[n,1].concat(f)),n+=f.length-1):a.content=f}}else{var g=a.content;Array.isArray(g)?e(g):e([g])}}}(p),new e.Token(a,p,"language-"+a,t)}e.languages.javascript["template-string"]=[s("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),s("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),s("svg",/\bsvg/.source),s("markdown",/\b(?:markdown|md)/.source),s("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),s("sql",/\bsql/.source),t].filter(Boolean);var p={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function d(e){return"string"==typeof e?e:Array.isArray(e)?e.map(d).join(""):d(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in p&&function t(n){for(var a=0,r=n.length;a]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(r),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],a=0;a*\.{3}(?:[^{}]|)*\})/.source;function i(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return a})).replace(//g,(function(){return r})),RegExp(e,t)}r=i(r).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=i(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:i(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:i(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""},o=function(t){for(var n=[],a=0;a0&&n[n.length-1].tagName===s(r.content[0].content[1])&&n.pop():"/>"===r.content[r.content.length-1].content||n.push({tagName:s(r.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===r.type&&"{"===r.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?n[n.length-1].openedBraces--:i=!0),(i||"string"==typeof r)&&n.length>0&&0===n[n.length-1].openedBraces){var l=s(r);a0&&("string"==typeof t[a-1]||"plain-text"===t[a-1].type)&&(l=s(t[a-1])+l,t.splice(a-1,1),a--),t[a]=new e.Token("plain-text",l,null,l)}r.content&&"string"!=typeof r.content&&o(r.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||o(e.tokens)}))}(r),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var a=t[n],r=[];/^\w+$/.test(n)||r.push(/\w+/.exec(n)[0]),"diff"===n&&r.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+a+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(r),r.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},r.languages.go=r.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),r.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete r.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,r,i){if(n.language===a){var s=n.tokenStack=[];n.code=n.code.replace(r,(function(e){if("function"==typeof i&&!i(e))return e;for(var r,o=s.length;-1!==n.code.indexOf(r=t(a,o));)++o;return s[o]=e,r})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var r=0,i=Object.keys(n.tokenStack);!function s(o){for(var l=0;l=i.length);l++){var c=o[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=i[r],p=n.tokenStack[u],d="string"==typeof c?c:c.content,m=t(a,u),f=d.indexOf(m);if(f>-1){++r;var b=d.substring(0,f),g=new e.Token(a,e.tokenize(p,n.grammar),"language-"+a,p),y=d.substring(f+m.length),h=[];b&&h.push.apply(h,s([b])),h.push(g),y&&h.push.apply(h,s([y])),"string"==typeof c?o.splice.apply(o,[l,1].concat(h)):c.content=h}}else c.content&&s(c.content)}return o}(n.tokens)}}}})}(r),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(r),r.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},r.languages.webmanifest=r.languages.json,r.languages.less=r.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),r.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),r.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},r.languages.objectivec=r.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete r.languages.objectivec["class-name"],r.languages.objc=r.languages.objectivec,r.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},r.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},r.languages.python["string-interpolation"].inside.interpolation.inside.rest=r.languages.python,r.languages.py=r.languages.python,r.languages.reason=r.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),r.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete r.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(r),r.languages.scss=r.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),r.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),r.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),r.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),r.languages.scss.atrule.inside.rest=r.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},a={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};a.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:a}},a.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:a}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:a}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:a}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:a}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:a.interpolation}},rest:a}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:a.interpolation,comment:a.comment,punctuation:/[{},]/}},func:a.func,string:a.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:a.interpolation,punctuation:/[{}()\[\];:.]/}}(r),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(r),r.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const i=r},6969:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},8722:(e,t,n)=>{const a=n(6969),r=n(8380),i=new Set;function s(e){void 0===e?e=Object.keys(a.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...i,...Object.keys(Prism.languages)];r(a,e,t).load((e=>{if(!(e in a.languages))return void(s.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(3157).resolve(t)],delete Prism.languages[e],n(3157)(t),i.add(e)}))}s.silent=!1,e.exports=s},8692:(e,t,n)=>{var a={"./":8722};function r(e){var t=i(e);return n(t)}function i(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=i,e.exports=r,r.id=8692},3157:(e,t,n)=>{var a={"./":8722};function r(e){var t=i(e);return n(t)}function i(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=i,e.exports=r,r.id=3157},8380:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,a=e.length;n "));var o={},l=e[a];if(l){function c(t){if(!(t in e))throw new Error(a+" depends on an unknown component "+t);if(!(t in o))for(var s in r(t,i),o[t]=!0,n[t])o[s]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[a]=o,i.pop()}}return function(e){var t=n[e];return t||(r(e,a),t=n[e]),t}}function r(e){for(var t in e)return!0;return!1}return function(i,s,o){var l=function(e){var t={};for(var n in e){var a=e[n];for(var r in a)if("meta"!=r){var i=a[r];t[r]="string"==typeof i?{title:i}:i}}return t}(i),c=function(e){var n;return function(a){if(a in e)return a;if(!n)for(var r in n={},e){var i=e[r];t(i&&i.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+r+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+r+" because it is a component.");n[t]=r}))}return n[a]||a}}(l);s=s.map(c),o=(o||[]).map(c);var u=n(s),p=n(o);s.forEach((function e(n){var a=l[n];t(a&&a.require,(function(t){t in p||(u[t]=!0,e(t))}))}));for(var d,m=a(l),f=u;r(f);){for(var b in d={},f){var g=l[b];t(g&&g.modify,(function(e){e in p&&(d[e]=!0)}))}for(var y in p)if(!(y in u))for(var h in m(y))if(h in u){d[y]=!0;break}for(var v in f=d)u[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,a,r){var i=r?r.series:void 0,s=r?r.parallel:e,o={},l={};function c(e){if(e in o)return o[e];l[e]=!0;var r,u=[];for(var p in t(e))p in n&&u.push(p);if(0===u.length)r=a(e);else{var d=s(u.map((function(e){var t=c(e);return delete l[e],t})));i?r=i(d,(function(){return a(e)})):a(e)}return o[e]=r}for(var u in n)c(u);var p=[];for(var d in l)p.push(o[d]);return s(p)}(m,u,t,n)}};return w}}();e.exports=t},2694:(e,t,n)=>{"use strict";var a=n(6925);function r(){}function i(){}i.resetWarningCache=r,e.exports=function(){function e(e,t,n,r,i,s){if(s!==a){var o=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw o.name="Invariant Violation",o}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:r};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var a=n(6540),r=n(5228),i=n(9982);function s(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n