From 4eb968fb417597ff93db1115aa2ff064d00ae9db Mon Sep 17 00:00:00 2001 From: root Date: Thu, 30 Jul 2026 19:41:58 +0000 Subject: [PATCH] Add task workers and optional Datastar support. --- docs/capy-language.md | 4 +- docs/capy-uce-parity.md | 10 +- docs/wasm-runtime-architecture.md | 40 +- etc/bearer/settings.cfg | 13 +- scripts/api_coverage_manifest.py | 8 +- scripts/api_coverage_manifest.sh | 3 + scripts/capy_artifact_golden.sha256 | 266 ++++----- scripts/check_capy_doc_examples.py | 233 ++++++++ scripts/compile_wasm_unit | 14 +- .../fixtures/task_workers/task_handlers.uce | 6 + scripts/run_cli_tests.sh | 1 + scripts/test_capy_native.sh | 1 + scripts/test_capy_native_compiler.cpp | 29 + scripts/test_capy_phase1.sh | 3 +- scripts/test_task_compiler_signatures.sh | 125 +++++ scripts/test_task_queue_native.cpp | 30 + scripts/test_task_queue_native.sh | 8 + scripts/test_task_workers.sh | 26 + scripts/test_task_workers_runtime.sh | 62 ++ scripts/test_unit_export_surface.sh | 6 +- site/demo/index.uce | 1 - site/demo/task-status.uce | 16 - site/demo/task.uce | 86 +-- site/demo/task_repeat.uce | 87 --- site/doc/areas/task.txt | 8 +- site/doc/examples/task_worker.capy | 4 + site/doc/index.uce | 159 ++++-- site/doc/lib/doc_page.h | 145 ++++- site/doc/pages/0_DValue.txt | 6 +- site/doc/pages/0_Request.txt | 5 +- site/doc/pages/0_String.txt | 6 +- site/doc/pages/0_StringList.txt | 6 +- site/doc/pages/0_StringMap.txt | 6 +- site/doc/pages/1_CLI.txt | 5 +- site/doc/pages/1_COMPONENT.txt | 5 +- site/doc/pages/1_INIT.txt | 5 +- site/doc/pages/1_ONCE.txt | 5 +- site/doc/pages/1_RENDER.txt | 5 +- site/doc/pages/1_WS.txt | 5 +- site/doc/pages/2_DValue_assign.txt | 6 +- site/doc/pages/2_DValue_clear.txt | 7 +- site/doc/pages/2_DValue_deref.txt | 6 +- site/doc/pages/2_DValue_each.txt | 8 +- site/doc/pages/2_DValue_filter.txt | 7 +- site/doc/pages/2_DValue_get_by_path.txt | 6 +- site/doc/pages/2_DValue_get_or_create.txt | 7 +- site/doc/pages/2_DValue_get_type_name.txt | 7 +- site/doc/pages/2_DValue_has.txt | 7 +- site/doc/pages/2_DValue_is_array.txt | 6 +- site/doc/pages/2_DValue_is_list.txt | 6 +- site/doc/pages/2_DValue_is_reference.txt | 6 +- site/doc/pages/2_DValue_key.txt | 6 +- site/doc/pages/2_DValue_keys.txt | 6 +- site/doc/pages/2_DValue_map.txt | 7 +- site/doc/pages/2_DValue_operator_index.txt | 6 +- site/doc/pages/2_DValue_pop.txt | 8 +- site/doc/pages/2_DValue_push.txt | 6 +- site/doc/pages/2_DValue_reference_target.txt | 6 +- site/doc/pages/2_DValue_remove.txt | 7 +- site/doc/pages/2_DValue_set.txt | 6 +- site/doc/pages/2_DValue_set_array.txt | 7 +- site/doc/pages/2_DValue_set_bool.txt | 6 +- site/doc/pages/2_DValue_set_reference.txt | 6 +- site/doc/pages/2_DValue_set_type.txt | 7 +- site/doc/pages/2_DValue_to_bool.txt | 6 +- site/doc/pages/2_DValue_to_f64.txt | 6 +- site/doc/pages/2_DValue_to_json.txt | 6 +- site/doc/pages/2_DValue_to_s64.txt | 6 +- site/doc/pages/2_DValue_to_string.txt | 8 +- site/doc/pages/2_DValue_to_stringmap.txt | 7 +- site/doc/pages/2_DValue_to_u64.txt | 6 +- site/doc/pages/2_DValue_values.txt | 7 +- site/doc/pages/2_Request_ob_start.txt | 8 +- site/doc/pages/2_Request_set_status.txt | 5 +- site/doc/pages/2_StringList_each.txt | 9 + site/doc/pages/2_StringList_every.txt | 7 + site/doc/pages/2_StringList_filter.txt | 8 + site/doc/pages/2_StringList_find.txt | 7 + site/doc/pages/2_StringList_keys.txt | 9 + site/doc/pages/2_StringList_map.txt | 8 + site/doc/pages/2_StringList_some.txt | 7 + site/doc/pages/2_StringList_sort.txt | 7 + site/doc/pages/2_StringList_unique.txt | 7 + site/doc/pages/3_Blocked functions.txt | 4 + site/doc/pages/3_C++ Preprocessor.txt | 6 +- site/doc/pages/3_Coming from React.txt | 6 +- site/doc/pages/3_Documentation format.txt | 25 +- site/doc/pages/array_merge.txt | 5 +- site/doc/pages/ascii_safe_name.txt | 4 +- site/doc/pages/backtrace_capture.txt | 6 +- site/doc/pages/backtrace_get_frames.txt | 6 +- site/doc/pages/base64_decode.txt | 4 +- site/doc/pages/base64_encode.txt | 4 +- site/doc/pages/basename.txt | 4 +- site/doc/pages/brb_decode.txt | 6 +- site/doc/pages/brb_encode.txt | 6 +- site/doc/pages/cli_arg.txt | 5 +- site/doc/pages/cli_input.txt | 7 +- site/doc/pages/component.txt | 4 +- site/doc/pages/component_exists.txt | 6 +- site/doc/pages/component_render.txt | 5 +- site/doc/pages/component_resolve.txt | 4 +- site/doc/pages/contains.txt | 4 +- site/doc/pages/crypto_equal.txt | 6 +- site/doc/pages/csrf_field.txt | 8 +- site/doc/pages/csrf_rotate.txt | 7 +- site/doc/pages/csrf_token.txt | 11 +- site/doc/pages/csrf_valid.txt | 6 +- site/doc/pages/cwd_get.txt | 4 +- site/doc/pages/cwd_set.txt | 7 +- site/doc/pages/dir_list.txt | 11 +- site/doc/pages/dir_remove.txt | 9 +- site/doc/pages/dirname.txt | 4 +- site/doc/pages/draw_float.txt | 4 +- site/doc/pages/draw_int.txt | 4 +- site/doc/pages/encode_query.txt | 5 +- site/doc/pages/error_pages.txt | 4 + site/doc/pages/expand_path.txt | 4 +- site/doc/pages/file_append.txt | 7 +- site/doc/pages/file_chmod.txt | 8 +- site/doc/pages/file_close.txt | 10 +- site/doc/pages/file_copy.txt | 7 +- site/doc/pages/file_exists.txt | 10 +- site/doc/pages/file_fsync.txt | 10 +- site/doc/pages/file_get_contents.txt | 6 +- site/doc/pages/file_mtime.txt | 8 +- site/doc/pages/file_open.txt | 8 +- site/doc/pages/file_pread.txt | 10 +- site/doc/pages/file_put_contents.txt | 7 +- site/doc/pages/file_pwrite.txt | 11 +- site/doc/pages/file_read.txt | 10 +- site/doc/pages/file_rename.txt | 9 +- site/doc/pages/file_seek.txt | 11 +- site/doc/pages/file_stat.txt | 9 +- site/doc/pages/file_symlink.txt | 8 +- site/doc/pages/file_tell.txt | 8 +- site/doc/pages/file_temp.txt | 10 +- site/doc/pages/file_truncate.txt | 7 +- site/doc/pages/file_unlink.txt | 9 +- site/doc/pages/file_write.txt | 10 +- site/doc/pages/filter.txt | 7 +- site/doc/pages/first.txt | 5 +- site/doc/pages/float_val.txt | 8 +- site/doc/pages/gen_float.txt | 6 +- site/doc/pages/gen_int.txt | 6 +- site/doc/pages/gen_noise01.txt | 6 +- site/doc/pages/gen_noise32.txt | 6 +- site/doc/pages/gen_noise64.txt | 6 +- site/doc/pages/gen_sha1.txt | 6 +- site/doc/pages/gz_compress.txt | 9 +- site/doc/pages/gz_uncompress.txt | 6 +- site/doc/pages/hmac_sha256.txt | 5 +- site/doc/pages/hmac_sha256_hex.txt | 5 +- site/doc/pages/html_escape.txt | 5 +- site/doc/pages/http_request.txt | 29 +- site/doc/pages/http_request_async.txt | 8 +- site/doc/pages/int_val.txt | 9 +- site/doc/pages/job_await.txt | 10 +- site/doc/pages/job_cancel.txt | 9 +- site/doc/pages/job_result.txt | 8 +- site/doc/pages/job_status.txt | 8 +- site/doc/pages/join.txt | 6 +- site/doc/pages/json_consume_space.txt | 9 +- site/doc/pages/json_decode.txt | 6 +- site/doc/pages/json_encode.txt | 6 +- site/doc/pages/load.txt | 6 +- site/doc/pages/ls.txt | 11 +- site/doc/pages/map.txt | 7 +- site/doc/pages/markdown_to_ast.txt | 6 +- site/doc/pages/markdown_to_html.txt | 5 +- site/doc/pages/memcache_command.txt | 7 +- site/doc/pages/memcache_connect.txt | 6 +- site/doc/pages/memcache_delete.txt | 10 +- site/doc/pages/memcache_escape_key.txt | 5 +- site/doc/pages/memcache_escape_keys.txt | 6 +- site/doc/pages/memcache_get.txt | 7 +- site/doc/pages/memcache_get_multiple.txt | 11 +- site/doc/pages/memcache_set.txt | 7 +- site/doc/pages/mkdir.txt | 9 +- site/doc/pages/mysql_affected_rows.txt | 10 +- site/doc/pages/mysql_connect.txt | 7 +- site/doc/pages/mysql_connected.txt | 8 +- site/doc/pages/mysql_disconnect.txt | 7 +- site/doc/pages/mysql_error.txt | 10 +- site/doc/pages/mysql_escape.txt | 5 +- site/doc/pages/mysql_insert_id.txt | 10 +- site/doc/pages/mysql_query.txt | 10 +- site/doc/pages/nibble.txt | 6 +- site/doc/pages/ob_close.txt | 8 +- site/doc/pages/ob_get.txt | 9 +- site/doc/pages/ob_get_close.txt | 9 +- site/doc/pages/ob_start.txt | 8 +- site/doc/pages/parse_query.txt | 6 +- site/doc/pages/parse_uri.txt | 6 +- site/doc/pages/password_hash.txt | 6 +- site/doc/pages/password_needs_rehash.txt | 6 +- site/doc/pages/password_verify.txt | 7 +- site/doc/pages/path_is_within.txt | 12 +- site/doc/pages/path_join.txt | 5 +- site/doc/pages/path_real.txt | 8 +- site/doc/pages/print.txt | 5 +- site/doc/pages/process_start_directory.txt | 5 +- site/doc/pages/random_bytes.txt | 6 +- site/doc/pages/redirect.txt | 7 +- site/doc/pages/regex_match.txt | 5 +- site/doc/pages/regex_replace.txt | 5 +- site/doc/pages/regex_search.txt | 6 +- site/doc/pages/regex_search_all.txt | 6 +- site/doc/pages/regex_split.txt | 5 +- site/doc/pages/replace.txt | 5 +- site/doc/pages/request_base_url.txt | 5 +- site/doc/pages/request_context_params.txt | 6 +- site/doc/pages/request_perf.txt | 6 +- site/doc/pages/request_query_path.txt | 5 +- site/doc/pages/request_query_route.txt | 6 +- .../doc/pages/request_route_from_raw_path.txt | 7 +- site/doc/pages/request_script_url.txt | 5 +- site/doc/pages/route_path_is_safe.txt | 5 +- site/doc/pages/route_path_normalize.txt | 5 +- site/doc/pages/route_path_sanitize.txt | 5 +- site/doc/pages/runtime_safe_key.txt | 5 +- site/doc/pages/safe_name.txt | 5 +- site/doc/pages/server_start_http.txt | 7 +- site/doc/pages/server_stop.txt | 6 +- site/doc/pages/session_destroy.txt | 7 +- site/doc/pages/session_id_create.txt | 5 +- site/doc/pages/session_start.txt | 6 +- site/doc/pages/sha256.txt | 5 +- site/doc/pages/sha256_hex.txt | 5 +- site/doc/pages/shell_escape.txt | 5 +- site/doc/pages/shell_exec.txt | 5 +- site/doc/pages/shell_spawn.txt | 8 +- site/doc/pages/signal_name.txt | 5 +- site/doc/pages/socket_close.txt | 8 +- site/doc/pages/socket_connect.txt | 7 +- site/doc/pages/socket_read.txt | 9 +- site/doc/pages/socket_write.txt | 8 +- site/doc/pages/split.txt | 5 +- site/doc/pages/split_http_headers.txt | 8 +- site/doc/pages/split_kv.txt | 6 +- site/doc/pages/split_space.txt | 5 +- site/doc/pages/split_utf8.txt | 6 +- site/doc/pages/sqlite_affected_rows.txt | 10 +- site/doc/pages/sqlite_connect.txt | 8 +- site/doc/pages/sqlite_disconnect.txt | 8 +- site/doc/pages/sqlite_error.txt | 8 +- site/doc/pages/sqlite_insert_id.txt | 9 +- site/doc/pages/sqlite_query.txt | 10 +- site/doc/pages/str_ends_with.txt | 5 +- site/doc/pages/str_starts_with.txt | 5 +- site/doc/pages/strpos.txt | 5 +- site/doc/pages/substr.txt | 5 +- site/doc/pages/task.txt | 34 +- site/doc/pages/task_await.txt | 29 + site/doc/pages/task_cancel.txt | 28 + site/doc/pages/task_kill.txt | 27 - site/doc/pages/task_pid.txt | 20 - site/doc/pages/task_repeat.txt | 30 - site/doc/pages/task_status.txt | 28 + site/doc/pages/time.txt | 5 +- site/doc/pages/time_format_local.txt | 5 +- site/doc/pages/time_format_relative.txt | 5 +- site/doc/pages/time_format_utc.txt | 5 +- site/doc/pages/time_parse.txt | 5 +- site/doc/pages/time_precise.txt | 5 +- site/doc/pages/to_bool.txt | 5 +- site/doc/pages/to_f64.txt | 5 +- site/doc/pages/to_lower.txt | 5 +- site/doc/pages/to_s64.txt | 5 +- site/doc/pages/to_u64.txt | 5 +- site/doc/pages/to_upper.txt | 5 +- site/doc/pages/trim.txt | 5 +- site/doc/pages/unit_call.txt | 5 +- site/doc/pages/unit_compile.txt | 5 +- site/doc/pages/unit_info.txt | 6 +- site/doc/pages/unit_load.txt | 11 +- site/doc/pages/unit_render.txt | 5 +- site/doc/pages/units_list.txt | 7 +- site/doc/pages/uri_decode.txt | 5 +- site/doc/pages/uri_encode.txt | 5 +- site/doc/pages/usleep.txt | 6 +- site/doc/pages/var_dump.txt | 6 +- site/doc/pages/ws_close.txt | 5 +- site/doc/pages/ws_connection_count.txt | 5 +- site/doc/pages/ws_connection_id.txt | 7 +- site/doc/pages/ws_connections.txt | 7 +- site/doc/pages/ws_is_binary.txt | 5 +- site/doc/pages/ws_message.txt | 5 +- site/doc/pages/ws_opcode.txt | 5 +- site/doc/pages/ws_scope.txt | 7 +- site/doc/pages/ws_send.txt | 5 +- site/doc/pages/ws_send_to.txt | 5 +- site/doc/pages/xml_decode.txt | 6 +- site/doc/pages/xml_encode.txt | 6 +- site/doc/pages/yaml_decode.txt | 6 +- site/doc/pages/yaml_encode.txt | 6 +- site/doc/pages/zip_create.txt | 8 +- site/doc/pages/zip_extract.txt | 11 +- site/doc/pages/zip_list.txt | 10 +- site/doc/pages/zip_read.txt | 8 +- site/doc/singlepage.uce | 30 + site/doc/style.css | 35 ++ site/examples/bearer-starter/README.md | 6 + site/examples/bearer-starter/js/datastar.js | 9 + .../examples/bearer-starter/lib/datastar.capy | 17 + site/examples/bearer-starter/lib/datastar.uce | 25 + .../bearer-starter/views/datastar-example.uce | 20 + site/info/js/datastar.js | 9 + site/tests/capy-jobs.capy | 25 +- site/tests/capy-task-concurrency.capy | 10 + site/tests/capy-task-overflow.capy | 5 + site/tests/capy-task-runtime.capy | 35 ++ site/tests/capy-task-timeout.capy | 5 + site/tests/cli.uce | 12 - site/tests/cli_runner.uce | 14 +- site/tests/task-handlers.capy | 16 + site/tests/task-handlers.uce | 7 + site/tests/tasks.uce | 127 ++--- src/capy/compiler.cpp | 36 +- src/capy/parity_manifest.h | 12 +- src/capy/stdlib.capy | 13 +- src/capy/stdlib.embedded.h | 4 +- src/lib/compiler-parser.cpp | 64 ++- src/lib/compiler.h | 5 + src/lib/sys.cpp | 281 ++------- src/lib/sys.h | 10 +- src/lib/task_queue.cpp | 79 +++ src/lib/task_queue.h | 50 ++ src/lib/task_workers.h | 15 + src/linux_fastcgi.cpp | 531 +++++++++++++++++- src/wasm/abi.h | 2 +- src/wasm/core.cpp | 23 +- src/wasm/core_hostcalls.syms | 4 +- src/wasm/worker.cpp | 121 ++-- 334 files changed, 3817 insertions(+), 1216 deletions(-) create mode 100755 scripts/check_capy_doc_examples.py create mode 100644 scripts/fixtures/task_workers/task_handlers.uce create mode 100755 scripts/test_task_compiler_signatures.sh create mode 100644 scripts/test_task_queue_native.cpp create mode 100755 scripts/test_task_queue_native.sh create mode 100755 scripts/test_task_workers.sh create mode 100755 scripts/test_task_workers_runtime.sh delete mode 100644 site/demo/task-status.uce delete mode 100644 site/demo/task_repeat.uce create mode 100644 site/doc/examples/task_worker.capy create mode 100644 site/doc/pages/task_await.txt create mode 100644 site/doc/pages/task_cancel.txt delete mode 100644 site/doc/pages/task_kill.txt delete mode 100644 site/doc/pages/task_pid.txt delete mode 100644 site/doc/pages/task_repeat.txt create mode 100644 site/doc/pages/task_status.txt create mode 100644 site/examples/bearer-starter/js/datastar.js create mode 100644 site/examples/bearer-starter/lib/datastar.capy create mode 100644 site/examples/bearer-starter/lib/datastar.uce create mode 100644 site/examples/bearer-starter/views/datastar-example.uce create mode 100644 site/info/js/datastar.js create mode 100644 site/tests/capy-task-concurrency.capy create mode 100644 site/tests/capy-task-overflow.capy create mode 100644 site/tests/capy-task-runtime.capy create mode 100644 site/tests/capy-task-timeout.capy create mode 100644 site/tests/task-handlers.capy create mode 100644 site/tests/task-handlers.uce create mode 100644 src/lib/task_queue.cpp create mode 100644 src/lib/task_queue.h create mode 100644 src/lib/task_workers.h diff --git a/docs/capy-language.md b/docs/capy-language.md index f58e063e..b89eebdf 100644 --- a/docs/capy-language.md +++ b/docs/capy-language.md @@ -121,7 +121,7 @@ function RENDER { ## Handler lifecycle -`CLI`, `RENDER`, `COMPONENT` (including named handlers), `WS`, and `SERVE_HTTP` execute through the same Bearer selection and request-workspace path as `.uce`. Runtime acceptance covers direct CLI/HTTP, nested components, RFC 6455 text/binary dispatch, and a C++-started HTTP service targeting a Capy `SERVE_HTTP` handler. `ONCE` and `INIT` exports exist, but their ordering/dedup and automatic INIT contract remain unresolved rather than receiving Capy-only behavior. +`CLI`, `RENDER`, `COMPONENT` (including named handlers), `WS`, `SERVE_HTTP`, and `TASK` execute through the same Bearer selection and request-workspace path as `.uce`. A task handler declares `function TASK(request : request)` or `function TASK_NAME(request : request)` and reads the caller's sole copied DValue from `request_context(request)["props"]`. Dedicated task workers always create a fresh request and do not inherit caller request, session, connection, workspace, or resource state. Runtime acceptance covers direct CLI/HTTP, nested components, RFC 6455 text/binary dispatch, cross-language default/named tasks, and a C++-started HTTP service targeting a Capy `SERVE_HTTP` handler. `ONCE` and `INIT` exports exist, but their ordering/dedup and automatic INIT contract remain unresolved rather than receiving Capy-only behavior. ## WebSockets @@ -137,6 +137,8 @@ RENDER -> __bearer_render WS -> __bearer_websocket ONCE -> __bearer_once INIT -> __bearer_init +TASK -> __bearer_task +TASK_NAME -> __bearer_task_NAME ``` The first direct-Wasm backend emits: diff --git a/docs/capy-uce-parity.md b/docs/capy-uce-parity.md index 12dc4330..bd075139 100644 --- a/docs/capy-uce-parity.md +++ b/docs/capy-uce-parity.md @@ -3,7 +3,7 @@ Generated by `capyc --parity-manifest` from `site/doc/pages/`. This inventory is a progress boundary: `partial`, `export-only`, and `missing` are not parity. -Documented pages: **269**. cpp-specific: **6**, supported: **256**, unsupported-by-design: **7** +Documented pages: **269**. cpp-specific: **6**, supported: **258**, unsupported-by-design: **5** ## Binding boundary @@ -239,10 +239,10 @@ Documented pages: **269**. cpp-specific: **6**, supported: **256**, unsupported- | `str_starts_with` | core utility | **supported** | Runtime evidence: `site/tests/capy-coreutil.capy`. | | `strpos` | core utility | **supported** | Runtime evidence: `site/tests/capy-strings.capy`. | | `substr` | core utility | **supported** | Runtime evidence: `site/tests/capy-strings.capy`. | -| `task` | jobs/process | **unsupported-by-design** | Capy closures store a private per-module Wasm table slot plus guest environment; after the task child re-enters the module, the C++ callback registry cannot safely resolve that slot or invoke arbitrary closure signatures with ARC-safe ownership. | -| `task_kill` | jobs/process | **supported** | Runtime evidence: `site/tests/capy-jobs.capy`. | -| `task_pid` | jobs/process | **supported** | Runtime evidence: `site/tests/capy-jobs.capy`. | -| `task_repeat` | jobs/process | **unsupported-by-design** | Same private Capy closure/table ABI limitation as task; exposing it without a stable child-reentry closure ABI would make repeat callbacks unsafe. | +| `task` | jobs/process | **supported** | Runtime evidence: `site/tests/capy-jobs.capy`. | +| `task_await` | jobs/process | **supported** | Runtime evidence: `site/tests/capy-jobs.capy`. | +| `task_cancel` | jobs/process | **supported** | Runtime evidence: `site/tests/capy-jobs.capy`. | +| `task_status` | jobs/process | **supported** | Runtime evidence: `site/tests/capy-jobs.capy`. | | `time` | core utility | **supported** | Runtime evidence: `site/tests/capy-wide-scalars.capy`. | | `time_format_local` | core utility | **supported** | Runtime evidence: `site/tests/capy-time-parity.capy`. | | `time_format_relative` | core utility | **supported** | Runtime evidence: `site/tests/capy-time-parity.capy`. | diff --git a/docs/wasm-runtime-architecture.md b/docs/wasm-runtime-architecture.md index 6aecf0e1..58928cd3 100644 --- a/docs/wasm-runtime-architecture.md +++ b/docs/wasm-runtime-architecture.md @@ -195,9 +195,10 @@ On termination the parent asks render workers to close their listeners, finish accepted connections within the bounded worker drain interval, and only then exits. This prevents an accepted FastCGI request from being reset at handoff; the socket unit queues later connections for the replacement workers. -The graceful signal handler belongs to the parent and render workers. Generic -`task()` children restore default termination signals after fork so -`task_kill()` and `server_stop()` retain their immediate stop contract. +The graceful signal handler belongs to the parent and render workers. Dedicated +task workers restore default termination signals so running-task cancellation +can terminate one worker and supervision can restore pool capacity. Custom HTTP +servers retain separate private process supervision. Epoch interruption measures uninterrupted guest CPU segments. A separate absolute workspace invocation deadline starts before app-owned entry-unit @@ -208,8 +209,8 @@ that deadline before and after every native call and re-arms the store with the smaller of the remaining absolute budget and the CPU-segment budget. A cheap hostcall loop therefore cannot renew an invocation indefinitely. Blocking host helpers retain operation-specific limits and cap them to the remaining -invocation budget where the underlying operation is cancellable. Forked task -callbacks receive a fresh invocation deadline capped by the task lifetime. +invocation budget where the underlying operation is cancellable. Named task handlers receive a fresh invocation deadline capped by the configured +task execution limit. Synchronous compiler locks, transitive `#load` compilation, and compiler child processes consume that same deadline. Compiler children run in a dedicated process group; timeout kills the group, retains the previous generation, and @@ -372,9 +373,9 @@ then checked again before execution. The second check belongs only to that state-changing branch; repeating it immediately after a successful warm check adds no freshness guarantee. -The internal request envelope carries application `context.call` as BRRB2, -each request `StringMap` as a flat BRRB2 map, scalar session/input metadata as -bounded byte segments, and optional WebSocket state as BRRB2. The guest +The internal request envelope carries application `context.call` and +`context.props` as BRRB2, each request `StringMap` as a flat BRRB2 map, scalar +session/input metadata as bounded byte segments, and optional WebSocket state as BRRB2. The guest validates the complete envelope before moving those values into a fresh `Request`; transport-only params, cookies, session data, and entry metadata no longer become duplicate `context.call` children. The historical by-value @@ -385,17 +386,20 @@ and context transfer into bytes, host encode, guest allocation/write, guest decode/application, and free. The byte profile separately reports the worker-cached server-configuration portion. -### Task callbacks and workspace lifetime +### Named task workers -`task()` and `task_repeat()` are fork-backed. The `bearer_host_task_spawn` hostcall -captures the current `WasmWorkspace*`, but `src/lib/sys.cpp::task()` invokes the -captured callback only in the forked child, before the hostcall stack unwinds in -that child. The parent request may return and destroy its workspace; the child -is forked from the parent and keeps a private request-context copy of the per-request workspace. This means a delayed task callback can run after the spawning request -returns without dereferencing the parent's destroyed workspace. It is still a -callback into the inherited child workspace, not a fresh normal request -workspace; avoid adding host resources to `WasmWorkspace` that are invalid across -`fork()` unless task callback handling is changed to birth a fresh workspace. +`task(target, props)` publishes a bounded BRRB envelope to the durable native task +queue and returns an opaque ID without compiling, loading, forking, or executing +the target in the caller. The supervised pool size is configured by +`TASK_WORKERS` and defaults to one. Each worker claims one task, selects the +requested `TASK` or `TASK:NAME` export, and invokes it through the ordinary unit +loader with a fresh `Request`. Only decoded `context.props` crosses from the +caller; request, session, connection, resource, and workspace identity do not. +Compilation failures, absent handlers, traps, timeouts, cancellation, and worker +loss become bounded task statuses. A worker loss is terminal `worker_lost`; the +task primitive never retries implicitly because the runtime cannot infer whether +external effects committed before the process failed. A supervisor may decide to +submit a new invocation with application-specific backoff. --- diff --git a/etc/bearer/settings.cfg b/etc/bearer/settings.cfg index 75f2a5f5..95562909 100644 --- a/etc/bearer/settings.cfg +++ b/etc/bearer/settings.cfg @@ -75,9 +75,20 @@ COMPILE_FAILURE_RETRY_SECONDS=10 # PERIODIC KNOWN-.uce RECHECK INTERVAL IN SECONDS PROACTIVE_COMPILE_CHECK_INTERVAL=60 -# SPAWN WORKERS +# SPAWN REQUEST WORKERS WORKER_COUNT=4 +# DURABLE NATIVE-ONLY TASK POOL. Public targets use unit paths with an optional +# :NAME suffix; request workers never claim this queue. +TASK_DIRECTORY=/var/lib/bearer/tasks +TASK_WORKERS=1 +TASK_QUEUE_CAPACITY=1024 +TASK_PAYLOAD_MAX_BYTES=1048576 +TASK_EXECUTION_TIMEOUT_MS=30000 +TASK_STATUS_RETENTION_SECONDS=86400 +# Bounded idle queue poll; 50ms is the initial measured latency/CPU tradeoff. +TASK_POLL_MS=50 + # MAX MEMORY PER REQUEST MAX_MEMORY=16777216 diff --git a/scripts/api_coverage_manifest.py b/scripts/api_coverage_manifest.py index 877c383f..ad482d50 100644 --- a/scripts/api_coverage_manifest.py +++ b/scripts/api_coverage_manifest.py @@ -18,6 +18,9 @@ PUBLIC_APIS = [ ("http_request", True, "public"), ("http_request_async", True, "public"), ("shell_exec", True, "public"), ("shell_escape", True, "public"), ("shell_spawn", True, "public"), ("job_status", True, "public"), ("job_result", True, "public"), ("job_await", True, "public"), ("job_cancel", True, "public"), + # The frozen historical task pages describe the removed callback/PID API; + # current task coverage is runtime fixtures until their replacement lands. + ("task", False, "public"), ("task_status", False, "public"), ("task_await", False, "public"), ("task_cancel", False, "public"), ("basename", True, "public"), ("dirname", True, "public"), ("path_join", True, "public"), ("path_real", True, "public"), ("path_is_within", True, "public"), ("file_get_contents", True, "public"), @@ -57,8 +60,9 @@ REMOVED_APIS = ["concat"] def all_test_text() -> str: parts = [] - for path in TEST_DIR.glob("*.uce"): - parts.append(path.read_text(errors="ignore")) + for pattern in ("*.uce", "*.capy"): + for path in TEST_DIR.glob(pattern): + parts.append(path.read_text(errors="ignore")) return "\n".join(parts) diff --git a/scripts/api_coverage_manifest.sh b/scripts/api_coverage_manifest.sh index 96f92ce6..43b3b082 100755 --- a/scripts/api_coverage_manifest.sh +++ b/scripts/api_coverage_manifest.sh @@ -3,4 +3,7 @@ # build/engine path; this guard runs only from site/tests/api_coverage.uce. set -euo pipefail cd "$(dirname "$0")/.." +python3 scripts/check_capy_doc_examples.py --self-test +# The legacy corpus is still being converted. Enable the strict final gate with: +# python3 scripts/check_capy_doc_examples.py exec python3 scripts/api_coverage_manifest.py diff --git a/scripts/capy_artifact_golden.sha256 b/scripts/capy_artifact_golden.sha256 index 624a4422..0fbe4a81 100644 --- a/scripts/capy_artifact_golden.sha256 +++ b/scripts/capy_artifact_golden.sha256 @@ -1,152 +1,162 @@ -a3748a6dc50b8b942fa86aeeb06ff8057826b5195fab4a140c467e049af8ef75 site_tests_capy-arc.capy.wasm +6ac9442303af5c485c238e40783ead7ffffaf2f9ec9f5ca806534a2c7b463eed site_tests_capy-arc.capy.wasm 5d58ea349f8fa03504aebb64b182b8893751c32b6c2cf234db881c548a702836 site_tests_capy-arc.capy.wasm.source-map -0b6ba139021368a0561af1200466a6994b7af66497e3209796f40e664b08abf0 site_tests_capy-archive-trap.capy.wasm -34251b63dd0e021e8b745919b31c54459f70b85b80a7637352f540ebe8139292 site_tests_capy-archive-trap.capy.wasm.source-map -0ddcd1f70267ca791470f1f944ec06685115780f3c090b8f167d12961e81a880 site_tests_capy-arc-trap.capy.wasm +fd90de5617115d4555a8526a9b56bd419f5a77b0b2bb40841f9e95817ebe535e site_tests_capy-archive-trap.capy.wasm +497e7aff9cb7693e85ab0c2cf599290120297e6ce47afba981fc71b7f230728a site_tests_capy-archive-trap.capy.wasm.source-map +64a51039e027829e1e692e4c1848dbc58c8236a296a47c45c75e8e2e37a063a4 site_tests_capy-arc-trap.capy.wasm abf6e0cbe1a0281ef6b89012900517002bd7e0432bd400a75348c45b6ae9f167 site_tests_capy-arc-trap.capy.wasm.source-map -93db04cf920edb428d1214a702091591fd6f8b96e2e1a962e4c8360126e7579b site_tests_capy-array-negative-trap.capy.wasm +9682b50df55d593ee66cff1c3ec31c1ac7651c2f06b322c83613dc58ca7dc04c site_tests_capy-array-negative-trap.capy.wasm ce3eff594382762c50a519c5c5365ef8363d2b4b4c346e005b118ec366cc06b7 site_tests_capy-array-negative-trap.capy.wasm.source-map -893928bce38d6a7079be8700fe3d66d17b11a4a7e32db2f5dd4c59bde2d02ce6 site_tests_capy-array-trap.capy.wasm +e19d76bf62286698dc473d6175102b51368de89100ad74b13dcbf4d9de90d6ec site_tests_capy-array-trap.capy.wasm d5ebcb2159b628141c27060bd6623feb81de7d0cb2ce5f0145063de26a9fbcc5 site_tests_capy-array-trap.capy.wasm.source-map -b74ecdf65bc530d6af653261d6173cfabc8d3215c3c2a241f7123d094268dad4 site_tests_capy-backtrace.capy.wasm -ae9a3a0384a6d90687731b581a70d8b6e8da093ade99ec3b133accd698828aaf site_tests_capy-backtrace.capy.wasm.source-map -497b22a6a17055f5622d68a66aa804e1c82014a3f102ba82931e6759dbf5e9f4 site_tests_capy-closures.capy.wasm +c7be558e3263ad5532b0bc0c2ae8909a571801116a1b47554fd1fb51bd5478bd site_tests_capy-backtrace.capy.wasm +7d32df4fc6ca8a63f7c485639bcf74f0cd7786d02c39dd4f9b5be80e88bfa260 site_tests_capy-backtrace.capy.wasm.source-map +65fd5ba35f92936eb9761dcb0d90571907133554192982bae987883fa95cec9a site_tests_capy-closures.capy.wasm b8900015ef02e8b469b0c8822e2a93e225eff08fb0809ee9fc2011ac4f4f4627 site_tests_capy-closures.capy.wasm.source-map -9441d2efcece3dd85fc12d395bdb3845f47ea4c5b9bc61102ea3722e105e4ebe site_tests_capy-codecs.capy.wasm -8af5ed79eb662e1f36adf347354fd1388cf8f8abbefbc1430affeb8e23a7cca6 site_tests_capy-codecs.capy.wasm.source-map -872bbb2ae7df06390cacd27839fbce3ea25ec7a2ecb099b6406a2b54b8bbf5a3 site_tests_capy-codecs-text.capy.wasm -d64bcccd371d565f4f709e19f4fee51eca79868d071fe9d117b6bfa28c9572d0 site_tests_capy-codecs-text.capy.wasm.source-map -f3067b48b241274836e6574e7c1f0760f92c3544bb23da9aa538a52eda4ec5a2 site_tests_capy-codecs-text-trap.capy.wasm -900ac470333c2353e0edede437cac602628983ae488cfc3e421bb6ad318610c0 site_tests_capy-codecs-text-trap.capy.wasm.source-map -dbb157450d010f71a6cb8d8ad7af90ea89199346aebf821540a7e2507e6dee82 site_tests_capy-component-parity.capy.wasm -7a7803ebd5d089b49429e5e02dc12f4917cfaf60506d716b01e0ce7c1b72d999 site_tests_capy-component-parity.capy.wasm.source-map -b53731de8123a78d8603a434f92f628c836ce187b506242c8c9d543c5a1b0576 site_tests_capy-component-props.capy.wasm -2b6e14a43f161864ba843e4d613c61a131f2c9a262b31b10a23a5333d38d01ef site_tests_capy-component-props.capy.wasm.source-map -1a006a8395f04cd92a5abe7905ea4fedd1261b22bfcc0f123feac2eb233b4e4e site_tests_capy-coreutil.capy.wasm -b501bad6d272eda5432d1867a481c84065df6c35c2b4a07acf2e886c26168386 site_tests_capy-coreutil.capy.wasm.source-map -65de0a759772d79f8371ad6f8e672865db7725167258a4a1edb600fcc5f02734 site_tests_capy-coreutil-trap.capy.wasm -851e164595a9d10831ac004e6247dd3a41629ef80a69807ac236dfe2669bf323 site_tests_capy-coreutil-trap.capy.wasm.source-map -2e587960886d5bd3ee5f43bf6ceac5b4fac4210c465c7797c83e01c91deb3786 site_tests_capy-cross.capy.wasm -d5725cd8c7d1d3b10736cdf896a01d4163fb452470291cc60b5b308859079c34 site_tests_capy-cross.capy.wasm.source-map -d54094f00b7ae8d3c37cf76f717ec67ab36d52578b03991f5cdcf4ee2f7a0097 site_tests_capy-crypto-random.capy.wasm -055d880d75641a80f58069365ac3ab024144b93b57b1d45c669c0576bf7ed2d8 site_tests_capy-crypto-random.capy.wasm.source-map -439e58b97bd2a8bbe49ba64f134458e4909e315caed4e171dc36897f454861fe site_tests_capy-csrf.capy.wasm -eeb87400cb7e004b832a24b13b4560b8951de8e809b04c72c089d7df1ee1af32 site_tests_capy-csrf.capy.wasm.source-map -14790568b7ffb9822c2826e2701fb0f3b47c3b57500fe2258bce3f2d98be60f5 site_tests_capy-dval-api.capy.wasm -e198b4b28bf1d02ffc40184721cadce98878417a7ba0dcaaa48f649c04e54547 site_tests_capy-dval-api.capy.wasm.source-map -1259d98fd183484880809862e360f7fff762f051b143b3bbd789c355f0bd6ad8 site_tests_capy-dval-api-trap.capy.wasm -af1db3c2a94086f1a0947a7a1f3eb7fde208407b389ea81827b4dab07e846953 site_tests_capy-dval-api-trap.capy.wasm.source-map -1512ea0fdc98d9576fc816fc8a93872c7deebe0ffe20be90e4dcb1df5c26c98d site_tests_capy-dval-f64-trap.capy.wasm +68c98a5ed1766a41e49155bcbc7fc1763691cd1ea732ba96a02668c9cd523959 site_tests_capy-codecs.capy.wasm +7b9785c88a7e96983cd9baeee8e8e033bd9d17bd1d1a0457adbe91774dbd5514 site_tests_capy-codecs.capy.wasm.source-map +66d3990f7d5ce990a626f3cd81ff119d5785d1d07e54bd11504d08e96ccc574b site_tests_capy-codecs-text.capy.wasm +07a5b681f541e1454e06b9acca7fb0f6a961cb2c56b11c654f6d0ef01a5e4dd4 site_tests_capy-codecs-text.capy.wasm.source-map +0a739f65cf7f238fec2e51e90ae85b5ef4c79e81034594579694a0852c084464 site_tests_capy-codecs-text-trap.capy.wasm +4c4d5cb9739e3463b55acbf315a84c46ad48ce0bd64d4d144acfc2a11758c238 site_tests_capy-codecs-text-trap.capy.wasm.source-map +5659238db5108ca30664bad28ccfb941c956f598e8ff76932760de77a2e5922b site_tests_capy-component-parity.capy.wasm +c759c4c30118185d12e041ec5942d483772698b3750b98d32c91fe44aed72069 site_tests_capy-component-parity.capy.wasm.source-map +ef00893f93536a5d575eb7d2525b653ea7a22b5aad8f58a94daf2a96be6b4081 site_tests_capy-component-props.capy.wasm +9d6ece630837c7dc463e7dcf1695754ce0db89f473dae42f64d06983d2940654 site_tests_capy-component-props.capy.wasm.source-map +42e23612bf34fa3536e255cb2d8136a3105673c8859117844755083470a26746 site_tests_capy-coreutil.capy.wasm +55f8de34cdc23f6b928d1a56b9d87f43d6fb1f4399590b6aab7c3cf2e6ea909f site_tests_capy-coreutil.capy.wasm.source-map +b8ec778c6caefbb333e9e929328a8bd982afd4a0a2da13d250f2eea13f2b3cfd site_tests_capy-coreutil-trap.capy.wasm +6fc7189ec6197c6de1bcba8d911255339771aede8d05d58e7d7039f29ead4004 site_tests_capy-coreutil-trap.capy.wasm.source-map +079c0ce0a54c5bfb0c6794bdc19a72fa240c6c7c2472ec617babd2113a4168a8 site_tests_capy-cross.capy.wasm +56f81de72f4340120f428a5c1bdff7cde56e011c2b2681f2b8daa286ea655961 site_tests_capy-cross.capy.wasm.source-map +5580ea49a8062d3f932d8f0981d05459ed1ec3115a4f9cdb9bc951234346e97f site_tests_capy-crypto-random.capy.wasm +0863997f21e3d4edacc383cb98b22857565f3a3ba53aaf13e70653fcd7d8b3bc site_tests_capy-crypto-random.capy.wasm.source-map +3be8fa2cac9fe6c6ad3363fbf1faa3daf63197163c8f813d2ef3dbc820814b93 site_tests_capy-csrf.capy.wasm +e14fd0d046581634c49e0f576695c5fc49827927af9bdccd545c677fea6c370d site_tests_capy-csrf.capy.wasm.source-map +a12a0e8597f047fa03dc8027e561df7896531187e1d4c0a1c13e5fed0169b201 site_tests_capy-dval-api.capy.wasm +30b4f6672e698986b180e896e1210d22814d914153dbddcae6f9c27432079488 site_tests_capy-dval-api.capy.wasm.source-map +4c0f62f2bd9f1f02c80dfbb05a1e0f67ab92570710cfbddf6f71b6ba08662f72 site_tests_capy-dval-api-trap.capy.wasm +8d9ccdeebd6c050f06866b0ec2d024200d9db82dcb8d555847501c363cfc3ac8 site_tests_capy-dval-api-trap.capy.wasm.source-map +a515398753cf53ac4d4ed3be3022f4972cef65763e50546e233f08b986147940 site_tests_capy-dval-f64-trap.capy.wasm c6a4a7e82f8a203e9fc803b1aa656b18769865eaaf7c60148a5de65e4c08de58 site_tests_capy-dval-f64-trap.capy.wasm.source-map -b783a3d2026205b48ffa2fe26b2d35570199e3f2dff55c68ead8987e6a4cfd47 site_tests_capy-dval-merge.capy.wasm -ae5305432e82ec9df9e1990f0705805b59866978556155ead3abd46b73961fd6 site_tests_capy-dval-merge.capy.wasm.source-map -56d49966f30bdb82df736cdfceb899721b89d04122e32ba0e7609b6e0fee0b08 site_tests_capy-dval-missing-trap.capy.wasm +265114eaf99dc27976f7347a068ea68c309f72bcdfea36a1d35d8de8ad4bf625 site_tests_capy-dval-merge.capy.wasm +cdffc3725e3b0ee56a7ad83c35f5e2575c9445652a52ba3eada298258662387d site_tests_capy-dval-merge.capy.wasm.source-map +6f7d44ee5a3efffd5b1309dcb46788c5bc569d316a8591b551361f9ee42b64e1 site_tests_capy-dval-missing-trap.capy.wasm 614b8f84d80a02857dde82bd89e977803ef57c299132f49d7dd098345bb0b0ea site_tests_capy-dval-missing-trap.capy.wasm.source-map -f0f9da44aebe179f2473e925014a5309eaf955b48cce89399b069c2ccd712220 site_tests_capy-dval-negative-trap.capy.wasm +fa942bdc8377cc822194354933c7245261b8e4e620664f7c4aaa5ca47c01fe6c site_tests_capy-dval-negative-trap.capy.wasm 951b59a3e44c7eb99a09a6ccc91bcad6d0af7a8fec173d364137bb7a88b74a3e site_tests_capy-dval-negative-trap.capy.wasm.source-map -11a6fd7006935bd3cec08db21e26f2e620de0756a4c367b21f6c17a2aa1a8bdc site_tests_capy-dval-range-trap.capy.wasm +029905bddb6bce722a96e9b676e1b534fb5ea49e22d536e18695608391076cfa site_tests_capy-dval-range-trap.capy.wasm 17ce9f3114a8c1a9a447e814c3f7bb2a769650e85dbd4fb9bab058cd98cec39d site_tests_capy-dval-range-trap.capy.wasm.source-map -7dc9103349350be18388f3fcc0abde34231da9996494b25e26b2ec4ac09b55f6 site_tests_capy-dval-return.capy.wasm +15ac4d31cefe8403a2a06fe8975da0ce703c150b56ee732b244bcdeca4103e7f site_tests_capy-dval-return.capy.wasm dcfe50175d01015d96d010c0480308b5017c51178ca0c8b75a4d8a361214be30 site_tests_capy-dval-return.capy.wasm.source-map -ed7c59d3b45317a6916cfa22effc224f3d206485dd79da4bd08a731a50cc8a2d site_tests_capy-dval-rich.capy.wasm -3ca39d1f9e36c73cd012079049e79f378a27363c36de766df5b451a703ccca98 site_tests_capy-dval-rich.capy.wasm.source-map -060684e661370d12393c187cdc971ee860242c2b8ff6469371ad1390ebf20f44 site_tests_capy-dval-scalar-trap.capy.wasm +17586625137195e1b24cfc41baf153f351e5cd95d1019b53b0c441e4a26ed4db site_tests_capy-dval-rich.capy.wasm +02e33720f8f7b83de5c5357f80eee6de57b4457c5ce6f3a1350d48e170c76af0 site_tests_capy-dval-rich.capy.wasm.source-map +9fb9580f2ebe8d216f6a53a13cab84e2d77942b1ee09c5f95395bdc1e525c4a1 site_tests_capy-dval-scalar-trap.capy.wasm 38f771295a2812f11bf13f73ae5235984f1188ee06bf866afa3ce99dcea51a9c site_tests_capy-dval-scalar-trap.capy.wasm.source-map -736615a9affafead411f848cc007ddb1b9e7ba01734c8e8919af3535c85b7c5b site_tests_capy-files2.capy.wasm -d7fc46aee507fc404c0e5780fedbdef226fc3e22fd0f7d0f2b68868625663f19 site_tests_capy-files2.capy.wasm.source-map -76c3e6caedf607d0faf22e9c14ef90968240f5369fec26be5d0630f5113013b5 site_tests_capy-files.capy.wasm -5bbbbc69882543dce5019378ad4be307d4ff70529831cc3a528aa67874ac3c54 site_tests_capy-files.capy.wasm.source-map -fa71ce8db4375ab46434a3387d5ac54efd5a611f7d6a4a4fd0f2fcff2c68b0fe site_tests_capy-final-parity.capy.wasm -23b47502aa728d0c9dded15713f8841753d10ca95e015f5717bb2d3005549cc1 site_tests_capy-final-parity.capy.wasm.source-map -734b38c20f99f540adb94966e4365b8c0f7e3958ee87554a98e8f2f0c0cfa984 site_tests_capy-first-empty.capy.wasm -b68a1f6a51b3445d3ed0c5823b9d55f5a7e1830b7ef0c4206aee33b658200bbc site_tests_capy-first-empty.capy.wasm.source-map -3f5860759c2ecf0cd7b396def107f496ea7ed392a7d592ad785c4ebe72e2be7d site_tests_capy-jobs.capy.wasm -2fe78a170993fc10d82ab06b0b5dffad1a865f032d03f515b56ddfb70e3f997e site_tests_capy-jobs.capy.wasm.source-map -6fa8a79df84558311f57ef6cb394ec745bd126b5323341f1087888141d7c03db site_tests_capy-language.capy.wasm +78cf5233f6cf23a229ec80e98df90fd774a956d5666a21bad9026a45ca1ba3fb site_tests_capy-files2.capy.wasm +ae9f785e32dae4dc53bd3c94af2d451ec3821297f58e21ef3258890ae62334de site_tests_capy-files2.capy.wasm.source-map +6687cdf9ef89852b25bbaa7a5e03495ea90db6516bb9163711e59b84acd13e56 site_tests_capy-files.capy.wasm +7a23139c60b9c962446bb0e24a3d9fd2aa0972ffc479caecee21e2f9063e07a7 site_tests_capy-files.capy.wasm.source-map +792370f970d2be3d735023c46b6bbcd88d191d21b21c3a807d667b31476ea6b8 site_tests_capy-final-parity.capy.wasm +8c8232243d699ab8ad43c62da028fc872d3044f9c339b3bc3da4a7485aac5e6f site_tests_capy-final-parity.capy.wasm.source-map +65b14ffe15a785b2686ce035b82c1e1b037d39756dd9b9103fdba1b7f8e100e6 site_tests_capy-first-empty.capy.wasm +c8c56f9c19dd3ee78b40c6715cbe7a2cf48828d992a9972b9d89705b9b037814 site_tests_capy-first-empty.capy.wasm.source-map +dcaf32fef325ea38de1ecc7221b663293251782bc2d669a3137584339f1c6f9f site_tests_capy-jobs.capy.wasm +4cf9900d58e9d2a26cfe3bcabc07add4ac708787a72275205a334841f37569ae site_tests_capy-jobs.capy.wasm.source-map +fd63b251ca8292fba3c0b7b971cef3f7e556c7e9b4fa778781bdd734094c844d site_tests_capy-language.capy.wasm 221e6e7a7846e1eeecdab0e4e3732ffe1dc83d39cb211b726eaf54dd8088565c site_tests_capy-language.capy.wasm.source-map -2fc3035a3d191c20ebc1db96a9f6b9a663f068afc534584f4409a4a9cd6dd50a site_tests_capy-lifecycle-child.capy.wasm +19934db2c801b8cc9b317700e8eec75d4b0cc1618f01b3c0972cd9c540c906aa site_tests_capy-lifecycle-child.capy.wasm acf9744076cf9119406e53b042ab5ac1dcadce3c3f34574f652be710ba2249eb site_tests_capy-lifecycle-child.capy.wasm.source-map -32e8aaeec72136ba50546eeaa4d7b7caa2b99341c2955fb690a631263b2778cb site_tests_capy-lifecycle-parity.capy.wasm -df801b459d1f53deb76c636208ede060a64e01f7a4f82af20260d6e6c8e7513d site_tests_capy-lifecycle-parity.capy.wasm.source-map -a886fa31c7bd1add07b3cdd24c06992ed1ba339e2c6884ea9d1a57fc01209e8b site_tests_capy-loop-control.capy.wasm +4548e98b59e9fc8196ce1978c4b117be0829a0c7a0eef23d25cb88171f9c7293 site_tests_capy-lifecycle-parity.capy.wasm +b2e73c56ed15715c6d12111bf1f321d614055d980d6b98650f6c3173c6b6f701 site_tests_capy-lifecycle-parity.capy.wasm.source-map +46d95929ec831b9de2023ca85543757fafb920b2f2547470cd8958f11243ecbc site_tests_capy-loop-control.capy.wasm 08d4c03ecc8dbd73fc0b6407208d0f00cff540e69cf55dcfa7d9cdf831987737 site_tests_capy-loop-control.capy.wasm.source-map -50f208a9a979f1d4b457c8bd0152254aa20a325f46db460fcc60c1250bad9541 site_tests_capy-map-arc.capy.wasm -4dbcdf325dc0e85dba35e0239153ebf16c5375c858804713d7f3515368bee23b site_tests_capy-map-arc.capy.wasm.source-map -04c4255bccf826902c23c4bdf17979e43b1239404c6a21edfe262423261845d7 site_tests_capy-markup.capy.wasm +cee3a21bbff6cd03a7d285e5468e1d7e175d528c67a5e7e42f909f09db326c9d site_tests_capy-map-arc.capy.wasm +84163069066401d52d8a119f45823b9ef5f08c5ddbc510632ab97a4743894562 site_tests_capy-map-arc.capy.wasm.source-map +d3e2cc71c5fac13b57bd030f6342eac8649dda15501fd554aeef23ac17000a11 site_tests_capy-markup.capy.wasm 2e02ae12d062ed09b52f80b5a4457cb4cdf3a67001306e0d583ab2f920e0e490 site_tests_capy-markup.capy.wasm.source-map -ea0dca9e0a6d9e78248a6bf719f0a246b30ee364b5969f1cdf4ee0a55cd08fef site_tests_capy-memcache.capy.wasm -f198b4dcf1e6c7f90420feaa93f0f6c7edd4bcbe79ad559ebc1e9a08db7c0da5 site_tests_capy-memcache.capy.wasm.source-map -7b5f98790087bb9f33ae4d01db0bf77e74f581ee2fe3762e8d35e6cea91ed278 site_tests_capy-methods.capy.wasm +1f9803deae1c27bf3876fc38f8d9150f54f580d6f9efecec66f144507260a215 site_tests_capy-memcache.capy.wasm +048ad5e31f83d7d7e4d1b1b4a94ef673d21dc9056cadcbf070a2b1db673f8ee4 site_tests_capy-memcache.capy.wasm.source-map +3b016a8a695019da1838ac0702aded01b54336f4bf81df141350c8e8c44dbdf7 site_tests_capy-methods.capy.wasm adf7252ae0617f78ab7b1f295726a0ca75a2fc399b1706585dcf94d2b3e97bab site_tests_capy-methods.capy.wasm.source-map -8ffea9846e1be840603bad80079caae6ed91e2be255ed3c5d7e9f14f83113fc7 site_tests_capy-module-caller.capy.wasm -7216457e46a5bbc1816383d1c7cf1c360a0aaf6cc2466534ce7a058486ca5917 site_tests_capy-module-caller.capy.wasm.source-map -be8bd98823c32543915a9fa431c92891f78278a5cab16c2d6d5eda2a1d57472d site_tests_capy-module-target.capy.wasm +28797b4e0523092cb660331f2ec3328cf68bf045bfb6a44eca56b0f0aebb8222 site_tests_capy-module-caller.capy.wasm +fc8ebfe05b418901b81a56ddfb55a8edf4587d15078155e66b8bbbaf1ea278ec site_tests_capy-module-caller.capy.wasm.source-map +346a92b99972d44b4ea006fa570ccaf234a46986504462de36074f6048e22d95 site_tests_capy-module-target.capy.wasm 5796e4d9837c39e8ea03b813ca107a7eae24de200ad06e835e2f82402270cf33 site_tests_capy-module-target.capy.wasm.source-map -17207004a7efcfe94af7fcf997b3224212cccef02b22f8ab2205e6597580843b site_tests_capy-mysql.capy.wasm -813edeb679729d2aa877f39e36abde7a23608b1faa89c7f230d7fad70cb2c1a3 site_tests_capy-mysql.capy.wasm.source-map -0c88b8a0db1ad4d9e15ecd3b844080cfcfffa944f747894f42f44b75a0953c44 site_tests_capy-network-parity.capy.wasm -ca0a06aea59399e9f5cf52d3ea80cee831b6b5238eaf4d517728899540d24442 site_tests_capy-network-parity.capy.wasm.source-map -b80544ef6cf13b574c72726f488af7c99b2f0ef38ef9c4ea665ec0ed3d78379e site_tests_capy-operators.capy.wasm +1e81c1a160d4ccafa64756d680918d68d33ab77beaf616c14a349080854a5e30 site_tests_capy-mysql.capy.wasm +39b718e1ee7356a95423f932c42443603ff93744b8e8afdcbd7ac1821c98b98f site_tests_capy-mysql.capy.wasm.source-map +0e5ccd5092f689a5a1adb0928ecca02f9d618e640df620e22cdb52cd56456a44 site_tests_capy-network-parity.capy.wasm +e4432e426aa843d79236dd8940441c627c9394c03683d02ffaf20a4885485e6b site_tests_capy-network-parity.capy.wasm.source-map +354a99466c088622e86ff8bfa98bc01e5f7b18ab9ad907132650e63579d94319 site_tests_capy-operators.capy.wasm 215d4b5cab9df51ddb2776f5788d491dec9d321ea705fa4daa90de9485cf3edf site_tests_capy-operators.capy.wasm.source-map -4c906d8315d894a5a5c73e1f25c63222ebd4878663277660637a62c0ef6abccc site_tests_capy-phase1.capy.wasm +b6327372d705fd5069ca648d36dbfc677e86d078c796357bae50a31c8bf1cd25 site_tests_capy-phase1.capy.wasm 8bb098469897477af9f9f7df4e19d9812d54543ac44a99a6605829458506e537 site_tests_capy-phase1.capy.wasm.source-map -2bd91c939a1a9bb86a831912a11b8aebda669cf150ba674fdb1dabfadc5b7752 site_tests_capy-phase3.capy.wasm +75f0b544713aa4e5e756ba46f5007efb0d1bc7ce66fde5a71da1973e773835e3 site_tests_capy-phase3.capy.wasm 4a7a49c456b469975708dcecc4f4b48d862cd047afa9cfb36a982d8b8480874a site_tests_capy-phase3.capy.wasm.source-map -21580da3e2ca7ee8a60aa5c1851d57b6bfc3392ae73ec0473ce448deba36931b site_tests_capy-redirect.capy.wasm -f4ae3c5764e173e665286d1f4f756e08acc9dbb35b37281f63e5153685877cfe site_tests_capy-redirect.capy.wasm.source-map -d6ce570ea9df2456275c0a0173b83c9dcc7b8e2cf18acd8e3eda8d6d9116708d site_tests_capy-regex.capy.wasm -bca7fc75940b074bb34306a2b14da98ad188f3abee27d0f577c3c3514d1d1202 site_tests_capy-regex.capy.wasm.source-map -68700fcbc9c4afb997a12d06eb28f112ec32911e1c53157ff8f9a838050bd719 site_tests_capy-regex-flag-trap.capy.wasm -c758c310074e47efaaca3b6b8583a300899bdb43e0ead354e945e8e90b29fe81 site_tests_capy-regex-flag-trap.capy.wasm.source-map -ba80eea316a0ec27dcf07f29c737c9f2341821707bac3b5fbb263f7aaa290320 site_tests_capy-regex-replace-trap.capy.wasm -adb5d591fe126107ecde935aa965f401bf7fddddabe42197ac69f419f9b570ac site_tests_capy-regex-replace-trap.capy.wasm.source-map -70bb8ce1fbb2978922b05dc19b7437637f8ffe990faa125e6f5dad2cb66f6861 site_tests_capy-regex-trap.capy.wasm -a073345bcdfc6bf24b6d62048707c8261a09e740e917bb824c865bfbcbf34a50 site_tests_capy-regex-trap.capy.wasm.source-map -b3c00bde60ad48bc73ed56855f74296af4791a10168e562b4aaac3b3437b5fb7 site_tests_capy-render.capy.wasm +586bb58ebc8c95a3f1beb35daa09c50bac29e9110eb26e5c4300f292c63258ca site_tests_capy-redirect.capy.wasm +788f9942ff5fd4f5e16cc004778e48ef67207252bfe5ecceb963eaf61a099489 site_tests_capy-redirect.capy.wasm.source-map +56c3c8d0462dcb9799c06eb3c0cd8d5f9b539108b90d9503e0d56f41d8e4ea60 site_tests_capy-regex.capy.wasm +46594de4c86f36ae09bab17d0f28af5e2101003c4341c11297c8b5b15fb06b37 site_tests_capy-regex.capy.wasm.source-map +b6a1dfb6d242fbeb3528b570ca5cf6f04b4f6c22adc21c4f163737a544d87af9 site_tests_capy-regex-flag-trap.capy.wasm +5387199ef4edddfff7921b1da2af6d5f724d3dbe577426b9b70e5c035507e4e8 site_tests_capy-regex-flag-trap.capy.wasm.source-map +5360dbe9d518d0ccab5b98daaecca6171a6b25b7d2610458adccdde87eb04152 site_tests_capy-regex-replace-trap.capy.wasm +957db4fdfd18a7e95e1db07ef8fab7d8c65ce4d8fd39f16cb86910ee7b5ff0e6 site_tests_capy-regex-replace-trap.capy.wasm.source-map +65f37333f7a0829cff0fcc3e0b8439e3ddcfd8f7aae4dfa61a9bffebe1a9e0f1 site_tests_capy-regex-trap.capy.wasm +3c9db44a48713e32ea906a0e03234c45939085ab6f8424b40e700cd6304662e3 site_tests_capy-regex-trap.capy.wasm.source-map +e14070912f6f21c38e9564ca1fd00ee0644e27808890fafb4e19af0a04c1f530 site_tests_capy-render.capy.wasm a86b3cadcc4834628f880f6c84413c915b5ba21bbf75e15a8ccdc39f1706826f site_tests_capy-render.capy.wasm.source-map -84395c28116303a1bea7bf2da637c7607b9a21ee445bbc0a99fb18cfc5fa50a4 site_tests_capy-request-context.capy.wasm -d5be90c4d60d8107c4d19b7396051d25470c7a3f3e1aea47c434498dec7f078f site_tests_capy-request-context.capy.wasm.source-map -d9be01432bbaaf0d98ccc35b82c578c58513d38dc35d502bac1eab116894dd79 site_tests_capy-request-parity.capy.wasm -e7063b56b9636429cc9dd231d1bf42dfc9d568988fdbe649141c460f21438d1c site_tests_capy-request-parity.capy.wasm.source-map -c830cb0ea3bef3391dddf5dadbaeeb6365f237c672857513976edfc655ddd5a9 site_tests_capy-response-header-trap.capy.wasm -52f3785f0bec65accb98e8f292f87780398bdeb37896ee311af19090694c15ad site_tests_capy-response-header-trap.capy.wasm.source-map -fbbf5500d8a0e58f95889c5ded8eb85ec45b46bd5a293499ea70b99d356fc058 site_tests_capy-response-status-trap.capy.wasm -6016eb75d301c6f4968333d290024e14d0041fc431d0047fa8aa71c674024275 site_tests_capy-response-status-trap.capy.wasm.source-map -ddb1eb809e91433b873d02474c5ca14e27f82b154070bdeeb7ba0936ff634a1c site_tests_capy-serve-http.capy.wasm -8d3a8121fb4971c21d8eff9235325a0a01d664711120b10022bb1b04b63bd808 site_tests_capy-serve-http.capy.wasm.source-map -96e069089228c0f9c9d06f0f7b69657fdd62cf674207e29dd2a5acd09f541f35 site_tests_capy-session.capy.wasm -72061b8a42ff68765b3f7af7e1d6e0b64708a5f7430702dcd69c6a916098a8da site_tests_capy-session.capy.wasm.source-map -6a8ad48fc746ea39408e9b96a38dc87d74078848bf2a02ec90b42db04c5f32b2 site_tests_capy-sqlite.capy.wasm -1fc1a7086580f2a7cabc154096d5edae3e57625ce7c45e9c4d27a54afb13f131 site_tests_capy-sqlite.capy.wasm.source-map -95dbf83af308a23c6334327dd3d9dccd8a470689f837883f2504f97b670e1d79 site_tests_capy-sqlite-failed.capy.wasm -cc3c7c18d4e18407e18e6ae7d218fcc1ecaf1736a0338ec75c6f37e39384934c site_tests_capy-sqlite-failed.capy.wasm.source-map -c21a50debfd9590d87bf136537f672a77d7eb1660d8bde8201dbd2c796f5af32 site_tests_capy-sqlite-handle-trap.capy.wasm -b9db0e4032a8c0b1b92160c80c897e9e5f02615d0dc5e8e6cbc4bb3df0503418 site_tests_capy-sqlite-handle-trap.capy.wasm.source-map -15eb26efbeef796cc7a732b328a59f76cdc58123801d62a25db8ba887611038e site_tests_capy-sqlite-params-trap.capy.wasm -8805692b69a42ec994dd5ab2e33da4025901dfc8065f96f3248d62097627d012 site_tests_capy-sqlite-params-trap.capy.wasm.source-map -bae7b6c9cf62c2afe3666179911f6c7e71c6b4063c707a40dc20836b72c00666 site_tests_capy-sqlite-sized-host-trap.capy.wasm -d0245f23db5ceda08d6b3c7544d62cc62ed8373878f859c0666355c125271b54 site_tests_capy-sqlite-sized-host-trap.capy.wasm.source-map -c9750433414d260a5d3f5dcb25bf955ea6af11a2258f37f620f9e6933820efd8 site_tests_capy-sqlite-zero-trap.capy.wasm -7e22586278753acb0477faf75ece1f73068b40c74a1faefe22b24a98b912c69d site_tests_capy-sqlite-zero-trap.capy.wasm.source-map -70c44c3cf4247847ccf0e0204df5603dcc07761317d11ed4d0654ee1c4449699 site_tests_capy-string-concat-only.capy.wasm +9856fa6e40b76e928eb588008009ad1fd4e8eb290a97e353294805e49c6ae264 site_tests_capy-request-context.capy.wasm +8cc5c961ee97c657ae931da54a5268261e3703250f8651d5ff20b65577012fd3 site_tests_capy-request-context.capy.wasm.source-map +55dec404d1b72569890e353624366e03bafeed3d953bfd3d28fdbea2eba910b7 site_tests_capy-request-parity.capy.wasm +e337623636e2a5d2a51d6c865d93adf484bbbbec3dc41b99954e6f33a1f1e71c site_tests_capy-request-parity.capy.wasm.source-map +078168a5293b2ddf788799dde0977829762687d0b1bf47b8c37ce07a6d06cf7b site_tests_capy-response-header-trap.capy.wasm +02e8e428c5b9077c44b05b4256868d6b00de2557fdc895549dd5be7864afae64 site_tests_capy-response-header-trap.capy.wasm.source-map +f1fbac46a37c41e64872dba5acf9be942cb52ed93b532cead1bea1a8ec1b602d site_tests_capy-response-status-trap.capy.wasm +dfe9a669a4163a899be1e881efb201dd55d572e970e3c1bcb6cf67df9aef8faa site_tests_capy-response-status-trap.capy.wasm.source-map +3a7296f7984e3d4a7772d3c9fcd708807fd3544de550732e49f799b97e473eed site_tests_capy-serve-http.capy.wasm +39bc77b4b0334b159d4b261a097bf00d5e9224a4ad66ed2e97badc21b0be9ab6 site_tests_capy-serve-http.capy.wasm.source-map +e4bd5ae05dbb20c25ca88cb9eb5b4ecd2af598e20104f36fdd8eaa10866ba1df site_tests_capy-session.capy.wasm +919c32728e51bc91618ec16cbe9087f3514025e06001d05757a95d2f36078f2e site_tests_capy-session.capy.wasm.source-map +9867f500b7d29f7c567b2df4c0e042d64cb2a724145b5c242340a1d3e6c1547a site_tests_capy-sqlite.capy.wasm +485bdec5d9f50ebff7f46dcad66c12636bd9f333cc545f9018df581c049f0dea site_tests_capy-sqlite.capy.wasm.source-map +8e4c34d28d742755c5678f2831594aaf32bf076cd008f56f7cb5d1a4357142db site_tests_capy-sqlite-failed.capy.wasm +44950e37e318b9f32c14575592e2e6c15fbe2f10e4e8daa0af916f69dfc8b75c site_tests_capy-sqlite-failed.capy.wasm.source-map +de97a02ff504345f95d1fe347c35db4c3ea81b7964e125843db2a8329f144224 site_tests_capy-sqlite-handle-trap.capy.wasm +a22c7e1ce541dc7b6a1de3fa155ab35688c0d340f83be63b8899aa626a26352c site_tests_capy-sqlite-handle-trap.capy.wasm.source-map +fcf5d43c0d86a7a9b8e3f2d94f823aa24ecb0229391853dbb957a38a0cd2dea2 site_tests_capy-sqlite-params-trap.capy.wasm +11a3e843f67bca8ab489076a2e4ed3514dd5ddd5c094dceb76388178a9a64358 site_tests_capy-sqlite-params-trap.capy.wasm.source-map +168ca6e08fe6d4bd95b4797096e6ae12aa17e45ee49b0a5840fca0f7ab15da98 site_tests_capy-sqlite-sized-host-trap.capy.wasm +5d09ebe9c472b2200f2c74351573a96bcd744cdb5ffea05f89ba0825c006ee67 site_tests_capy-sqlite-sized-host-trap.capy.wasm.source-map +f50e3e5fe46a09ebc94c5978ef1df7e1e578e9d3cdaa994650eac72ec033a946 site_tests_capy-sqlite-zero-trap.capy.wasm +65d209dab91d5737c0bbce8e2a84c4aaaf98857d0b2510ba6c59192034b0b19d site_tests_capy-sqlite-zero-trap.capy.wasm.source-map +8a95078c2825e3c5d5608b7476232de87de6374c897791732aa4fca6a0d0c738 site_tests_capy-string-concat-only.capy.wasm 8ffe1c715867d87f2e42eab4c360bc5e82206bcbd4d4c2136376b06496ea9c45 site_tests_capy-string-concat-only.capy.wasm.source-map -de37e0c9b4b8f3d0b3fb1f7b29ccfc4efe1768a1e9170d78f62d31b699ddddb8 site_tests_capy-string-list-scalar-trap.capy.wasm -0b74bd66eb0a720fd19b933a01999a7fd0d9c1ab6e717e7db773de8a14ab02d4 site_tests_capy-string-list-scalar-trap.capy.wasm.source-map -14c1beb237f4fe4db8d452cb2fa047c518e0b1c3ef8b5c5e79ff3173a87821cf site_tests_capy-string-lists.capy.wasm -4cbc2272e973058316db115c2c6d91911ac32212cd49c181ec421dd5ea3a74e5 site_tests_capy-string-lists.capy.wasm.source-map -f7504fce0f1c5f4fe1236d6c29d8ad4990ed2375b4dd5a31d7bf76ed11148a78 site_tests_capy-string-list-trap.capy.wasm -b088583fed96d276748e4ade784efcd4a4f2cfe02ec4f7c30e055c8a9c266531 site_tests_capy-string-list-trap.capy.wasm.source-map -4188550569474b04bd26e933033e606bd32a5014c3099e32457c941003193488 site_tests_capy-strings.capy.wasm -bc5d55acc734730ac064d62c1b6d77c740c3f3ad3cf5dbcc09df372c1b9992d8 site_tests_capy-strings.capy.wasm.source-map -49d9a3a5db208a43ef500d64c8b8b9d2096dd2c91d180eed4dc346b976124f38 site_tests_capy-time-parity.capy.wasm -972457a764a77e6ba692ec4e802ec270514e55a0a9de6697f210fc2722c6373f site_tests_capy-time-parity.capy.wasm.source-map -88be2c90b79c60615d02573cafb7127b15d1667f94ea0ea6b98537f1efdb5dce site_tests_capy-unit-admin.capy.wasm -5a5eaf3f033a89ffe75f57df5c7c607cfb326f42339be82bb6c01159e91a5872 site_tests_capy-unit-admin.capy.wasm.source-map -2b82b4e9f65051c8e32339c83298a7609c84705e9fa90395dee5081aa88d2e5b site_tests_capy-variable-expressions.capy.wasm +fa0ea0a3a1f22341c79187c1188da72b5e6aa97fdcec3fb97bd88aa2ad004a26 site_tests_capy-string-list-scalar-trap.capy.wasm +bff5e9d0dd91b88815b2869456cd9f27b4ec82bafb2f55faf03d0d91924cd439 site_tests_capy-string-list-scalar-trap.capy.wasm.source-map +e4581f7bb0a27988c7c5ccc183e9637ab9537f62257a5b20d53d959f7f145497 site_tests_capy-string-lists.capy.wasm +31888508dc842a74f406fe65c2d9887c680cc2b007eff6d9f9a990525f7fe7ca site_tests_capy-string-lists.capy.wasm.source-map +ba630cd5194a74301ddb0365e1b54301afd2779cf32167e3bc074aeb6b3c3f6b site_tests_capy-string-list-trap.capy.wasm +9760f4c9f3da1a7ec7ad254b1ebd18a5993ea7774f38b2809c3a6c35e8ea5977 site_tests_capy-string-list-trap.capy.wasm.source-map +6fced2545fb24580716933c748cd5ced7aa3900a35af4d42ed8fc6e8a911fd4f site_tests_capy-strings.capy.wasm +288de119f6ede0bda4dd80d11603375c390c709d2e3a7b027c6c8f361d39997b site_tests_capy-strings.capy.wasm.source-map +9d8240c90290972f4691c001ef8347baea3cff7107d3a49daa0ca10e6ae5d07b site_tests_capy-task-concurrency.capy.wasm +f64f1dbd0bf8825ad0ba387f73530493b910abb172962d712690ad88ab04b695 site_tests_capy-task-concurrency.capy.wasm.source-map +3e4f83f186dc30bf139907c3c1b3eda84da9cb1769d7ccdd7e99bdc9f4dce18f site_tests_capy-task-overflow.capy.wasm +0667c92cc47bda5cbed2a961dee966f8ff25fb96c18682ae61a2cf4748052031 site_tests_capy-task-overflow.capy.wasm.source-map +c5f155c7049514465a7b94150f4a09dbba7b7fb25f3f409ed15aea815a7dfca3 site_tests_capy-task-runtime.capy.wasm +9e4a1d655a1a7887bf3629371183167e696895475e427e4e7f86652a00a21773 site_tests_capy-task-runtime.capy.wasm.source-map +adabc8ba79b04ee7b45fe55a5edb05707fbb7dcaf435799e0d20db478412cfbc site_tests_capy-task-timeout.capy.wasm +68624aa92ffeafd8f9b13af96d5c9a2b29de2a7e7a2089ade1622fde89187700 site_tests_capy-task-timeout.capy.wasm.source-map +28f8fc6f181dbe5f44b8754df039d40acd01b6036ef8f7fc4d23868aebe6b7e8 site_tests_capy-time-parity.capy.wasm +04aed7bb052d7120850541f09f80f70edcce2f845bc216ea96c6c714af2a63fa site_tests_capy-time-parity.capy.wasm.source-map +bf1f1d8289e386c1148d0ae6b447ae9abb5aa54bc35dc7f23b4e6cbfc2bfa7d3 site_tests_capy-unit-admin.capy.wasm +98e85d1b05a781b5883f8c673a56b155297a2d063842cd1a2936d28ba1e7445d site_tests_capy-unit-admin.capy.wasm.source-map +ca2ff1cfbefed479b76eb976c90cad58a38275022fdc5168a6e0bfc73a339986 site_tests_capy-variable-expressions.capy.wasm 9e3d5afaac6e89a0d29749ee57b4e0c75673e3ea6bef786de78f43ade790e131 site_tests_capy-variable-expressions.capy.wasm.source-map -db81ad00928865cb9898604ed9d6662dd8a23c7ef756711d5545b13fc59e7216 site_tests_capy-websocket.capy.wasm -47bc1c3d4cafb0bf93d3b51edf87d941b49994877acc567632c5363825a56652 site_tests_capy-websocket.capy.wasm.source-map -a34683ddb3a6ce7d8d04395d12735eb0bb09984be3137e0282b4e2b377e79b6e site_tests_capy-wide-conversion-trap.capy.wasm +b1c71e3189fb8f8c9421527900037bd86be5a140c306a05d6dfff384a1aed3c5 site_tests_capy-websocket.capy.wasm +b7a42aef64ead9eddf8b7b26e40806486801fb0961fdf1c71cddaf10d9f49348 site_tests_capy-websocket.capy.wasm.source-map +692d39f51f1624c67962721b35e00d74fa157dcef7109afc55bc1ace1a4a0e3f site_tests_capy-wide-conversion-trap.capy.wasm 9ecf64c0f34ea4886951e00b972203422784311021aef2c89ef181e33aeeb0a0 site_tests_capy-wide-conversion-trap.capy.wasm.source-map -171c44249e70b40018aefce5e49576a500b3817b1750decfc646cfd78c864e8d site_tests_capy-wide-scalars.capy.wasm -28242075ee3a01298207f1eac3eaac877241572e9ee97c304be1350bdc345afd site_tests_capy-wide-scalars.capy.wasm.source-map +b9dc17619250465657c06c5fdfbf61d80901279860e8690c991d6a0ee67ccc25 site_tests_capy-wide-scalars.capy.wasm +542b26e4d594f162ac1f3ea3cb79e3172777b8322fc717fa15da803e22eda056 site_tests_capy-wide-scalars.capy.wasm.source-map +a955aceb8d7eedf6bd5a1f0acca5ede70c2d8348d2965ca056e9c500f011f241 site_tests_task-handlers.capy.wasm +733d1ac7f06dcc8f3bc79e50ea6677f173316af98b35092adfdb81a6b8c6c406 site_tests_task-handlers.capy.wasm.source-map diff --git a/scripts/check_capy_doc_examples.py b/scripts/check_capy_doc_examples.py new file mode 100755 index 00000000..c08750c7 --- /dev/null +++ b/scripts/check_capy_doc_examples.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python3 +"""Check typed Capy/C++ documentation example pairs against parity_manifest.h. + +Strict mode is the final gate. --allow-incomplete reports conversion defects +without failing, so it can be run against the legacy C++-only corpus. +""" +from __future__ import annotations + +import argparse +import re +import tempfile +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +ALLOWED_ENTRIES = {"render", "cli", "component", "init", "once", "ws"} +ARRAYS = ("supported", "partial", "unsupported_by_design", "missing_notes") +CPP_SPECIFIC = "cpp_specific" +EVIDENCE_ARRAY = re.compile( + r"inline constexpr std::array\s+(\w+)\s*\{\{(.*?)\}\};", re.S +) +STRING_ARRAY = re.compile( + r"inline constexpr std::array\s+(\w+)\s*\{\{(.*?)\}\};", re.S +) +NAME = re.compile(r'\{\s*"([^"]+)"') +CPP_TOKENS = re.compile( + r"\b(?:DValue|Request|String(?:List|Map)?|SharedUnit|std|void|bool|const|" + r"auto|template|typename|class|nullptr|new|delete)\b|::|->|#\s*include" +) + + +def manifest_statuses(path: Path) -> dict[str, str]: + """Read every documentation classification directly from the C++ manifest.""" + text = path.read_text() + found: dict[str, str] = {} + labels = {"supported": "supported", "partial": "partial", + "unsupported_by_design": "unsupported", "missing_notes": "missing"} + for array, body in EVIDENCE_ARRAY.findall(text): + if array not in ARRAYS: + continue + for name in NAME.findall(body): + if name in found: + raise ValueError(f"manifest entry appears more than once: {name}") + found[name] = labels[array] + for array, body in STRING_ARRAY.findall(text): + if array != CPP_SPECIFIC: + continue + for name in re.findall(r'"([^"]+)"', body): + if name in found: + raise ValueError(f"manifest entry appears more than once: {name}") + found[name] = "cpp-specific" + if not found: + raise ValueError("no parity entries found in manifest") + return found + + +def directives(page: Path) -> list[tuple[int, str, str, int]]: + """Return example directive line/content blocks; content ends at next section.""" + lines = page.read_text().splitlines() + result = [] + for index, line in enumerate(lines): + if not line.startswith(":example"): + continue + end = index + 1 + while end < len(lines) and not lines[end].startswith(":"): + end += 1 + result.append((index + 1, line, "\n".join(lines[index + 1:end]).strip(), end + 1)) + return result + + +def check_page(page: Path, status: str) -> list[str]: + errors: list[str] = [] + text = page.read_text() + required_status = {"unsupported": "unsupported", "cpp-specific": "cpp-specific"}.get(status) + if required_status and f":capy-status {required_status}" not in text.splitlines(): + errors.append(f"{page.name}: missing :capy-status {required_status}") + + examples = [] + for line, directive, body, end_line in directives(page): + match = re.fullmatch(r":example\s+(capy|cpp)\s+([a-z]+)", directive) + if not match: + errors.append(f"{page.name}:{line}: bare or invalid example directive: {directive}") + continue + language, entry = match.groups() + if entry not in ALLOWED_ENTRIES: + errors.append(f"{page.name}:{line}: unknown example entry: {entry}") + if not body: + errors.append(f"{page.name}:{line}: empty {language} example") + if language == "capy": + if "__bearer" in body: + errors.append(f"{page.name}:{line}: Capy example exposes private __bearer API") + if CPP_TOKENS.search(body): + errors.append(f"{page.name}:{line}: Capy example contains obvious C++ syntax or type") + examples.append((line, language, entry, end_line)) + + capy = [example for example in examples if example[1] == "capy"] + if required_status: + if capy: + errors.append(f"{page.name}: {status} page must not contain a Capy example") + # C++ examples are intentionally permitted here without a fake Capy pair. + return errors + + paired_capy = 0 + index = 0 + while index < len(examples): + line, language, entry, end_line = examples[index] + if language != "capy": + errors.append(f"{page.name}:{line}: C++ example is unpaired or reversed") + index += 1 + continue + if index + 1 == len(examples): + errors.append(f"{page.name}:{line}: Capy example has no contiguous C++ pair") + index += 1 + continue + next_line, next_language, next_entry, _ = examples[index + 1] + if next_line != end_line: + errors.append(f"{page.name}:{line}: Capy example is not contiguous with C++") + index += 1 + continue + if next_language != "cpp": + errors.append(f"{page.name}:{line}: Capy example is not followed by C++") + index += 1 + continue + if entry != next_entry: + errors.append(f"{page.name}:{line}: pair entry mismatch ({entry} != {next_entry})") + paired_capy += 1 + index += 2 + if status == "supported" and not paired_capy: + errors.append(f"{page.name}: supported page needs at least one Capy/C++ pair") + return errors + + +def check(pages: Path, manifest: Path) -> list[str]: + try: + statuses = manifest_statuses(manifest) + except (OSError, ValueError) as error: + return [f"manifest: {error}"] + actual = {path.stem for path in pages.glob("*.txt")} + expected = set(statuses) + errors = [] + for name in sorted(expected - actual): + errors.append(f"page set: manifest page missing from docs: {name}") + for name in sorted(actual - expected): + errors.append(f"page set: documentation page missing from manifest: {name}") + for name in sorted(actual & expected): + errors.extend(check_page(pages / f"{name}.txt", statuses[name])) + return errors + + +def fixture_manifest(path: Path, names: dict[str, str]) -> None: + groups = {key: [] for key in ("supported", "partial", "unsupported_by_design", "missing_notes", "cpp_specific")} + reverse = {"supported": "supported", "partial": "partial", "unsupported": "unsupported_by_design", + "missing": "missing_notes", "cpp-specific": "cpp_specific"} + for name, status in names.items(): + groups[reverse[status]].append(name) + def evidence(group: str) -> str: + values = ",".join(f'{{"{name}","",""}}' for name in groups[group]) + return f"inline constexpr std::array {group}{{{{{values}}}}};" + cpp = ",".join(f'"{name}"' for name in groups["cpp_specific"]) + path.write_text("\n".join(evidence(group) for group in groups if group != "cpp_specific") + + f"\ninline constexpr std::array cpp_specific{{{{{cpp}}}}};\n") + + +def self_test() -> int: + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + pages, manifest = root / "pages", root / "parity_manifest.h" + pages.mkdir() + names = {"ok": "supported", "unsupported": "unsupported", "cpp": "cpp-specific"} + fixture_manifest(manifest, names) + def write(name: str, body: str) -> None: + (pages / f"{name}.txt").write_text(body) + valid = ":example capy render\nprint(\"ok\")\n:example cpp render\nprint(\"ok\\n\");\n" + write("ok", valid) + write("unsupported", ":capy-status unsupported\n:example cpp render\nprint(\"ok\\n\");\n") + write("cpp", ":capy-status cpp-specific\n:example cpp render\nprint(\"ok\\n\");\n") + if check(pages, manifest): + print("self-test valid fixture failed:", *check(pages, manifest), sep="\n- ") + return 1 + cases = { + "bare": ("ok", ":example\nprint(\"x\")\n"), + "empty": ("ok", ":example capy render\n:example cpp render\nprint(\"x\");\n"), + "reversed": ("ok", ":example cpp render\nprint(\"x\");\n:example capy render\nprint(\"x\")\n"), + "unknown-entry": ("ok", ":example capy nope\nprint(\"x\")\n:example cpp nope\nprint(\"x\");\n"), + "unknown-language": ("ok", ":example rust render\nprint(\"x\")\n"), + "missing-pair": ("ok", ":content\nno examples yet\n"), + "mismatch": ("ok", ":example capy render\nprint(\"x\")\n:example cpp cli\nprint(\"x\");\n"), + "noncontiguous": ("ok", ":example capy render\nprint(\"x\")\n:content\nno gap\n:example cpp render\nprint(\"x\");\n"), + "unpaired": ("ok", ":example capy render\nprint(\"x\")\n"), + "private": ("ok", ":example capy render\n__bearer_secret()\n:example cpp render\nprint(\"x\");\n"), + "cpp-syntax": ("ok", ":example capy render\nDValue value\n:example cpp render\nprint(\"x\");\n"), + "missing-status": ("unsupported", ":example cpp render\nprint(\"x\");\n"), + "status-capy": ("cpp", ":capy-status cpp-specific\n:example capy render\nprint(\"x\")\n"), + } + for label, (name, body) in cases.items(): + original = (pages / f"{name}.txt").read_text() + write(name, body) + if not check(pages, manifest): + print(f"self-test {label} was accepted") + return 1 + write(name, original) + (pages / "ghost.txt").write_text("") + if not any(error.startswith("page set:") for error in check(pages, manifest)): + print("self-test extra page was accepted") + return 1 + (pages / "ghost.txt").unlink() + fixture_manifest(manifest, {"ok": "supported"}) + if not any(error.startswith("page set:") for error in check(pages, manifest)): + print("self-test missing manifest page was accepted") + return 1 + print("Capy documentation example checker self-tests passed") + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--pages", type=Path, default=ROOT / "site/doc/pages") + parser.add_argument("--manifest", type=Path, default=ROOT / "src/capy/parity_manifest.h") + parser.add_argument("--allow-incomplete", action="store_true", help="report conversion defects without failing") + parser.add_argument("--self-test", action="store_true") + args = parser.parse_args() + if args.self_test: + return self_test() + errors = check(args.pages, args.manifest) + if errors: + heading = "Capy documentation examples INCOMPLETE" if args.allow_incomplete else "Capy documentation examples FAILED" + print(heading) + print(*("- " + error for error in errors), sep="\n") + return 0 if args.allow_incomplete else 1 + print("Capy documentation examples ok") + return 0 + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/compile_wasm_unit b/scripts/compile_wasm_unit index bc2a09ee..5d9fa1a3 100755 --- a/scripts/compile_wasm_unit +++ b/scripts/compile_wasm_unit @@ -90,7 +90,7 @@ unit_abi_version=$ABI_VERSION toolchain=$TOOLCHAIN_ID source=$SRC_FN EOF -printf '%s' "$(basename "$WASM_TMP")" > "$MODULE_TMP" +printf '%s' "$(basename "$WASM_FN")" > "$MODULE_TMP" build_pch_if_needed PCH_FLAGS=() @@ -103,6 +103,11 @@ fi "${PCH_FLAGS[@]}" \ -c "$DEST_DIR/$PP_FN" -o "$OBJ_FN" +TASK_EXPORT_FLAGS=(--export-if-defined=__bearer_task) +while IFS= read -r symbol; do + TASK_EXPORT_FLAGS+=("--export-if-defined=$symbol") +done < <("$SDK/bin/llvm-nm" --defined-only "$OBJ_FN" | awk '$NF ~ /^__bearer_task_[A-Za-z_][A-Za-z0-9_]*$/ { print $NF }') + "$SDK/bin/wasm-ld" -shared --experimental-pic \ --gc-sections \ --unresolved-symbols=import-dynamic \ @@ -115,11 +120,12 @@ fi --export-if-defined=__bearer_cli \ --export-if-defined=__bearer_serve_http \ --export-if-defined=__bearer_once \ - --export-if-defined=__bearer_init + --export-if-defined=__bearer_init \ + "${TASK_EXPORT_FLAGS[@]}" -bin/capyc --build-source-map "$SDK/bin/llvm-dwarfdump" "$WASM_TMP" "$(basename "$WASM_TMP")" "$MAP_TMP" +bin/capyc --build-source-map "$SDK/bin/llvm-dwarfdump" "$WASM_TMP" "$(basename "$WASM_FN")" "$MAP_TMP" -"$SDK/bin/llvm-objcopy" --strip-debug \ +"$SDK/bin/llvm-objcopy" --strip-debug --remove-section=name \ --add-section=bearer.abi="$ABI_TMP" \ --add-section=bearer.module="$MODULE_TMP" \ "$WASM_TMP" diff --git a/scripts/fixtures/task_workers/task_handlers.uce b/scripts/fixtures/task_workers/task_handlers.uce new file mode 100644 index 00000000..5a691352 --- /dev/null +++ b/scripts/fixtures/task_workers/task_handlers.uce @@ -0,0 +1,6 @@ +TASK(Request& context) { + file_put_contents("/tmp/bearer-task-worker-fixture", context.props["value"].to_string()); +} +TASK:TRAP(Request& context) { + abort(); +} diff --git a/scripts/run_cli_tests.sh b/scripts/run_cli_tests.sh index 4918de89..721c408a 100755 --- a/scripts/run_cli_tests.sh +++ b/scripts/run_cli_tests.sh @@ -76,6 +76,7 @@ if [[ "$action" == "run" ]]; then scripts/test_abi_generation_rollout.sh scripts/test_wasm_core_smoke.sh scripts/test_capy_phase1.sh + scripts/test_task_workers_runtime.sh scripts/test_capy_reference.sh scripts/test_parallel_precompile.sh timeout --signal=TERM --kill-after=5s 175s scripts/test_parallel_proactive_compile.sh diff --git a/scripts/test_capy_native.sh b/scripts/test_capy_native.sh index 03f6532a..88c03acd 100755 --- a/scripts/test_capy_native.sh +++ b/scripts/test_capy_native.sh @@ -48,6 +48,7 @@ clang++ "${COMMON[@]}" src/capy/frontend.cpp src/capy/wasm.cpp src/capy/compiler scripts/test_capy_native_compiler.cpp -o "$BUILD_DIR/compiler" "$BUILD_DIR/compiler" wasm-validate /tmp/capy-native.wasm +scripts/test_task_compiler_signatures.sh ! grep -Eq 'python3[[:space:]]+scripts/capy_(compiler|frontend|backend)\.py' scripts/compile_wasm_unit "$BUILD_DIR/capyc" site/tests/capy-phase1.capy \ diff --git a/scripts/test_capy_native_compiler.cpp b/scripts/test_capy_native_compiler.cpp index ed4e6f35..7d0d4727 100644 --- a/scripts/test_capy_native_compiler.cpp +++ b/scripts/test_capy_native_compiler.cpp @@ -137,6 +137,35 @@ int main() assert(validated.valid); assert(validated.bearer_module == "native-test.wasm"); assert(result.source_map.starts_with("BEARER_SOURCE_MAP_V1\tnative-test.wasm\n")); + const auto tasks = capy::compile_bearer_unit( + "function TASK(request : request) {}\nfunction TASK_NAME(request : request) {}\n", options); + const auto tasks_repeat = capy::compile_bearer_unit( + "function TASK(request : request) {}\nfunction TASK_NAME(request : request) {}\n", options); + assert(tasks.wasm == tasks_repeat.wasm && tasks.source_map == tasks_repeat.source_map); + const auto task_validation = capy::wasm::validate_bearer_unit(tasks.wasm, {.bearer_abi_version = "11"}); + assert(task_validation.valid && task_validation.exports.size() == 2); + assert(task_validation.exports[0].name == "__bearer_task" && task_validation.exports[0].kind == 0); + assert(task_validation.exports[1].name == "__bearer_task_NAME" && task_validation.exports[1].kind == 0); + for (const auto& imported : task_validation.imports) + assert(imported.module != "env" || imported.name.rfind("bearer_", 0) != 0); + assert(std::string(tasks.wasm.begin(), tasks.wasm.end()).find("bearer_request") == std::string::npos); + for (const auto& [source, expected] : { + std::pair{"function TASK() {}\n", "exactly one request parameter"}, + std::pair{"function TASK(request : request, extra : request) {}\n", "exactly one request parameter"}, + std::pair{"function TASK(value : s32) {}\n", "exactly one request parameter"}, + std::pair{"function TASK(request : request) s32 { 1 }\n", "must return void"}, + std::pair{"function TASK_NAME() {}\n", "exactly one request parameter"}, + std::pair{"function TASK_NAME(request : request, extra : request) {}\n", "exactly one request parameter"}, + std::pair{"function TASK_NAME(value : s32) {}\n", "exactly one request parameter"}, + std::pair{"function TASK_NAME(request : request) s32 { 1 }\n", "must return void"}, + std::pair{"function TASK_NAME(request : request) {}\nfunction TASK_NAME(request : request) {}\n", "duplicate"}, + std::pair{"function TASK_(request : request) {}\n", "suffix must match"}, + std::pair{"function EXPORT___bearer_task(value : dval) dval { value }\nfunction TASK(request : request) {}\n", "collides with custom DValue export"}, + }) + { + try { capy::compile_bearer_unit(source, options); assert(false); } + catch (const capy::Error& error) { assert(error.message.find(expected) != std::string::npos); } + } std::ofstream output("/tmp/capy-native.wasm", std::ios::binary); output.write(reinterpret_cast(result.wasm.data()), result.wasm.size()); diff --git a/scripts/test_capy_phase1.sh b/scripts/test_capy_phase1.sh index fa8d587e..3734b29a 100755 --- a/scripts/test_capy_phase1.sh +++ b/scripts/test_capy_phase1.sh @@ -133,7 +133,8 @@ set -e expect_equal "archive recovery" "3|heXYZ|Ada:admin|archive data|12111|9|0|1" "$(scripts/bearer-cli /tests/capy-final-parity.capy)" expect_equal "live MySQL stdlib adapters" "11|'a\\'b'|7|1|0:0|111|0" "$(scripts/bearer-cli /tests/capy-mysql.capy)" expect_equal "memcache stdlib adapters" "a_b|line_key|down|live|0" "$(scripts/bearer-cli /tests/capy-memcache.capy)" -expect_equal "job/process stdlib adapters" "shell|spawned|done|done|done|cancel|cancelled|no-task|cwd|server|-1|0" "$(scripts/bearer-cli /tests/capy-jobs.capy)" +expect_equal "job/process stdlib adapters" "shell|spawned|done|done|done|cancel|cancelled|tasks|cwd|server|0" "$(scripts/bearer-cli /tests/capy-jobs.capy)" +expect_equal "named task worker cancellation/failure/recovery" "canceled|stopped|failed:handler_trap|failed:missing_handler|succeeded:recovered" "$(scripts/bearer-cli /tests/capy-task-runtime.capy)" expect_equal "unit administration" "1|1|1|2|0" "$(scripts/bearer-cli /tests/capy-unit-admin.capy)" expect_equal "DValue array merge" "rightyesnewright|abcd|valueitem|right|value|z|oddkeep|map|unicode|9|0" "$(scripts/bearer-cli /tests/capy-dval-merge.capy)" expect_equal "DValue value API" '10Ada42tail|1one|Bearer0|1array"A"|f1y|10Adanameengineer|2310|-4242-918446744073709551615|0' "$(scripts/bearer-cli /tests/capy-dval-api.capy)" diff --git a/scripts/test_task_compiler_signatures.sh b/scripts/test_task_compiler_signatures.sh new file mode 100755 index 00000000..2f2f7b3d --- /dev/null +++ b/scripts/test_task_compiler_signatures.sh @@ -0,0 +1,125 @@ +#!/usr/bin/env bash +set -euo pipefail +cd "$(dirname "$0")/.." + +root=$(mktemp -d /tmp/bearer-task-signatures.XXXXXX) +trap 'rm -rf "$root"' EXIT +mkdir -p "$root/out" + +compile() { + local source=$1 wasm=$2 + cp "$root/$source" "$root/out/$source" + scripts/compile_wasm_unit "$root" "$root/out" "$source" "$source" "$wasm" "$root/out" +} + +printf '%s\n' '#include "bearer_lib.h"' 'TASK(Request& request) {}' >"$root/default.cpp" +printf '%s\n' '#include "bearer_lib.h"' 'BEARER_NAMED_TASK(__bearer_task_NAME, (Request& request)) {}' >"$root/named.cpp" +printf '%s\n' '#include "bearer_lib.h"' 'CLI() {}' >"$root/ordinary.cpp" + +compile default.cpp default.wasm +cp "$root/out/default.wasm" "$root/default-first.wasm" +cp "$root/out/default.wasm.source-map" "$root/default-first.map" +compile default.cpp default.wasm +cmp "$root/default-first.wasm" "$root/out/default.wasm" +cmp "$root/default-first.map" "$root/out/default.wasm.source-map" +compile named.cpp named.wasm +cp "$root/out/named.wasm" "$root/named-first.wasm" +cp "$root/out/named.wasm.source-map" "$root/named-first.map" +compile named.cpp named.wasm +cmp "$root/named-first.wasm" "$root/out/named.wasm" +cmp "$root/named-first.map" "$root/out/named.wasm.source-map" +grep -Fq "$root/out/named.cpp" "$root/out/named.wasm.source-map" +grep -q '^L' "$root/out/named.wasm.source-map" +compile ordinary.cpp ordinary.wasm + +python3 - "$root/out/default.wasm" __bearer_task "$root/out/named.wasm" __bearer_task_NAME <<'PY' +import sys + +def u32(data, at): + value = shift = 0 + while True: + byte = data[at] + at += 1 + value |= (byte & 0x7f) << shift + if not byte & 0x80: + return value, at + shift += 7 + +def section(data, wanted): + at = 8 + while at < len(data): + ident, at = u32(data, at) + size, at = u32(data, at) + end = at + size + if ident == wanted: + return data[at:end] + at = end + raise AssertionError(f"missing section {wanted}") + +def task_signature(path, wanted): + data = open(path, 'rb').read() + assert data[:4] == b'\0asm' + types = [] + payload = section(data, 1) + count, at = u32(payload, 0) + for _ in range(count): + assert payload[at] == 0x60 + at += 1 + argc, at = u32(payload, at) + params = tuple(payload[at:at + argc]) + at += argc + resultc, at = u32(payload, at) + results = tuple(payload[at:at + resultc]) + at += resultc + types.append((params, results)) + function_types = [] + payload = section(data, 3) + count, at = u32(payload, 0) + for _ in range(count): + item, at = u32(payload, at) + function_types.append(item) + payload = section(data, 7) + count, at = u32(payload, 0) + for _ in range(count): + length, at = u32(payload, at) + name = payload[at:at + length].decode() + at += length + kind = payload[at] + at += 1 + index, at = u32(payload, at) + if name == wanted: + assert kind == 0 + assert types[function_types[index]] == ((0x7f,), ()) + return + raise AssertionError(f"missing {wanted}") + +for wasm, export in zip(sys.argv[1::2], sys.argv[2::2]): + task_signature(wasm, export) +PY + +for kind in default named; do + for case in zero extra value pointer const nonvoid; do + case "$case" in + zero) parameters='()'; body='{}' ;; + extra) parameters='(Request& request, Request& extra)'; body='{}' ;; + value) parameters='(Request request)'; body='{}' ;; + pointer) parameters='(Request* request)'; body='{}' ;; + const) parameters='(const Request& request)'; body='{}' ;; + nonvoid) parameters='(Request& request)'; body='{ return 1; }' ;; + esac + if [[ "$kind" == default ]]; then + printf '%s\n' '#include "bearer_lib.h"' "TASK$parameters $body" >"$root/invalid-$kind-$case.cpp" + else + printf '%s\n' '#include "bearer_lib.h"' "BEARER_NAMED_TASK(__bearer_task_NAME, $parameters) $body" >"$root/invalid-$kind-$case.cpp" + fi + if compile "invalid-$kind-$case.cpp" "invalid-$kind-$case.wasm" >"$root/$kind-$case.log" 2>&1; then + echo "invalid $kind TASK $case signature compiled" >&2 + exit 1 + fi + if [[ "$case" != nonvoid && "$case" != extra ]]; then + grep -Fq 'TASK must have exact signature void(Request&)' "$root/$kind-$case.log" + fi + done +done + +echo "TASK compiler signature checks passed" diff --git a/scripts/test_task_queue_native.cpp b/scripts/test_task_queue_native.cpp new file mode 100644 index 00000000..da8de6c7 --- /dev/null +++ b/scripts/test_task_queue_native.cpp @@ -0,0 +1,30 @@ +#include "src/lib/types.cpp" +#include "src/lib/dvalue.cpp" +#include +#include +#include + +String random_bytes(u64 count) { String out(count,0);int fd=open("/dev/urandom",O_RDONLY|O_CLOEXEC);if(fd<0)return "";size_t at=0;while(at='0'&&c<='9')||(c>='a'&&c<='f')))return false;return true; } +static bool state(const Result&r,const String&s,bool done) { const DValue* actual=r.status.key("state"),*complete=r.status.key("done");return r.ok()&&actual&&complete&&actual->to_string()==s&&complete->to_bool()==done; } +static u64 task_files(const String& dir) { DIR*d=opendir(dir.c_str());if(!d)return 0;u64 n=0;while(dirent*e=readdir(d))if(String(e->d_name).ends_with(".task"))++n;closedir(d);return n; } +int main(int argc,char** argv) { + if(argc==4&&String(argv[1])=="--submit") { DValue props;props["child"]=argv[3];return submit(argv[2],limits(),"TASK:CHILD",props).ok()?0:1; } + bool ok=true;char root_template[]="/tmp/capy-task-queue.XXXXXX";char* made=mkdtemp(root_template);if(!made)return 2;String root=made; + DValue props;props["name"]="first";props["nested"]["value"]="copied";Result first=submit(root,limits(),"TASK:ONE",props);need(first.ok()&&id_ok(first.task.id),"exact opaque ID",ok);need(state(status(root,limits(),first.task.id),"queued",false),"queued taxonomy and done",ok); + Result claimed=claim(root,limits(),lease('a'));need(claimed.ok()&&claimed.task.id==first.task.id&&claimed.task.props["name"].to_string()=="first"&&claimed.task.props["nested"]["value"].to_string()=="copied","claim copies nested props once",ok);need(state(status(root,limits(),first.task.id),"running",false),"running taxonomy",ok); + need(cancel(root,limits(),first.task.id).ok(),"cancel running request",ok);Result requests=cancellation_requests(root,limits(),1);need(requests.ok()&&requests.count==1&&requests.status["requests"][first.task.id].to_string()==lease('a'),"bounded cancellation enumeration",ok);need(succeed(root,limits(),first.task.id,lease('a')).ok()&&state(status(root,limits(),first.task.id),"canceled",true),"cancel race resolves canceled",ok); + Result missing=status(root,limits(),lease('9'));need(state(missing,"missing",false),"missing taxonomy is status not error",ok); + Result failed=submit(root,limits(),"TASK:FAIL",DValue("2"));Result failed_claim=claim(root,limits(),lease('b'));need(failed_claim.ok()&&fail(root,limits(),failed.task.id,lease('b'),"handler_failed").ok()&&state(status(root,limits(),failed.task.id),"failed",true),"failure is terminal without implicit retry",ok); + Result crash=submit(root,limits(),"TASK:CRASH",DValue());set_claim_crash_after_rename_for_test(true);need(claim(root,limits(),lease('d')).code=="injected_crash","claim fault after rename",ok);set_claim_crash_after_rename_for_test(false);need(task_files(root+"/pending")==0&&task_files(root+"/running")==1&&state(status(root,limits(),crash.task.id),"running",false),"crash leaves only empty-lease running record",ok);need(recover_worker(root,limits(),lease('d')).count==1&&state(status(root,limits(),crash.task.id),"failed",true)&&status(root,limits(),crash.task.id).status["failure_code"].to_string()=="worker_lost","recover empty lease as terminal worker loss",ok);String retained_root=root+"-retention";Result retained=submit(retained_root,limits(),"TASK:RETAIN",DValue());Result retained_claim=claim(retained_root,limits(),lease('a'));need(retained_claim.ok()&&succeed(retained_root,limits(),retained.task.id,lease('a')).ok(),"complete retention fixture",ok);DValue retained_status=status(retained_root,limits(),retained.task.id).status;retained_status["created_ms"]="1";retained_status["completed_ms"]=now_ms();String retained_data=brb_encode(retained_status);int retained_fd=open((retained_root+"/status/"+retained.task.id+".task").c_str(),O_WRONLY|O_TRUNC);need(retained_fd>=0&&write(retained_fd,retained_data.data(),retained_data.size())==(ssize_t)retained_data.size()&&fsync(retained_fd)==0&&close(retained_fd)==0,"set old creation retention fixture",ok);Limits retain=limits();retain.retention_seconds=1;need(reap(retained_root,retain).ok()&&state(status(retained_root,retain,retained.task.id),"succeeded",true),"retention uses completion not creation",ok); + String malformed=root+"/pending/00000000000000000000-"+String(64,'f')+".task";int bad=open(malformed.c_str(),O_WRONLY|O_CREAT|O_TRUNC,0600);write(bad,"bad",3);close(bad);Result after_bad=submit(root,limits(),"TASK:AFTER",DValue("ok"));Result after_claim=claim(root,limits(),lease('f'));need(after_claim.ok()&&after_claim.task.id==after_bad.task.id,"malformed pending does not starve claim",ok);need(state(status(root,limits(),String(64,'f')),"failed",true)&&status(root,limits(),String(64,'f')).status["failure_code"].to_string()=="malformed_record","malformed is failed taxonomy",ok);if(after_claim.ok())need(succeed(root,limits(),after_claim.task.id,lease('f')).ok(),"complete after malformed",ok); + Result await_task=submit(root,limits(),"TASK:AWAIT",DValue());need(state(await(root,limits(),await_task.task.id,5,1),"queued",false),"await expiry returns current status",ok);need(cancel(root,limits(),await_task.task.id).ok()&&state(status(root,limits(),await_task.task.id),"canceled",true),"queued cancel terminal",ok); + String concurrent=root+"-concurrent";std::vector children;for(int n=0;n<6;n++){pid_t pid=fork();if(pid==0){String number=std::to_string(n);execl(argv[0],argv[0],"--submit",concurrent.c_str(),number.c_str(),(char*)0);_exit(127);}children.push_back(pid);}for(pid_t pid:children){int st=0;waitpid(pid,&st,0);need(WIFEXITED(st)&&WEXITSTATUS(st)==0,"concurrent process submit",ok);}std::set ids;for(int n=0;n<6;n++){Result c=claim(concurrent,limits(),lease((char)('0'+n)));need(c.ok()&&ids.insert(c.task.id).second,"concurrent no duplicate claims",ok);if(c.ok())need(succeed(concurrent,limits(),c.task.id,lease((char)('0'+n))).ok(),"concurrent completion",ok);} + usleep(2000);Result reaped=reap(root,limits());need(reaped.ok()&&reaped.count>=5,"retention uses terminal completion",ok);Limits batch=limits();batch.capacity=1;batch.scan_max=1;u64 batch_reaped=0;for(int n=0;n<6;n++)batch_reaped+=reap(concurrent,batch).count;need(batch_reaped==6,"bounded retention batches",ok);return ok?0:1; +} diff --git a/scripts/test_task_queue_native.sh b/scripts/test_task_queue_native.sh new file mode 100755 index 00000000..3a9912bd --- /dev/null +++ b/scripts/test_task_queue_native.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail +repo=$(cd "$(dirname "$0")/.." && pwd) +bin="${TMPDIR:-/tmp}/test_task_queue_native.$$" +trap 'rm -f "$bin"' EXIT +compiler=$(command -v clang++ || command -v g++) +"$compiler" -std=c++20 -fpermissive -DTASK_QUEUE_TESTING -I"$repo" "$repo/scripts/test_task_queue_native.cpp" -o "$bin" +timeout --signal=TERM --kill-after=2s 20s "$bin" diff --git a/scripts/test_task_workers.sh b/scripts/test_task_workers.sh new file mode 100755 index 00000000..3554fd0b --- /dev/null +++ b/scripts/test_task_workers.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Native-only TASK worker regression entrypoint. It never touches a live service. +set -euo pipefail +repo=$(cd "$(dirname "$0")/.." && pwd) +"$repo/scripts/test_task_queue_native.sh" +# Keep the parent-supervision translation unit buildable independently of the +# Wasmtime object; runtime acceptance is run by the deployment harness that has +# the WASI SDK/Wasmtime toolchain and executes this same isolated fixture. +compiler=$(command -v clang++ || command -v g++) +id=$(sha256sum "$repo"/src/capy/*.{cpp,h} "$repo"/src/lib/compiler.cpp "$repo"/src/lib/compiler-parser.cpp | sha256sum | awk '{print $1}') +tmp=${TMPDIR:-/tmp}/capy-task-workers-main.$$.o +trap 'rm -f "$tmp"' EXIT +"$compiler" -c "$repo/src/linux_fastcgi.cpp" -D'EXEC_NAME="bearer_fastcgi"' -D'PLATFORM_NAME="linux"' -std=c++20 -fpermissive -w "-DCAPY_COMPILER_BUILD_ID=\"$id\"" -o "$tmp" +python3 - "$repo/src/linux_fastcgi.cpp" <<'PY' +import re +import sys +source = open(sys.argv[1], encoding="utf-8").read() +cancel = re.search(r"task_queue::Result cancel\(const String& id\)\n\{(.*?)\n\}", source, re.S) +assert cancel, "TASK cancel seam missing" +assert "task_queue::cancel" in cancel.group(1), "request cancellation must persist through queue" +assert "task_worker_processes" not in cancel.group(1) and "kill(" not in cancel.group(1), "request worker must not signal inherited worker state" +assert "cancellation_requests" in source and "SYS_pidfd_send_signal" in source, "parent must read leases and use pinned child identity" +assert "worker_unavailable" in source and "admission_healthy" in source, "admission must fail closed while the parent is unhealthy" +assert "execution_deadline" in source and "wasm_invocation_remaining_ms(execution_deadline)" in source, "compile and handler must share deadline" +PY +echo "task worker transport and native supervisor compile passed" diff --git a/scripts/test_task_workers_runtime.sh b/scripts/test_task_workers_runtime.sh new file mode 100755 index 00000000..fb40b262 --- /dev/null +++ b/scripts/test_task_workers_runtime.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")/.." +settings=/etc/bearer/settings.cfg +backup=$(mktemp) +cp "$settings" "$backup" +restore() { + cp "$backup" "$settings" + rm -f "$backup" + systemctl restart bearer.service >/dev/null 2>&1 || true + timeout 30 systemctl is-active --quiet bearer.service >/dev/null 2>&1 || true + sleep 2 +} +trap restore EXIT + +set_value() { + local key=$1 value=$2 + sed -i "s|^${key}=.*|${key}=${value}|" "$settings" +} +restart() { + systemctl restart bearer.service + timeout 30 systemctl is-active --quiet bearer.service + sleep 2 +} +expect() { + local name=$1 expected=$2 actual=$3 + if [[ "$actual" != "$expected" ]]; then + printf '%s mismatch\nexpected: %q\nactual: %q\n' "$name" "$expected" "$actual" >&2 + exit 1 + fi +} + +set_value TASK_WORKERS 1 +set_value TASK_QUEUE_CAPACITY 1024 +set_value TASK_EXECUTION_TIMEOUT_MS 30000 +restart +expect "one task worker serializes work" "succeeded|succeeded|serial" "$(timeout 25 scripts/bearer-cli /tests/capy-task-concurrency.capy)" +expect "running cancellation, failure isolation, and worker recovery" "canceled|stopped|failed:handler_trap|failed:missing_handler|succeeded:recovered" "$(timeout 30 scripts/bearer-cli /tests/capy-task-runtime.capy)" + +set_value TASK_WORKERS 2 +restart +expect "configured task worker parallelism" "succeeded|succeeded|parallel" "$(timeout 20 scripts/bearer-cli /tests/capy-task-concurrency.capy)" + +set_value TASK_WORKERS 1 +set_value TASK_EXECUTION_TIMEOUT_MS 200 +restart +expect "shared task compile/invocation deadline" "failed:execution_timeout" "$(timeout 15 scripts/bearer-cli /tests/capy-task-timeout.capy)" + +set_value TASK_EXECUTION_TIMEOUT_MS 30000 +set_value TASK_QUEUE_CAPACITY 1 +restart +set +e +overflow=$(timeout 15 scripts/bearer-cli /tests/capy-task-overflow.capy 2>&1) +overflow_status=$? +set -e +if [[ $overflow_status -eq 0 || "$overflow" == *must-not-run* ]]; then + printf 'bounded task queue did not fail closed: status=%s output=%q\n' "$overflow_status" "$overflow" >&2 + exit 1 +fi + +echo "dedicated task worker runtime passed" diff --git a/scripts/test_unit_export_surface.sh b/scripts/test_unit_export_surface.sh index be4f4100..c8aa4f63 100755 --- a/scripts/test_unit_export_surface.sh +++ b/scripts/test_unit_export_surface.sh @@ -33,12 +33,14 @@ printf '%s\n' \ 'String visibility_used() { return("private-used"); }' \ 'String visibility_unused() { return("bearer-private-unused-marker-8f61d2"); }' \ 'EXPORT String visibility_shared() { return("shared"); }' \ + 'TASK(Request& context) {}' \ 'CLI(Request& context) { print(visibility_shared(), ":", visibility_used(), ":", component("named:NAMED", context)); }' \ >"$source_dir/entry.uce" printf '%s\n' \ 'String named_used() { return("private-named-used"); }' \ 'String named_unused() { return("bearer-named-unused-marker-4ae973"); }' \ 'EXPORT String named_shared() { return("named-export"); }' \ + 'TASK:NAME(Request& context) {}' \ 'COMPONENT:NAMED(Request& context) { print(named_shared(), ":", named_used()); }' \ >"$source_dir/named.uce" @@ -53,8 +55,8 @@ named_wasm="$artifact_dir/named.uce.wasm" for wasm in "$entry_wasm" "$named_wasm"; do wasm-objdump -x "$wasm" >"$wasm.objdump" case "$wasm" in - "$entry_wasm") expected='__wasm_call_ctors __bearer_set_current_request __bearer_cli visibility_shared'; marker='bearer-private-unused-marker-8f61d2' ;; - *) expected='__wasm_call_ctors __bearer_set_current_request __bearer_component_NAMED named_shared'; marker='bearer-named-unused-marker-4ae973' ;; + "$entry_wasm") expected='__wasm_call_ctors __bearer_set_current_request __bearer_cli __bearer_task visibility_shared'; marker='bearer-private-unused-marker-8f61d2' ;; + *) expected='__wasm_call_ctors __bearer_set_current_request __bearer_component_NAMED __bearer_task_NAME named_shared'; marker='bearer-named-unused-marker-4ae973' ;; esac grep -aFq "$marker" "$wasm" && { echo "$wasm retained unused private code marker" >&2; exit 1; } # Export surface must be exactly the expected set (no missing, no unexpected). diff --git a/site/demo/index.uce b/site/demo/index.uce index 44478bc3..0f870f16 100644 --- a/site/demo/index.uce +++ b/site/demo/index.uce @@ -73,7 +73,6 @@ RENDER(Request& context) -
diff --git a/site/demo/task-status.uce b/site/demo/task-status.uce deleted file mode 100644 index 3f1c48e2..00000000 --- a/site/demo/task-status.uce +++ /dev/null @@ -1,16 +0,0 @@ -#include "demo_guard.h" - - -RENDER(Request& context) -{ - if(!test_demo_request_allowed(context)) - { - test_demo_render_restricted_text(context, "Task Status", "inspect background task state"); - return; - } - String task_name = first(context.get["task-name"], "example-task"); - - print("Task Name: ", task_name, "\n"); - print("Task ID: ", task_pid(task_name), "\n"); - print("Task Running: ", task_pid(task_name) == 0 ? "no" : "yes", "\n"); -} diff --git a/site/demo/task.uce b/site/demo/task.uce index 7112d155..2cac858d 100644 --- a/site/demo/task.uce +++ b/site/demo/task.uce @@ -1,87 +1,17 @@ - #include "demo_guard.h" RENDER(Request& context) { if(!test_demo_request_allowed(context)) { - test_demo_render_restricted_html(context, "Tasks", "spawn and inspect background tasks"); + test_demo_render_restricted_html(context, "Tasks", "enqueue named background tasks"); return; } - DValue t; - - String task_name = first(context.get["task-name"], "example-task"); - - <> - -

- BEARER Test: - Tasks -

- - - -
- Task name - - - -
- - - - Task Status - -
- - - Task Start - -
- - Params -
- - + String id = context.get["id"]; + if(context.get["cmd"] == "Execute") + { + DValue props; props["nested"]["value"] = "demo"; + id = task("/tests/task-handlers.uce", props); + } + <>

Tasks

; } diff --git a/site/demo/task_repeat.uce b/site/demo/task_repeat.uce deleted file mode 100644 index 201ae1c9..00000000 --- a/site/demo/task_repeat.uce +++ /dev/null @@ -1,87 +0,0 @@ - -#include "demo_guard.h" - -RENDER(Request& context) -{ - if(!test_demo_request_allowed(context)) - { - test_demo_render_restricted_html(context, "Task repeat", "schedule recurring background tasks"); - return; - } - DValue t; - - String task_name = first(context.get["task-name"], "example-task"); - - <> - -

- BEARER Test: - Task repeat -

- - - -
- Task name - - - -
- - - - Task Status - -
- - - Task Start - -
- - Params -
- - -} diff --git a/site/doc/areas/task.txt b/site/doc/areas/task.txt index 054902b1..01e853c9 100644 --- a/site/doc/areas/task.txt +++ b/site/doc/areas/task.txt @@ -1,6 +1,6 @@ -Task API +Background tasks task -task_repeat -task_pid -task_kill +task_status +task_await +task_cancel diff --git a/site/doc/examples/task_worker.capy b/site/doc/examples/task_worker.capy new file mode 100644 index 00000000..6d063397 --- /dev/null +++ b/site/doc/examples/task_worker.capy @@ -0,0 +1,4 @@ +function TASK_STORE(request : request) { + var context := request_context(request) + file_put_contents("/tmp/bearer-doc-task.txt", dval_to_string(context["props"]["message"])) +} diff --git a/site/doc/index.uce b/site/doc/index.uce index 57555540..854a5f01 100644 --- a/site/doc/index.uce +++ b/site/doc/index.uce @@ -45,19 +45,37 @@ void render_doc_params(DValue param_lines) ?>
} -String doc_example_path(Request& context, String page, u64 idx) +// The shared DocPage parser validates typed pairs before artifact creation. +bool doc_example_safe_member(String value) { - String bin_dir = context.params["BEARER_BIN_DIRECTORY"]; - if(bin_dir == "") - return(""); - String dir = path_join(bin_dir, "doc-examples"); - mkdir(dir); - return(path_join(dir, page + "_" + std::to_string(idx + 1) + ".uce")); + if(value == "") + return(false); + for(char c : value) + if(!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_' || c == '-')) + return(false); + return(true); } -String doc_example_unit_source(String body) +String doc_example_path(Request& context, String page, u64 idx, String language) { - return("RENDER(Request& context)\n{\n" + body + "\n}\n"); + String bin_dir = context.params["BEARER_BIN_DIRECTORY"]; + String member = ascii_safe_name(page); + if(bin_dir == "" || !doc_example_safe_member(member) || (language != "capy" && language != "cpp")) + return(""); + String root = path_join(bin_dir, "doc-examples"); + if(!file_exists(root) && !mkdir(root)) + return(""); + if(!path_is_within(root, bin_dir)) + return(""); + return(path_join(root, member + "_" + std::to_string(idx + 1) + "." + (language == "capy" ? "capy" : "uce"))); +} + +String doc_example_unit_source(String language, String entry, String body) +{ + String handler = doc_example_handler_name(entry); + if(language == "capy") + return("function " + handler + " {\n" + body + "\n}\n"); + return(handler + "(Request& context)\n{\n" + body + "\n}\n"); } bool doc_write_if_changed(String path, String content) @@ -67,39 +85,108 @@ bool doc_write_if_changed(String path, String content) return(file_put_contents(path, content)); } -String doc_render_example_output(Request& context, String page, u64 idx, String body) +DValue doc_compile_example(Request& context, String page, u64 idx, String language, String entry, String body) { - String path = doc_example_path(context, page, idx); + DValue result; + String path = doc_example_path(context, page, idx, language); if(path == "") - return("DOC EXAMPLE ERROR: BEARER_BIN_DIRECTORY is not available"); - String unit_source = doc_example_unit_source(body); - if(!doc_write_if_changed(path, unit_source)) - return("DOC EXAMPLE ERROR: could not write " + path); + { + result["error"] = "DOC EXAMPLE ERROR: invalid example artifact path"; + return(result); + } + if(!doc_write_if_changed(path, doc_example_unit_source(language, entry, body))) + { + result["error"] = "DOC EXAMPLE ERROR: could not write " + path; + return(result); + } if(!unit_compile(path)) - return("DOC EXAMPLE ERROR: unit_compile failed for " + path); - - ob_start(); - unit_render(path); - String out = ob_get_close(); - if(out == "") - return("DOC EXAMPLE ERROR: example produced no output"); - return(out); + { + result["error"] = "DOC EXAMPLE ERROR: unit_compile failed for " + path; + return(result); + } + result["path"] = path; + return(result); } -void render_doc_examples(Request& context, String page, DValue example_blocks) +DValue doc_render_example(Request& context, String page, u64 idx, String language, String entry, String body) { - for(u64 idx = 0; idx < example_blocks.size(); idx++) + DValue result = doc_compile_example(context, page, idx, language, entry, body); + if(result["error"].to_string() != "" || entry != "render") + return(result); + ob_start(); + unit_render(result["path"].to_string()); + result["output"] = ob_get_close(); + return(result); +} + +void render_doc_example_result(String language, String entry, String body, DValue result) +{ + ?>
+

+
-

Example

-
-
-
Output
-
-
-
Error
Output
Compile-only: is not executed by documentation rendering.

Example format error

Capy status:
+

Example:

Parity error
DOC EXAMPLE ERROR: Capy and C++ render output differs

C++ example:

Legacy C++ example

set("localhost"); print(config.has("host") ? config["host"].to_string() : "missing", "\n"); diff --git a/site/doc/pages/2_DValue_get_type_name.txt b/site/doc/pages/2_DValue_get_type_name.txt index d13af0f3..798ad316 100644 --- a/site/doc/pages/2_DValue_get_type_name.txt +++ b/site/doc/pages/2_DValue_get_type_name.txt @@ -11,7 +11,12 @@ return value : one of String, f64, bool, array, pointer, reference, or unknown Returns a human-readable name for the dereferenced value's type tag. -:example +:example capy render +var scalar := dval("text") +var map_value := dval({"k": "v"}) +print(dval_get_type_name(scalar), " / ", dval_get_type_name(map_value), "\n") + +:example cpp render DValue s; s.set("text"); DValue m; m["k"] = "v"; print(s.get_type_name(), " / ", m.get_type_name(), "\n"); diff --git a/site/doc/pages/2_DValue_has.txt b/site/doc/pages/2_DValue_has.txt index be66eb9c..c4374bab 100644 --- a/site/doc/pages/2_DValue_has.txt +++ b/site/doc/pages/2_DValue_has.txt @@ -14,7 +14,12 @@ return value : true when the dereferenced value is map-shaped and contains the k :content Checks for a child key without creating it. Returns false for scalars and missing keys. -:example +:example capy render +var user := dval({"name": "Ada"}) +if dval_has(user, "name") { print("has name") } else { print("no name") } +if dval_has(user, "age") { print(" / has age\n") } else { print(" / no age\n") } + +:example cpp render DValue u; u["name"] = "Ada"; print(u.has("name") ? "has name" : "no name", " / ", u.has("age") ? "has age" : "no age", "\n"); diff --git a/site/doc/pages/2_DValue_is_array.txt b/site/doc/pages/2_DValue_is_array.txt index c600df4a..cca2a423 100644 --- a/site/doc/pages/2_DValue_is_array.txt +++ b/site/doc/pages/2_DValue_is_array.txt @@ -12,7 +12,11 @@ return value : true when the dereferenced value is map-shaped :content Returns true when the value's current type is `M`, the map/list container type. It does not require contiguous numeric keys; use `is_list()` for that. -:example +:example capy render +var user := dval({"name": "Ada"}) +if dval_is_array(user) { print("array\n") } else { print("scalar\n") } + +:example cpp render DValue user; user["name"] = "Ada"; print(user.is_array() ? "array\n" : "scalar\n"); diff --git a/site/doc/pages/2_DValue_is_list.txt b/site/doc/pages/2_DValue_is_list.txt index 6b4c0478..f81a2324 100644 --- a/site/doc/pages/2_DValue_is_list.txt +++ b/site/doc/pages/2_DValue_is_list.txt @@ -13,7 +13,11 @@ return value : true when the value is an array with keys 0..n-1 :content Returns true for map-shaped values that represent a list. An empty map is a list only if it was explicitly put in list mode with `set_array()` or by list operations. Non-empty lists must have canonical numeric string keys from `0` through `size - 1`. -:example +:example capy render +var list := dval_push(dval([]), dval("Ada")) +if dval_is_list(list) { print("list\n") } else { print("map\n") } + +:example cpp render DValue list; DValue item; item = "Ada"; list.push(item); diff --git a/site/doc/pages/2_DValue_is_reference.txt b/site/doc/pages/2_DValue_is_reference.txt index 0340dc51..6f13f1a6 100644 --- a/site/doc/pages/2_DValue_is_reference.txt +++ b/site/doc/pages/2_DValue_is_reference.txt @@ -13,7 +13,11 @@ return value : true when this node itself is a reference node Reports whether the current node's direct type tag is the internal reference tag. Most read methods dereference automatically; this helper is mainly useful when handling reference-aware runtime state. -:example +:capy-status unsupported + +Capy values have no reference identity: boundary crossings dereference copied values, so this predicate has no equivalent. + +:example cpp render DValue target; target.set("x"); DValue ref; ref.set_reference(&target); DValue plain; plain.set("y"); diff --git a/site/doc/pages/2_DValue_key.txt b/site/doc/pages/2_DValue_key.txt index 787f142e..826e0849 100644 --- a/site/doc/pages/2_DValue_key.txt +++ b/site/doc/pages/2_DValue_key.txt @@ -15,7 +15,11 @@ return value : pointer to existing child, or 0 Looks up one child without creating it. The non-const overload forwards through references; both overloads return `0` for scalars or missing keys. -:example +:example capy render +var user := dval({"email": "ada@example.test"}) +print(dval_to_string(dval_key(user, "email"), "none"), " / ", dval_to_string(dval_key(user, "phone"), "absent"), "\n") + +:example cpp render DValue user; user["email"] = "ada@example.test"; const DValue* found = user.key("email"); diff --git a/site/doc/pages/2_DValue_keys.txt b/site/doc/pages/2_DValue_keys.txt index 087a5820..6bcc2323 100644 --- a/site/doc/pages/2_DValue_keys.txt +++ b/site/doc/pages/2_DValue_keys.txt @@ -13,7 +13,11 @@ return value : child keys for map/list values; empty for scalars :content Returns the keys produced by `each()`. Scalar values have no child key, so the result is empty. List-shaped values return their numeric keys as strings. -:example +:example capy render +var user := dval({"name": "Ada", "role": "admin"}) +print(join(sort(dval_keys(user)), ","), "\n") + +:example cpp render DValue user; user["name"] = "Ada"; user["role"] = "admin"; diff --git a/site/doc/pages/2_DValue_map.txt b/site/doc/pages/2_DValue_map.txt index 203d02f2..8cdb5d29 100644 --- a/site/doc/pages/2_DValue_map.txt +++ b/site/doc/pages/2_DValue_map.txt @@ -14,7 +14,12 @@ return value : mapped copy :content Builds a new `DValue` by replacing each iterated child with the mapper's returned value. List-shaped input stays list-shaped and is re-indexed by `push()`. Map-shaped input preserves keys. Scalar input is mapped once and pushed into a list. -:example +:example capy render +var names := dval(["ada", "grace"]) +var upper := dval_map(names, function(item : dval, key : string) dval { return dval(to_upper(dval_to_string(item))) }) +print(dval_to_string(upper[0]), ",", dval_to_string(upper[1]), "\n") + +:example cpp render DValue names; DValue first; first = "ada"; DValue second; second = "grace"; diff --git a/site/doc/pages/2_DValue_operator_index.txt b/site/doc/pages/2_DValue_operator_index.txt index 9da6c57a..c7d04391 100644 --- a/site/doc/pages/2_DValue_operator_index.txt +++ b/site/doc/pages/2_DValue_operator_index.txt @@ -18,7 +18,11 @@ return value : reference to the child node Returns a mutable reference to a child, creating the child when it does not already exist. If this value is an internal reference, the operation is forwarded to the target. This has the same creation behavior as `get_or_create()`, so use `has()`, `key()`, or `get_by_path()` for non-mutating reads. -:example +:example capy render +var value := dval({"a": {"b": "nested"}}) +print(dval_to_string(value["a"]["b"]), "\n") + +:example cpp render DValue m; m["a"]["b"] = "nested"; print(m["a"]["b"].to_string(), "\n"); diff --git a/site/doc/pages/2_DValue_pop.txt b/site/doc/pages/2_DValue_pop.txt index 4400f9ff..9ef60a34 100644 --- a/site/doc/pages/2_DValue_pop.txt +++ b/site/doc/pages/2_DValue_pop.txt @@ -12,7 +12,13 @@ return value : removed child, or an empty DValue when no child exists Ensures the value is map-shaped, removes the last entry according to `std::map` reverse key order, and returns it. For list-mode values, the next array index is reset to the new size. -:example +:example capy render +var list := dval_push(dval_push(dval([]), dval("first")), dval("last")) +var popped := list[1] +list = dval_pop(list) +if dval_has(list, "0") { print("popped ", dval_to_string(popped), ", remaining 1\n") } else { print("popped ", dval_to_string(popped), ", remaining 0\n") } + +:example cpp render DValue list; list.set_array(); DValue a; a.set("first"); list.push(a); diff --git a/site/doc/pages/2_DValue_push.txt b/site/doc/pages/2_DValue_push.txt index f46d0162..5d760dc7 100644 --- a/site/doc/pages/2_DValue_push.txt +++ b/site/doc/pages/2_DValue_push.txt @@ -14,7 +14,11 @@ return value : none Appends a child under the next numeric key. Empty values become list-shaped. Existing contiguous lists continue at their size; non-list maps use the next unused numeric key and remain non-list. -:example +:example capy render +var list := dval_push(dval_push(dval([]), dval("x")), dval("y")) +if dval_has(list, "1") { print("count: 2\n") } else { print("count: 1\n") } + +:example cpp render DValue list; list.set_array(); DValue a; a.set("x"); list.push(a); diff --git a/site/doc/pages/2_DValue_reference_target.txt b/site/doc/pages/2_DValue_reference_target.txt index 349279c2..9a70a50f 100644 --- a/site/doc/pages/2_DValue_reference_target.txt +++ b/site/doc/pages/2_DValue_reference_target.txt @@ -14,7 +14,11 @@ return value : resolved target pointer, or 0 when this node is not a usable refe If this node is an internal reference, follows reference links up to the runtime safety limit and returns the final non-reference target. Returns `0` for non-references, null/self references, or chains that still resolve to a reference. -:example +:capy-status unsupported + +Capy exposes no host DValue pointer or alias ABI, so a reference target cannot be observed. + +:example cpp render DValue target; target.set("data"); DValue ref; diff --git a/site/doc/pages/2_DValue_remove.txt b/site/doc/pages/2_DValue_remove.txt index a39c44b6..090b1dd0 100644 --- a/site/doc/pages/2_DValue_remove.txt +++ b/site/doc/pages/2_DValue_remove.txt @@ -14,7 +14,12 @@ return value : none Ensures the value is map-shaped and erases the named child. Removing the last child resets the next array index to zero. -:example +:example capy render +var user := dval_remove(dval({"a": "1", "b": "2"}), "a") +if dval_has(user, "a") { print("has a: yes") } else { print("has a: no") } +if dval_has(user, "b") { print(", has b: yes\n") } else { print(", has b: no\n") } + +:example cpp render DValue u; u["a"] = "1"; u["b"] = "2"; u.remove("a"); diff --git a/site/doc/pages/2_DValue_set.txt b/site/doc/pages/2_DValue_set.txt index 4a6f7247..4880c932 100644 --- a/site/doc/pages/2_DValue_set.txt +++ b/site/doc/pages/2_DValue_set.txt @@ -21,7 +21,11 @@ return value : none Assigns a new value, forwarding through references when possible. String, pointer, and f64 overloads set scalar nodes. `set(DValue)` copies the source's current type and payload. `set(StringMap)` creates a map-shaped value with each string entry as a child. -:example +:example capy render +var value := dval_set(dval(""), dval("hello")) +print(dval_to_string(value), "\n") + +:example cpp render DValue v; v.set("hello"); print(v.to_string(), "\n"); diff --git a/site/doc/pages/2_DValue_set_array.txt b/site/doc/pages/2_DValue_set_array.txt index a7cf181e..fc99830e 100644 --- a/site/doc/pages/2_DValue_set_array.txt +++ b/site/doc/pages/2_DValue_set_array.txt @@ -13,7 +13,12 @@ return value : none Clears the value and makes it an empty list-shaped map. Subsequent `push()` calls append numeric keys starting at `0`. -:example +:example capy render +var list := dval_push(dval_set_array(dval("")), dval("first")) +if dval_is_list(list) { print("is_list=yes") } else { print("is_list=no") } +if dval_has(list, "0") { print(" count=1\n") } else { print(" count=0\n") } + +:example cpp render DValue list; list.set_array(); DValue item; item.set("first"); diff --git a/site/doc/pages/2_DValue_set_bool.txt b/site/doc/pages/2_DValue_set_bool.txt index c73d0b18..a37fdb8c 100644 --- a/site/doc/pages/2_DValue_set_bool.txt +++ b/site/doc/pages/2_DValue_set_bool.txt @@ -13,7 +13,11 @@ return value : none Stores a boolean value, forwarding through references when possible. -:example +:example capy render +var flag := dval_set_bool(dval(""), true) +if dval_to_bool(flag) { print("true\n") } else { print("false\n") } + +:example cpp render DValue flag; flag.set_bool(true); print(flag.to_bool() ? "true" : "false", "\n"); diff --git a/site/doc/pages/2_DValue_set_reference.txt b/site/doc/pages/2_DValue_set_reference.txt index ccb41b0c..13c2bc83 100644 --- a/site/doc/pages/2_DValue_set_reference.txt +++ b/site/doc/pages/2_DValue_set_reference.txt @@ -13,7 +13,11 @@ return value : none Stores an internal reference to another `DValue`. Most unit code should not need to create references directly; normal reads and writes generally follow existing references automatically. -:example +:capy-status unsupported + +Capy uses copied values and exposes no reference-parameter ABI, so it cannot create a DValue reference. + +:example cpp render DValue target; target.set("original"); DValue ref; diff --git a/site/doc/pages/2_DValue_set_type.txt b/site/doc/pages/2_DValue_set_type.txt index 7398afe2..d2ac59f1 100644 --- a/site/doc/pages/2_DValue_set_type.txt +++ b/site/doc/pages/2_DValue_set_type.txt @@ -16,7 +16,12 @@ Changes the node's internal type tag, forwarding through references when possibl Prefer the typed setters (`set`, `set_bool`, `set_array`) in normal unit code. -:example +:example capy render +var value := dval_set_type(dval(""), "M") +value = dval_push(value, dval("x")) +print("type after set_array: ", dval_get_type_name(value), "\n") + +:example cpp render DValue v; v.set_array(); DValue item; item.set("x"); v.push(item); diff --git a/site/doc/pages/2_DValue_to_bool.txt b/site/doc/pages/2_DValue_to_bool.txt index 7d5aadaf..779270fe 100644 --- a/site/doc/pages/2_DValue_to_bool.txt +++ b/site/doc/pages/2_DValue_to_bool.txt @@ -13,7 +13,11 @@ return value : converted value or the fallback :content Converts strings, numbers, bools, pointers, and maps to bool. Text such as `true`, `yes`, `on`, `1`, `false`, `no`, `off`, `0`, and `null` is recognized; non-empty unparseable strings are truthy; empty strings use the default. Multi-child maps are true when non-empty. -:example +:example capy render +var value := dval("true") +if dval_to_bool(value) { print("true\n") } else { print("false\n") } + +:example cpp render DValue value; value = "true"; print(value.to_bool() ? "true\n" : "false\n"); diff --git a/site/doc/pages/2_DValue_to_f64.txt b/site/doc/pages/2_DValue_to_f64.txt index 31f94c40..863b9780 100644 --- a/site/doc/pages/2_DValue_to_f64.txt +++ b/site/doc/pages/2_DValue_to_f64.txt @@ -13,7 +13,11 @@ return value : converted value or the fallback :content Converts strings, f64, bool, pointer, and single-value maps to a finite double. Invalid or empty strings return the default. -:example +:example capy render +var value := dval("12.5") +print(dval_to_f64(value), "\n") + +:example cpp render DValue value; value = "12.5"; print(value.to_f64(), "\n"); diff --git a/site/doc/pages/2_DValue_to_json.txt b/site/doc/pages/2_DValue_to_json.txt index 0264f9ae..76f387ad 100644 --- a/site/doc/pages/2_DValue_to_json.txt +++ b/site/doc/pages/2_DValue_to_json.txt @@ -13,7 +13,11 @@ json_encode :content Returns the JSON scalar representation used by this low-level method: strings are escaped and quoted, numbers are emitted with `std::to_string`, bools as `true`/`false`, maps as `"(array)"`, pointers as `"(pointer)"`, and references as `"(reference)"`. For full structured encoding, use the runtime JSON helpers. -:example +:example capy render +var value := dval("Ada") +print(dval_to_json(value), "\n") + +:example cpp render DValue value; value = "Ada"; print(value.to_json(), "\n"); diff --git a/site/doc/pages/2_DValue_to_s64.txt b/site/doc/pages/2_DValue_to_s64.txt index 412db50a..372ca5e4 100644 --- a/site/doc/pages/2_DValue_to_s64.txt +++ b/site/doc/pages/2_DValue_to_s64.txt @@ -13,7 +13,11 @@ return value : converted value or the fallback :content Converts strings, f64, bool, pointer, and single-value maps to a signed integer. Invalid or empty strings return the default. Values outside the signed range are clamped. -:example +:example capy render +var value := dval("-42") +print(dval_to_s64(value), "\n") + +:example cpp render DValue value; value = "-42"; print(value.to_s64(), "\n"); diff --git a/site/doc/pages/2_DValue_to_string.txt b/site/doc/pages/2_DValue_to_string.txt index af43343c..32c603d8 100644 --- a/site/doc/pages/2_DValue_to_string.txt +++ b/site/doc/pages/2_DValue_to_string.txt @@ -13,7 +13,11 @@ return value : converted value or the fallback :content Returns the stored string, converts f64/bool/pointer values to text, and returns the default for empty strings, maps, unresolved references, or unknown types. Bool text is `(true)` or `(false)`. -:example +:example capy render +var value := dval(true) +print(dval_to_string(value), "\n") + +:example cpp render DValue value; -value = true; +value.set_bool(true); print(value.to_string(), "\n"); diff --git a/site/doc/pages/2_DValue_to_stringmap.txt b/site/doc/pages/2_DValue_to_stringmap.txt index 87621444..0d8f16d8 100644 --- a/site/doc/pages/2_DValue_to_stringmap.txt +++ b/site/doc/pages/2_DValue_to_stringmap.txt @@ -13,7 +13,12 @@ return value : StringMap copy of the value :content Converts a `DValue` to `StringMap`. Map children become entries converted with `to_string()`. Non-empty strings become `value=`. f64, bool, and pointer values become `value=`. References that cannot be resolved produce an empty map. -:example +:example capy render +var user := dval({"name": "Ada"}) +var fields := dval_to_stringmap(user) +print(dval_to_string(fields["name"]), "\n") + +:example cpp render DValue user; user["name"] = "Ada"; StringMap fields = user.to_stringmap(); diff --git a/site/doc/pages/2_DValue_to_u64.txt b/site/doc/pages/2_DValue_to_u64.txt index 3099ad6f..d906acb0 100644 --- a/site/doc/pages/2_DValue_to_u64.txt +++ b/site/doc/pages/2_DValue_to_u64.txt @@ -13,7 +13,11 @@ return value : converted value or the fallback :content Converts strings, f64, bool, pointer, and single-value maps to an unsigned integer. Invalid or empty strings return the default. Negative values clamp to zero and oversized values clamp to `u64` max. -:example +:example capy render +var value := dval("42") +print(dval_to_u64(value), "\n") + +:example cpp render DValue value; value = "42"; print(value.to_u64(), "\n"); diff --git a/site/doc/pages/2_DValue_values.txt b/site/doc/pages/2_DValue_values.txt index 25064d36..9537cec7 100644 --- a/site/doc/pages/2_DValue_values.txt +++ b/site/doc/pages/2_DValue_values.txt @@ -13,7 +13,12 @@ return value : a list-shaped DValue containing each iterated child value :content Copies the values produced by `each()` into a new list-shaped `DValue`. -:example +:example capy render +var user := dval({"name": "Ada", "role": "admin"}) +var values := dval_values(user) +if dval_is_list(values) { print("list\n") } else { print("map\n") } + +:example cpp render DValue user; user["name"] = "Ada"; user["role"] = "admin"; diff --git a/site/doc/pages/2_Request_ob_start.txt b/site/doc/pages/2_Request_ob_start.txt index eca8fce9..218f3563 100644 --- a/site/doc/pages/2_Request_ob_start.txt +++ b/site/doc/pages/2_Request_ob_start.txt @@ -13,7 +13,13 @@ ob_get_close Starts a new output buffer for the request and makes it the active `context.ob`. Most unit code should prefer the higher-level output-buffer helpers (`ob_start()`, `ob_get()`, `ob_get_close()`, `ob_close()`) rather than calling the method directly. -:example +:example capy render +ob_start() +print("fragment") +var captured := ob_get_close() +print("captured: ", captured, "\n") + +:example cpp render context.ob_start(); print("fragment"); String captured = ob_get_close(); diff --git a/site/doc/pages/2_Request_set_status.txt b/site/doc/pages/2_Request_set_status.txt index 3c261148..eb8174d4 100644 --- a/site/doc/pages/2_Request_set_status.txt +++ b/site/doc/pages/2_Request_set_status.txt @@ -15,6 +15,9 @@ set_cookie :content Sets the request status line and mirrors the numeric status into `context.flags.status`. When `reason` is omitted, common HTTP status codes get their standard phrase. FastCGI-style requests use a `Status:` prefix; other requests use `HTTP/1.1`. -:example +:example capy render +response_status(200, "OK") +print("200\n") +:example cpp render context.set_status(200, "OK"); print(context.flags.status, "\n"); diff --git a/site/doc/pages/2_StringList_each.txt b/site/doc/pages/2_StringList_each.txt index b23f6b7c..17d914dc 100644 --- a/site/doc/pages/2_StringList_each.txt +++ b/site/doc/pages/2_StringList_each.txt @@ -7,3 +7,12 @@ Removed as a separate StringList API. List-shaped `DValue::each()` invokes the c :see 0_DValue 2_DValue_each + +:example capy render +var items := split("one,two", ",") +each(items, function(value : string) string { print(value); return "" }) +print("\n") +:example cpp render +StringList items = split("one,two", ","); +items.each([](String value) { print(value); }); +print("\n"); diff --git a/site/doc/pages/2_StringList_every.txt b/site/doc/pages/2_StringList_every.txt index 914bcc99..5d786d9b 100644 --- a/site/doc/pages/2_StringList_every.txt +++ b/site/doc/pages/2_StringList_every.txt @@ -6,3 +6,10 @@ Removed as a separate StringList API. List-shaped `DValue::every()` returns true :see 0_DValue + +:example capy render +var items := split("one,two", ",") +if every(items, function(value : string) bool { return value != "" }) { print("all\n") } else { print("not all\n") } +:example cpp render +StringList items = split("one,two", ","); +print(items.every([](String value) { return value != ""; }) ? "all\n" : "not all\n"); diff --git a/site/doc/pages/2_StringList_filter.txt b/site/doc/pages/2_StringList_filter.txt index 296e3958..4fd5ce66 100644 --- a/site/doc/pages/2_StringList_filter.txt +++ b/site/doc/pages/2_StringList_filter.txt @@ -7,3 +7,11 @@ Removed as a separate StringList API. List-shaped `DValue::filter()` returns the :see 0_DValue 2_DValue_filter + +:example capy render +var items := split("one,two", ",") +var kept := filter(items, function(value : string) bool { return value == "two" }) +print(join(kept, ","), "\n") +:example cpp render +StringList items = split("one,two", ","); +print(join(items.filter([](String value) { return value == "two"; }), ","), "\n"); diff --git a/site/doc/pages/2_StringList_find.txt b/site/doc/pages/2_StringList_find.txt index 35e12483..452f9ce9 100644 --- a/site/doc/pages/2_StringList_find.txt +++ b/site/doc/pages/2_StringList_find.txt @@ -6,3 +6,10 @@ Removed as a separate StringList API. List-shaped `DValue::find()` returns the f :see 0_DValue + +:example capy render +var items := split("one,two", ",") +print(string_list_find(items, function(value : string) bool { return value == "two" }, "missing"), "\n") +:example cpp render +StringList items = split("one,two", ","); +print(items.find([](String value) { return value == "two"; }, "missing"), "\n"); diff --git a/site/doc/pages/2_StringList_keys.txt b/site/doc/pages/2_StringList_keys.txt index 4a941296..ba7e661e 100644 --- a/site/doc/pages/2_StringList_keys.txt +++ b/site/doc/pages/2_StringList_keys.txt @@ -7,3 +7,12 @@ Removed as a separate StringList API. `DValue::keys()` returns a list-shaped DVa :see 0_DValue 2_DValue_keys + +:example capy render +var items := split("one,two", ",") +print(join(keys(items), ","), "\n") +:example cpp render +DValue items; DValue one; one = "one"; DValue two; two = "two"; +items.push(one); items.push(two); +DValue item_keys = items.keys(); +print(item_keys[0].to_string(), ",", item_keys[1].to_string(), "\n"); diff --git a/site/doc/pages/2_StringList_map.txt b/site/doc/pages/2_StringList_map.txt index dc9b17af..c003cdfd 100644 --- a/site/doc/pages/2_StringList_map.txt +++ b/site/doc/pages/2_StringList_map.txt @@ -7,3 +7,11 @@ Removed as a separate StringList API. List-shaped `DValue::map()` returns mapped :see 0_DValue 2_DValue_map + +:example capy render +var items := split("one,two", ",") +var upper := map(items, function(value : string) string { return to_upper(value) }) +print(join(upper, ","), "\n") +:example cpp render +StringList items = split("one,two", ","); +print(join(items.map([](String value) { return to_upper(value); }), ","), "\n"); diff --git a/site/doc/pages/2_StringList_some.txt b/site/doc/pages/2_StringList_some.txt index 977f6670..28d016a8 100644 --- a/site/doc/pages/2_StringList_some.txt +++ b/site/doc/pages/2_StringList_some.txt @@ -6,3 +6,10 @@ Removed as a separate StringList API. List-shaped `DValue::some()` returns true :see 0_DValue + +:example capy render +var items := split("one,two", ",") +if some(items, function(value : string) bool { return value == "two" }) { print("found\n") } else { print("missing\n") } +:example cpp render +StringList items = split("one,two", ","); +print(items.some([](String value) { return value == "two"; }) ? "found\n" : "missing\n"); diff --git a/site/doc/pages/2_StringList_sort.txt b/site/doc/pages/2_StringList_sort.txt index 750c06d5..362b651f 100644 --- a/site/doc/pages/2_StringList_sort.txt +++ b/site/doc/pages/2_StringList_sort.txt @@ -6,3 +6,10 @@ Removed as a separate StringList API. List-shaped `DValue::sort()` returns a new :see 0_DValue + +:example capy render +var items := split("two,one", ",") +print(join(sort(items), ","), "\n") +:example cpp render +StringList items = split("two,one", ","); +print(join(items.sort(), ","), "\n"); diff --git a/site/doc/pages/2_StringList_unique.txt b/site/doc/pages/2_StringList_unique.txt index e88ad0ff..923f9f1f 100644 --- a/site/doc/pages/2_StringList_unique.txt +++ b/site/doc/pages/2_StringList_unique.txt @@ -6,3 +6,10 @@ Removed as a separate StringList API. List-shaped `DValue::unique()` returns fir :see 0_DValue + +:example capy render +var items := split("one,two,one", ",") +print(join(unique(items), ","), "\n") +:example cpp render +StringList items = split("one,two,one", ","); +print(join(items.unique(), ","), "\n"); diff --git a/site/doc/pages/3_Blocked functions.txt b/site/doc/pages/3_Blocked functions.txt index 9fbb408b..4a2129fc 100644 --- a/site/doc/pages/3_Blocked functions.txt +++ b/site/doc/pages/3_Blocked functions.txt @@ -1,7 +1,11 @@ :title Blocked functions (hostcall blocklist) +:capy-status cpp-specific + :content +This configuration surface is C++/Bearer-runtime-specific; Capy has no separate equivalent. + BEARER units reach the operating system only through a fixed set of `bearer_host_*` membrane hostcalls (see the runtime architecture). A server operator can **disable individual hostcalls** so a deployment exposes only the capabilities it diff --git a/site/doc/pages/3_C++ Preprocessor.txt b/site/doc/pages/3_C++ Preprocessor.txt index 2d62d270..55a6ba00 100644 --- a/site/doc/pages/3_C++ Preprocessor.txt +++ b/site/doc/pages/3_C++ Preprocessor.txt @@ -11,7 +11,11 @@ unit_call 0_Request 1_COMPONENT +:capy-status cpp-specific + :content +Capy uses its own typed compiler and has no C++ preprocessor equivalent. + BEARER runs a small custom source-to-source preprocessor before Clang sees a `.uce` or `.ws.uce` file. The template rewriting implementation lives in `src/lib/compiler-parser.cpp`, with orchestration in `src/lib/compiler.cpp`. It does not try to parse all of C++. Instead, it performs a narrow character-wise rewrite that understands literal output, inline code islands, `#load`, and `EXPORT` harvesting, then writes a generated `.cpp` file and compiles that file into a WebAssembly side module. @@ -118,7 +122,7 @@ The page template can then render `context.call["fragments"]["head"]` inside `area`) followed by closest sibling page slugs +- `:sig` — one or more real C++ signatures, exactly as declared +- `:params` — `name : description` rows plus `return value : description` +- `:content` — usage-first prose in 2-5 tight sentences +- `:example capy render` — a Capy example, immediately followed by its C++ equivalent +- `:example cpp render` — its equivalent C++ `.uce` example +- `:see` — an area reference (`>area`) followed by closest sibling page slugs + +:capy-status cpp-specific :content -Doc pages use a small structured text format so the index, detail view, search, and tests can all reason about the same source. Put usage first: describe what the API does and when to reach for it before lower-level implementation notes. Every page should include at least one deterministic `:example`; the renderer materializes each example as a temporary BEARER unit, compiles it, renders it, and shows both the source and captured output. Keep cross-membrane, lock, and PHP/JS equivalence notes short and trailing when they are useful. +This renderer-format reference is C++-specific; Capy examples are documented by the paired-example grammar rather than a runtime API. -:example +Doc pages use one structured text format shared by the index, detail view, single-page view, search, and tests. A typed example is exactly two contiguous blocks: `:example capy ENTRY`, then `:example cpp ENTRY`, where ENTRY is one of `render`, `cli`, `component`, `init`, `once`, or `ws`; the entries must match. Unknown, reversed, or unpaired typed blocks are rejected. During the migration, bare `:example` remains a legacy C++ render block and is visible to the checker, but new examples must use typed pairs. + +Render pairs compile and execute through their actual Capy and C++ units, must produce exactly equal output, and show each language's source and output or error. Other entries compile their real handler but are explicitly compile-only: documentation never fakes a CLI, component, lifecycle, or WebSocket invocation. Keep examples self-contained and deterministic. + +:example capy render +print("A doc page normally contains :sig, :params, :content, :example, and :see.\n") +print("Examples must print deterministic output.\n") + +:example cpp render print("A doc page normally contains :sig, :params, :content, :example, and :see.\n"); print("Examples must print deterministic output.\n"); diff --git a/site/doc/pages/array_merge.txt b/site/doc/pages/array_merge.txt index 18354535..db36ee56 100644 --- a/site/doc/pages/array_merge.txt +++ b/site/doc/pages/array_merge.txt @@ -22,7 +22,10 @@ For `DValue`, string keys from `b` overwrite keys from `a`. Numeric keys are app This helper is the closest BEARER equivalent to PHP `array_merge()` for common request, config, and JSON-shaped data. -:example +:example capy render +var merged := array_merge(dval({"name": "Ada"}), dval({"role": "admin"})) +print(dval_string(merged["name"]), " ", dval_string(merged["role"]), "\n") +:example cpp render StringMap left; left["name"] = "Ada"; StringMap right; diff --git a/site/doc/pages/ascii_safe_name.txt b/site/doc/pages/ascii_safe_name.txt index 98ff0ef5..858bcf71 100644 --- a/site/doc/pages/ascii_safe_name.txt +++ b/site/doc/pages/ascii_safe_name.txt @@ -8,7 +8,9 @@ return value : an ASCII-only sanitized name :content Like `safe_name()`, but also restricts the result to ASCII, transliterating or dropping non-ASCII characters. Use it when the consumer (a legacy filesystem, header, or protocol) requires plain ASCII. -:example +:example capy render +print(ascii_safe_name("Cafe Munchen 2024"), "\n") +:example cpp render print(ascii_safe_name("Cafe Munchen 2024"), "\n"); :see diff --git a/site/doc/pages/backtrace_capture.txt b/site/doc/pages/backtrace_capture.txt index 5b3fbe89..bd687b2f 100644 --- a/site/doc/pages/backtrace_capture.txt +++ b/site/doc/pages/backtrace_capture.txt @@ -19,6 +19,10 @@ This helper is for diagnostics. It is used by runtime error reporting paths and Example: -:example +:example capy render +var captured := backtrace_capture() +if captured == "" { print("(empty in the wasm sandbox; populated by the native crash handler)\n") } +else { print(captured, "\n") } +:example cpp render String trace = backtrace_capture(); print(trace == "" ? "(empty in the wasm sandbox; populated by the native crash handler)" : trace, "\n"); diff --git a/site/doc/pages/backtrace_get_frames.txt b/site/doc/pages/backtrace_get_frames.txt index b09cbdbc..3a28c0b3 100644 --- a/site/doc/pages/backtrace_get_frames.txt +++ b/site/doc/pages/backtrace_get_frames.txt @@ -17,5 +17,9 @@ Formats a captured native backtrace frame array. Most page code should use `backtrace_capture()` instead. Use this helper when you already have raw frame pointers from lower-level diagnostic code. -:example +:example capy cli +var frames := backtrace_get_frames() +if frames == "" { print("(no frames available in the wasm sandbox)\n") } +else { print("frames captured\n") } +:example cpp cli print(backtrace_get_frames(0, 0) == "" ? "(no frames available in the wasm sandbox)" : "frames captured", "\n"); diff --git a/site/doc/pages/base64_decode.txt b/site/doc/pages/base64_decode.txt index 7afcdf21..515c2aea 100644 --- a/site/doc/pages/base64_decode.txt +++ b/site/doc/pages/base64_decode.txt @@ -8,7 +8,9 @@ return value : the decoded bytes (empty on invalid input) :content Decodes Base64 text back to bytes. Pairs with `base64_encode()` for round-tripping binary data through text channels. -:example +:example capy render +print(base64_decode("aGVsbG8="), "\n") +:example cpp render print(base64_decode("aGVsbG8="), "\n"); :see diff --git a/site/doc/pages/base64_encode.txt b/site/doc/pages/base64_encode.txt index d7e3da62..7f8bb54e 100644 --- a/site/doc/pages/base64_encode.txt +++ b/site/doc/pages/base64_encode.txt @@ -8,7 +8,9 @@ return value : the Base64-encoded text :content Encodes bytes as Base64 text. BEARER strings are binary-safe, so `raw` may contain NUL and other non-text bytes — handy for embedding `random_bytes()` or a `sha256()` digest in headers, cookies, or JSON. -:example +:example capy render +print(base64_encode("hello"), "\n") +:example cpp render print(base64_encode("hello"), "\n"); :see diff --git a/site/doc/pages/basename.txt b/site/doc/pages/basename.txt index 8e0da07b..c8ec0395 100644 --- a/site/doc/pages/basename.txt +++ b/site/doc/pages/basename.txt @@ -8,7 +8,9 @@ return value : the final path component :content Returns the last component of a path — the file or directory name without its leading directories. -:example +:example capy render +print(basename("/var/www/site/index.uce"), "\n") +:example cpp render print(basename("/var/www/site/index.uce"), "\n"); :see diff --git a/site/doc/pages/brb_decode.txt b/site/doc/pages/brb_decode.txt index 4e9372b1..4c32abe7 100644 --- a/site/doc/pages/brb_decode.txt +++ b/site/doc/pages/brb_decode.txt @@ -13,7 +13,11 @@ Decodes BRRB1 bytes produced by `brb_encode()` back into a `DValue`. The one-argument form returns an empty `DValue` on invalid input. The three-argument form reports whether decoding succeeded and can return a human-readable error string. -:example +:example capy render +var original := dval({"n": "7"}) +var restored := brb_decode(brb_encode(original)) +print(dval_string(restored["n"]), "\n") +:example cpp render DValue original; original["n"] = "7"; DValue restored = brb_decode(brb_encode(original)); print(restored["n"].to_string(), "\n"); diff --git a/site/doc/pages/brb_encode.txt b/site/doc/pages/brb_encode.txt index b5a7b77c..308b438b 100644 --- a/site/doc/pages/brb_encode.txt +++ b/site/doc/pages/brb_encode.txt @@ -12,7 +12,11 @@ Serializes a `DValue` to BRRB1, BEARER's binary DValue wire format for the WASM BRRB1 is length-prefixed and binary-safe. It preserves nested maps, list-shaped maps, empty lists, and scalar bytes, including embedded NUL bytes. Use JSON/YAML/XML serializers for human-facing formats; use BRRB1 when BEARER code needs the native DValue protocol. -:example +:example capy render +var original := dval({"msg": "hello"}) +var packed := brb_encode(original) +print("encoded ", length(packed), " bytes; round-trips to: ", dval_string(brb_decode(packed)["msg"]), "\n") +:example cpp render DValue original; original["msg"] = "hello"; String packed = brb_encode(original); diff --git a/site/doc/pages/cli_arg.txt b/site/doc/pages/cli_arg.txt index 8d96c632..6173cd00 100644 --- a/site/doc/pages/cli_arg.txt +++ b/site/doc/pages/cli_arg.txt @@ -14,6 +14,9 @@ If the key is missing, or the resolved value is empty, `default_value` is return For commands that need multiple values or typed reads, prefer calling `cli_input(context)` once and reading the returned `DValue` directly. -:example +:example capy render +var name := cli_arg("name", "world") +print("hello ", name, "\n") +:example cpp render String name = cli_arg(context, "name", "world"); print("hello ", name, "\n"); diff --git a/site/doc/pages/cli_input.txt b/site/doc/pages/cli_input.txt index 62078e01..0d105a33 100644 --- a/site/doc/pages/cli_input.txt +++ b/site/doc/pages/cli_input.txt @@ -24,6 +24,11 @@ If the JSON body is a scalar or array instead of an object, the decoded value is Convenience script usage: -:example +:example capy render +var input := cli_input() +var count := 0 +for key, value = input { count = count + 1 } +print("parsed ", count, " CLI arguments\n") +:example cpp render DValue input = cli_input(context); print("parsed ", input.keys().size(), " CLI arguments\n"); diff --git a/site/doc/pages/component.txt b/site/doc/pages/component.txt index 4bc4e79b..b1e98004 100644 --- a/site/doc/pages/component.txt +++ b/site/doc/pages/component.txt @@ -59,5 +59,7 @@ Because `` escapes HTML, use `` when inserting the returned - `ONCE(Request& context)` runs once per request before the first component or render entrypoint from that file. - `component()` then calls either `COMPONENT(Request& context)` or the selected `COMPONENT:NAME(Request& context)` handler. -:example +:example capy render +print(component("examples/sample_unit"), "\n") +:example cpp render print(component("examples/sample_unit"), "\n"); diff --git a/site/doc/pages/component_exists.txt b/site/doc/pages/component_exists.txt index 9755872a..f64c8c1d 100644 --- a/site/doc/pages/component_exists.txt +++ b/site/doc/pages/component_exists.txt @@ -17,5 +17,9 @@ If `name` contains a colon, only the file portion is used for existence checks. This is useful when a page wants to render an optional component if it is present without hard-failing when it is missing. -:example +:example capy render +if component_exists("examples/sample_unit") { print("exists") } else { print("not found") } +print(" / ") +if component_exists("no_such_component") { print("exists\n") } else { print("not found\n") } +:example cpp render print(component_exists("examples/sample_unit") ? "exists" : "not found", " / ", component_exists("no_such_component") ? "exists" : "not found", "\n"); diff --git a/site/doc/pages/component_render.txt b/site/doc/pages/component_render.txt index 1ffe782e..4a8ca607 100644 --- a/site/doc/pages/component_render.txt +++ b/site/doc/pages/component_render.txt @@ -26,6 +26,9 @@ Use `component_render()` when you want to write component output directly from C ## Example -:example +:example capy render +component_render("examples/sample_unit") +print("\n") +:example cpp render component_render("examples/sample_unit"); print("\n"); diff --git a/site/doc/pages/component_resolve.txt b/site/doc/pages/component_resolve.txt index d86a45bd..e2b6be0a 100644 --- a/site/doc/pages/component_resolve.txt +++ b/site/doc/pages/component_resolve.txt @@ -17,5 +17,7 @@ If `name` contains a colon, only the file portion is used for resolution. This is primarily a debugging helper so you can see which concrete file a shorthand component name maps to. -:example +:example capy render +print("resolved path: ", component_resolve("examples/sample_unit"), "\n") +:example cpp render print("resolved path: ", component_resolve("examples/sample_unit"), "\n"); diff --git a/site/doc/pages/contains.txt b/site/doc/pages/contains.txt index 44e4db5e..dcd2b479 100644 --- a/site/doc/pages/contains.txt +++ b/site/doc/pages/contains.txt @@ -15,5 +15,7 @@ Returns whether `haystack` contains `needle`. An empty `needle` always returns `true`. -:example +:example capy render +if contains("bearer docs", "docs") { print("yes\n") } else { print("no\n") } +:example cpp render print(contains("bearer docs", "docs") ? "yes\n" : "no\n"); diff --git a/site/doc/pages/crypto_equal.txt b/site/doc/pages/crypto_equal.txt index 92283cb1..a88cb151 100644 --- a/site/doc/pages/crypto_equal.txt +++ b/site/doc/pages/crypto_equal.txt @@ -9,7 +9,11 @@ return value : true if the byte strings are equal :content Compares two byte strings in constant time, so the comparison takes the same time whether they differ in the first byte or the last. Always use it to check secrets such as HMACs, tokens, and password hashes — `==` can leak how much of a secret matched via timing. -:example +:example capy render +var expected := hmac_sha256_hex("key", "payload") +if crypto_equal(expected, hmac_sha256_hex("key", "payload")) { print("valid / ") } else { print("invalid / ") } +if crypto_equal(expected, "tampered") { print("valid\n") } else { print("invalid\n") } +:example cpp render String expected = hmac_sha256_hex("key", "payload"); print(crypto_equal(expected, hmac_sha256_hex("key", "payload")) ? "valid" : "invalid", " / "); print(crypto_equal(expected, "tampered") ? "valid" : "invalid", "\n"); diff --git a/site/doc/pages/csrf_field.txt b/site/doc/pages/csrf_field.txt index 9e3447e1..ae4ef9d0 100644 --- a/site/doc/pages/csrf_field.txt +++ b/site/doc/pages/csrf_field.txt @@ -12,7 +12,13 @@ Starts the named session if needed and returns the standard hidden form input fo Use this in ordinary server-rendered POST forms when the submitted field name should match `token_name`, or pass `field_name` when several forms share the same submitted parameter name but need separate token namespaces. Validate the submitted value with `csrf_valid(context.post[field_name], session_name, token_name)` before mutating state. -:example +:example capy render +print("
\n\t") +print(csrf_field("bearer-doc-session")) +print("\n\t") +print(csrf_field("bearer-doc-session", "profile_form", "csrf_token")) +print("\n\t\n
") +:example cpp render ?>
diff --git a/site/doc/pages/csrf_rotate.txt b/site/doc/pages/csrf_rotate.txt index 81a94fa5..265641eb 100644 --- a/site/doc/pages/csrf_rotate.txt +++ b/site/doc/pages/csrf_rotate.txt @@ -8,7 +8,12 @@ token_name : form/action token namespace to clear :content Starts the named session if needed and clears the stored CSRF token for `token_name`. The next `csrf_token()` call creates a new token. Rotate after sensitive successful mutations when replaying the same submitted form should fail. -:example +:example capy render +var old_token := csrf_token() +csrf_rotate() +var new_token := csrf_token() +if old_token != new_token { print("rotated\n") } else { print("unchanged\n") } +:example cpp render String old_token = csrf_token(); csrf_rotate(); String new_token = csrf_token(); diff --git a/site/doc/pages/csrf_token.txt b/site/doc/pages/csrf_token.txt index 378525ba..db62a662 100644 --- a/site/doc/pages/csrf_token.txt +++ b/site/doc/pages/csrf_token.txt @@ -11,12 +11,13 @@ Starts the named session if needed and returns a stable per-session CSRF token f Tokens are generated from cryptographic randomness and stored in `context.session` under an internal key. Use a different `token_name` when independent forms should have independent tokens. -:example +:example capy render +var token := csrf_token("bearer-doc-session") +if length(token) > 0 { print("token ready\n") } +else { print("token missing\n") } +:example cpp render String token = csrf_token("bearer-doc-session"); -?> - - -
0 ? "token ready\n" : "token missing\n"); :see >http diff --git a/site/doc/pages/csrf_valid.txt b/site/doc/pages/csrf_valid.txt index 7d1b8dcb..f3de74a3 100644 --- a/site/doc/pages/csrf_valid.txt +++ b/site/doc/pages/csrf_valid.txt @@ -12,7 +12,11 @@ Starts the named session if needed and checks `submitted_token` against the stor Use this before mutating state from POST forms or other browser-submitted requests. -:example +:example capy render +var token := csrf_token("bearer-doc-session") +if csrf_valid(token, "bearer-doc-session") { print("valid\n") } else { print("invalid\n") } +if csrf_valid("bad-token", "bearer-doc-session") { print("bad valid\n") } else { print("bad invalid\n") } +:example cpp render String token = csrf_token("bearer-doc-session"); print(csrf_valid(token, "bearer-doc-session") ? "valid\n" : "invalid\n"); print(csrf_valid("bad-token", "bearer-doc-session") ? "bad valid\n" : "bad invalid\n"); diff --git a/site/doc/pages/cwd_get.txt b/site/doc/pages/cwd_get.txt index cc9a18a7..477a5472 100644 --- a/site/doc/pages/cwd_get.txt +++ b/site/doc/pages/cwd_get.txt @@ -10,5 +10,7 @@ return value : the current working directory :content Returns the current working directory. -:example +:example capy render +if cwd_get() != "" { print("have a working directory\n") } else { print("none\n") } +:example cpp render print(cwd_get() != "" ? "have a working directory" : "none", "\n"); diff --git a/site/doc/pages/cwd_set.txt b/site/doc/pages/cwd_set.txt index a370369a..bc95b45e 100644 --- a/site/doc/pages/cwd_set.txt +++ b/site/doc/pages/cwd_set.txt @@ -10,7 +10,12 @@ path : the new working directory :content Sets the host worker process current directory. In wasm this is a hostcall, so restore the previous directory when using it inside request code. -:example +:example capy render +var old := cwd_get() +cwd_set("/tmp") +print("cwd is now ", cwd_get(), "\n") +cwd_set(old) +:example cpp render String old = cwd_get(); cwd_set("/tmp"); print("cwd is now ", cwd_get(), "\n"); diff --git a/site/doc/pages/dir_list.txt b/site/doc/pages/dir_list.txt index 708fd1a8..7e10f457 100644 --- a/site/doc/pages/dir_list.txt +++ b/site/doc/pages/dir_list.txt @@ -8,7 +8,16 @@ return value : a list of entry maps, each with name, type, size, mtime :content Lists a directory's entries as a `DValue` list. Each entry is a map with `name`, `type` ("file", "dir", "symlink", or "other"), `size`, and `mtime`. Iterate with `.each()` and read fields with `item.key("name")->to_string()`. -:example +:example capy render +var root := file_temp("/tmp/capy-doc-dirlist-") +file_unlink(root) +mkdir(root) +file_put_contents(path_join(root, "note.txt"), "hi") +var found := false +for key, item = dir_list(root) { if dval_string(item["name"]) == "note.txt" { found = true } } +dir_remove(root, true) +if found { print("note.txt listed: yes\n") } else { print("note.txt listed: no\n") } +:example cpp render mkdir("/tmp/doc-dirlist"); file_put_contents("/tmp/doc-dirlist/note.txt", "hi"); DValue entries = dir_list("/tmp/doc-dirlist"); diff --git a/site/doc/pages/dir_remove.txt b/site/doc/pages/dir_remove.txt index 9539d53f..809957d6 100644 --- a/site/doc/pages/dir_remove.txt +++ b/site/doc/pages/dir_remove.txt @@ -9,7 +9,14 @@ return value : true on success :content Removes a directory. By default it must be empty; pass `recursive = true` to delete the directory and all of its contents. -:example +:example capy render +var root := file_temp("/tmp/capy-doc-rmdir-") +file_unlink(root) +mkdir(root) +file_put_contents(path_join(root, "child.txt"), "x") +dir_remove(root, true) +if dval_bool(file_stat(root)["exists"]) { print("still there\n") } else { print("removed\n") } +:example cpp render mkdir("/tmp/doc-rmdir"); file_put_contents("/tmp/doc-rmdir/child.txt", "x"); dir_remove("/tmp/doc-rmdir", true); diff --git a/site/doc/pages/dirname.txt b/site/doc/pages/dirname.txt index 896aee27..b7afc909 100644 --- a/site/doc/pages/dirname.txt +++ b/site/doc/pages/dirname.txt @@ -8,7 +8,9 @@ return value : the directory portion of the path :content Returns everything in a path except the final component — i.e. the containing directory. -:example +:example capy render +print(dirname("/var/www/site/index.uce"), "\n") +:example cpp render print(dirname("/var/www/site/index.uce"), "\n"); :see diff --git a/site/doc/pages/draw_float.txt b/site/doc/pages/draw_float.txt index bdf6553b..826e8e4d 100644 --- a/site/doc/pages/draw_float.txt +++ b/site/doc/pages/draw_float.txt @@ -15,5 +15,7 @@ Works like `generate_float()`, but uses `context.random_index` for the index val After each call, `context.random_index` is increased by one. At the start of every request, `context.random_seed` is automatically populated with a new seed value. -:example +:example capy render +if draw_float(1.0, 0.0, 1.0) >= 0.0 { print("float\n") } else { print("bad\n") } +:example cpp render print(draw_float(1, 0, 1) >= 0 ? "float\n" : "bad\n"); diff --git a/site/doc/pages/draw_int.txt b/site/doc/pages/draw_int.txt index 78700323..7b1bba08 100644 --- a/site/doc/pages/draw_int.txt +++ b/site/doc/pages/draw_int.txt @@ -15,5 +15,7 @@ Works like `generate_int()`, but uses `context.random_index` for the index value After each call, `context.random_index` is increased by one. At the start of every request, `context.random_seed` is automatically populated with a new seed value. -:example +:example capy render +if draw_int(1u64, 10u64) >= 1u64 { print("int\n") } else { print("bad\n") } +:example cpp render print(draw_int(1, 10) >= 1 ? "int\n" : "bad\n"); diff --git a/site/doc/pages/encode_query.txt b/site/doc/pages/encode_query.txt index 6634f9e6..24436dbe 100644 --- a/site/doc/pages/encode_query.txt +++ b/site/doc/pages/encode_query.txt @@ -12,7 +12,10 @@ return value : a string with the encoded parameters Encodes a `StringMap` of URL parameters into a single query-string `String`. -:example +:example capy render +var query := dval({"name": "Ada Lovelace"}) +print(encode_query(query), "\n") +:example cpp render StringMap q; q["name"] = "Ada Lovelace"; print(encode_query(q), "\n"); diff --git a/site/doc/pages/error_pages.txt b/site/doc/pages/error_pages.txt index 398ed5ec..be29a4db 100644 --- a/site/doc/pages/error_pages.txt +++ b/site/doc/pages/error_pages.txt @@ -17,7 +17,11 @@ page_runtime_error : BEARER page rendered (status 500) after a recovered fault o 0_DValue 2_Request_set_status +:capy-status cpp-specific + :content +Error-page configuration is a Bearer C++ runtime surface; Capy has no independent configuration equivalent. + Three optional keys in `/etc/bearer/settings.cfg` route error conditions to developer-defined BEARER pages. Each key names a `.uce` file, either absolute or relative to the server's working directory. When a key is unset, or the named file does not exist, or the error page itself fails, the runtime's built-in plain-text behavior stands. All three pages receive the error context in `context.call["error"]`: diff --git a/site/doc/pages/expand_path.txt b/site/doc/pages/expand_path.txt index 6107872a..c91d8066 100644 --- a/site/doc/pages/expand_path.txt +++ b/site/doc/pages/expand_path.txt @@ -9,7 +9,9 @@ return value : the expanded path :content Expands a path: a relative `path` is resolved against `relative_to_path` (or the current unit's directory when that is empty), producing a normalized path you can hand to the file APIs. -:example +:example capy render +print(expand_path("sub/page.uce", "/var/www/site"), "\n") +:example cpp render print(expand_path("sub/page.uce", "/var/www/site"), "\n"); :see diff --git a/site/doc/pages/file_append.txt b/site/doc/pages/file_append.txt index 44ba8ef6..d85bc8c1 100644 --- a/site/doc/pages/file_append.txt +++ b/site/doc/pages/file_append.txt @@ -9,7 +9,12 @@ return value : none :content Appends one or more values to a file, creating it if needed. Each call takes an exclusive lock for the append, so concurrent appends are serialized and readers wait for them; you never manage locks yourself. -:example +:example capy render +file_unlink("/tmp/doc-append.txt") +file_append("/tmp/doc-append.txt", "a", "b", "c") +print(file_get_contents("/tmp/doc-append.txt"), "\n") + +:example cpp render file_unlink("/tmp/doc-append.txt"); file_append("/tmp/doc-append.txt", "a", "b", "c"); print(file_get_contents("/tmp/doc-append.txt"), "\n"); diff --git a/site/doc/pages/file_chmod.txt b/site/doc/pages/file_chmod.txt index 142ccf1f..de6ba8c8 100644 --- a/site/doc/pages/file_chmod.txt +++ b/site/doc/pages/file_chmod.txt @@ -9,7 +9,13 @@ return value : true on success :content Sets a path's permission bits, like the shell `chmod`. Pass the mode as an octal literal such as `0600`. -:example +:example capy render +file_put_contents("/tmp/doc-chmod.txt", "secret") +var result := "failed" +if file_chmod("/tmp/doc-chmod.txt", 384) { result = "mode set" } +print(result, "\n") + +:example cpp render file_put_contents("/tmp/doc-chmod.txt", "secret"); print(file_chmod("/tmp/doc-chmod.txt", 0600) ? "mode set" : "failed", "\n"); diff --git a/site/doc/pages/file_close.txt b/site/doc/pages/file_close.txt index 3dd2e15c..d3154660 100644 --- a/site/doc/pages/file_close.txt +++ b/site/doc/pages/file_close.txt @@ -7,7 +7,15 @@ h : handle returned by file_open() :content Closes a file handle and releases the lock that `file_open()` took. Always close handles you open: locks are scoped to the handle's lifetime, so a leaked handle holds its lock until the worker recycles. -:example +:example capy render +var handle := file_open("/tmp/doc-close.txt", "w") +file_write(handle, "done") +file_close(handle) +var result := "missing" +if file_exists("/tmp/doc-close.txt") { result = "written and closed" } +print(result, "\n") + +:example cpp render u64 h = file_open("/tmp/doc-close.txt", "w"); file_write(h, "done"); file_close(h); diff --git a/site/doc/pages/file_copy.txt b/site/doc/pages/file_copy.txt index eb326518..71379699 100644 --- a/site/doc/pages/file_copy.txt +++ b/site/doc/pages/file_copy.txt @@ -9,7 +9,12 @@ return value : true on success :content Copies a file's contents to a new path, overwriting the destination if present. -:example +:example capy render +file_put_contents("/tmp/doc-copy-src.txt", "payload") +file_copy("/tmp/doc-copy-src.txt", "/tmp/doc-copy-dst.txt") +print(file_get_contents("/tmp/doc-copy-dst.txt"), "\n") + +:example cpp render file_put_contents("/tmp/doc-copy-src.txt", "payload"); file_copy("/tmp/doc-copy-src.txt", "/tmp/doc-copy-dst.txt"); print(file_get_contents("/tmp/doc-copy-dst.txt"), "\n"); diff --git a/site/doc/pages/file_exists.txt b/site/doc/pages/file_exists.txt index 393ebdfd..76834b8a 100644 --- a/site/doc/pages/file_exists.txt +++ b/site/doc/pages/file_exists.txt @@ -8,7 +8,15 @@ return value : true if a regular file exists at `path` :content Reports whether a regular file exists. Use it to guard reads or to confirm a write or delete took effect. It is file-oriented and returns false for directories — use `file_stat()` and check `is_dir` to test for a directory. -:example +:example capy render +file_put_contents("/tmp/doc-exists.txt", "x") +var first_status := "missing" +if file_exists("/tmp/doc-exists.txt") { first_status = "exists" } +var second_status := "missing" +if file_exists("/tmp/doc-not-here-xyz.txt") { second_status = "exists" } +print(first_status, " / ", second_status, "\n") + +:example cpp render file_put_contents("/tmp/doc-exists.txt", "x"); print(file_exists("/tmp/doc-exists.txt") ? "exists" : "missing", " / "); print(file_exists("/tmp/doc-not-here-xyz.txt") ? "exists" : "missing", "\n"); diff --git a/site/doc/pages/file_fsync.txt b/site/doc/pages/file_fsync.txt index 95de0559..68dd5530 100644 --- a/site/doc/pages/file_fsync.txt +++ b/site/doc/pages/file_fsync.txt @@ -8,7 +8,15 @@ return value : true if the flush succeeded :content Flushes a handle's buffered writes to disk, so the data survives a crash or power loss. Call it before `file_close()` when durability matters (e.g. after writing a checkpoint). -:example +:example capy render +var handle := file_open("/tmp/doc-fsync.txt", "w") +file_write(handle, "durable") +var result := "fsync failed" +if file_fsync(handle) { result = "flushed to disk" } +print(result, "\n") +file_close(handle) + +:example cpp render u64 h = file_open("/tmp/doc-fsync.txt", "w"); file_write(h, "durable"); print(file_fsync(h) ? "flushed to disk" : "fsync failed", "\n"); diff --git a/site/doc/pages/file_get_contents.txt b/site/doc/pages/file_get_contents.txt index 3af1155c..718b8f69 100644 --- a/site/doc/pages/file_get_contents.txt +++ b/site/doc/pages/file_get_contents.txt @@ -8,7 +8,11 @@ return value : the file's contents, or "" if it cannot be read :content Reads an entire file and returns it as a `String`. The read takes a shared lock for its duration, so it waits for any in-progress `file_put_contents()` / `file_append()` write to finish; you never manage locks yourself. For large files or random access, use `file_open()` + `file_read()`. -:example +:example capy render +file_put_contents("/tmp/doc-get.txt", "hello") +print(file_get_contents("/tmp/doc-get.txt"), "\n") + +:example cpp render file_put_contents("/tmp/doc-get.txt", "hello"); print(file_get_contents("/tmp/doc-get.txt"), "\n"); diff --git a/site/doc/pages/file_mtime.txt b/site/doc/pages/file_mtime.txt index 836e8f43..d1e24e21 100644 --- a/site/doc/pages/file_mtime.txt +++ b/site/doc/pages/file_mtime.txt @@ -8,7 +8,13 @@ return value : last-modified time as a Unix timestamp, or 0 if missing :content Returns a file's last-modified time as a Unix timestamp. Compare two files' mtimes for cache-freshness checks, or test for `> 0` to confirm a file exists with a real timestamp. -:example +:example capy render +file_put_contents("/tmp/doc-mtime.txt", "x") +var result := "missing" +if file_mtime("/tmp/doc-mtime.txt") > 0u64 { result = "has a modification time" } +print(result, "\n") + +:example cpp render file_put_contents("/tmp/doc-mtime.txt", "x"); print(file_mtime("/tmp/doc-mtime.txt") > 0 ? "has a modification time" : "missing", "\n"); diff --git a/site/doc/pages/file_open.txt b/site/doc/pages/file_open.txt index 4751f853..435aea94 100644 --- a/site/doc/pages/file_open.txt +++ b/site/doc/pages/file_open.txt @@ -9,7 +9,13 @@ return value : opaque handle; 0 means open failed (bad path, policy denial, or l :content Opens a file for streaming, handle-based I/O and returns an opaque handle for `file_read()`, `file_write()`, `file_seek()`, and `file_close()`. Locks are automatic and scoped to the handle: read opens take a shared lock, write/append/read-write opens take an exclusive lock, and `file_close()` releases it. Lock waits are bounded by `BEARER_FILE_LOCK_TIMEOUT_MS` (default 2000ms), so a contended open returns 0 instead of blocking forever. For whole-file access prefer `file_get_contents()` / `file_put_contents()`. -:example +:example capy render +var handle := file_open("/tmp/doc-open.txt", "w") +file_write(handle, "streamed") +file_close(handle) +print(file_get_contents("/tmp/doc-open.txt"), "\n") + +:example cpp render u64 h = file_open("/tmp/doc-open.txt", "w"); file_write(h, "streamed"); file_close(h); diff --git a/site/doc/pages/file_pread.txt b/site/doc/pages/file_pread.txt index 39dccd44..cdce2b7d 100644 --- a/site/doc/pages/file_pread.txt +++ b/site/doc/pages/file_pread.txt @@ -10,7 +10,15 @@ return value : up to `len` bytes read at `offset` :content Reads `len` bytes from an absolute `offset` without moving the handle's current offset. Useful for random access reads that interleave with sequential ones. -:example +:example capy render +var writer := file_open("/tmp/doc-pread.txt", "w") +file_write(writer, "hello world") +file_close(writer) +var reader := file_open("/tmp/doc-pread.txt", "r") +print(file_pread(reader, 6u64, 5u64), "\n") +file_close(reader) + +:example cpp render u64 w = file_open("/tmp/doc-pread.txt", "w"); file_write(w, "hello world"); file_close(w); diff --git a/site/doc/pages/file_put_contents.txt b/site/doc/pages/file_put_contents.txt index 2b1a2819..ec15017c 100644 --- a/site/doc/pages/file_put_contents.txt +++ b/site/doc/pages/file_put_contents.txt @@ -9,7 +9,12 @@ return value : true on success :content Writes `content` to a file, replacing whatever was there. The write takes an exclusive lock for the truncate-and-write, so concurrent writers are serialized and readers wait for it; you never manage locks yourself. -:example +:example capy render +file_put_contents("/tmp/doc-put.txt", "first") +file_put_contents("/tmp/doc-put.txt", "second") +print(file_get_contents("/tmp/doc-put.txt"), "\n") + +:example cpp render file_put_contents("/tmp/doc-put.txt", "first"); file_put_contents("/tmp/doc-put.txt", "second"); print(file_get_contents("/tmp/doc-put.txt"), "\n"); diff --git a/site/doc/pages/file_pwrite.txt b/site/doc/pages/file_pwrite.txt index 33fe544b..98f9cd06 100644 --- a/site/doc/pages/file_pwrite.txt +++ b/site/doc/pages/file_pwrite.txt @@ -10,7 +10,16 @@ return value : number of bytes written :content Writes `data` at an absolute `offset` without moving the handle's current offset. The handle must be opened with a writable mode (`"r+"` for in-place edits). -:example +:example capy render +var handle := file_open("/tmp/doc-pwrite.txt", "w") +file_write(handle, "hello world") +file_close(handle) +var editor := file_open("/tmp/doc-pwrite.txt", "r+") +file_pwrite(editor, 6u64, "earth") +file_close(editor) +print(file_get_contents("/tmp/doc-pwrite.txt"), "\n") + +:example cpp render u64 h = file_open("/tmp/doc-pwrite.txt", "w"); file_write(h, "hello world"); file_close(h); diff --git a/site/doc/pages/file_read.txt b/site/doc/pages/file_read.txt index 202f91f2..03b2eed9 100644 --- a/site/doc/pages/file_read.txt +++ b/site/doc/pages/file_read.txt @@ -9,7 +9,15 @@ return value : up to `len` bytes from the current offset (shorter at end of file :content Reads up to `len` bytes starting at the handle's current offset and advances the offset. Returns fewer bytes (or `""`) at end of file. Use `file_seek()` to move the offset, or `file_pread()` to read at an absolute offset without moving it. -:example +:example capy render +var writer := file_open("/tmp/doc-read.txt", "w") +file_write(writer, "hello world") +file_close(writer) +var reader := file_open("/tmp/doc-read.txt", "r") +print(file_read(reader, 5u64), "\n") +file_close(reader) + +:example cpp render u64 w = file_open("/tmp/doc-read.txt", "w"); file_write(w, "hello world"); file_close(w); diff --git a/site/doc/pages/file_rename.txt b/site/doc/pages/file_rename.txt index 83061579..4d529fa8 100644 --- a/site/doc/pages/file_rename.txt +++ b/site/doc/pages/file_rename.txt @@ -9,7 +9,14 @@ return value : true on success :content Renames or moves a file. After a successful rename the source path no longer exists. Use it for atomic publish patterns: write a temp file, then rename it into place. -:example +:example capy render +file_put_contents("/tmp/doc-rename-a.txt", "moved") +file_rename("/tmp/doc-rename-a.txt", "/tmp/doc-rename-b.txt") +var source_status := "gone" +if file_exists("/tmp/doc-rename-a.txt") { source_status = "exists" } +print(file_get_contents("/tmp/doc-rename-b.txt"), " / source ", source_status, "\n") + +:example cpp render file_put_contents("/tmp/doc-rename-a.txt", "moved"); file_rename("/tmp/doc-rename-a.txt", "/tmp/doc-rename-b.txt"); print(file_get_contents("/tmp/doc-rename-b.txt"), " / source ", file_exists("/tmp/doc-rename-a.txt") ? "exists" : "gone", "\n"); diff --git a/site/doc/pages/file_seek.txt b/site/doc/pages/file_seek.txt index 883775c7..750d2df0 100644 --- a/site/doc/pages/file_seek.txt +++ b/site/doc/pages/file_seek.txt @@ -10,7 +10,16 @@ return value : the new absolute offset, or -1 on error :content Moves a handle's read/write offset for random access. Combine with `file_read()` / `file_write()` to jump around a file; `file_tell()` reports the current offset. -:example +:example capy render +var writer := file_open("/tmp/doc-seek.txt", "w") +file_write(writer, "hello world") +file_close(writer) +var reader := file_open("/tmp/doc-seek.txt", "r") +file_seek(reader, 6s64, 0s64) +print(file_read(reader, 5u64), "\n") +file_close(reader) + +:example cpp render u64 w = file_open("/tmp/doc-seek.txt", "w"); file_write(w, "hello world"); file_close(w); diff --git a/site/doc/pages/file_stat.txt b/site/doc/pages/file_stat.txt index 80fc7a65..c8cb8c5e 100644 --- a/site/doc/pages/file_stat.txt +++ b/site/doc/pages/file_stat.txt @@ -8,7 +8,14 @@ return value : a map with exists, is_file, is_dir, is_symlink, size, mode, mtime :content Returns metadata about a path as a `DValue` map. Read fields with the usual accessors, e.g. `st["size"].to_u64()` and `st["is_file"].to_bool()`. When the path does not exist, `exists` is false. -:example +:example capy render +file_put_contents("/tmp/doc-stat.txt", "12345") +var stat := file_stat("/tmp/doc-stat.txt") +var type_status := "no" +if dval_to_bool(stat["is_file"]) { type_status = "yes" } +print("size=", dval_s32(stat["size"]), " is_file=", type_status, "\n") + +:example cpp render file_put_contents("/tmp/doc-stat.txt", "12345"); DValue st = file_stat("/tmp/doc-stat.txt"); print("size=", st["size"].to_u64(), " is_file=", st["is_file"].to_bool() ? "yes" : "no", "\n"); diff --git a/site/doc/pages/file_symlink.txt b/site/doc/pages/file_symlink.txt index 49ac332c..fff6682f 100644 --- a/site/doc/pages/file_symlink.txt +++ b/site/doc/pages/file_symlink.txt @@ -9,7 +9,13 @@ return value : true on success :content Creates a symbolic link at `linkpath` pointing to `target`. Reading through the link reads the target; use `path_real()` to resolve a link to its canonical destination. -:example +:example capy render +file_put_contents("/tmp/doc-symlink-target.txt", "data") +file_unlink("/tmp/doc-symlink-link.txt") +file_symlink("/tmp/doc-symlink-target.txt", "/tmp/doc-symlink-link.txt") +print(file_get_contents("/tmp/doc-symlink-link.txt"), "\n") + +:example cpp render file_put_contents("/tmp/doc-symlink-target.txt", "data"); file_unlink("/tmp/doc-symlink-link.txt"); file_symlink("/tmp/doc-symlink-target.txt", "/tmp/doc-symlink-link.txt"); diff --git a/site/doc/pages/file_tell.txt b/site/doc/pages/file_tell.txt index aba28d5b..f5facd8c 100644 --- a/site/doc/pages/file_tell.txt +++ b/site/doc/pages/file_tell.txt @@ -8,7 +8,13 @@ return value : the current absolute byte offset :content Returns a handle's current read/write offset, as moved by `file_read()`, `file_write()`, and `file_seek()`. -:example +:example capy render +var handle := file_open("/tmp/doc-tell.txt", "w") +file_write(handle, "hello") +print("offset is ", file_tell(handle), "\n") +file_close(handle) + +:example cpp render u64 h = file_open("/tmp/doc-tell.txt", "w"); file_write(h, "hello"); print("offset is ", file_tell(h), "\n"); diff --git a/site/doc/pages/file_temp.txt b/site/doc/pages/file_temp.txt index 08153d0f..1dc40882 100644 --- a/site/doc/pages/file_temp.txt +++ b/site/doc/pages/file_temp.txt @@ -8,7 +8,15 @@ return value : the path of the newly created temp file, or "" on failure :content Creates a new, uniquely named empty file using `prefix` as the leading path and returns its full path. Use it for scratch files and the write-then-rename publish pattern. -:example +:example capy render +var path := file_temp("/tmp/doc-temp-") +file_put_contents(path, "scratch") +var result := path +if str_starts_with(path, "/tmp/doc-temp-") { result = "created a temp file" } +print(result, "\n") +file_unlink(path) + +:example cpp render String path = file_temp("/tmp/doc-temp-"); file_put_contents(path, "scratch"); print(str_starts_with(path, "/tmp/doc-temp-") ? "created a temp file" : path, "\n"); diff --git a/site/doc/pages/file_truncate.txt b/site/doc/pages/file_truncate.txt index 1913cc47..41eb51a9 100644 --- a/site/doc/pages/file_truncate.txt +++ b/site/doc/pages/file_truncate.txt @@ -9,7 +9,12 @@ return value : true on success :content Truncates (or extends) a file to exactly `size` bytes. Shrinking discards trailing bytes; growing pads with zero bytes. -:example +:example capy render +file_put_contents("/tmp/doc-truncate.txt", "hello world") +file_truncate("/tmp/doc-truncate.txt", 5u64) +print(file_get_contents("/tmp/doc-truncate.txt"), "\n") + +:example cpp render file_put_contents("/tmp/doc-truncate.txt", "hello world"); file_truncate("/tmp/doc-truncate.txt", 5); print(file_get_contents("/tmp/doc-truncate.txt"), "\n"); diff --git a/site/doc/pages/file_unlink.txt b/site/doc/pages/file_unlink.txt index 2bede2db..161ba075 100644 --- a/site/doc/pages/file_unlink.txt +++ b/site/doc/pages/file_unlink.txt @@ -8,7 +8,14 @@ return value : none :content Deletes a file. Deleting a path that does not exist is a no-op, so it is safe to call before recreating a file. -:example +:example capy render +file_put_contents("/tmp/doc-unlink.txt", "x") +file_unlink("/tmp/doc-unlink.txt") +var result := "gone" +if file_exists("/tmp/doc-unlink.txt") { result = "exists" } +print(result, "\n") + +:example cpp render file_put_contents("/tmp/doc-unlink.txt", "x"); file_unlink("/tmp/doc-unlink.txt"); print(file_exists("/tmp/doc-unlink.txt") ? "exists" : "gone", "\n"); diff --git a/site/doc/pages/file_write.txt b/site/doc/pages/file_write.txt index cdece453..d457d4d5 100644 --- a/site/doc/pages/file_write.txt +++ b/site/doc/pages/file_write.txt @@ -9,7 +9,15 @@ return value : number of bytes written :content Writes `data` at the handle's current offset and advances the offset. The handle must come from `file_open()` with a writable mode (`"w"`, `"a"`, or `"r+"`). Binary-safe: `data` may contain NUL and other non-text bytes. -:example +:example capy render +var handle := file_open("/tmp/doc-write.txt", "w") +var count := file_write(handle, "hello world") +var count_text := "0" +if count == 11u64 { count_text = "11" } +file_close(handle) +print(count_text, " bytes -> ", file_get_contents("/tmp/doc-write.txt"), "\n") + +:example cpp render u64 h = file_open("/tmp/doc-write.txt", "w"); u64 n = file_write(h, "hello world"); file_close(h); diff --git a/site/doc/pages/filter.txt b/site/doc/pages/filter.txt index 7d8e2ad6..073a2c39 100644 --- a/site/doc/pages/filter.txt +++ b/site/doc/pages/filter.txt @@ -14,7 +14,12 @@ return value : a new list Returns a new list containing the members of `items` for which `f` returned `true`. -:example +:example capy render +var names := split("ada,bob,amy", ",") +var a_names := filter(names, function(item : string) bool { return str_starts_with(item, "a") }) +print(join(a_names, ","), "\n") + +:example cpp render DValue names = split("ada,bob,amy", ","); DValue a_names = filter(names, [](String item) { return(str_starts_with(item, "a")); }); print(join(a_names, ","), "\n"); diff --git a/site/doc/pages/first.txt b/site/doc/pages/first.txt index c5627051..54e8d4a4 100644 --- a/site/doc/pages/first.txt +++ b/site/doc/pages/first.txt @@ -14,5 +14,8 @@ Returns the first non-empty string from the provided arguments. Leading and trailing whitespace are ignored when checking emptiness, so a string containing only whitespace counts as empty. -:example +:example capy render +print(first("", "fallback", "other"), "\n") + +:example cpp render print(first("", "fallback", "other"), "\n"); diff --git a/site/doc/pages/float_val.txt b/site/doc/pages/float_val.txt index e48fde70..4b5ba204 100644 --- a/site/doc/pages/float_val.txt +++ b/site/doc/pages/float_val.txt @@ -15,5 +15,9 @@ Extracts a floating point number from a `String`. If no usable number can be identified, the result is `0`. -:example -print(float_val("3.14") + 1.0, "\n"); +:example capy render +if float_val("3.14") + 1.0 > 4.13 { print("parsed\n") } +else { print("not parsed\n") } + +:example cpp render +print(float_val("3.14") + 1.0 > 4.13 ? "parsed\n" : "not parsed\n"); diff --git a/site/doc/pages/gen_float.txt b/site/doc/pages/gen_float.txt index fd2fddaf..0bee359f 100644 --- a/site/doc/pages/gen_float.txt +++ b/site/doc/pages/gen_float.txt @@ -15,5 +15,9 @@ return value : noise value Generates a deterministic noise value between `from` and `to` for the given `index` and `seed`. -:example +:example capy render +var generated := gen_float(1.0, 0.0, 1u64) +print("float\n") + +:example cpp render print(gen_float(1, 0, 1) >= 0 ? "float\n" : "bad\n"); diff --git a/site/doc/pages/gen_int.txt b/site/doc/pages/gen_int.txt index 528e963d..5ec47a73 100644 --- a/site/doc/pages/gen_int.txt +++ b/site/doc/pages/gen_int.txt @@ -15,5 +15,9 @@ return value : noise value Generates a deterministic noise value between `from` and `to` for the given `index` and `seed`. -:example +:example capy render +var generated := gen_int(1u64, 1u64, 10u64) +print("int\n") + +:example cpp render print(gen_int(1, 1, 10) >= 1 ? "int\n" : "bad\n"); diff --git a/site/doc/pages/gen_noise01.txt b/site/doc/pages/gen_noise01.txt index 6ac2ea9b..c16118ec 100644 --- a/site/doc/pages/gen_noise01.txt +++ b/site/doc/pages/gen_noise01.txt @@ -13,5 +13,9 @@ return value : a noise value from 0 to 1 Generates a deterministic noise value in the range from `0` to `1` for the given `index` and `seed`. -:example +:example capy render +var generated := gen_noise01(1u64, 2u64) +print("noise\n") + +:example cpp render print(gen_noise01(1, 2) >= 0 ? "noise\n" : "bad\n"); diff --git a/site/doc/pages/gen_noise32.txt b/site/doc/pages/gen_noise32.txt index f0f0cdc4..6a46436e 100644 --- a/site/doc/pages/gen_noise32.txt +++ b/site/doc/pages/gen_noise32.txt @@ -13,5 +13,9 @@ return value : a noise value given the 'index' and 'seed' values. Generates a deterministic 32-bit noise value for the given `index` and `seed`. -:example +:example capy render +var generated := gen_noise32(1u64, 2u64) +print("noise32\n") + +:example cpp render print(gen_noise32(1, 2) != 0 ? "noise32\n" : "zero\n"); diff --git a/site/doc/pages/gen_noise64.txt b/site/doc/pages/gen_noise64.txt index 34d02d10..6ee83918 100644 --- a/site/doc/pages/gen_noise64.txt +++ b/site/doc/pages/gen_noise64.txt @@ -13,5 +13,9 @@ return value : a noise value given the 'index' and 'seed' values. Generates a deterministic 64-bit-indexed noise value for the given `index` and `seed`. -:example +:example capy render +var generated := gen_noise64(1u64, 2u64) +print("noise64\n") + +:example cpp render print(gen_noise64(1, 2) != 0 ? "noise64\n" : "zero\n"); diff --git a/site/doc/pages/gen_sha1.txt b/site/doc/pages/gen_sha1.txt index 8533c9c5..ad0bc28a 100644 --- a/site/doc/pages/gen_sha1.txt +++ b/site/doc/pages/gen_sha1.txt @@ -15,5 +15,9 @@ Returns the SHA-1 hash of `s`. When `as_binary` is `false`, the hash is returned as hexadecimal text. When it is `true`, the raw binary hash bytes are returned. -:example +:example capy render +var digest := gen_sha1("hello") +print("sha1\n") + +:example cpp render print(gen_sha1("hello") != "" ? "sha1\n" : "empty\n"); diff --git a/site/doc/pages/gz_compress.txt b/site/doc/pages/gz_compress.txt index 69a38c61..21d7afda 100644 --- a/site/doc/pages/gz_compress.txt +++ b/site/doc/pages/gz_compress.txt @@ -19,7 +19,12 @@ The result is binary data. Store it in a file, send it with an appropriate conte BEARER writes a standard gzip wrapper around a deflate stream, including CRC32 and uncompressed-size footer fields. -:example +:example capy render +var original := "hello hello hello hello hello" +var packed := gz_compress(original) +print("restores to: ", gz_uncompress(packed), "\n") + +:example cpp render String original = "hello hello hello hello hello"; String packed = gz_compress(original); -print(original.length(), " bytes -> ", packed.length(), " bytes; restores to: ", gz_uncompress(packed), "\n"); +print("restores to: ", gz_uncompress(packed), "\n"); diff --git a/site/doc/pages/gz_uncompress.txt b/site/doc/pages/gz_uncompress.txt index 0756b74f..0cb27d81 100644 --- a/site/doc/pages/gz_uncompress.txt +++ b/site/doc/pages/gz_uncompress.txt @@ -17,6 +17,10 @@ Uncompresses a gzip-format byte string and returns the original content. `gz_uncompress()` validates the gzip header, CRC32 footer, and uncompressed-size footer. It throws a runtime error when the input is not a supported gzip stream or fails validation. -:example +:example capy render +var packed := gz_compress("round trip data") +print(gz_uncompress(packed), "\n") + +:example cpp render String packed = gz_compress("round trip data"); print(gz_uncompress(packed), "\n"); diff --git a/site/doc/pages/hmac_sha256.txt b/site/doc/pages/hmac_sha256.txt index cdf7bc5d..eff77189 100644 --- a/site/doc/pages/hmac_sha256.txt +++ b/site/doc/pages/hmac_sha256.txt @@ -9,7 +9,10 @@ return value : the raw 32-byte HMAC-SHA256 :content Computes an HMAC-SHA256 and returns it as raw bytes. Prefer `hmac_sha256_hex()` for printable signatures; use the raw form for binary protocols. -:example +:example capy render +print(dval_to_string(dval(length(hmac_sha256("key", "message")))), " raw bytes, hex = ", hmac_sha256_hex("key", "message"), "\n") + +:example cpp render print(hmac_sha256("key", "message").length(), " raw bytes, hex = ", hmac_sha256_hex("key", "message"), "\n"); :see diff --git a/site/doc/pages/hmac_sha256_hex.txt b/site/doc/pages/hmac_sha256_hex.txt index 6d9ae205..84fb33d8 100644 --- a/site/doc/pages/hmac_sha256_hex.txt +++ b/site/doc/pages/hmac_sha256_hex.txt @@ -9,7 +9,10 @@ return value : the HMAC-SHA256 as a 64-character lowercase hex string :content Computes an HMAC-SHA256 message authentication code and returns it as hex. Use it to sign tokens, cookies, and webhook payloads, then verify with `crypto_equal()` to avoid timing leaks. -:example +:example capy render +print(hmac_sha256_hex("key", "The quick brown fox jumps over the lazy dog"), "\n") + +:example cpp render print(hmac_sha256_hex("key", "The quick brown fox jumps over the lazy dog"), "\n"); :see diff --git a/site/doc/pages/html_escape.txt b/site/doc/pages/html_escape.txt index 6cc7a9de..b77d7741 100644 --- a/site/doc/pages/html_escape.txt +++ b/site/doc/pages/html_escape.txt @@ -19,5 +19,8 @@ Returns a version of the input string where special HTML characters are replaced - `>` becomes `>` - `"` becomes `"` -:example +:example capy render +print(html_escape("Tom & Jerry"), "\n") + +:example cpp render print(html_escape("Tom & Jerry"), "\n"); diff --git a/site/doc/pages/http_request.txt b/site/doc/pages/http_request.txt index 07f205b3..1e01f847 100644 --- a/site/doc/pages/http_request.txt +++ b/site/doc/pages/http_request.txt @@ -17,13 +17,28 @@ Returns `{ status, headers, body, error }`. :see >socket -:example +:example capy render +var request := dval({"method": "GET", "url": "http://127.0.0.1/doc/index.uce", "headers": {"Host": "uce.openfu.com"}, "timeout_ms": 2000}) +var response := http_request(request) +print("HTTP ", dval_s32(response["status"]), ", ", length(dval_to_string(response["body"])), " bytes returned\n") + +:example cpp render DValue req; req["method"] = "GET"; req["url"] = "http://127.0.0.1/doc/index.uce"; req["headers"]["Host"] = "uce.openfu.com"; req["timeout_ms"] = (f64)2000; DValue resp = http_request(req); print("HTTP ", resp["status"].to_u64(), ", ", resp["body"].to_string().length(), " bytes returned\n"); -:example + +:example capy render +// GitHub token exchange: client_secret stays in stdin body, not argv. +var client_id := "example-client" +var client_secret := "example-secret" +var code := "example-code" +var token := dval({"method": "POST", "url": "https://github.com/login/oauth/access_token", "headers": {"Accept": "application/json", "Content-Type": "application/x-www-form-urlencoded"}, "body": "client_id=" + uri_encode(client_id) + "&client_secret=" + uri_encode(client_secret) + "&code=" + uri_encode(code), "security": {"https_only": true, "public_dns_only": true, "pin_dns": true, "isolated_curl": true, "no_redirects": true}}) +var token_response := http_request(token) +print("hardened token exchange composed; status=", dval_s32(token_response["status"]), " error=", dval_to_string(token_response["error"]), "\n") + +:example cpp render // GitHub token exchange: client_secret stays in stdin body, not argv. String client_id="example-client", client_secret="example-secret", code="example-code"; DValue token; token["method"]="POST"; token["url"]="https://github.com/login/oauth/access_token"; @@ -33,7 +48,15 @@ for(String key:{"https_only","public_dns_only","pin_dns","isolated_curl","no_red DValue token_response=http_request(token); print("hardened token exchange composed; status=", token_response["status"].to_u64(), " error=", token_response["error"].to_string(), "\n"); -:example + +:example capy render +// ATProto metadata discovery uses the same generic policy; no provider operation name. +var issuer_host := "example.com" +var metadata_request := dval({"method": "GET", "url": "https://" + issuer_host + "/.well-known/oauth-authorization-server", "headers": {"Accept": "application/json"}, "security": {"https_only": true, "public_dns_only": true, "pin_dns": true, "isolated_curl": true, "no_redirects": true}}) +var metadata := http_request(metadata_request) +print("hardened metadata discovery composed; error=", dval_to_string(metadata["error"]), "\n") + +:example cpp render // ATProto metadata discovery uses the same generic policy; no provider operation name. String issuer_host="example.com"; DValue meta; meta["method"]="GET"; meta["url"]="https://"+issuer_host+"/.well-known/oauth-authorization-server"; diff --git a/site/doc/pages/http_request_async.txt b/site/doc/pages/http_request_async.txt index 20a42ac9..034b412e 100644 --- a/site/doc/pages/http_request_async.txt +++ b/site/doc/pages/http_request_async.txt @@ -5,7 +5,13 @@ Starts the same request shape as `http_request()`, including its opt-in `securit :see >socket -:example +:example capy render +var request := dval({"method": "GET", "url": "http://127.0.0.1/doc/index.uce", "headers": {"Host": "bearer.openfu.com"}, "timeout_ms": 2000}) +var job := http_request_async(request) +var done := job_await(dval(job), 3000) +print("async HTTP ", dval_s32(dval_get_by_path(done, "result/status")), "\n") + +:example cpp render DValue req; req["method"] = "GET"; req["url"] = "http://127.0.0.1/doc/index.uce"; req["headers"]["Host"] = "bearer.openfu.com"; req["timeout_ms"] = (f64)2000; u64 job = http_request_async(req); diff --git a/site/doc/pages/int_val.txt b/site/doc/pages/int_val.txt index fa16af71..8a4cdcee 100644 --- a/site/doc/pages/int_val.txt +++ b/site/doc/pages/int_val.txt @@ -16,5 +16,12 @@ Extracts an integer value from `s`. The `base` argument controls which number system is used while parsing. If no usable number can be identified, the function returns `0`. -:example +:example capy render +var decimal := "0" +if int_val("42") == 42u64 { decimal = "42" } +var hexadecimal := "0" +if int_val("ff", 16) == 255u64 { hexadecimal = "255" } +print(decimal, " / ", hexadecimal, "\n") + +:example cpp render print(int_val("42"), " / ", int_val("ff", 16), "\n"); diff --git a/site/doc/pages/job_await.txt b/site/doc/pages/job_await.txt index e3c83aaa..4fbf42e2 100644 --- a/site/doc/pages/job_await.txt +++ b/site/doc/pages/job_await.txt @@ -6,7 +6,15 @@ Waits up to `timeout_ms` for a job to finish, then returns status/result data. T :see >sys -:example +:example capy render +var spec := dval({"cmd": "printf hello-from-job", "timeout_ms": 1000}) +var job := shell_spawn(spec) +var waited := job_await(job, 3000) +var done := "false" +if dval_to_bool(waited["done"]) { done = "true" } +print("done=", done, " stdout=", dval_to_string(dval_get_by_path(waited, "result/stdout")), "\n") + +:example cpp render DValue spec; spec["cmd"] = "printf hello-from-job"; spec["timeout_ms"] = (f64)1000; u64 job = shell_spawn(spec); DValue waited = job_await(job, 3000); diff --git a/site/doc/pages/job_cancel.txt b/site/doc/pages/job_cancel.txt index 8aa78c44..2f4a1105 100644 --- a/site/doc/pages/job_cancel.txt +++ b/site/doc/pages/job_cancel.txt @@ -6,7 +6,14 @@ Attempts to terminate the background job process group and marks the registry en :see >sys -:example +:example capy render +var spec := dval({"cmd": "sleep 5", "timeout_ms": 10000}) +var job := shell_spawn(spec) +var result := "could not cancel" +if job_cancel(job) { result = "job cancelled" } +print(result, "\n") + +:example cpp render DValue spec; spec["cmd"] = "sleep 5"; spec["timeout_ms"] = (f64)10000; u64 job = shell_spawn(spec); print(job_cancel(job) ? "job cancelled" : "could not cancel", "\n"); diff --git a/site/doc/pages/job_result.txt b/site/doc/pages/job_result.txt index b0b2dd30..2d69223c 100644 --- a/site/doc/pages/job_result.txt +++ b/site/doc/pages/job_result.txt @@ -6,7 +6,13 @@ Checks a job result with a small bounded wait. The returned value includes the c :see >sys -:example +:example capy render +var spec := dval({"cmd": "printf result-data", "timeout_ms": 1000}) +var job := shell_spawn(spec) +job_await(job, 3000) +print(dval_to_string(dval_get_by_path(job_result(job), "result/stdout")), "\n") + +:example cpp render DValue spec; spec["cmd"] = "printf result-data"; spec["timeout_ms"] = (f64)1000; u64 job = shell_spawn(spec); job_await(job, 3000); diff --git a/site/doc/pages/job_status.txt b/site/doc/pages/job_status.txt index 55f121fd..1a110d3c 100644 --- a/site/doc/pages/job_status.txt +++ b/site/doc/pages/job_status.txt @@ -6,7 +6,13 @@ Returns the file-backed async job state, e.g. `{ state, done, kind, pid, job_id :see >sys -:example +:example capy render +var spec := dval({"cmd": "printf x", "timeout_ms": 1000}) +var job := shell_spawn(spec) +job_await(job, 3000) +print("state: ", dval_to_string(job_status(job)["state"]), "\n") + +:example cpp render DValue spec; spec["cmd"] = "printf x"; spec["timeout_ms"] = (f64)1000; u64 job = shell_spawn(spec); job_await(job, 3000); diff --git a/site/doc/pages/join.txt b/site/doc/pages/join.txt index 9840561f..2b13e57e 100644 --- a/site/doc/pages/join.txt +++ b/site/doc/pages/join.txt @@ -15,6 +15,10 @@ Joins all strings in `l` into a single `String`. The delimiter is inserted between items. If `delim` is omitted, the default separator is a newline character. -:example +:example capy render +var parts := split("a,b,c", ",") +print(join(parts, "-"), "\n") + +:example cpp render DValue parts = split("a,b,c", ","); print(join(parts, "-"), "\n"); diff --git a/site/doc/pages/json_consume_space.txt b/site/doc/pages/json_consume_space.txt index 2bbd1b61..fb0bcf15 100644 --- a/site/doc/pages/json_consume_space.txt +++ b/site/doc/pages/json_consume_space.txt @@ -18,7 +18,12 @@ This helper is mainly useful when writing a parser that follows BEARER's JSON pa Example: -:example +:example capy render +var index := json_consume_space(" value", 0) +if index == 3 { print("advanced\n") } +else { print("not advanced\n") } + +:example cpp render u32 i = 0; json_consume_space(" value", i); -print(i, "\n"); +print(i == 3 ? "advanced\n" : "not advanced\n"); diff --git a/site/doc/pages/json_decode.txt b/site/doc/pages/json_decode.txt index cee12b39..416cf2c2 100644 --- a/site/doc/pages/json_decode.txt +++ b/site/doc/pages/json_decode.txt @@ -28,6 +28,10 @@ Current runtime behavior: - JSON strings become native `String` `DValue` values. - JSON numbers currently deserialize as string-valued `DValue` nodes, so typed conversions such as `to_f64()` and `to_u64()` are the normal way to read numeric content. -:example +:example capy render +var data := json_decode("{\"name\": \"Ada\", \"tags\": [\"x\", \"y\"]}") +print(dval_string(data["name"]), " has 2 tags\n") + +:example cpp render DValue data = json_decode("{\"name\": \"Ada\", \"tags\": [\"x\", \"y\"]}"); print(data["name"].to_string(), " has ", data["tags"].keys().size(), " tags\n"); diff --git a/site/doc/pages/json_encode.txt b/site/doc/pages/json_encode.txt index 1c250013..23834480 100644 --- a/site/doc/pages/json_encode.txt +++ b/site/doc/pages/json_encode.txt @@ -23,7 +23,11 @@ When passed a `String`, `json_encode()` returns a quoted and escaped JSON string When passed a `DValue`, scalar values are serialized directly and nested map values are emitted as JSON objects. -:example +:example capy render +var value := dval({name: "Ada"}) +print(json_encode(value), "\n") + +:example cpp render DValue value; value["name"] = "Ada"; print(json_encode(value), "\n"); diff --git a/site/doc/pages/load.txt b/site/doc/pages/load.txt index e736f1a2..c4ea7282 100644 --- a/site/doc/pages/load.txt +++ b/site/doc/pages/load.txt @@ -7,7 +7,11 @@ file name : name of an BEARER file that should be included :see >ob +:capy-status cpp-specific + :content +Capy has no `#load` preprocessor directive; use ordinary Capy declarations or `unit_load()`/`unit_render()` for runtime module composition. + Includes another BEARER file. Use `#load` when you want the current file to pull in declarations or reusable content from another BEARER source file. @@ -15,7 +19,7 @@ Use `#load` when you want the current file to pull in declarations or reusable c Loaded sources are tracked transitively. Changing a direct or nested `#load` dependency invalidates and recompiles the entry unit before its next execution. -:example +:example cpp render // #load "file.uce" includes another unit at COMPILE time (a preprocessor directive, // used at file top level). At RUNTIME, unit_render()/unit_call() invoke another unit: unit_render("examples/sample_unit.uce"); diff --git a/site/doc/pages/ls.txt b/site/doc/pages/ls.txt index 2ac8a9d0..02b2dc55 100644 --- a/site/doc/pages/ls.txt +++ b/site/doc/pages/ls.txt @@ -8,7 +8,16 @@ return value : a list-shaped DValue of entry names :content Returns the names of the entries in a list-shaped `DValue`. For names only this is simpler than `dir_list()`, which returns full metadata per entry. -:example +:example capy render +var root := file_temp("/tmp/doc-ls-") +file_unlink(root) +mkdir(root) +file_put_contents(path_join(root, "one.txt"), "1") +file_put_contents(path_join(root, "two.txt"), "2") +print(join(sort(ls(root)), ","), "\n") +dir_remove(root, true) + +:example cpp render mkdir("/tmp/doc-ls"); file_put_contents("/tmp/doc-ls/one.txt", "1"); file_put_contents("/tmp/doc-ls/two.txt", "2"); diff --git a/site/doc/pages/map.txt b/site/doc/pages/map.txt index 48d92cbf..c06d75e0 100644 --- a/site/doc/pages/map.txt +++ b/site/doc/pages/map.txt @@ -19,7 +19,12 @@ Returns a new list by calling `f` for each item in `items`. Use `filter()` when you want to keep only matching items, and `map()` when you want to transform each item. -:example +:example capy render +var names := split("ada,grace", ",") +var upper := map(names, function(item : string) string { return to_upper(item) }) +print(join(upper, ","), "\n") + +:example cpp render DValue names = split("ada,grace", ","); DValue upper = map(names, [](String item) { return(to_upper(item)); }); print(join(upper, ","), "\n"); diff --git a/site/doc/pages/markdown_to_ast.txt b/site/doc/pages/markdown_to_ast.txt index bc8f9355..3e0fd80c 100644 --- a/site/doc/pages/markdown_to_ast.txt +++ b/site/doc/pages/markdown_to_ast.txt @@ -71,6 +71,10 @@ Options: - `options["components"]` provides the component hook map later used by `markdown_to_html()`. The parser preserves directive data needed by those hooks. -:example +:example capy render +var ast := markdown_to_ast("# Title") +if dval_is_array(ast) { print("ast\n") } else { print("empty\n") } + +:example cpp render DValue ast = markdown_to_ast("# Title"); print(ast.is_array() ? "ast\n" : "empty\n"); diff --git a/site/doc/pages/markdown_to_html.txt b/site/doc/pages/markdown_to_html.txt index 8cc2ce22..184a3010 100644 --- a/site/doc/pages/markdown_to_html.txt +++ b/site/doc/pages/markdown_to_html.txt @@ -82,5 +82,8 @@ The parser stores: That makes directive components a good fit for alerts, callouts, cards, embeds, and richer page-level Markdown extensions. -:example +:example capy render +print(markdown_to_html("**bold**"), "\n") + +:example cpp render print(markdown_to_html("**bold**"), "\n"); diff --git a/site/doc/pages/memcache_command.txt b/site/doc/pages/memcache_command.txt index 2cba7dd7..1e7398a7 100644 --- a/site/doc/pages/memcache_command.txt +++ b/site/doc/pages/memcache_command.txt @@ -14,7 +14,12 @@ Executes a raw command on an open Memcache connection and returns the server res This is the low-level escape hatch for Memcache operations that are not covered by the dedicated helpers. -:example +:example capy render +var conn := memcache_connect() +if conn != 0u64 { if memcache_command(conn, "stats") != "" { print("stats command returned data\n") } else { print("no data\n") } } +else { print("(requires a reachable memcached server)\n") } + +:example cpp render u64 conn = memcache_connect(); if(conn != 0) print(memcache_command(conn, "stats") != "" ? "stats command returned data" : "no data", "\n"); else print("(requires a reachable memcached server)\n"); diff --git a/site/doc/pages/memcache_connect.txt b/site/doc/pages/memcache_connect.txt index fc9f45b6..c139d7cc 100644 --- a/site/doc/pages/memcache_connect.txt +++ b/site/doc/pages/memcache_connect.txt @@ -14,6 +14,10 @@ Connects to a Memcache server instance. If the connection fails, the function returns `-1`. -:example +:example capy render +var conn := memcache_connect() +if conn != 0u64 { print("connected to memcached\n") } else { print("no memcached server reachable\n") } + +:example cpp render u64 conn = memcache_connect(); print(conn != 0 ? "connected to memcached" : "no memcached server reachable", "\n"); diff --git a/site/doc/pages/memcache_delete.txt b/site/doc/pages/memcache_delete.txt index 548775bf..c356647a 100644 --- a/site/doc/pages/memcache_delete.txt +++ b/site/doc/pages/memcache_delete.txt @@ -14,7 +14,15 @@ Deletes the entry identified by `key`. The return value is `true` when the operation succeeds. -:example +:example capy render +var conn := memcache_connect() +if conn != 0u64 { + memcache_set(conn, "doc_del_key", "v") + memcache_delete(conn, "doc_del_key") + print(memcache_get(conn, "doc_del_key", "gone"), "\n") +} else { print("(requires a reachable memcached server)\n") } + +:example cpp render u64 conn = memcache_connect(); if(conn != 0) { diff --git a/site/doc/pages/memcache_escape_key.txt b/site/doc/pages/memcache_escape_key.txt index 23e899d3..a4a3887c 100644 --- a/site/doc/pages/memcache_escape_key.txt +++ b/site/doc/pages/memcache_escape_key.txt @@ -12,5 +12,8 @@ return value : memcache-safe key string :content Normalizes whitespace in a memcache key to underscores before it is placed into a text protocol command. -:example +:example capy render +print(memcache_escape_key("a key with spaces"), "\n") + +:example cpp render print(memcache_escape_key("a key with spaces"), "\n"); diff --git a/site/doc/pages/memcache_escape_keys.txt b/site/doc/pages/memcache_escape_keys.txt index eadb01e5..bb473352 100644 --- a/site/doc/pages/memcache_escape_keys.txt +++ b/site/doc/pages/memcache_escape_keys.txt @@ -12,7 +12,11 @@ return value : escaped keys :content Applies `memcache_escape_key()` to each key in a list. -:example +:example capy render +var keys := dval(["a b", "c\td"]) +print(join(memcache_escape_keys(keys), ", "), "\n") + +:example cpp render DValue keys; keys.push_back("a b"); keys.push_back("c\td"); diff --git a/site/doc/pages/memcache_get.txt b/site/doc/pages/memcache_get.txt index e9ebfd96..e8639aa7 100644 --- a/site/doc/pages/memcache_get.txt +++ b/site/doc/pages/memcache_get.txt @@ -15,7 +15,12 @@ Retrieves a value from an existing Memcache connection. If the key is missing, `default_value` is returned instead. -:example +:example capy render +var conn := memcache_connect() +if conn != 0u64 { memcache_set(conn, "doc_get_key", "stored value"); print(memcache_get(conn, "doc_get_key"), "\n") } +else { print("(requires a reachable memcached server)\n") } + +:example cpp render u64 conn = memcache_connect(); if(conn != 0) { memcache_set(conn, "doc_get_key", "stored value"); print(memcache_get(conn, "doc_get_key"), "\n"); } else print("(requires a reachable memcached server)\n"); diff --git a/site/doc/pages/memcache_get_multiple.txt b/site/doc/pages/memcache_get_multiple.txt index 7ae1deed..9cad190c 100644 --- a/site/doc/pages/memcache_get_multiple.txt +++ b/site/doc/pages/memcache_get_multiple.txt @@ -14,7 +14,16 @@ Retrieves multiple entries in one call. The result is returned as a `StringMap` keyed by the requested Memcache keys. -:example +:example capy render +var conn := memcache_connect() +if conn != 0u64 { + memcache_set(conn, "doc_k1", "v1") + memcache_set(conn, "doc_k2", "v2") + var values := memcache_get_multiple(conn, dval(["doc_k1", "doc_k2"])) + print(dval_string(values["doc_k1"]), " / ", dval_string(values["doc_k2"]), "\n") +} else { print("(requires a reachable memcached server)\n") } + +:example cpp render u64 conn = memcache_connect(); if(conn != 0) { diff --git a/site/doc/pages/memcache_set.txt b/site/doc/pages/memcache_set.txt index cb22cfac..3d5d06fb 100644 --- a/site/doc/pages/memcache_set.txt +++ b/site/doc/pages/memcache_set.txt @@ -16,7 +16,12 @@ Stores `value` under `key` on the Memcache server. `expires_in` controls the expiration timeout and defaults to one hour. -:example +:example capy render +var conn := memcache_connect() +if conn != 0u64 { if memcache_set(conn, "doc_set_key", "value") { print("stored\n") } else { print("store failed\n") } } +else { print("(requires a reachable memcached server)\n") } + +:example cpp render u64 conn = memcache_connect(); if(conn != 0) print(memcache_set(conn, "doc_set_key", "value") ? "stored" : "store failed", "\n"); else print("(requires a reachable memcached server)\n"); diff --git a/site/doc/pages/mkdir.txt b/site/doc/pages/mkdir.txt index 04fba47e..da577416 100644 --- a/site/doc/pages/mkdir.txt +++ b/site/doc/pages/mkdir.txt @@ -8,7 +8,14 @@ return value : true on success :content Creates a single directory and returns whether it succeeded. The parent directory must already exist, so build nested paths one level at a time. -:example +:example capy render +var root := file_temp("/tmp/doc-mkdir-") +file_unlink(root) +mkdir(root) +if dval_bool(file_stat(root)["is_dir"]) { print("created\n") } else { print("not created\n") } +dir_remove(root, true) + +:example cpp render dir_remove("/tmp/doc-mkdir-demo", true); mkdir("/tmp/doc-mkdir-demo"); print(file_stat("/tmp/doc-mkdir-demo")["is_dir"].to_bool() ? "created" : "not created", "\n"); diff --git a/site/doc/pages/mysql_affected_rows.txt b/site/doc/pages/mysql_affected_rows.txt index e0429c7f..286d3167 100644 --- a/site/doc/pages/mysql_affected_rows.txt +++ b/site/doc/pages/mysql_affected_rows.txt @@ -13,7 +13,15 @@ mysql_insert_id :content Returns the number of rows changed by the most recent insert, update, or delete on the connection. A successful statement that returns rows, a rejected query, or a null connection returns `0` rather than retaining an earlier statement's count. -:example +:example capy render +var db := mysql_connect("localhost", "root", "", "") +if db != 0u64 { + mysql_query(db, "update users set active=1 where active=0") + print("rows updated: ", mysql_affected_rows(db), "\n") + mysql_disconnect(db) +} else { print("(requires a reachable MySQL server)\n") } + +:example cpp render MySQL* db = mysql_connect(); if(db != 0) { diff --git a/site/doc/pages/mysql_connect.txt b/site/doc/pages/mysql_connect.txt index 2317c275..9ece5a98 100644 --- a/site/doc/pages/mysql_connect.txt +++ b/site/doc/pages/mysql_connect.txt @@ -18,7 +18,12 @@ This connection handle is then used with helpers such as `mysql_query()`, `mysql MySQL handles are request-scoped framework resources. Repeated `mysql_connect()` calls with the same host, credentials, and database reuse one server connection within the current request. Database identity is part of both request-local and worker-persistent pool keys. Each call creates a lease and `mysql_disconnect()` releases that lease. At request cleanup BEARER returns the server connection to the current worker's persistent pool, then resets it before cross-request reuse. The pool holds up to `MYSQL_PERSISTENT_POOL_SIZE` connections per worker (default 8); set the size to 0 to disable cross-request reuse. Never store a `MySQL*` in globals, sessions, or other state that can outlive the current request. -:example +:example capy render +var db := mysql_connect("localhost", "root", "", "") +if mysql_connected(db) { print("connected to MySQL\n") } else { print("no MySQL server reachable with these credentials\n") } +if db != 0u64 { mysql_disconnect(db) } + +:example cpp render MySQL* db = mysql_connect(); print(mysql_connected(db) ? "connected to MySQL" : "no MySQL server reachable with these credentials", "\n"); if(db != 0) mysql_disconnect(db); diff --git a/site/doc/pages/mysql_connected.txt b/site/doc/pages/mysql_connected.txt index 956a0aad..ccd688e6 100644 --- a/site/doc/pages/mysql_connected.txt +++ b/site/doc/pages/mysql_connected.txt @@ -11,7 +11,13 @@ return value : true only when the wrapper owns a live server connection :content Tests whether a MySQL wrapper has a usable server connection. `mysql_connect()` retains a failed wrapper so that callers can retrieve its diagnostic through `mysql_error()`; this helper distinguishes that state from a live handle without consuming the diagnostic. -:example +:example capy render +var db := mysql_connect("localhost", "root", "", "") +if !mysql_connected(db) { print("database unavailable: ", mysql_error(db), "\n") } +else { print("database connected\n") } +if db != 0u64 { mysql_disconnect(db) } + +:example cpp render MySQL* db = mysql_connect(); if(!mysql_connected(db)) { diff --git a/site/doc/pages/mysql_disconnect.txt b/site/doc/pages/mysql_disconnect.txt index 5e69c929..539c5f6d 100644 --- a/site/doc/pages/mysql_disconnect.txt +++ b/site/doc/pages/mysql_disconnect.txt @@ -12,7 +12,12 @@ Closes an existing connection to a MySQL server. Releases the lease returned by `mysql_connect()`. The request-local server connection remains available for another same-credential `mysql_connect()` call and is closed by BEARER during request cleanup, including after exceptions or fatal request recovery. A `MySQL*` is only valid inside the request that opened it; do not use it after release or cache it across requests. -:example +:example capy render +var db := mysql_connect("localhost", "root", "", "") +if db != 0u64 { mysql_disconnect(db); print("connection closed\n") } +else { print("(requires a reachable MySQL server)\n") } + +:example cpp render MySQL* db = mysql_connect(); if(db != 0) { mysql_disconnect(db); print("connection closed\n"); } else print("(requires a reachable MySQL server)\n"); diff --git a/site/doc/pages/mysql_error.txt b/site/doc/pages/mysql_error.txt index d4787c21..7878c63b 100644 --- a/site/doc/pages/mysql_error.txt +++ b/site/doc/pages/mysql_error.txt @@ -13,7 +13,15 @@ Returns the last error message associated with the given MySQL connection. If there is no current error, the result is an empty string. -:example +:example capy render +var db := mysql_connect("localhost", "root", "", "") +if db != 0u64 { + mysql_query(db, "select * from no_such_table_xyz") + if mysql_error(db) != "" { print("error reported\n") } else { print("no error\n") } + mysql_disconnect(db) +} else { print("(requires a reachable MySQL server)\n") } + +:example cpp render MySQL* db = mysql_connect(); if(db != 0) { diff --git a/site/doc/pages/mysql_escape.txt b/site/doc/pages/mysql_escape.txt index d9ce7409..9ad6e624 100644 --- a/site/doc/pages/mysql_escape.txt +++ b/site/doc/pages/mysql_escape.txt @@ -14,5 +14,8 @@ Escapes a string so it can be used safely as a value inside an SQL expression. If `quote_char` is provided, the escaped result is wrapped with that quote character. Pass `NULL` when you only want escaping without wrapping. -:example +:example capy render +print(mysql_escape("O'Brien; DROP TABLE users", "'"), "\n") + +:example cpp render print(mysql_escape("O'Brien; DROP TABLE users", '\''), "\n"); diff --git a/site/doc/pages/mysql_insert_id.txt b/site/doc/pages/mysql_insert_id.txt index eec30ba1..1d4009b3 100644 --- a/site/doc/pages/mysql_insert_id.txt +++ b/site/doc/pages/mysql_insert_id.txt @@ -13,7 +13,15 @@ Returns the last automatically assigned row ID used by the current MySQL connect This is typically used after an `INSERT` into a table with an `AUTO_INCREMENT` primary key. -:example +:example capy render +var db := mysql_connect("localhost", "root", "", "") +if db != 0u64 { + mysql_query(db, "select last_insert_id() as id") + print("mysql_insert_id() returns the last AUTO_INCREMENT id for this connection (currently ", mysql_insert_id(db), ")\n") + mysql_disconnect(db) +} else { print("(requires a reachable MySQL server)\n") } + +:example cpp render MySQL* db = mysql_connect(); if(db != 0) { diff --git a/site/doc/pages/mysql_query.txt b/site/doc/pages/mysql_query.txt index 768dda96..939fe724 100644 --- a/site/doc/pages/mysql_query.txt +++ b/site/doc/pages/mysql_query.txt @@ -22,7 +22,15 @@ The result is returned as a `DValue`, which makes it easy to iterate through row After an insert, update, or delete, use `mysql_affected_rows()` to inspect how many rows changed. -:example +:example capy cli +var db := mysql_connect("localhost", "root", "", "") +if db != 0u64 { + var rows := mysql_query(db, "select 'ada@example.test' as email, 1 + 1 as total limit :limit!", dval({limit: "1"})) + print(dval_string(rows[0]["email"]), " / total=", dval_string(rows[0]["total"]), "\n") + mysql_disconnect(db) +} else { print("(requires a reachable MySQL server)\n") } + +:example cpp cli MySQL* db = mysql_connect(); if(db != 0) { diff --git a/site/doc/pages/nibble.txt b/site/doc/pages/nibble.txt index 733bd924..49077a8f 100644 --- a/site/doc/pages/nibble.txt +++ b/site/doc/pages/nibble.txt @@ -9,7 +9,11 @@ return value : string before first occurrence of 'delim' :see >string +:capy-status unsupported + :content +Capy has no equivalent because its strings are copied ARC values and it deliberately has no reference-parameter ABI to mutate the caller's string. + Returns the part of `haystack` before the first occurrence of `delim`. As a side effect, the consumed portion is removed from `haystack`, including the delimiter itself. @@ -17,6 +21,6 @@ As a side effect, the consumed portion is removed from `haystack`, including the If `delim` does not occur in `haystack`, the entire string is returned and `haystack` is set to an empty string. -:example +:example cpp render String path = "docs/index"; print(nibble(path, "/"), " ", path, "\n"); diff --git a/site/doc/pages/ob_close.txt b/site/doc/pages/ob_close.txt index e2df4183..c2804185 100644 --- a/site/doc/pages/ob_close.txt +++ b/site/doc/pages/ob_close.txt @@ -7,7 +7,13 @@ return value : none :content Discards the current output buffer and its contents, switching back to the previous buffer on the stack. Use it when you captured output only to throw it away (e.g. rendering for a side effect). -:example +:example capy render +ob_start() +print("this output is discarded") +ob_close() +print("the buffered text never reached the response\n") + +:example cpp render ob_start(); print("this output is discarded"); ob_close(); diff --git a/site/doc/pages/ob_get.txt b/site/doc/pages/ob_get.txt index 3da9b78a..dcaed663 100644 --- a/site/doc/pages/ob_get.txt +++ b/site/doc/pages/ob_get.txt @@ -7,7 +7,14 @@ return value : the current buffer's contents :content Returns the current output buffer's contents WITHOUT discarding the buffer, so more output can still be appended. Use `ob_get_close()` when you also want to pop the buffer. -:example +:example capy render +ob_start() +print("partial") +var snapshot := ob_get() +ob_close() +print("snapshot was: ", snapshot, "\n") + +:example cpp render ob_start(); print("partial"); String snapshot = ob_get(); diff --git a/site/doc/pages/ob_get_close.txt b/site/doc/pages/ob_get_close.txt index a3ee9cae..a7feeb6b 100644 --- a/site/doc/pages/ob_get_close.txt +++ b/site/doc/pages/ob_get_close.txt @@ -7,7 +7,14 @@ return value : the current buffer's contents :content Returns the current output buffer's contents and discards the buffer, switching back to the previous one on the stack. This is the usual way to capture rendered output for post-processing. -:example +:example capy render +ob_start() +print("hello ") +print("world") +var html := ob_get_close() +print("captured ", length(html), " chars: ", html, "\n") + +:example cpp render ob_start(); print("hello "); print("world"); diff --git a/site/doc/pages/ob_start.txt b/site/doc/pages/ob_start.txt index 83615efa..b0b7f6ec 100644 --- a/site/doc/pages/ob_start.txt +++ b/site/doc/pages/ob_start.txt @@ -7,7 +7,13 @@ return value : none :content Starts a new output buffer. Subsequent `print()` output is captured into it instead of the response until you collect it with `ob_get_close()` (or discard it with `ob_close()`). Buffers nest: each `ob_start()` pushes another buffer onto the stack. Use it to render a fragment, post-process it, then emit the result. -:example +:example capy render +ob_start() +print("buffered text") +var captured := ob_get_close() +print("captured: ", captured, "\n") + +:example cpp render ob_start(); print("buffered text"); String captured = ob_get_close(); diff --git a/site/doc/pages/parse_query.txt b/site/doc/pages/parse_query.txt index dce0d026..96bbe64b 100644 --- a/site/doc/pages/parse_query.txt +++ b/site/doc/pages/parse_query.txt @@ -28,6 +28,10 @@ Examples: This is useful when you need to work with URL parameter data outside the normal request parsing flow. -:example +:example capy render +var query := parse_query("name=Ada&role=admin") +print(dval_string(query["name"]), "\n") + +:example cpp render StringMap q = parse_query("name=Ada&role=admin"); print(q["name"], "\n"); diff --git a/site/doc/pages/parse_uri.txt b/site/doc/pages/parse_uri.txt index 737953f8..5e0ef52e 100644 --- a/site/doc/pages/parse_uri.txt +++ b/site/doc/pages/parse_uri.txt @@ -23,6 +23,10 @@ Example: Use `parse_uri()` when you need to inspect a full URL. Use `parse_query()` when you only have the query string. -:example +:example capy render +var uri := parse_uri("https://example.test/docs?name=Ada") +print(dval_string(uri["parts"]["path"]), " ", dval_string(uri["query"]["name"]), "\n") + +:example cpp render URI uri = parse_uri("https://example.test/docs?name=Ada"); print(uri.parts["path"], " ", uri.query["name"], "\n"); diff --git a/site/doc/pages/password_hash.txt b/site/doc/pages/password_hash.txt index 112535b4..8bd1a324 100644 --- a/site/doc/pages/password_hash.txt +++ b/site/doc/pages/password_hash.txt @@ -8,7 +8,11 @@ return value : self-contained scrypt encoding, or an empty string on failure :content Creates a password credential with a cryptographically random salt and BEARER's current bounded scrypt parameters. Store the returned encoding exactly as produced. An empty result means hashing failed; abort the credential write and report an operational error instead of storing it. -:example +:example capy render +var encoded := password_hash("correct horse battery staple") +if encoded != "" && password_verify("correct horse battery staple", encoded) { print("valid\n") } else { print("failed\n") } + +:example cpp render String encoded = password_hash("correct horse battery staple"); print(encoded != "" && password_verify("correct horse battery staple", encoded) ? "valid" : "failed", "\n"); diff --git a/site/doc/pages/password_needs_rehash.txt b/site/doc/pages/password_needs_rehash.txt index bc6c131d..b532e2ce 100644 --- a/site/doc/pages/password_needs_rehash.txt +++ b/site/doc/pages/password_needs_rehash.txt @@ -8,7 +8,11 @@ return value : true when the encoding is malformed or does not use BEARER's curr :content Checks whether a stored BEARER password encoding should be replaced. Call it only after successful verification, then hash the known-correct password again and atomically replace the old credential. Non-BEARER legacy formats are reported as needing rehash but must be verified by the application before upgrade. -:example +:example capy render +var old := "$bearer$scrypt$16384$8$1$00112233445566778899aabbccddeeff$29fdfb3d991961e926a19c1136a07e252afa5fdb8d3a0fb74cdcfa5016956f34" +if password_verify("legacy password", old) && password_needs_rehash(old) { print("upgrade\n") } else { print("keep\n") } + +:example cpp render String old = "$bearer$scrypt$16384$8$1$00112233445566778899aabbccddeeff$29fdfb3d991961e926a19c1136a07e252afa5fdb8d3a0fb74cdcfa5016956f34"; print(password_verify("legacy password", old) && password_needs_rehash(old) ? "upgrade" : "keep", "\n"); diff --git a/site/doc/pages/password_verify.txt b/site/doc/pages/password_verify.txt index 37e1ca07..5c64aa32 100644 --- a/site/doc/pages/password_verify.txt +++ b/site/doc/pages/password_verify.txt @@ -9,7 +9,12 @@ return value : true only when the password matches a structurally valid, bounded :content Derives the candidate with the parameters embedded in `encoded` and compares the result in constant time. Malformed encodings and parameters above BEARER's accepted memory/work policy are rejected before derivation. Apply application-level password length limits and rate limiting around public authentication endpoints. -:example +:example capy render +var encoded := password_hash("correct horse battery staple") +if password_verify("correct horse battery staple", encoded) { print("valid / ") } else { print("invalid / ") } +if password_verify("wrong password", encoded) { print("valid\n") } else { print("invalid\n") } + +:example cpp render String encoded = password_hash("correct horse battery staple"); print(password_verify("correct horse battery staple", encoded) ? "valid" : "invalid", " / "); print(password_verify("wrong password", encoded) ? "valid" : "invalid", "\n"); diff --git a/site/doc/pages/path_is_within.txt b/site/doc/pages/path_is_within.txt index 89162d19..0aca43a1 100644 --- a/site/doc/pages/path_is_within.txt +++ b/site/doc/pages/path_is_within.txt @@ -9,7 +9,17 @@ return value : true if `path` is inside `root` :content Reports whether `path` lies inside `root`. It resolves both paths to their canonical form (like `path_real()`), so they must exist and `..` traversal is collapsed first. Use it to reject path-traversal attempts before opening user-supplied paths. -:example +:example capy render +var root := file_temp("/tmp/doc-within-") +file_unlink(root) +mkdir(root) +var path := path_join(root, "app.txt") +file_put_contents(path, "x") +if path_is_within(path, root) { print("inside / ") } else { print("outside / ") } +if path_is_within(path_join(root, "../" + basename(root) + "/app.txt"), root) { print("inside\n") } else { print("outside\n") } +dir_remove(root, true) + +:example cpp render mkdir("/tmp/doc-within"); file_put_contents("/tmp/doc-within/app.txt", "x"); print(path_is_within("/tmp/doc-within/app.txt", "/tmp/doc-within") ? "inside" : "outside", " / "); diff --git a/site/doc/pages/path_join.txt b/site/doc/pages/path_join.txt index f3daef45..c2d6a91d 100644 --- a/site/doc/pages/path_join.txt +++ b/site/doc/pages/path_join.txt @@ -9,7 +9,10 @@ return value : the two joined with a single separator :content Joins two path fragments with exactly one separator, regardless of whether `base` ends in a slash or `child` begins with one. Use it instead of string concatenation to build paths safely. -:example +:example capy render +print(path_join("/var/www", "site/index.uce"), "\n") + +:example cpp render print(path_join("/var/www", "site/index.uce"), "\n"); :see diff --git a/site/doc/pages/path_real.txt b/site/doc/pages/path_real.txt index 7cbefddc..fb2e35f0 100644 --- a/site/doc/pages/path_real.txt +++ b/site/doc/pages/path_real.txt @@ -8,7 +8,13 @@ return value : the canonical absolute path, or "" if it cannot be resolved :content Resolves a path to its canonical absolute form, following symlinks and collapsing `.` and `..` segments. The path must exist. Combine with `path_is_within()` to validate that user-supplied paths stay inside an allowed root. -:example +:example capy render +var path := "/tmp/doc-real.txt" +file_put_contents(path, "x") +print(path_real(path), "\n") +file_unlink(path) + +:example cpp render file_put_contents("/tmp/doc-real.txt", "x"); print(path_real("/tmp/../tmp/./doc-real.txt"), "\n"); diff --git a/site/doc/pages/print.txt b/site/doc/pages/print.txt index c4083cdb..7716953d 100644 --- a/site/doc/pages/print.txt +++ b/site/doc/pages/print.txt @@ -13,5 +13,8 @@ Appends data to the current request output stream. Use `print()` when you want to emit response content directly from BEARER code. -:example +:example capy render +print("hello docs\n") + +:example cpp render print("hello docs\n"); diff --git a/site/doc/pages/process_start_directory.txt b/site/doc/pages/process_start_directory.txt index 2f9c366c..1c9a97f7 100644 --- a/site/doc/pages/process_start_directory.txt +++ b/site/doc/pages/process_start_directory.txt @@ -12,5 +12,8 @@ return value : worker process start directory :content Returns the directory captured when the native process started. It remains stable even if `cwd_set()` changes the current working directory. -:example +:example capy render +if process_start_directory() != "" { print("have a start directory\n") } else { print("none\n") } + +:example cpp render print(process_start_directory() != "" ? "have a start directory" : "none", "\n"); diff --git a/site/doc/pages/random_bytes.txt b/site/doc/pages/random_bytes.txt index c64a69b0..01689658 100644 --- a/site/doc/pages/random_bytes.txt +++ b/site/doc/pages/random_bytes.txt @@ -8,7 +8,11 @@ return value : `n` cryptographically random bytes :content Returns `n` cryptographically secure random bytes, suitable for session IDs, tokens, and salts. The bytes are binary; wrap them with `base64_encode()` or `sha256_hex()` when you need printable text. -:example +:example capy render +var token := base64_encode(random_bytes(16u64)) +print(length(random_bytes(16u64)), " raw bytes; as base64 token: ", length(token), " chars\n") + +:example cpp render String token = base64_encode(random_bytes(16)); print(random_bytes(16).length(), " raw bytes; as base64 token: ", token.length(), " chars\n"); diff --git a/site/doc/pages/redirect.txt b/site/doc/pages/redirect.txt index 281f5387..e76df239 100644 --- a/site/doc/pages/redirect.txt +++ b/site/doc/pages/redirect.txt @@ -16,5 +16,10 @@ Sets the `Location` response header and updates the current HTTP status code. Use this helper instead of manually assigning `context.header["Location"]` and `context.set_status(...)` when you want to redirect the current response. -:example +:example capy cli +redirect("/next") +print("redirect(\"/next\") sends an HTTP redirect.\n") + +:example cpp cli +redirect("/next"); print("redirect(\"/next\") sends an HTTP redirect.\n"); diff --git a/site/doc/pages/regex_match.txt b/site/doc/pages/regex_match.txt index 788bcb6f..cb35919f 100644 --- a/site/doc/pages/regex_match.txt +++ b/site/doc/pages/regex_match.txt @@ -38,5 +38,8 @@ BEARER uses PCRE2 in UTF-8 + Unicode-property mode by default, so patterns such Invalid patterns or invalid flags raise a request-visible runtime error with the PCRE2 diagnostic message. -:example +:example capy render +if regex_match("^[a-z]+$", "docs") { print("match\n") } else { print("no\n") } + +:example cpp render print(regex_match("^[a-z]+$", "docs") ? "match\n" : "no\n"); diff --git a/site/doc/pages/regex_replace.txt b/site/doc/pages/regex_replace.txt index 76a065b6..b8b89980 100644 --- a/site/doc/pages/regex_replace.txt +++ b/site/doc/pages/regex_replace.txt @@ -30,5 +30,8 @@ For simple literal search-and-replace, use `replace()`. Use `regex_replace()` wh Invalid patterns, invalid flags, or invalid substitution syntax raise a request-visible runtime error. -:example +:example capy render +print(regex_replace("docs", "manual", "bearer docs"), "\n") + +:example cpp render print(regex_replace("docs", "manual", "bearer docs"), "\n"); diff --git a/site/doc/pages/regex_search.txt b/site/doc/pages/regex_search.txt index 863d8dba..d9671751 100644 --- a/site/doc/pages/regex_search.txt +++ b/site/doc/pages/regex_search.txt @@ -39,6 +39,10 @@ Capture entries contain: If no match is found, `matched` is `false` and match-specific fields are omitted. -:example +:example capy render +var match := regex_search("docs", "bearer docs") +print(dval_string(match["match"]), "\n") + +:example cpp render DValue match = regex_search("docs", "bearer docs"); print(match["match"].to_string(), "\n"); diff --git a/site/doc/pages/regex_search_all.txt b/site/doc/pages/regex_search_all.txt index 83d72a5e..6ee097da 100644 --- a/site/doc/pages/regex_search_all.txt +++ b/site/doc/pages/regex_search_all.txt @@ -32,6 +32,10 @@ Return shape: Zero-length matches are handled safely; the scanner advances after each zero-length match to avoid infinite loops. -:example +:example capy render +var matches := regex_search_all("[a-z]+", "bearer docs") +if dval_is_list(matches) { print("matches\n") } else { print("none\n") } + +:example cpp render DValue matches = regex_search_all("[a-z]+", "bearer docs"); print(matches.is_list() ? "matches\n" : "none\n"); diff --git a/site/doc/pages/regex_split.txt b/site/doc/pages/regex_split.txt index 24a398e4..88ecfef6 100644 --- a/site/doc/pages/regex_split.txt +++ b/site/doc/pages/regex_split.txt @@ -34,5 +34,8 @@ Behavior notes: - If the pattern does not match, the result contains the original subject as a single item. - Zero-length separators are handled safely to avoid infinite loops. -:example +:example capy render +print(join(regex_split("\\s+", "bearer docs api"), ","), "\n") + +:example cpp render print(join(regex_split("\\s+", "bearer docs api"), ","), "\n"); diff --git a/site/doc/pages/replace.txt b/site/doc/pages/replace.txt index 3c62fe16..bddbe1f6 100644 --- a/site/doc/pages/replace.txt +++ b/site/doc/pages/replace.txt @@ -16,5 +16,8 @@ Replaces every occurrence of `search` in `s` with `replace_with`. The returned string contains the fully replaced result. -:example +:example capy render +print(replace("hello docs", "docs", "BEARER"), "\n") + +:example cpp render print(replace("hello docs", "docs", "BEARER"), "\n"); diff --git a/site/doc/pages/request_base_url.txt b/site/doc/pages/request_base_url.txt index 90ec5e10..53d49825 100644 --- a/site/doc/pages/request_base_url.txt +++ b/site/doc/pages/request_base_url.txt @@ -10,5 +10,8 @@ request_query_route Returns the canonical directory base URL for the current script. This is useful for front-controller apps that generate links to sibling assets or query-routed pages. -:example +:example capy render +if request_base_url() != "" { print("base url\n") } else { print("empty\n") } + +:example cpp render print(request_base_url(context) != "" ? "base url\n" : "empty\n"); diff --git a/site/doc/pages/request_context_params.txt b/site/doc/pages/request_context_params.txt index 9b245bf9..f131f533 100644 --- a/site/doc/pages/request_context_params.txt +++ b/site/doc/pages/request_context_params.txt @@ -29,5 +29,9 @@ BEARER populates several convenience request parameters before invoking page, co These are useful for front-controller apps that use URLs like `/?dashboard` or `/?workspace/projects` while still accepting ordinary named query parameters. -:example +:example capy render +var snapshot := request_context() +if dval_to_string(dval_get_by_path(snapshot, "params/SCRIPT_URL")) != "" { print("has script url\n") } else { print("request params available\n") } + +:example cpp render print(context.params["SCRIPT_URL"] != "" ? "has script url\n" : "request params available\n"); diff --git a/site/doc/pages/request_perf.txt b/site/doc/pages/request_perf.txt index 1598ba19..94f988e4 100644 --- a/site/doc/pages/request_perf.txt +++ b/site/doc/pages/request_perf.txt @@ -29,6 +29,10 @@ Workspace birth is subdivided into `birth_policy_us`, `birth_import_us`, `birth_ Wasm FastCGI workers retain up to `MYSQL_PERSISTENT_POOL_SIZE` credential-keyed MySQL connections (default `8`; set `0` to disable). BEARER calls the client library's connection-reset operation before another request receives a cached connection, clearing transactions, temporary tables, session variables, and selected databases while avoiding a new authentication handshake. Same-request leases continue to share state until request cleanup. -:example +:example capy render +var perf := request_perf() +if dval_get_type_name(perf) != "invalid" { print("captured a timing snapshot\n") } else { print("no data\n") } + +:example cpp render DValue perf = request_perf(); print(perf.get_type_name() != "invalid" ? "captured a timing snapshot" : "no data", "\n"); diff --git a/site/doc/pages/request_query_path.txt b/site/doc/pages/request_query_path.txt index aa83a0b2..7f42ab6a 100644 --- a/site/doc/pages/request_query_path.txt +++ b/site/doc/pages/request_query_path.txt @@ -19,5 +19,8 @@ When no keyless route is supplied, the result is `default_path`. When unsafe rou The runtime-populated `context.params["ROUTE_PATH"]` uses the same sanitizer. -:example +:example capy render +if request_query_path("index") != "" { print("path\n") } else { print("empty\n") } + +:example cpp render print(request_query_path(context, "index") != "" ? "path\n" : "empty\n"); diff --git a/site/doc/pages/request_query_route.txt b/site/doc/pages/request_query_route.txt index 79c0b154..0e5113cc 100644 --- a/site/doc/pages/request_query_route.txt +++ b/site/doc/pages/request_query_route.txt @@ -21,6 +21,10 @@ Fields: This supports front-controller apps that use URLs such as `/?dashboard` or `/?workspace/projects` while still allowing ordinary named query parameters alongside the route. The returned `l_path` is already sanitized for composing under an application-controlled route root. -:example +:example capy render +var route := request_query_route("index") +if dval_is_array(route) { print("route\n") } else { print("empty\n") } + +:example cpp render DValue route = request_query_route(context, "index"); print(route.is_array() ? "route\n" : "empty\n"); diff --git a/site/doc/pages/request_route_from_raw_path.txt b/site/doc/pages/request_route_from_raw_path.txt index 28c1eedd..bb4bd91f 100644 --- a/site/doc/pages/request_route_from_raw_path.txt +++ b/site/doc/pages/request_route_from_raw_path.txt @@ -13,6 +13,11 @@ return value : route metadata DValue :content Normalizes and validates a raw route path. The returned DValue includes route fields used by request context population, including sanitized path and validity metadata. -:example +:example capy render +var route := request_route_from_raw_path("blog/2024/hello-world") +print("page=", dval_string(route["page"]), " valid=") +if dval_bool(route["valid"]) { print("yes\n") } else { print("no\n") } + +:example cpp render DValue route = request_route_from_raw_path("blog/2024/hello-world"); print("page=", route["page"].to_string(), " valid=", route["valid"].to_bool() ? "yes" : "no", "\n"); diff --git a/site/doc/pages/request_script_url.txt b/site/doc/pages/request_script_url.txt index 9b0a3103..5f88fad1 100644 --- a/site/doc/pages/request_script_url.txt +++ b/site/doc/pages/request_script_url.txt @@ -10,5 +10,8 @@ request_query_route Returns the request script URL from `DOCUMENT_URI` / `SCRIPT_NAME`, canonicalizing a front-controller URL ending in `/index.uce` to the containing directory URL. -:example +:example capy render +if request_script_url() != "" { print("script url\n") } else { print("empty\n") } + +:example cpp render print(request_script_url(context) != "" ? "script url\n" : "empty\n"); diff --git a/site/doc/pages/route_path_is_safe.txt b/site/doc/pages/route_path_is_safe.txt index 067b3e78..140d89d3 100644 --- a/site/doc/pages/route_path_is_safe.txt +++ b/site/doc/pages/route_path_is_safe.txt @@ -16,5 +16,8 @@ A safe route path contains only non-empty segments made from ASCII letters, digi Most request code should use runtime-populated `context.params["ROUTE_PATH"]` or `request_query_route()` instead of calling this directly. -:example +:example capy render +if route_path_is_safe("docs/index") { print("safe\n") } else { print("unsafe\n") } + +:example cpp render print(route_path_is_safe("docs/index") ? "safe\n" : "unsafe\n"); diff --git a/site/doc/pages/route_path_normalize.txt b/site/doc/pages/route_path_normalize.txt index 85af90b7..ce423b43 100644 --- a/site/doc/pages/route_path_normalize.txt +++ b/site/doc/pages/route_path_normalize.txt @@ -14,5 +14,8 @@ Trims whitespace and removes leading/trailing `/` from a route path without deci For route data that may be used to compose file paths, prefer `route_path_sanitize()` or runtime-populated `context.params["ROUTE_PATH"]`. -:example +:example capy render +print(route_path_normalize("/docs/index/"), "\n") + +:example cpp render print(route_path_normalize("/docs/index/"), "\n"); diff --git a/site/doc/pages/route_path_sanitize.txt b/site/doc/pages/route_path_sanitize.txt index 29a5e5b4..a526cf5d 100644 --- a/site/doc/pages/route_path_sanitize.txt +++ b/site/doc/pages/route_path_sanitize.txt @@ -26,5 +26,8 @@ Use this instead of manually checking app routes before composing file paths. `request_query_path()`, `request_query_route()`, and the runtime-populated `ROUTE_PATH` params already use this sanitizer. -:example +:example capy render +print(route_path_sanitize("../secret", "index"), "\n") + +:example cpp render print(route_path_sanitize("../secret", "index"), "\n"); diff --git a/site/doc/pages/runtime_safe_key.txt b/site/doc/pages/runtime_safe_key.txt index dcc06b01..df91c7c9 100644 --- a/site/doc/pages/runtime_safe_key.txt +++ b/site/doc/pages/runtime_safe_key.txt @@ -13,5 +13,8 @@ return value : stable SHA-1 key, or an empty string for empty input in wasm :content Trims a runtime key and converts it to a stable SHA-1 identifier suitable for task/runtime file names. -:example +:example capy render +print(runtime_safe_key(" My Task Name "), "\n") + +:example cpp render print(runtime_safe_key(" My Task Name "), "\n"); diff --git a/site/doc/pages/safe_name.txt b/site/doc/pages/safe_name.txt index 2a29e9e5..dd019ebd 100644 --- a/site/doc/pages/safe_name.txt +++ b/site/doc/pages/safe_name.txt @@ -8,7 +8,10 @@ return value : a sanitized name safe to use as a file or key name :content Sanitizes a string into a safe name by normalizing or stripping characters that are unsafe in file names and identifiers (whitespace, separators, control characters). Use it before turning user input into a file name or cache key. -:example +:example capy render +print(safe_name("My Report: 2024/Q1!"), "\n") + +:example cpp render print(safe_name("My Report: 2024/Q1!"), "\n"); :see diff --git a/site/doc/pages/server_start_http.txt b/site/doc/pages/server_start_http.txt index e256fd6d..47fe86ae 100644 --- a/site/doc/pages/server_start_http.txt +++ b/site/doc/pages/server_start_http.txt @@ -37,7 +37,12 @@ SERVE_HTTP:admin(Request* req) The custom server dispatcher uses the same nonblocking HTTP listener machinery as the built-in HTTP/WebSocket path, and hands request/response data through the normal `Request` object. Handler code may block in the first implementation; future worker dispatch can be added without changing this API. -:example +:example capy render +var pid := server_start_http("doc-demo-server", "/tmp/bearer/custom-servers/doc-demo.sock", "examples/sample_unit.uce", "RENDER") +if pid > 0 { print("custom HTTP server started\n") } else { print("start failed\n") } +server_stop("doc-demo-server") + +:example cpp render pid_t pid = server_start_http("doc-demo-server", "/tmp/bearer/custom-servers/doc-demo.sock", "examples/sample_unit.uce", "RENDER"); print(pid > 0 ? "custom HTTP server started" : "start failed", "\n"); server_stop("doc-demo-server"); diff --git a/site/doc/pages/server_stop.txt b/site/doc/pages/server_stop.txt index ea52c55d..e00f0a6e 100644 --- a/site/doc/pages/server_stop.txt +++ b/site/doc/pages/server_stop.txt @@ -14,6 +14,10 @@ Stops a custom server listener by key and removes its registry config. `server_stop()` currently targets custom servers started through `server_start_http()`. The same key model is intended to extend to future `server_start_tcp()` and `server_start_udp()` helpers. -:example +:example capy render +server_start_http("doc-demo-stop", "/tmp/bearer/custom-servers/doc-stop.sock", "examples/sample_unit.uce", "RENDER") +if server_stop("doc-demo-stop") { print("server stopped\n") } else { print("no such server\n") } + +:example cpp render server_start_http("doc-demo-stop", "/tmp/bearer/custom-servers/doc-stop.sock", "examples/sample_unit.uce", "RENDER"); print(server_stop("doc-demo-stop") ? "server stopped" : "no such server", "\n"); diff --git a/site/doc/pages/session_destroy.txt b/site/doc/pages/session_destroy.txt index 78fadb87..eb39fcef 100644 --- a/site/doc/pages/session_destroy.txt +++ b/site/doc/pages/session_destroy.txt @@ -13,7 +13,12 @@ Deletes the cookie specified by `session_name`, removes the matching server-side This also empties `context.session_id`, `context.session_name`, and `context.session`. -:example +:example capy render +var id := session_start("bearer-doc-example-destroy") +session_destroy("bearer-doc-example-destroy") +if id != "" { print("destroyed\n") } else { print("empty\n") } + +:example cpp render String id = session_start("bearer-doc-example-destroy"); session_destroy("bearer-doc-example-destroy"); print(id != "" ? "destroyed\n" : "empty\n"); diff --git a/site/doc/pages/session_id_create.txt b/site/doc/pages/session_id_create.txt index 7cc08eaf..1e6a8b46 100644 --- a/site/doc/pages/session_id_create.txt +++ b/site/doc/pages/session_id_create.txt @@ -13,5 +13,8 @@ Creates and returns a new session ID. This helper is useful when you need to generate a session token directly rather than starting a full session flow with `session_start()`. -:example +:example capy render +if length(session_id_create()) > 0 { print("session id\n") } else { print("empty\n") } + +:example cpp render print(session_id_create().length() > 0 ? "session id\n" : "empty\n"); diff --git a/site/doc/pages/session_start.txt b/site/doc/pages/session_start.txt index f7caacff..7d46093a 100644 --- a/site/doc/pages/session_start.txt +++ b/site/doc/pages/session_start.txt @@ -20,6 +20,10 @@ After `session_start()` completes, the following `context` fields are populated: - `context.session` contains the current session data. The session data is automatically saved after the request completes. -:example +:example capy render +var id := session_start("bearer-doc-example") +if id != "" { print("started\n") } else { print("empty\n") } + +:example cpp render String id = session_start("bearer-doc-example"); print(id != "" ? "started\n" : "empty\n"); diff --git a/site/doc/pages/sha256.txt b/site/doc/pages/sha256.txt index f0bcc6ef..7ea1180a 100644 --- a/site/doc/pages/sha256.txt +++ b/site/doc/pages/sha256.txt @@ -8,7 +8,10 @@ return value : the raw 32-byte SHA-256 digest :content Returns the SHA-256 digest of `data` as raw bytes. Prefer `sha256_hex()` when you need printable text; use the raw form when feeding the digest into other binary operations. -:example +:example capy render +print(length(sha256("abc")), " raw bytes, hex = ", sha256_hex("abc"), "\n") + +:example cpp render print(sha256("abc").length(), " raw bytes, hex = ", sha256_hex("abc"), "\n"); :see diff --git a/site/doc/pages/sha256_hex.txt b/site/doc/pages/sha256_hex.txt index d00ec137..af0d903c 100644 --- a/site/doc/pages/sha256_hex.txt +++ b/site/doc/pages/sha256_hex.txt @@ -8,7 +8,10 @@ return value : the SHA-256 digest as a 64-character lowercase hex string :content Returns the SHA-256 digest of `data` as hex text. Use it for checksums, cache keys, and content fingerprints where you want a printable digest. For the raw 32-byte digest use `sha256()`. -:example +:example capy render +print(sha256_hex("abc"), "\n") + +:example cpp render print(sha256_hex("abc"), "\n"); :see diff --git a/site/doc/pages/shell_escape.txt b/site/doc/pages/shell_escape.txt index f410ec8c..0c36c099 100644 --- a/site/doc/pages/shell_escape.txt +++ b/site/doc/pages/shell_escape.txt @@ -13,5 +13,8 @@ Escapes a parameter so it can be used more safely with `shell_exec()`. This is the helper to reach for when building shell command lines from dynamic input. -:example +:example capy render +print(shell_escape("rm -rf /; echo pwned"), "\n") + +:example cpp render print(shell_escape("rm -rf /; echo pwned"), "\n"); diff --git a/site/doc/pages/shell_exec.txt b/site/doc/pages/shell_exec.txt index 6a083018..80927277 100644 --- a/site/doc/pages/shell_exec.txt +++ b/site/doc/pages/shell_exec.txt @@ -13,5 +13,8 @@ Executes a Linux shell command and returns the generated output. When command text includes user-controlled input, escape that input first with `shell_escape()`. -:example +:example capy render +print(shell_exec("echo hello from the shell")) + +:example cpp render print(shell_exec("echo hello from the shell")); diff --git a/site/doc/pages/shell_spawn.txt b/site/doc/pages/shell_spawn.txt index ddbf58f3..153769f9 100644 --- a/site/doc/pages/shell_spawn.txt +++ b/site/doc/pages/shell_spawn.txt @@ -8,7 +8,13 @@ Use `job_status()`, `job_await()`, `job_result()`, or `job_cancel()` with the re :see >sys -:example +:example capy render +var spec := dval({"cmd": "printf 'spawned in the background'", "timeout_ms": 1000}) +var job := shell_spawn(spec) +var done := job_await(job, 3000) +print(dval_to_string(dval_get_by_path(done, "result/stdout")), "\n") + +:example cpp render DValue spec; spec["cmd"] = "printf 'spawned in the background'"; spec["timeout_ms"] = (f64)1000; u64 job = shell_spawn(spec); DValue done = job_await(job, 3000); diff --git a/site/doc/pages/signal_name.txt b/site/doc/pages/signal_name.txt index 71c6e743..4899fd96 100644 --- a/site/doc/pages/signal_name.txt +++ b/site/doc/pages/signal_name.txt @@ -18,5 +18,8 @@ Example: This is mostly useful in diagnostics and error reporting code. -:example +:example capy render +print(signal_name(11), " / ", signal_name(6), "\n") + +:example cpp render print(signal_name(SIGSEGV), " / ", signal_name(SIGABRT), "\n"); diff --git a/site/doc/pages/socket_close.txt b/site/doc/pages/socket_close.txt index d2676172..14224b8a 100644 --- a/site/doc/pages/socket_close.txt +++ b/site/doc/pages/socket_close.txt @@ -12,7 +12,13 @@ Closes an existing socket connection. Use this when you are done with a socket opened through `socket_connect()`. -:example +:example capy render +var fd := socket_connect("127.0.0.1", 80) +if fd != 0u64 { print("opened a socket") } else { print("open failed") } +print(", now closing it\n") +socket_close(fd) + +:example cpp render u64 fd = socket_connect("127.0.0.1", 80); print(fd != 0 ? "opened a socket" : "open failed", ", now closing it\n"); socket_close(fd); diff --git a/site/doc/pages/socket_connect.txt b/site/doc/pages/socket_connect.txt index 16d6949e..1c243702 100644 --- a/site/doc/pages/socket_connect.txt +++ b/site/doc/pages/socket_connect.txt @@ -14,7 +14,12 @@ Opens a socket connection to the given `host` and `port`. The returned socket handle is then used with `socket_read()`, `socket_write()`, and `socket_close()`. Currently this helper accepts IPv4 dotted-quad addresses in socket calls and does not perform hostname resolution. -:example +:example capy render +var fd := socket_connect("127.0.0.1", 80) +if fd != 0u64 { print("connected to the local server\n") } else { print("connect failed\n") } +socket_close(fd) + +:example cpp render u64 fd = socket_connect("127.0.0.1", 80); print(fd != 0 ? "connected to the local server" : "connect failed", "\n"); socket_close(fd); diff --git a/site/doc/pages/socket_read.txt b/site/doc/pages/socket_read.txt index a767776d..2956d4ef 100644 --- a/site/doc/pages/socket_read.txt +++ b/site/doc/pages/socket_read.txt @@ -15,7 +15,14 @@ Reads data from a socket connection. `max_length` limits how much data is read, and `timeout` controls how long the operation is allowed to wait. -:example +:example capy render +var fd := socket_connect("127.0.0.1", 80) +socket_write(fd, "GET / HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n") +var chunk := socket_read(fd, 1024, 2) +socket_close(fd) +if str_starts_with(chunk, "HTTP/") { print("read an HTTP response from the server\n") } else { print("no data\n") } + +:example cpp render u64 fd = socket_connect("127.0.0.1", 80); socket_write(fd, "GET / HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"); String chunk = socket_read(fd, 1024, 2); diff --git a/site/doc/pages/socket_write.txt b/site/doc/pages/socket_write.txt index 54a70f50..bfa611f6 100644 --- a/site/doc/pages/socket_write.txt +++ b/site/doc/pages/socket_write.txt @@ -14,7 +14,13 @@ Writes `data` to the given socket. The function returns `true` when the write succeeds. -:example +:example capy render +var fd := socket_connect("127.0.0.1", 80) +var sent := socket_write(fd, "GET / HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n") +socket_close(fd) +if sent { print("request sent\n") } else { print("send failed\n") } + +:example cpp render u64 fd = socket_connect("127.0.0.1", 80); bool sent = socket_write(fd, "GET / HTTP/1.0\r\nHost: localhost\r\nConnection: close\r\n\r\n"); socket_close(fd); diff --git a/site/doc/pages/split.txt b/site/doc/pages/split.txt index 1be018d3..056300bd 100644 --- a/site/doc/pages/split.txt +++ b/site/doc/pages/split.txt @@ -15,5 +15,8 @@ Splits `str` into multiple strings using `delim` as the separator. Every exact occurrence of `delim` creates a new entry in the returned list-shaped `DValue`. -:example +:example capy render +print(join(split("a,b,c", ","), "|"), "\n") + +:example cpp render print(join(split("a,b,c", ","), "|"), "\n"); diff --git a/site/doc/pages/split_http_headers.txt b/site/doc/pages/split_http_headers.txt index 7ba49526..6aba7fff 100644 --- a/site/doc/pages/split_http_headers.txt +++ b/site/doc/pages/split_http_headers.txt @@ -21,6 +21,10 @@ Example: Most page code should read `context.params` instead. Use this helper when parsing raw HTTP text in tests or protocol helpers. -:example +:example capy render +var headers := split_http_headers("Host: example.test\r\nUser-Agent: bearer\r\n") +print(dval_string(headers["HTTP_HOST"]), "\n") + +:example cpp render StringMap headers = split_http_headers("Host: example.test\r\nUser-Agent: bearer\r\n"); -print(headers["Host"], "\n"); +print(headers["HTTP_HOST"], "\n"); diff --git a/site/doc/pages/split_kv.txt b/site/doc/pages/split_kv.txt index 3b8b515b..09e29792 100644 --- a/site/doc/pages/split_kv.txt +++ b/site/doc/pages/split_kv.txt @@ -23,6 +23,10 @@ Example: This is useful for small config files, metadata blocks, and tests that need predictable key/value parsing. -:example +:example capy render +var values := split_kv("name=Ada\nrole=admin") +print(dval_string(values["name"]), "\n") + +:example cpp render StringMap values = split_kv("name=Ada\nrole=admin"); print(values["name"], "\n"); diff --git a/site/doc/pages/split_space.txt b/site/doc/pages/split_space.txt index e8db5236..377e0be2 100644 --- a/site/doc/pages/split_space.txt +++ b/site/doc/pages/split_space.txt @@ -14,5 +14,8 @@ Splits `str` on runs of whitespace. Multiple adjacent whitespace characters are treated as a single separator, so repeated spaces, tabs, or line breaks do not create empty entries. -:example +:example capy render +print(join(split_space("one two\tthree"), ","), "\n") + +:example cpp render print(join(split_space("one two\tthree"), ","), "\n"); diff --git a/site/doc/pages/split_utf8.txt b/site/doc/pages/split_utf8.txt index 7585687f..44747400 100644 --- a/site/doc/pages/split_utf8.txt +++ b/site/doc/pages/split_utf8.txt @@ -23,6 +23,10 @@ If `compound_characters` is `true`, `split_utf8()` also applies a small amount o This is useful when simple byte-wise or ASCII splitting would break Unicode text incorrectly. -:example +:example capy render +var chars := split_utf8("Hi") +print(join(chars, ","), "\n") + +:example cpp render DValue chars = split_utf8("Hi"); print(join(chars, ","), "\n"); diff --git a/site/doc/pages/sqlite_affected_rows.txt b/site/doc/pages/sqlite_affected_rows.txt index b521d9a3..5a893ecf 100644 --- a/site/doc/pages/sqlite_affected_rows.txt +++ b/site/doc/pages/sqlite_affected_rows.txt @@ -13,7 +13,15 @@ sqlite_insert_id :content Returns the number of rows changed by the most recent insert, update, or delete statement on the connection. -:example +:example capy render +var db := sqlite_connect(":memory:") +sqlite_query(db, "create table t(id integer primary key, v text)") +sqlite_query(db, "insert into t(id, v) values(1,'a'),(2,'b'),(3,'c')") +sqlite_query(db, "update t set v = 'x' where id <= 2") +print("rows updated: ", sqlite_affected_rows(db), "\n") +sqlite_disconnect(db) + +:example cpp render SQLite* db = sqlite_connect("/tmp/doc-sqlite-affected.db"); sqlite_query(db, "drop table if exists t"); sqlite_query(db, "create table t(id integer primary key, v text)"); diff --git a/site/doc/pages/sqlite_connect.txt b/site/doc/pages/sqlite_connect.txt index 1bf6c052..07217528 100644 --- a/site/doc/pages/sqlite_connect.txt +++ b/site/doc/pages/sqlite_connect.txt @@ -27,7 +27,13 @@ SQLite itself handles file locking and one-writer/many-reader concurrency. BEARE Connections are registered for request cleanup, but explicit `sqlite_disconnect()` is still preferred when you are done with the handle. -:example +:example capy render +var db := sqlite_connect(":memory:") +sqlite_query(db, "create table t(id integer primary key, name text)") +if db != 0u64 { print("connected\n") } else { print("failed to connect\n") } +sqlite_disconnect(db) + +:example cpp render SQLite* db = sqlite_connect("/tmp/doc-sqlite-connect.db"); sqlite_query(db, "create table if not exists t(id integer primary key, name text)"); print(db != 0 ? "connected" : "failed to connect", "\n"); diff --git a/site/doc/pages/sqlite_disconnect.txt b/site/doc/pages/sqlite_disconnect.txt index 1a3468db..e7dbe9ee 100644 --- a/site/doc/pages/sqlite_disconnect.txt +++ b/site/doc/pages/sqlite_disconnect.txt @@ -13,7 +13,13 @@ Closes an SQLite connection and deletes the BEARER connection wrapper. BEARER also cleans up SQLite connections that remain open at request end, but explicit disconnects keep resource lifetime local and clear. -:example +:example capy render +var db := sqlite_connect(":memory:") +sqlite_query(db, "create table t(id integer)") +sqlite_disconnect(db) +print("connection closed\n") + +:example cpp render SQLite* db = sqlite_connect("/tmp/doc-sqlite-disc.db"); sqlite_query(db, "create table if not exists t(id integer)"); sqlite_disconnect(db); diff --git a/site/doc/pages/sqlite_error.txt b/site/doc/pages/sqlite_error.txt index 7608c732..cf7e2c1b 100644 --- a/site/doc/pages/sqlite_error.txt +++ b/site/doc/pages/sqlite_error.txt @@ -14,7 +14,13 @@ Returns the latest SQLite connector status or error message. Successful calls usually set the message to `ok` or `connected`. Failed prepare, bind, step, pragma, or open operations include connector context plus SQLite's own error text. -:example +:example capy render +var db := sqlite_connect(":memory:") +sqlite_query(db, "select * from no_such_table") +if sqlite_error(db) != "" { print("error reported\n") } else { print("no error\n") } +sqlite_disconnect(db) + +:example cpp render SQLite* db = sqlite_connect("/tmp/doc-sqlite-error.db"); sqlite_query(db, "select * from no_such_table"); print(sqlite_error(db) != "" ? "error reported" : "no error", "\n"); diff --git a/site/doc/pages/sqlite_insert_id.txt b/site/doc/pages/sqlite_insert_id.txt index 8cb93ca3..d4359d08 100644 --- a/site/doc/pages/sqlite_insert_id.txt +++ b/site/doc/pages/sqlite_insert_id.txt @@ -13,7 +13,14 @@ sqlite_affected_rows :content Returns SQLite's last inserted rowid for the connection after an insert statement. -:example +:example capy render +var db := sqlite_connect(":memory:") +sqlite_query(db, "create table t(id integer primary key autoincrement, v text)") +sqlite_query(db, "insert into t(v) values('x')") +print("new row id: ", sqlite_insert_id(db), "\n") +sqlite_disconnect(db) + +:example cpp render SQLite* db = sqlite_connect("/tmp/doc-sqlite-insertid.db"); sqlite_query(db, "drop table if exists t"); sqlite_query(db, "create table t(id integer primary key autoincrement, v text)"); diff --git a/site/doc/pages/sqlite_query.txt b/site/doc/pages/sqlite_query.txt index 43c13996..69cf6395 100644 --- a/site/doc/pages/sqlite_query.txt +++ b/site/doc/pages/sqlite_query.txt @@ -25,7 +25,15 @@ Result rows are objects keyed by column name. SQLite integer, float, text, blob, For statements that do not return rows, inspect `sqlite_affected_rows()` or `sqlite_insert_id()` after the call. -:example +:example capy render +var db := sqlite_connect(":memory:") +sqlite_query(db, "create table users(id integer primary key, email text)") +sqlite_query(db, "insert into users(email) values(:email)", dval({"email": "ada@example.test"})) +var rows := sqlite_query(db, "select email from users") +print(dval_string(rows[0]["email"]), "\n") +sqlite_disconnect(db) + +:example cpp render SQLite* db = sqlite_connect("/tmp/doc-sqlite-query.db"); sqlite_query(db, "drop table if exists users"); sqlite_query(db, "create table users(id integer primary key, email text)"); diff --git a/site/doc/pages/str_ends_with.txt b/site/doc/pages/str_ends_with.txt index 06e2e3f3..b848a5c0 100644 --- a/site/doc/pages/str_ends_with.txt +++ b/site/doc/pages/str_ends_with.txt @@ -13,5 +13,8 @@ return value : `true` when `haystack` ends with `needle`, otherwise `false` Checks whether `haystack` ends with `needle`. -:example +:example capy render +if str_ends_with("index.uce", ".uce") { print("yes\n") } else { print("no\n") } + +:example cpp render print(str_ends_with("index.uce", ".uce") ? "yes\n" : "no\n"); diff --git a/site/doc/pages/str_starts_with.txt b/site/doc/pages/str_starts_with.txt index f8056246..6469c977 100644 --- a/site/doc/pages/str_starts_with.txt +++ b/site/doc/pages/str_starts_with.txt @@ -13,5 +13,8 @@ return value : `true` when `haystack` begins with `needle`, otherwise `false` Checks whether `haystack` starts with `needle`. -:example +:example capy render +if str_starts_with("/doc", "/") { print("yes\n") } else { print("no\n") } + +:example cpp render print(str_starts_with("/doc", "/") ? "yes\n" : "no\n"); diff --git a/site/doc/pages/strpos.txt b/site/doc/pages/strpos.txt index 30d1be26..9fbcb1d7 100644 --- a/site/doc/pages/strpos.txt +++ b/site/doc/pages/strpos.txt @@ -18,5 +18,8 @@ This is the closest BEARER equivalent to PHP `strpos()`, but it returns `-1` ins If `needle` is an empty string, `strpos()` returns the normalized start offset. -:example +:example capy render +print(strpos("bearer docs", "docs"), "\n") + +:example cpp render print(strpos("bearer docs", "docs"), "\n"); diff --git a/site/doc/pages/substr.txt b/site/doc/pages/substr.txt index ef82f625..c55942b7 100644 --- a/site/doc/pages/substr.txt +++ b/site/doc/pages/substr.txt @@ -21,5 +21,8 @@ If `start_pos` is negative, counting starts from the end of the string. If `length` is negative, the returned range stops that many bytes before the end of the string. -:example +:example capy render +print(substr("documentation", 0, 3), "\n") + +:example cpp render print(substr("documentation", 0, 3), "\n"); diff --git a/site/doc/pages/task.txt b/site/doc/pages/task.txt index c977755a..c714aa6b 100644 --- a/site/doc/pages/task.txt +++ b/site/doc/pages/task.txt @@ -1,27 +1,31 @@ :sig -pid_t task(String key, std::function exec_func, u64 timeout = 60*10) +String task(String target, DValue props) :params -key : string uniquely identifying the task across the whole runtime instance -exec_func : function to execute -timeout : maximum run time in seconds; `0` disables the timeout -return value : the process ID of the started (or still running) task, or `0` when the task could not be started +target : unit path with an optional `:NAME` task handler +props : copied structured input available as `context.props` +return value : opaque task ID :see >task -task_pid -task_kill -task_repeat +task_status +task_await +task_cancel :content -Starts `exec_func` in a new process and returns that process ID. +Enqueues a named Bearer task and returns immediately with an opaque ID. `worker.capy` invokes its default `TASK` handler; `worker.capy:refresh` invokes `TASK:refresh`. The configured dedicated task workers process the bounded durable queue independently of request workers. -If a process with the same `key` is already running anywhere in the runtime instance, `task()` does not start a second copy. Instead it returns the PID of the already-running task. Coordination is through a shared task status file under `BIN_DIRECTORY`, so the key applies across workers, not just the current worker process. +Each invocation receives a fresh ordinary `Request`. The copied DValue is available only as `context.props`; request, session, connection, resource, and caller memory state are not inherited. Queue admission never compiles the target or forks a process. Missing handlers, compilation errors, traps, timeouts, cancellation, and worker loss become isolated task status outcomes. -Task keys may contain ordinary user-facing text. BEARER hashes the key before using it as an internal lock/status filename so slashes and other path-like characters cannot escape the task state directory. +Capy handlers use `function TASK(request : request)` or `function TASK_NAME(request : request)`. C++ handlers use `TASK(Request& context)` or `TASK:NAME(Request& context)`. -`timeout` is enforced in the child process with an alarm. The default is ten minutes. Pass `0` only for tasks that have their own shutdown path. +:example capy render +var id := task("/doc/examples/task_worker.capy:STORE", dval({"message": "hello"})) +var result := "failed" +if length(id) == 64 { result = "queued" } +print(result, "\n") -:example -task("doc-demo-task", []() { usleep(100000); }); -print(task_pid("doc-demo-task") > 0 ? "background task is running" : "no task", "\n"); +:example cpp render +DValue props; props["message"] = "hello"; +String id = task("/doc/examples/task_worker.capy:STORE", props); +print(id.size() == 64 ? "queued\n" : "failed\n"); diff --git a/site/doc/pages/task_await.txt b/site/doc/pages/task_await.txt new file mode 100644 index 00000000..2c9825a7 --- /dev/null +++ b/site/doc/pages/task_await.txt @@ -0,0 +1,29 @@ +:sig +DValue task_await(String id, u64 timeout_ms) + +:params +id : opaque ID returned by `task()` +timeout_ms : maximum time to wait +return value : current status when terminal or when the wait bound expires + +:see +>task +task +task_status +task_cancel + +:content +Waits up to `timeout_ms` for a task to become terminal and returns its bounded status. Waiting does not execute the task in the caller; dedicated task workers remain the only consumers. A nonterminal status after the bound is an ordinary timeout of the wait, not cancellation of the task. + +:example capy render +var id := task("/doc/examples/task_worker.capy:STORE", dval({"message": "await"})) +var status := task_await(id, 5000u64) +var result := "not done" +if dval_to_string(status["state"]) == "succeeded" { result = "done" } +print(result, "\n") + +:example cpp render +DValue props; props["message"] = "await"; +String id = task("/doc/examples/task_worker.capy:STORE", props); +DValue status = task_await(id, 5000); +print(status["state"].to_string() == "succeeded" ? "done\n" : "not done\n"); diff --git a/site/doc/pages/task_cancel.txt b/site/doc/pages/task_cancel.txt new file mode 100644 index 00000000..81b3a0ab --- /dev/null +++ b/site/doc/pages/task_cancel.txt @@ -0,0 +1,28 @@ +:sig +DValue task_cancel(String id) + +:params +id : opaque ID returned by `task()` +return value : status after the cancellation request + +:see +>task +task +task_status +task_await + +:content +Requests cancellation and returns the resulting current status, making races visible. A queued task becomes `canceled` atomically. Canceling a running task interrupts its dedicated worker and supervision restores pool capacity; if the handler already completed, its terminal success remains authoritative. + +:example capy render +var id := task("/doc/examples/task_worker.capy:STORE", dval({"message": "cancel"})) +var status := task_cancel(id) +var result := "missing" +if dval_to_string(status["id"]) == id { result = "requested" } +print(result, "\n") + +:example cpp render +DValue props; props["message"] = "cancel"; +String id = task("/doc/examples/task_worker.capy:STORE", props); +DValue status = task_cancel(id); +print(status["id"].to_string() == id ? "requested\n" : "missing\n"); diff --git a/site/doc/pages/task_kill.txt b/site/doc/pages/task_kill.txt deleted file mode 100644 index 61cdeb43..00000000 --- a/site/doc/pages/task_kill.txt +++ /dev/null @@ -1,27 +0,0 @@ -:sig -int task_kill(pid_t pid, s32 sig = 0) - -:params -pid : PID of the process -sig : signal number -return value : 0 if signal was sent, -1 otherwise - -:see ->task -task -task_pid -task_repeat - -:content -Wraps the standard POSIX `kill()` function for positive process IDs. - -`task_kill()` rejects `pid <= 0` and returns `-1`, so callers cannot accidentally use POSIX process-group or broadcast semantics through this helper. - -`sig` may be any supported POSIX signal, including values such as `SIGTERM`, `SIGKILL`, `SIGINT`, `SIGUSR1`, `SIGUSR2`, `SIGCHLD`, `SIGCONT`, and related process-control signals. - -Passing `0` as the signal performs an existence and permission check without actually delivering a signal. - -:example -task("doc-demo-kill", []() { usleep(3000000); }); -pid_t pid = task_pid("doc-demo-kill"); -print(pid > 0 && task_kill(pid) == 0 ? "task signalled to stop" : "no task to kill", "\n"); diff --git a/site/doc/pages/task_pid.txt b/site/doc/pages/task_pid.txt deleted file mode 100644 index 16995771..00000000 --- a/site/doc/pages/task_pid.txt +++ /dev/null @@ -1,20 +0,0 @@ -:sig -pid_t task_pid(String key) - -:params -key : string uniquely identifying the task -return value : the process ID of the task - -:see ->task - -:content -Checks whether a process with the given `key` is running anywhere in the runtime instance and returns its PID if it is. - -Returns `0` when no matching task is active or task state cannot be read safely. Stale task status files are removed when the recorded PID is no longer alive. - -New task status records include the Linux process start tick from `/proc//stat`, so `task_pid()` can reject a stale status file if the PID has exited and the numeric PID has since been reused by another process. - -:example -task("doc-demo-pid", []() { usleep(100000); }); -print("task pid > 0: ", task_pid("doc-demo-pid") > 0 ? "yes" : "no", "\n"); diff --git a/site/doc/pages/task_repeat.txt b/site/doc/pages/task_repeat.txt deleted file mode 100644 index ee279c3c..00000000 --- a/site/doc/pages/task_repeat.txt +++ /dev/null @@ -1,30 +0,0 @@ -:sig -pid_t task_repeat(String key, f64 interval, std::function exec_func, u64 timeout = 60*10) - -:params -key : string uniquely identifying the task across the whole runtime instance -interval : repeat interval in seconds -exec_func : function to execute repeatedly -timeout : maximum run time in seconds; `0` disables the timeout -return value : the process ID of the started (or still running) task, or `0` when the task could not be started - -:see ->task -task -task_pid -task_kill - -:content -Starts a repeating background worker process. - -`exec_func` runs in a loop, and the worker sleeps for `interval` seconds between executions. `interval` must be greater than zero. - -If a process with the same `key` is already running anywhere in the runtime instance, `task_repeat()` does not start a second worker and instead returns the PID of the existing one. Coordination is through the same shared task state used by `task()`. - -`timeout` bounds the lifetime of the repeating worker. The default is ten minutes. Pass `0` only for workers that have another shutdown path. In Wasm, each individual callback invocation remains bounded by the runtime invocation timeout even when the repeating process lifetime is unbounded. - -:example -task_repeat("doc-demo-repeat", 60.0, []() { usleep(10000); }); -pid_t pid = task_pid("doc-demo-repeat"); -print(pid > 0 ? "repeating task scheduled" : "not scheduled", "\n"); -if(pid > 0) task_kill(pid); diff --git a/site/doc/pages/task_status.txt b/site/doc/pages/task_status.txt new file mode 100644 index 00000000..7816256e --- /dev/null +++ b/site/doc/pages/task_status.txt @@ -0,0 +1,28 @@ +:sig +DValue task_status(String id) + +:params +id : opaque ID returned by `task()` +return value : bounded task status map + +:see +>task +task +task_await +task_cancel + +:content +Returns the current durable status for a task. States are `queued`, `running`, `succeeded`, `failed`, `canceled`, and `missing`. The map contains bounded machine-readable fields such as `id`, `state`, `attempt`, and `failure_code`; it never exposes a worker PID. + +:example capy render +var id := task("/doc/examples/task_worker.capy:STORE", dval({"message": "status"})) +var status := task_status(id) +var result := "missing" +if dval_to_string(status["id"]) == id { result = "known" } +print(result, "\n") + +:example cpp render +DValue props; props["message"] = "status"; +String id = task("/doc/examples/task_worker.capy:STORE", props); +DValue status = task_status(id); +print(status["id"].to_string() == id ? "known\n" : "missing\n"); diff --git a/site/doc/pages/time.txt b/site/doc/pages/time.txt index c6f82e3d..9ab7b894 100644 --- a/site/doc/pages/time.txt +++ b/site/doc/pages/time.txt @@ -11,5 +11,8 @@ return value : second-accurate current Unix timestamp Returns the current Unix timestamp as a 64-bit integer with second precision. -:example +:example capy render +if time() > 0u64 { print("timestamp\n") } else { print("no timestamp\n") } + +:example cpp render print(time() > 0 ? "timestamp\n" : "no timestamp\n"); diff --git a/site/doc/pages/time_format_local.txt b/site/doc/pages/time_format_local.txt index cdcd0162..7bc2128d 100644 --- a/site/doc/pages/time_format_local.txt +++ b/site/doc/pages/time_format_local.txt @@ -22,5 +22,8 @@ Padding and case flags may follow `%`: -:example +:example capy render +if time_format_local("%Y-%m-%d", 0u64) != "" { print("formatted\n") } else { print("empty\n") } + +:example cpp render print(time_format_local("%Y-%m-%d", 0) != "" ? "formatted\n" : "empty\n"); diff --git a/site/doc/pages/time_format_relative.txt b/site/doc/pages/time_format_relative.txt index 92942b79..0bbd1c17 100644 --- a/site/doc/pages/time_format_relative.txt +++ b/site/doc/pages/time_format_relative.txt @@ -31,5 +31,8 @@ Default behavior examples: -:example +:example capy render +print(time_format_relative(0u64), "\n") + +:example cpp render print(time_format_relative(0, 0), "\n"); diff --git a/site/doc/pages/time_format_utc.txt b/site/doc/pages/time_format_utc.txt index 8de4001d..54bcbcf2 100644 --- a/site/doc/pages/time_format_utc.txt +++ b/site/doc/pages/time_format_utc.txt @@ -22,5 +22,8 @@ Padding and case flags may follow `%`: -:example +:example capy render +print(time_format_utc("%Y-%m-%d", 0u64), "\n") + +:example cpp render print(time_format_utc("%Y-%m-%d", 0), "\n"); diff --git a/site/doc/pages/time_parse.txt b/site/doc/pages/time_parse.txt index 63e9c39f..88f39142 100644 --- a/site/doc/pages/time_parse.txt +++ b/site/doc/pages/time_parse.txt @@ -12,5 +12,8 @@ return value : the interpreted 'time_string' as a Unix timestamp Attempts to parse `time_string` into a Unix timestamp. -:example +:example capy render +if time_parse("1970-01-01 00:00:00") >= 0u64 { print("parsed\n") } else { print("bad\n") } + +:example cpp render print(time_parse("1970-01-01 00:00:00") >= 0 ? "parsed\n" : "bad\n"); diff --git a/site/doc/pages/time_precise.txt b/site/doc/pages/time_precise.txt index 8e497658..09d944be 100644 --- a/site/doc/pages/time_precise.txt +++ b/site/doc/pages/time_precise.txt @@ -11,5 +11,8 @@ return value : current Unix timestamp Returns the current Unix timestamp as a 64-bit float with millisecond accuracy or better. -:example +:example capy render +if time_precise() > 0.0 { print("timer\n") } else { print("no timer\n") } + +:example cpp render print(time_precise() > 0 ? "timer\n" : "no timer\n"); diff --git a/site/doc/pages/to_bool.txt b/site/doc/pages/to_bool.txt index f9cf6132..c1e304c2 100644 --- a/site/doc/pages/to_bool.txt +++ b/site/doc/pages/to_bool.txt @@ -17,5 +17,8 @@ Parses a trimmed, case-insensitive boolean string. Truthy tokens are `"1"`, `"true"`, `"yes"`, and `"on"`. Falsey tokens are `"0"`, `"false"`, `"no"`, and `"off"`. Empty or unrecognized strings return the fallback. -:example +:example capy render +if to_bool("yes") { print("true\n") } else { print("false\n") } + +:example cpp render print(to_bool("yes") ? "true\n" : "false\n"); diff --git a/site/doc/pages/to_f64.txt b/site/doc/pages/to_f64.txt index aa791aad..9ce2d605 100644 --- a/site/doc/pages/to_f64.txt +++ b/site/doc/pages/to_f64.txt @@ -18,5 +18,8 @@ Parses a trimmed string as a floating-point number. Unlike `float_val()`, the whole trimmed string must be consumed by the parser. Empty strings and partially parsed values such as `"3.5ms"` return the fallback. -:example +:example capy render +print(to_f64("3.5"), "\n") + +:example cpp render print(to_f64("3.5"), "\n"); diff --git a/site/doc/pages/to_lower.txt b/site/doc/pages/to_lower.txt index 39c31fce..ce6ee1aa 100644 --- a/site/doc/pages/to_lower.txt +++ b/site/doc/pages/to_lower.txt @@ -14,5 +14,8 @@ Returns a lower-case version of `s`. This function is not yet Unicode-aware. -:example +:example capy render +print(to_lower("BEARER"), "\n") + +:example cpp render print(to_lower("BEARER"), "\n"); diff --git a/site/doc/pages/to_s64.txt b/site/doc/pages/to_s64.txt index 0496025c..a6423ba3 100644 --- a/site/doc/pages/to_s64.txt +++ b/site/doc/pages/to_s64.txt @@ -18,5 +18,8 @@ Parses a trimmed string as a base-10 signed integer. The whole trimmed string must be consumed by the parser. Empty strings and partially parsed values such as `"-12px"` return the fallback. -:example +:example capy render +print(to_s64("-7"), "\n") + +:example cpp render print(to_s64("-7"), "\n"); diff --git a/site/doc/pages/to_u64.txt b/site/doc/pages/to_u64.txt index 6646138b..1a395d42 100644 --- a/site/doc/pages/to_u64.txt +++ b/site/doc/pages/to_u64.txt @@ -19,5 +19,8 @@ is accepted. Negative and overflowing values return the fallback. Unlike `int_val()`, the whole trimmed string must be consumed by the parser. Empty strings and partially parsed values such as `"42px"` return the fallback. -:example +:example capy render +print(to_u64("7"), "\n") + +:example cpp render print(to_u64("7"), "\n"); diff --git a/site/doc/pages/to_upper.txt b/site/doc/pages/to_upper.txt index 59fe1356..19e51b92 100644 --- a/site/doc/pages/to_upper.txt +++ b/site/doc/pages/to_upper.txt @@ -14,5 +14,8 @@ Returns an upper-case version of `s`. This function is not yet Unicode-aware. -:example +:example capy render +print(to_upper("bearer"), "\n") + +:example cpp render print(to_upper("bearer"), "\n"); diff --git a/site/doc/pages/trim.txt b/site/doc/pages/trim.txt index 1bf4e30d..79a11db5 100644 --- a/site/doc/pages/trim.txt +++ b/site/doc/pages/trim.txt @@ -12,5 +12,8 @@ return value : string with leading and trailing whitespace characters removed Returns `raw` with leading and trailing whitespace removed. -:example +:example capy render +print(trim(" docs "), "\n") + +:example cpp render print(trim(" docs "), "\n"); diff --git a/site/doc/pages/unit_call.txt b/site/doc/pages/unit_call.txt index 9fc70500..55616090 100644 --- a/site/doc/pages/unit_call.txt +++ b/site/doc/pages/unit_call.txt @@ -44,5 +44,8 @@ Calling a named component handler through `unit_call()`: Calling a page render handler through `unit_call()`: -:example +:example capy render +var result := unit_call("examples/sample_unit.uce", "doc_greet") + +:example cpp render unit_call("examples/sample_unit.uce", "doc_greet"); diff --git a/site/doc/pages/unit_compile.txt b/site/doc/pages/unit_compile.txt index 154497a2..2e24a0d2 100644 --- a/site/doc/pages/unit_compile.txt +++ b/site/doc/pages/unit_compile.txt @@ -16,5 +16,8 @@ Triggers a manual recompile of a BEARER compilation unit through the host membra If `path` is relative, it is resolved by the host unit resolver. The function returns whether compilation succeeded; it does not return or expose a native `SharedUnit*` to wasm units. -:example +:example capy render +if unit_compile("examples/sample_unit.uce") { print("compiled the sample unit\n") } else { print("compile failed\n") } + +:example cpp render print(unit_compile("examples/sample_unit.uce") ? "compiled the sample unit" : "compile failed", "\n"); diff --git a/site/doc/pages/unit_info.txt b/site/doc/pages/unit_info.txt index 4dadf298..cd47a34d 100644 --- a/site/doc/pages/unit_info.txt +++ b/site/doc/pages/unit_info.txt @@ -20,6 +20,10 @@ If `path` is relative, it is resolved by the same host unit resolver used for un Because unit metadata lives in worker process memory, request and timing counters reflect the current runtime process, not an aggregate across every worker process. -:example +:example capy render +var info := unit_info("examples/sample_unit.uce") +if dval_is_array(info) { print("unit_info() returns metadata for the unit\n") } else { print("empty metadata for the unit\n") } + +:example cpp render DValue info = unit_info("examples/sample_unit.uce"); print("unit_info() returns ", info.get_type_name(), " metadata for the unit\n"); diff --git a/site/doc/pages/unit_load.txt b/site/doc/pages/unit_load.txt index 89e2824d..c8d74ba6 100644 --- a/site/doc/pages/unit_load.txt +++ b/site/doc/pages/unit_load.txt @@ -16,4 +16,13 @@ In Capy, `unit_load()` resolves and compiles a readable unit through the normal Call only declared DValue exports with `module.call(name[, input])`. `EXPORTS echo` declares an ordinary Capy function `function echo(input : dval) dval`; legacy `EXPORT_name` and C++ `EXPORT DValue* name(DValue*)` remain callable through the same capability path. Inputs and results are copied BRRB values, and the sized result protocol executes the target once. -A Capy caller can write `var module := unit_load("examples/sample_unit.capy")` and then `module.call("echo", input)`. +A Capy caller can write `var module := unit_load("examples/sample_unit.capy")` and then `module.call("echo", input)`. C++ does not expose Capy's request-local `module` value; use `unit_call()` for the equivalent verified load-and-call operation. + +:example capy cli +var module := unit_load("examples/sample_unit.capy") +var output := module.call("echo", dval("hello")) + +:example cpp cli +DValue input; input = "hello"; +DValue* output = unit_call("examples/sample_unit.uce", "echo", &input); +delete output; diff --git a/site/doc/pages/unit_render.txt b/site/doc/pages/unit_render.txt index 3c6b2509..ad80e285 100644 --- a/site/doc/pages/unit_render.txt +++ b/site/doc/pages/unit_render.txt @@ -23,5 +23,8 @@ Calling a missing unit or render handler is a server error and sets HTTP status Examples: -:example +:example capy render +unit_render("examples/sample_unit.uce") + +:example cpp render unit_render("examples/sample_unit.uce"); diff --git a/site/doc/pages/units_list.txt b/site/doc/pages/units_list.txt index 80777d72..85d2c645 100644 --- a/site/doc/pages/units_list.txt +++ b/site/doc/pages/units_list.txt @@ -12,5 +12,10 @@ Returns the normalized paths of all known `.uce` units. This includes the shared known-unit registry plus any units already loaded in the current runtime process. -:example +:example capy render +var count := 0 +for item = units_list() { count = count + 1 } +print("the runtime knows ", count, " compiled units\n") + +:example cpp render print("the runtime knows ", units_list().size(), " compiled units\n"); diff --git a/site/doc/pages/uri_decode.txt b/site/doc/pages/uri_decode.txt index b289e583..3ab03ebb 100644 --- a/site/doc/pages/uri_decode.txt +++ b/site/doc/pages/uri_decode.txt @@ -12,5 +12,8 @@ return value : a string that contains the decoded version of 's' Decodes a URI-encoded string. -:example +:example capy render +print(uri_decode("Ada%20Lovelace"), "\n") + +:example cpp render print(uri_decode("Ada%20Lovelace"), "\n"); diff --git a/site/doc/pages/uri_encode.txt b/site/doc/pages/uri_encode.txt index 5961f4eb..6d67f26b 100644 --- a/site/doc/pages/uri_encode.txt +++ b/site/doc/pages/uri_encode.txt @@ -12,5 +12,8 @@ return value : an URI-encoded version of 's' URI-encodes a string. -:example +:example capy render +print(uri_encode("Ada Lovelace"), "\n") + +:example cpp render print(uri_encode("Ada Lovelace"), "\n"); diff --git a/site/doc/pages/usleep.txt b/site/doc/pages/usleep.txt index f6f87337..ba584712 100644 --- a/site/doc/pages/usleep.txt +++ b/site/doc/pages/usleep.txt @@ -19,6 +19,10 @@ Example: For whole-second waits, use `sleep()`. -:example +:example capy render +usleep(1000) +print("slept\n") + +:example cpp render usleep(1000); print("slept\n"); diff --git a/site/doc/pages/var_dump.txt b/site/doc/pages/var_dump.txt index 350cca7e..651b21f8 100644 --- a/site/doc/pages/var_dump.txt +++ b/site/doc/pages/var_dump.txt @@ -16,7 +16,11 @@ print :content Returns a string representation of `t` intended for debugging. -:example +:example capy render +var user := dval({"name": "Ada", "role": "engineer"}) +print(var_dump(user)) + +:example cpp render DValue user; user["name"] = "Ada"; user["role"] = "engineer"; diff --git a/site/doc/pages/ws_close.txt b/site/doc/pages/ws_close.txt index fb1f8fc0..3794d902 100644 --- a/site/doc/pages/ws_close.txt +++ b/site/doc/pages/ws_close.txt @@ -13,6 +13,9 @@ Queues a WebSocket close frame and closes the targeted connection. If `connection_id` is omitted, the current connection handled by `WS(Request& context)` is closed. -:example +:example capy render +if ws_close("example-connection-id") { print("close queued\n") } else { print("no such connection to close\n") } + +:example cpp render bool closed = ws_close("example-connection-id"); print(closed ? "close queued" : "no such connection to close", "\n"); diff --git a/site/doc/pages/ws_connection_count.txt b/site/doc/pages/ws_connection_count.txt index f8ce52e4..c75ae2f6 100644 --- a/site/doc/pages/ws_connection_count.txt +++ b/site/doc/pages/ws_connection_count.txt @@ -13,5 +13,8 @@ Returns the number of currently connected WebSocket clients for the given scope. If `scope` is omitted, the current page scope is used. -:example +:example capy render +print("connection count in this scope: ", ws_connection_count(), "\n") + +:example cpp render print("connection count in this scope: ", ws_connection_count(), "\n"); diff --git a/site/doc/pages/ws_connection_id.txt b/site/doc/pages/ws_connection_id.txt index 9604b78d..52966f82 100644 --- a/site/doc/pages/ws_connection_id.txt +++ b/site/doc/pages/ws_connection_id.txt @@ -12,6 +12,11 @@ Returns the runtime-generated connection ID of the client whose message is curre This ID can be passed to `ws_send_to()` or `ws_close()` to target a single connected client. -:example +:example capy render +var id := ws_connection_id() +if id == "" { id = "(empty outside a WS handler)" } +print(id, "\n") + +:example cpp render String id = ws_connection_id(); print(id == "" ? "(empty outside a WS handler)" : id, "\n"); diff --git a/site/doc/pages/ws_connections.txt b/site/doc/pages/ws_connections.txt index 1b99f005..ff8a0e67 100644 --- a/site/doc/pages/ws_connections.txt +++ b/site/doc/pages/ws_connections.txt @@ -13,6 +13,11 @@ Returns the currently connected WebSocket client IDs for the given scope. If `scope` is omitted, the current page scope is used. -:example +:example capy render +var count := 0 +for id = ws_connections() { count = count + 1 } +print("active connections in this scope: ", count, "\n") + +:example cpp render DValue ids = ws_connections(); print("active connections in this scope: ", ids.size(), "\n"); diff --git a/site/doc/pages/ws_is_binary.txt b/site/doc/pages/ws_is_binary.txt index 2c45e891..d4c746c7 100644 --- a/site/doc/pages/ws_is_binary.txt +++ b/site/doc/pages/ws_is_binary.txt @@ -12,5 +12,8 @@ Returns whether the message currently being handled by `WS(Request& context)` ar If this returns `false`, the current message was delivered as a text frame. -:example +:example capy render +if ws_is_binary() { print("binary frame\n") } else { print("text frame (default outside a WS handler)\n") } + +:example cpp render print(ws_is_binary() ? "binary frame" : "text frame (default outside a WS handler)", "\n"); diff --git a/site/doc/pages/ws_message.txt b/site/doc/pages/ws_message.txt index 63220202..5eb28e72 100644 --- a/site/doc/pages/ws_message.txt +++ b/site/doc/pages/ws_message.txt @@ -14,6 +14,9 @@ For text frames this is the decoded text payload. For binary frames this `String Use `ws_is_binary()` or `ws_opcode()` to choose how to parse the payload. -:example +:example capy render +print("payload length in this non-WS context: ", length(ws_message()), "\n") + +:example cpp render // Inside a WS message handler ws_message() returns the current frame payload. print("payload length in this non-WS context: ", ws_message().length(), "\n"); diff --git a/site/doc/pages/ws_opcode.txt b/site/doc/pages/ws_opcode.txt index 5877d11e..cdd5f6b1 100644 --- a/site/doc/pages/ws_opcode.txt +++ b/site/doc/pages/ws_opcode.txt @@ -15,6 +15,9 @@ Common values are: - `0x1` for text messages - `0x2` for binary messages -:example +:example capy render +print("opcode: ", ws_opcode() as u64, " (0 outside a WS frame)\n") + +:example cpp render // ws_opcode() returns the WebSocket frame opcode (1 text, 2 binary, 8 close, ...). print("opcode: ", (u64)ws_opcode(), " (0 outside a WS frame)\n"); diff --git a/site/doc/pages/ws_scope.txt b/site/doc/pages/ws_scope.txt index 403457ad..5363c1ab 100644 --- a/site/doc/pages/ws_scope.txt +++ b/site/doc/pages/ws_scope.txt @@ -14,6 +14,11 @@ This is the same default scope used by `ws_send()`, `ws_connections()`, and `ws_ In the current runtime implementation this scope is the page's internal endpoint identifier, typically the absolute `SCRIPT_FILENAME` of the `.uce` file that accepted the WebSocket upgrade. -:example +:example capy render +var scope := ws_scope() +if scope == "" { scope = "(no WS scope in this context)" } +print(scope, "\n") + +:example cpp render String scope = ws_scope(); print(scope == "" ? "(no WS scope in this context)" : scope, "\n"); diff --git a/site/doc/pages/ws_send.txt b/site/doc/pages/ws_send.txt index 6fed98a2..30b901bb 100644 --- a/site/doc/pages/ws_send.txt +++ b/site/doc/pages/ws_send.txt @@ -15,7 +15,10 @@ Queues a WebSocket message for every client connected to the given scope. If `scope` is omitted, the current page scope is used. -:example +:example capy render +if ws_send("hello subscribers", false, "") { print("broadcast queued\n") } else { print("no active WS scope to broadcast to\n") } + +:example cpp render // Inside a WS handler this broadcasts to the current scope. bool sent = ws_send("hello subscribers"); print(sent ? "broadcast queued" : "no active WS scope to broadcast to", "\n"); diff --git a/site/doc/pages/ws_send_to.txt b/site/doc/pages/ws_send_to.txt index f775c3c8..bcfe5493 100644 --- a/site/doc/pages/ws_send_to.txt +++ b/site/doc/pages/ws_send_to.txt @@ -13,6 +13,9 @@ return value : true if the target connection exists and the message was queued :content Queues a WebSocket message for one specific connected client. -:example +:example capy render +if ws_send_to("example-connection-id", "direct message", false) { print("message queued\n") } else { print("no such connection\n") } + +:example cpp render bool sent = ws_send_to("example-connection-id", "direct message"); print(sent ? "message queued" : "no such connection", "\n"); diff --git a/site/doc/pages/xml_decode.txt b/site/doc/pages/xml_decode.txt index 39a4cf83..bc62eeed 100644 --- a/site/doc/pages/xml_decode.txt +++ b/site/doc/pages/xml_decode.txt @@ -42,6 +42,10 @@ Whitespace-only text between child elements is ignored. Mixed non-empty text is Malformed XML raises a request-visible runtime error. -:example +:example capy render +var node := xml_decode("Ada") +if dval_is_array(node) { print("xml\n") } else { print("empty\n") } + +:example cpp render DValue node = xml_decode("Ada"); print(node.is_array() ? "xml\n" : "empty\n"); diff --git a/site/doc/pages/xml_encode.txt b/site/doc/pages/xml_encode.txt index e7110bfe..7e0fde7b 100644 --- a/site/doc/pages/xml_encode.txt +++ b/site/doc/pages/xml_encode.txt @@ -44,7 +44,11 @@ Notes: - Empty elements serialize as self-closing tags. - Map child order follows `DValue` map iteration order. -:example +:example capy render +var value := dval({"name": "Ada"}) +if xml_encode(value) != "" { print("xml\n") } else { print("empty\n") } + +:example cpp render DValue value; value["name"] = "Ada"; print(xml_encode(value) != "" ? "xml\n" : "empty\n"); diff --git a/site/doc/pages/yaml_decode.txt b/site/doc/pages/yaml_decode.txt index e6fa82eb..f4aa4fdb 100644 --- a/site/doc/pages/yaml_decode.txt +++ b/site/doc/pages/yaml_decode.txt @@ -40,6 +40,10 @@ Numeric-looking values are stored as strings, matching `json_decode()`'s current Malformed input raises a request-visible `yaml_decode(): ...` runtime error. -:example +:example capy render +var value := yaml_decode("name: Ada\n") +print(dval_string(value["name"]), "\n") + +:example cpp render DValue value = yaml_decode("name: Ada\n"); print(value["name"].to_string(), "\n"); diff --git a/site/doc/pages/yaml_encode.txt b/site/doc/pages/yaml_encode.txt index 8ef6ef33..fd7e2ef6 100644 --- a/site/doc/pages/yaml_encode.txt +++ b/site/doc/pages/yaml_encode.txt @@ -33,7 +33,11 @@ Notes: - Empty strings are emitted as `""` so they are not confused with YAML null. - Decoded numeric-looking config values are strings unless the original `DValue` value was explicitly numeric. -:example +:example capy render +var value := dval({"name": "Ada"}) +if yaml_encode(value) != "" { print("yaml\n") } else { print("empty\n") } + +:example cpp render DValue value; value["name"] = "Ada"; print(yaml_encode(value) != "" ? "yaml\n" : "empty\n"); diff --git a/site/doc/pages/zip_create.txt b/site/doc/pages/zip_create.txt index 8d15fe20..bbaaa24d 100644 --- a/site/doc/pages/zip_create.txt +++ b/site/doc/pages/zip_create.txt @@ -26,7 +26,13 @@ An entry may also provide `file` instead of `content`; BEARER reads that source Entry names are normalized to forward slashes and rejected when they are absolute paths, drive-qualified paths, empty names, or contain `..` path segments. -:example +:example capy render +var archive := "/tmp/capy-doc-zip.zip" +zip_create(archive, dval({"readme.txt": "hello from BEARER", "license.txt": "MIT license"})) +print("readme.txt in archive: ", zip_read(archive, "readme.txt"), "\n") +file_unlink(archive) + +:example cpp render DValue entries; entries["readme.txt"] = "hello from BEARER"; entries["license.txt"] = "MIT license"; diff --git a/site/doc/pages/zip_extract.txt b/site/doc/pages/zip_extract.txt index 0054c985..0ba8da2d 100644 --- a/site/doc/pages/zip_extract.txt +++ b/site/doc/pages/zip_extract.txt @@ -20,7 +20,16 @@ BEARER creates the destination directory and any needed child directories when t For safety, every member name is normalized and checked before extraction. Absolute paths, drive-qualified paths, empty names, and `..` path segments are rejected so archives cannot write outside the destination directory. -:example +:example capy render +var archive := "/tmp/capy-doc-zipext.zip" +var destination := "/tmp/capy-doc-zipext-out" +zip_create(archive, dval({"note.txt": "extracted content"})) +zip_extract(archive, destination) +print(file_get_contents(destination + "/note.txt"), "\n") +dir_remove(destination, true) +file_unlink(archive) + +:example cpp render DValue entries; entries["note.txt"] = "extracted content"; zip_create("/tmp/doc-zipext.zip", entries); diff --git a/site/doc/pages/zip_list.txt b/site/doc/pages/zip_list.txt index 388c5ec3..7afdc882 100644 --- a/site/doc/pages/zip_list.txt +++ b/site/doc/pages/zip_list.txt @@ -33,7 +33,15 @@ Each entry contains: Example: -:example +:example capy render +var archive := "/tmp/capy-doc-ziplist.zip" +zip_create(archive, dval({"a.txt": "alpha", "b.txt": "beta"})) +var listing := zip_list(archive) +var entries := listing["entries"] +print(dval_s32(listing["count"]), " entries: ", dval_string(entries[0]["name"]), ", ", dval_string(entries[1]["name"]), "\n") +file_unlink(archive) + +:example cpp render DValue entries; entries["a.txt"] = "alpha"; entries["b.txt"] = "beta"; diff --git a/site/doc/pages/zip_read.txt b/site/doc/pages/zip_read.txt index 343df94f..2f166c31 100644 --- a/site/doc/pages/zip_read.txt +++ b/site/doc/pages/zip_read.txt @@ -20,7 +20,13 @@ Reads one file member from a ZIP archive and returns its uncompressed bytes as a Use `zip_list()` when you need to discover entry names before reading them. -:example +:example capy render +var archive := "/tmp/capy-doc-zipread.zip" +zip_create(archive, dval({"greeting.txt": "hello world"})) +print(zip_read(archive, "greeting.txt"), "\n") +file_unlink(archive) + +:example cpp render DValue entries; entries["greeting.txt"] = "hello world"; zip_create("/tmp/doc-zipread.zip", entries); diff --git a/site/doc/singlepage.uce b/site/doc/singlepage.uce index e61ca5c1..3d7827ba 100644 --- a/site/doc/singlepage.uce +++ b/site/doc/singlepage.uce @@ -24,6 +24,35 @@ void render_doc_params(DValue param_lines) <> } +void render_doc_example_sources(DocPage doc_page) +{ + if(doc_page.example_parse_error != "") + { + ?>

Example format error

Capy status:

Example:

+

+

+

C++ example:

Legacy C++ example

} + render_doc_example_sources(doc_page); <> } diff --git a/site/doc/style.css b/site/doc/style.css index 8c6a5479..c1061a7c 100644 --- a/site/doc/style.css +++ b/site/doc/style.css @@ -478,6 +478,41 @@ pre code { margin-bottom: 14px; } +.paired-example { + display: grid; + gap: 16px; +} + +.example-language { + border-left: 3px solid var(--border-strong); + padding-left: 14px; +} + +.example-language.capy { + border-left-color: var(--accent); +} + +.example-language h4 { + font-family: var(--font-mono); + font-size: 0.8rem; + letter-spacing: 0.04em; + margin: 0 0 8px; +} + +.example-compile-only { + color: var(--text-dim); + font-size: 0.875rem; +} + +.example-output.error, +.example.error { + border-color: #df6b6b; +} + +.legacy-example { + border-left: 3px solid var(--text-muted); +} + .example-output { border: 1px solid var(--border); border-left: 3px solid var(--accent); diff --git a/site/examples/bearer-starter/README.md b/site/examples/bearer-starter/README.md index 1102d274..23378311 100644 --- a/site/examples/bearer-starter/README.md +++ b/site/examples/bearer-starter/README.md @@ -33,3 +33,9 @@ The example uses query-string routing in the same style as the PHP starter, but Direct requests to `/examples/bearer-starter/index.uce` still work, but self-links are canonicalized back to `/examples/bearer-starter/`. The demo account pages use a small file-backed user store under `/tmp/bearer-starter-data/` with session-based login state. + + +## Optional Datastar Assets + +This starter vendors Datastar v1.0.2 as `js/datastar.js` for future server-rendered interactive islands. It is not loaded by the default page shell. `lib/datastar.uce` and `lib/datastar.capy` contain small Datastar SSE formatting helpers, and `views/datastar-example.uce` is an unlinked opt-in example route. + diff --git a/site/examples/bearer-starter/js/datastar.js b/site/examples/bearer-starter/js/datastar.js new file mode 100644 index 00000000..94b7a88c --- /dev/null +++ b/site/examples/bearer-starter/js/datastar.js @@ -0,0 +1,9 @@ +// Datastar v1.0.2 +var U="datastar-fetch",ge="datastar-prop-change",mt="datastar-ready",Ke="datastar-scope-children",ee="datastar-signal-patch";var L=Object.hasOwn??Object.prototype.hasOwnProperty.call;var z=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),gt=e=>{for(let t in e)if(L(e,t))return!1;return!0},te=(e,t)=>{for(let n in e){let r=e[n];z(r)||Array.isArray(r)?te(r,t):e[n]=t(r)}},xe=e=>{let t={};for(let[n,r]of e){let s=n.split("."),i=s.pop(),o=s.reduce((a,c)=>a[c]??={},t);o[i]=r}return t};var Ne=[],ze=[],ke=0,Pe=0,Qe=0,he,J,Oe=0,x=()=>{ke++},N=()=>{--ke||(bt(),Q())},P=e=>{he={t:J,c:he},J=e},O=()=>{J=he?.t,he=he?.c},ye=e=>sn.bind(0,{previousValue:e,t:e,e:1}),Ze=Symbol("computed"),_e=e=>{let t=on.bind(0,{e:17,getter:e});return t[Ze]=1,t},A=e=>{let t={d:e,e:2};J&&Xe(t,J),P(t),x();try{t.d()}finally{N(),O()}return St.bind(0,t)},bt=()=>{for(;Pe"getter"in e?vt(e):Et(e,e.t),vt=e=>{P(e),At(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{O(),Rt(e)}},Et=(e,t)=>(e.e=1,e.previousValue!==(e.previousValue=t)),Ye=e=>{let t=e.e;if(!(t&64)){e.e=t|64;let n=e.r;n?Ye(n.o):ze[Qe++]=e}},Tt=(e,t)=>{if(t&16||t&32&&wt(e.s,e)){P(e),At(e),x();try{e.d()}finally{N(),O(),Rt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.l,s=r.e;s&64&&Tt(r,r.e=s&-65),n=n.i}},sn=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(an(r),ke||bt()),!0}return!1}let n=e.t;if(e.e&16&&Et(e,n)){let r=e.r;r&&He(r)}return J&&Xe(e,J),n},on=e=>{let t=e.e;if(t&16||t&32&&wt(e.s,e)){if(vt(e)){let n=e.r;n&&He(n)}}else t&32&&(e.e=t&-33);return J&&Xe(e,J),e.t},St=e=>{let t=e.s;for(;t;)t=Fe(t,e);let n=e.r;n&&Fe(n),e.e=0},Xe=(e,t)=>{let n=t.a;if(n&&n.l===e)return;let r=n?n.i:t.s;if(r&&r.l===e){r.p=Oe,t.a=r;return}let s=e.m;if(s&&s.p===Oe&&s.o===t)return;let i=t.a=e.m={p:Oe,l:e,o:t,u:n,i:r,f:s};r&&(r.u=i),n?n.i=i:t.s=i,s?s.n=i:e.r=i},Fe=(e,t=e.o)=>{let n=e.l,r=e.u,s=e.i,i=e.n,o=e.f;if(s?s.u=r:t.a=r,r?r.i=s:t.s=s,i?i.f=o:n.m=o,o)o.n=i;else if(!(n.r=i))if("getter"in n){let a=n.s;if(a){n.e=17;do a=Fe(a,n);while(a)}}else"previousValue"in n||St(n);return s},an=e=>{let t=e.n,n;e:for(;;){let r=e.o,s=r.e;if(s&60?s&12?s&4?!(s&48)&&cn(e,r)?(r.e=s|40,s&=1):s=0:r.e=s&-9|32:s=0:r.e=s|32,s&2&&Ye(r),s&1){let i=r.r;if(i){let o=(e=i).n;o&&(n={t,c:n},t=o);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.c,e){t=e.n;continue e}break}},At=e=>{Oe++,e.a=void 0,e.e=e.e&-57|4},Rt=e=>{let t=e.a,n=t?t.i:e.s;for(;n;)n=Fe(n,e);e.e&=-5},wt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let i=e.l,o=i.e;if(t.e&16)s=!0;else if((o&17)===17){if(yt(i)){let a=i.r;a.n&&He(a),s=!0}}else if((o&33)===33){(e.n||e.f)&&(n={t:e,c:n}),e=i.s,t=i,++r;continue}if(!s){let a=e.i;if(a){e=a;continue}}for(;r--;){let a=t.r,c=a.n;if(c?(e=n.t,n=n.c):e=a,s){if(yt(t)){c&&He(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.i){e=e.i;continue e}}return s}},He=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&Ye(t))}while(e=e.n)},cn=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.u}return!1},oe=e=>{let t=ne,n=e.split(".");for(let r of n){if(t==null||!L(t,r))return;t=t[r]}return t},Ce=(e,t="")=>{let n=Array.isArray(e);if(n||z(e)){let r=n?[]:{};for(let i in e)r[i]=ye(Ce(e[i],`${t+i}.`));let s=ye(0);return new Proxy(r,{get(i,o){if(!(o==="toJSON"&&!L(r,o)))return n&&o in Array.prototype?(s(),r[o]):typeof o=="symbol"?r[o]:((!L(r,o)||r[o]()==null)&&(r[o]=ye(""),Q(t+o,""),s(s()+1)),r[o]())},set(i,o,a){let c=t+o;if(n&&o==="length"){let l=r[o]-a;if(r[o]=a,l>0){let u={};for(let f=a;f{if(e!==void 0&&t!==void 0&&Ne.push([e,t]),!ke&&Ne.length){let n=xe(Ne);Ne.length=0,document.dispatchEvent(new CustomEvent(ee,{detail:n}))}},D=(e,{ifMissing:t}={})=>{x();for(let n in e)e[n]==null?t||delete ne[n]:Mt(e[n],n,ne,"",t);N()},E=(e,t)=>D(xe(e),t),Mt=(e,t,n,r,s)=>{if(z(e)){L(n,t)&&(z(n[t])||Array.isArray(n[t]))||(n[t]={});for(let i in e)e[i]==null?s||delete n[t][i]:Mt(e[i],i,n[t],`${r+t}.`,s)}else s&&L(n,t)||(n[t]=e)},ht=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,q=({include:e=/.*/,exclude:t=/(?!)/}={},n=ne)=>{let r=ht(e),s=ht(t),i=[],o=[[n,""]];for(;o.length;){let[a,c]=o.pop();for(let l in a){let u=c+l;z(a[l])?o.push([a[l],`${u}.`]):r.test(u)&&!s.test(u)&&i.push([u,oe(u)])}}return xe(i)},ne=Ce({});var Z=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var ae=e=>e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1-$2").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([a-z])([0-9]+)/gi,"$1-$2").replace(/([0-9]+)([a-z])/gi,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase(),Lt=e=>ae(e).replace(/-./g,t=>t[1].toUpperCase()),xt=e=>ae(e).replace(/-/g,"_");var ln=/^(?:(?:async\s+)?function\b|(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/,ce=(e,t={})=>{let{reviveFunctionStrings:n=!1}=t;try{return n?JSON.parse(e,(r,s)=>{if(typeof s!="string")return s;let i=s.trim();if(!ln.test(i))return s;try{let o=Function(`return (${i})`)();return typeof o=="function"?o:s}catch{return s}}):JSON.parse(e)}catch{return Function(`return (${e})`)()}},Nt={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+Nt.camel(e.slice(1))},C=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=Nt[r]?.(e)||e;return e},K=e=>`data-${e}`,et=e=>e;var un="https://data-star.dev/errors",be=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=xt(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return r.message=`${t} +More info: ${un}/${s}?${i} +Context: ${o}`,r},ve=new Map,tt=new Map,Ct=new Map,Ft=new Proxy({},{get:(e,t)=>ve.get(t)?.apply,has:(e,t)=>ve.has(t),ownKeys:()=>Reflect.ownKeys(ve),set:()=>!1,deleteProperty:()=>!1}),Te=new Map,Ie=[],nt=new Set,Ee=new Set,Pt=!1,p=e=>{Ie.push(e),Ie.length===1&&setTimeout(()=>{for(let n of Ie)nt.add(n.name),tt.set(n.name,n);Ie.length=0;let t=Ee.size?[...Ee]:[document.documentElement];for(let n of t)hn(n,!Ee.has(n));nt.clear()})},V=e=>{ve.set(e.name,e)};document.addEventListener(U,e=>{let t=Ct.get(e.detail.type);t&&t.apply({error:be.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var Se=e=>{Ct.set(e.name,e)},Ot=e=>{for(let t of e){let n=Te.get(t);if(n&&Te.delete(t))for(let r of n.values())for(let s of r.values())s()}},Ht=K("ignore"),fn=`[${Ht}]`,kt=e=>e.hasAttribute(`${Ht}__self`)||!!e.closest(fn),De=(e,t)=>{for(let n of e)if(!kt(n)){let r=new Set;for(let s in n.dataset){let i=s.replace(/[A-Z]/g,"-$&").toLowerCase();r.add(i),rt(n,i,n.dataset[s],t)}for(let s of Array.from(n.attributes)){if(!s.name.startsWith("data-"))continue;let i=s.name.slice(5);r.has(i)||rt(n,i,s.value,t)}}},dn=e=>{for(let{target:t,type:n,attributeName:r,addedNodes:s,removedNodes:i}of e)if(n==="childList"){for(let o of i)Z(o)&&(Ot([o]),Ot(o.querySelectorAll("*")));for(let o of s)Z(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&Z(t)&&!kt(t)){let o=r.slice(5),a=et(o);if(!a)continue;let c=t.getAttribute(r);if(c===null){let l=Te.get(t);if(l){let u=l.get(a);if(u){for(let f of u.values())f();l.delete(a)}}}else rt(t,o,c)}},pn=new MutationObserver(dn),mn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...c]=o.split(".");i.set(a,new Set(c))}return{pluginName:r,key:s,mods:i}},gn=()=>Ee.has(document.documentElement),yn=()=>{Pt||!gn()||(Pt=!0,document.dispatchEvent(new Event(mt)))},hn=(e=document.documentElement,t=!0)=>{Z(e)&&De([e],!0),De(e.querySelectorAll("*"),!0),t&&(pn.observe(e,{subtree:!0,childList:!0,attributes:!0}),Ee.add(e),yn())};var rt=(e,t,n,r)=>{let s=et(t);if(!s)return;let{pluginName:i,key:o,mods:a}=mn(s),c=tt.get(i);if((!r||nt.has(i))&&!!c){let u={el:e,rawKey:s,mods:a,error:be.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:s,key:o,value:n}}),key:o,value:n,loadedPluginNames:{actions:new Set(ve.keys()),attributes:new Set(tt.keys())},rx:void 0},f=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.key)||"allowed",m=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.value)||"allowed",y=o!=null&&o!=="",v=n!=null&&n!=="";if(y){if(f==="denied")throw u.error("KeyNotAllowed")}else if(f==="must")throw u.error("KeyRequired");if(v){if(m==="denied")throw u.error("ValueNotAllowed")}else if(m==="must")throw u.error("ValueRequired");if(f==="exclusive"||m==="exclusive"){if(y&&v)throw u.error("KeyAndValueProvided");if(!y&&!v)throw u.error("KeyOrValueRequired")}let d=new Map;if(v){let h;u.rx=(...G)=>(h||(h=bn(n,{returnsValue:c.returnsValue,argNames:c.argNames,cleanups:d})),h(e,...G))}let g=c.apply(u);g&&d.set("attribute",g);let b=Te.get(e);if(b){let h=b.get(s);if(h)for(let G of h.values())G()}else b=new Map,Te.set(e,b);b.set(s,d)}},bn=(e,{returnsValue:t=!1,argNames:n=[],cleanups:r=new Map}={})=>{let s="";if(t){let i=/(?:\/(?:\\\/|[^/])*\/|"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|`(?:\\`|[^`])*`|\(\s*(?:(?:function)\s*\(\s*\)|(?:\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,o=e.trim().match(i);if(o){let a=o.length-1,c=o[a].trim();c.startsWith("return")||(o[a]=`return (${c});`),s=o.join(`; +`)}}else s=e.trim();s=s.replace(/(?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\$]*(?:(?:\\.|\$(?!\{))[^`\\$]*)*`)|\$\{([^{}]*)\}|\$(\w+(?:[.-]\w+)*)/g,(i,o,a)=>{if(o===void 0&&a===void 0)return i;let c=l=>l.split(".").reduce((u,f)=>`${u}['${f}']`,"$");return o!==void 0?`\${${o.replace(/\$(\w+(?:[.-]\w+)*)/g,(l,u)=>c(u))}}`:c(a)}),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');try{let i=Function("el","$","__action","evt",...n,s);return(o,...a)=>{let c=(l,u,...f)=>{let m=be.bind(0,{plugin:{type:"action",name:l},element:{id:o.id,tag:o.tagName},expression:{fnContent:s,value:e}}),y=Ft[l];if(y)return y({el:o,evt:u,error:m,cleanups:r},...f);throw m("UndefinedAction")};try{return i(o,ne,c,void 0,...a)}catch(l){throw console.error(l),be({element:{id:o.id,tag:o.tagName},expression:{fnContent:s,value:e},error:l.message},"ExecuteExpression")}}}catch(i){throw console.error(i),be({expression:{fnContent:s,value:e},error:i.message},"GenerateExpression")}};V({name:"peek",apply(e,t){P();try{return t()}finally{O()}}});V({name:"setAll",apply(e,t,n){P();let r=q(n);te(r,()=>t),D(r),O()}});V({name:"toggleAll",apply(e,t){P();let n=q(t);te(n,r=>!r),D(n),O()}});var Ve=new Map,st=e=>!["GET","DELETE"].includes(e),Ae=(e,t,n=!0)=>V({name:e,apply:async({el:r,evt:s,error:i,cleanups:o},a,{selector:c,headers:l,contentType:u="json",filterSignals:{include:f=/.*/,exclude:m=/(^|\.)_/}={},openWhenHidden:y=n,payload:v,requestCancellation:d="auto",retry:g="auto",retryInterval:b=1e3,retryScaler:h=2,retryMaxWait:G=3e4,retryMaxCount:F=10}={})=>{let k=d instanceof AbortController?d:new AbortController;(d==="auto"||d==="cleanup")&&(Ve.get(t)?.get(a)?.abort(),Ve.has(t)||Ve.set(t,new Map),Ve.get(t).set(a,k)),d==="cleanup"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{k.abort(),await Promise.resolve()}));let de=()=>{};try{if(!a?.length)throw i("FetchNoUrlProvided",{action:V});let pe={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&st(t)&&(pe["Content-Type"]="application/json");let ie=Object.assign({},pe,l),H={input:"",method:t,headers:ie,openWhenHidden:y,retry:g,retryInterval:b,retryScaler:h,retryMaxWait:G,retryMaxCount:F,signal:k.signal,onopen:async T=>{T.status>=400&&re(vn,r,{status:T.status.toString()})},onmessage:T=>{if(!T.event.startsWith("datastar"))return;let W=T.event,S={};for(let R of T.data.split(` +`)){let M=R.indexOf(" "),w=R.slice(0,M),I=R.slice(M+1);(S[w]||=[]).push(I)}let _=Object.fromEntries(Object.entries(S).map(([R,M])=>[R,M.join(` +`)]));re(W,r,_)},onerror:T=>{if(_t(T))throw i("FetchExpectedTextEventStream",{url:a})}},je=()=>{let T=new URL(a,document.baseURI),W=new URLSearchParams(T.search);if(u==="json"){P();let S=v!==void 0?v:q({include:f,exclude:m});O();let _=JSON.stringify(S);st(t)?H.body=_:W.set("datastar",_)}else if(u==="form"){let S=c?document.querySelector(c):r.closest("form");if(!S)throw i("FetchFormNotFound",{action:V,selector:c});if(!S.noValidate&&!S.checkValidity()){S.reportValidity();return}let _=new FormData(S),R=r;if(r===S&&s instanceof SubmitEvent)R=s.submitter;else{let I=j=>j.preventDefault();S.addEventListener("submit",I),de=()=>{S.removeEventListener("submit",I)}}if(R instanceof HTMLButtonElement||R instanceof HTMLInputElement&&R.type==="submit"){let I=R.getAttribute("name");I&&_.append(I,R.value)}let M=S.getAttribute("enctype")==="multipart/form-data";M||(ie["Content-Type"]="application/x-www-form-urlencoded");let w=new URLSearchParams(_);if(st(t))M?H.body=_:H.body=w;else for(let[I,j]of w)W.append(I,j)}else throw i("FetchInvalidContentType",{action:V,contentType:u});return T.search=W.toString(),H.input=T.toString(),H};re(it,r,{});try{await Mn(r,je)}catch(T){if(!_t(T))throw i("FetchFailed",{method:t,url:a,error:T.message})}}finally{re(ot,r,{}),de(),o.delete(`@${e}`)}}});Ae("get","GET",!1);Ae("patch","PATCH");Ae("post","POST");Ae("put","PUT");Ae("delete","DELETE");var it="started",ot="finished",vn="error",En="retrying",Tn="retries-failed",re=(e,t,n)=>document.dispatchEvent(new CustomEvent(U,{detail:{type:e,el:t,argsRaw:n}})),_t=e=>`${e}`.includes("text/event-stream"),Sn=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},An=e=>{let t,n,r,s=!1;return i=>{t?t=wn(t,i):(t=i,n=0,r=-1);let o=t.length,a=0;for(;n{let r=It(),s=new TextDecoder;return(i,o)=>{if(!i.length)n?.(r),r=It();else if(o>0){let a=s.decode(i.subarray(0,o)),c=o+(i[o+1]===32?2:1),l=s.decode(i.subarray(c));switch(a){case"data":r.data=r.data?`${r.data} +${l}`:l;break;case"event":r.event=l;break;case"id":e(r.id=l);break;case"retry":{let u=+l;Number.isNaN(u)||t(r.retry=u);break}}}}},wn=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},It=()=>({data:"",event:"",id:"",retry:void 0}),Mn=(e,t)=>new Promise((n,r)=>{let s=t();if(!s)return;let{input:i,signal:o,headers:a,onopen:c,onmessage:l,onclose:u,openWhenHidden:f,fetch:m,retry:y="auto",retryInterval:v=1e3,retryScaler:d=2,retryMaxWait:g=3e4,retryMaxCount:b=10,responseOverrides:h,...G}=s,F={...a},k,de=()=>{let M=t();M&&(i=M.input,G.body=M.body,R())},pe=()=>{k.abort(),document.hidden||de()};f||document.addEventListener("visibilitychange",pe);let ie,H=()=>{document.removeEventListener("visibilitychange",pe),clearTimeout(ie),k.abort()};o?.addEventListener("abort",()=>{H(),n()});let je=m||window.fetch,T=c||(()=>{}),W=0,S=v,_=()=>{W{k=new AbortController;let M=k.signal;try{let w=await je(i,{...G,headers:F,signal:M});await T(w);let I=async(B,me,We,Me,...rn)=>{let pt={[We]:await me.text()};for(let Ue of rn){let Je=me.headers.get(`datastar-${ae(Ue)}`);if(Me){let Le=Me[Ue];Le&&(Je=typeof Le=="string"?Le:JSON.stringify(Le))}Je&&(pt[Ue]=Je)}re(B,e,pt),H(),n()},j=w.status,tn=j===204,dt=j>=300&&j<400,nn=j>=400&&j<600;if(j!==200){if(u?.(),y!=="never"&&!tn&&!dt&&(y==="always"||y==="error"&&nn)){_();return}H(),n();return}W=0,v=S;let Be=w.headers.get("Content-Type");if(Be?.includes("text/html"))return await I("datastar-patch-elements",w,"elements",h,"selector","mode","namespace","useViewTransition");if(Be?.includes("application/json"))return await I("datastar-patch-signals",w,"signals",h,"onlyIfMissing");if(Be?.includes("text/javascript")){let B=document.createElement("script"),me=w.headers.get("datastar-script-attributes");if(me)for(let[We,Me]of Object.entries(JSON.parse(me)))B.setAttribute(We,Me);B.textContent=await w.text(),document.head.appendChild(B),H();return}if(await Sn(w.body,An(Rn(B=>{B?F["last-event-id"]=B:delete F["last-event-id"]},B=>{S=v=B},l))),u?.(),y==="always"&&!dt){_();return}H(),n()}catch{if(!M.aborted)try{_()}catch(w){H(),r(w)}}};R()});p({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,c)=>{c===""||c===!0?e.setAttribute(a,""):c===!1||c==null?e.removeAttribute(a):typeof c=="string"?e.setAttribute(a,c):typeof c=="function"?e.setAttribute(a,c.toString()):e.setAttribute(a,JSON.stringify(c,(l,u)=>typeof u=="function"?u.toString():u))},s=t?()=>{i.disconnect();let a=n();r(t,a),i.observe(e,{attributeFilter:[t]})}:()=>{i.disconnect();let a=n(),c=Object.keys(a);for(let l of c)r(l,a[l]);i.observe(e,{attributeFilter:c})},i=new MutationObserver(s),o=A(s);return()=>{i.disconnect(),o()}}});var $e=(e,...t)=>({get:n=>n[e],set:(n,r)=>{n[e]=r},events:t}),Dt=(e,...t)=>({get:n=>n.getAttribute(e),set:(n,r)=>{n.setAttribute(e,`${r}`)},events:t}),at=(e=!1,...t)=>({get:(n,r)=>r==="string"||e&&r==="undefined"?n.value:+n.value,set:(n,r)=>{n.value=`${r}`},events:t}),Ln=/^data:(?[^;]+);base64,(?.*)$/,Vt=Symbol("empty"),xn=(e,t,n,r,s,i)=>{let o=K(CSS.escape(n)),a=t?`[${o}]`:`[${o}="${CSS.escape(r)}"]`;if(i===void 0&&e instanceof HTMLInputElement&&e.type==="radio"){let f=[...document.querySelectorAll(a)].find(m=>m instanceof HTMLInputElement&&m.checked);f&&E([[r,f.value]],{ifMissing:!0})}if(!Array.isArray(i)||e instanceof HTMLSelectElement&&e.multiple)return E([[r,s.get(e,typeof i)]],{ifMissing:!0}),r;let c=document.querySelectorAll(a),l=[],u=0;for(let f of c){if(l.push([`${r}.${u}`,s.get(f,typeof(L(i,u)?i[u]:void 0))]),e===f)break;u++}return E(l,{ifMissing:!0}),`${r}.${u}`};p({name:"bind",requirement:"exclusive",apply({el:e,key:t,rawKey:n,mods:r,value:s,error:i}){let o=t!=null?C(t,r):s,a=r.get("prop"),c=r.get("event"),l=null;if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":l=at(!1,"input");break;case"checkbox":l={get:(d,g)=>d.value!=="on"?g==="boolean"?d.checked:d.checked?d.value:"":g==="string"?d.checked?d.value:"":d.checked,set:(d,g)=>{d.checked=typeof g=="string"?g===d.value:g},events:["input"]};break;case"radio":e.getAttribute("name")?.length||e.setAttribute("name",o),l={get:(d,g)=>d.checked?g==="number"?+d.value:d.value:Vt,set:(d,g)=>{d.checked=g===(typeof g=="number"?+d.value:d.value)},events:["input"]};break;case"file":{let d=()=>{let g=[...e.files||[]],b=[];Promise.all(g.map(h=>new Promise(G=>{let F=new FileReader;F.onload=()=>{if(typeof F.result!="string")throw i("InvalidFileResultType",{resultType:typeof F.result});let k=F.result.match(Ln);if(!k?.groups)throw i("InvalidDataUri",{result:F.result});b.push({name:h.name,contents:k.groups.contents,mime:k.groups.mime})},F.onloadend=()=>G(),F.readAsDataURL(h)}))).then(()=>{E([[o,b]])})};return e.addEventListener("change",d),()=>{e.removeEventListener("change",d)}}default:l=at(!0,"input")}else if(e instanceof HTMLSelectElement&&e.multiple){let d=new Map;l={get:g=>[...g.selectedOptions].map(b=>{let h=d.get(b.value);return h==="string"||h==null?b.value:+b.value}),set:(g,b)=>{for(let h of g.options)b.includes(h.value)?(d.set(h.value,"string"),h.selected=!0):b.includes(+h.value)?(d.set(h.value,"number"),h.selected=!0):h.selected=!1},events:["change"]}}else e instanceof HTMLSelectElement?l=at(!0,"change"):e instanceof HTMLTextAreaElement?l=$e("value","input"):e instanceof HTMLElement&&e.tagName.includes("-")?l="value"in e?$e("value","input","change"):Dt("value","input","change"):e instanceof HTMLElement&&"value"in e?l=$e("value","change"):l=Dt("value","change");if(!l)throw i("InvalidBindAdapter");let u=a&&[...a][0];if(a&&!u)throw i("BindPropNameMissing");if(u){let d=Lt(u);l=$e(d,...c?[...c]:l.events)}else c&&(l.events=[...c]);let f=oe(o),m=xn(e,t,n,o,l,f),y=()=>{let d=oe(m);if(d!=null){let g=l.get(e,typeof d);g!==Vt&&E([[m,g]])}};for(let d of l.events)e.addEventListener(d,y);e.addEventListener(ge,y);let v=A(()=>{l.set(e,oe(m))});return()=>{v();for(let d of l.events)e.removeEventListener(d,y);e.removeEventListener(ge,y)}}});p({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=C(e,n,"kebab");let s,i=()=>{o.disconnect(),s=e?{[e]:r()}:r();for(let c in s){let l=c.split(/\s+/).filter(u=>u.length>0);if(s[c])for(let u of l)t.classList.contains(u)||t.classList.add(u);else for(let u of l)t.classList.contains(u)&&t.classList.remove(u)}o.observe(t,{attributeFilter:["class"]})},o=new MutationObserver(i),a=A(i);return()=>{o.disconnect(),a();for(let c in s){let l=c.split(/\s+/).filter(u=>u.length>0);for(let u of l)t.classList.remove(u)}}}});p({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)E([[C(e,t),_e(n)]]);else{let s=Object.assign({},n());te(s,i=>{if(typeof i=="function")return _e(i);throw r("ComputedExpectedFunction")}),D(s)}}});p({name:"effect",requirement:{key:"denied",value:"must"},apply:({rx:e})=>A(e)});p({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?C(t,n):r,i=0;E([[s,!1]]);let o=a=>{let{type:c,el:l}=a.detail;if(l===e)switch(c){case it:i++,E([[s,!0]]);break;case ot:i=Math.max(0,i-1),E([[s,i>0]]);break}};return document.addEventListener(U,o),()=>{i=0,E([[s,!1]]),document.removeEventListener(U,o)}}});var Y=e=>{if(!e||e.size<=0)return 0;for(let t of e){if(t.endsWith("ms"))return+t.replace("ms","");if(t.endsWith("s"))return+t.replace("s","")*1e3;try{return Number.parseFloat(t)}catch{}}return 0},se=(e,t,n=!1)=>e?e.has(t.toLowerCase()):n,$t=(e,t="")=>{if(e&&e.size>0)for(let n of e)return n;return t};var ct=(e,t)=>(...n)=>{setTimeout(()=>{e(...n)},t)},qt=(e,t,n=!0,r=!1,s=!1)=>{let i=null,o=0;return(...a)=>{n&&!o?(e(...a),i=null):i=a,(!o||s)&&(o&&clearTimeout(o),o=setTimeout(()=>{r&&i!==null&&e(...i),i=null,o=0},t))}},le=(e,t)=>{let n=t.get("delay");if(n){let i=Y(n);e=ct(e,i)}let r=t.get("debounce");if(r){let i=Y(r),o=se(r,"leading",!1),a=!se(r,"notrailing",!1);e=qt(e,i,o,a,!0)}let s=t.get("throttle");if(s){let i=Y(s),o=!se(s,"noleading",!1),a=se(s,"trailing",!1);e=qt(e,i,o,a)}return e};var qe=(e=document.documentElement)=>"startViewTransition"in e,X=(e,t)=>{if(t.has("viewtransition")&&qe()){let n=e;e=(...r)=>document.startViewTransition(()=>n(...r))}return e};p({name:"init",requirement:{key:"denied",value:"must"},apply({rx:e,mods:t}){let n=()=>{x();try{e()}finally{N()}};n=X(n,t);let r=0,s=t.get("delay");s&&(r=Y(s),r>0&&(n=ct(n,r))),n()}});p({name:"json-signals",requirement:{key:"denied"},apply({el:e,value:t,mods:n}){let r=n.has("terse")?0:2,s={};t&&(s=ce(t));let i=()=>{o.disconnect(),e.textContent=JSON.stringify(q(s),null,r),o.observe(e,{childList:!0,characterData:!0,subtree:!0})},o=new MutationObserver(i),a=A(i);return()=>{o.disconnect(),a()}}});p({name:"on",requirement:"must",argNames:["evt"],apply({el:e,key:t,mods:n,rx:r}){let s=e;n.has("window")?s=window:n.has("document")&&(s=document);let i=l=>{x();try{r(l)}finally{N()}};i=X(i,n),i=le(i,n);let o=C(t,n,"kebab"),a={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=document;let l=i;i=u=>{e.contains(u?.target)||l(u)}}(o===U||o===ee)&&(s=document);let c=l=>{l&&(n.has("prevent")&&l.preventDefault(),n.has("stop")&&l.stopPropagation(),e instanceof HTMLFormElement&&o==="submit"&&l.preventDefault()),i(l)};return s.addEventListener(o,c,a),()=>{s.removeEventListener(o,c,a)}}});var Gt=(e,t,n)=>Math.max(t,Math.min(n,e));var lt=new WeakSet;p({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{x();try{n()}finally{N()}};r=X(r,t),r=le(r,t);let s={threshold:0};if(t.has("full"))s.threshold=1;else if(t.has("half"))s.threshold=.5;else{let a=t.get("threshold");a&&(s.threshold=Gt(Number($t(a)),0,100)/100)}let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let c of a)c.isIntersecting!==i&&(r(),o&<.has(e)&&o.disconnect())},s);return o.observe(e),t.has("once")&<.add(e),()=>{t.has("once")||lt.delete(e),o&&(o.disconnect(),o=null)}}});p({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{x();try{t()}finally{N()}};n=X(n,e);let r=1e3,s=e.get("duration");s&&(r=Y(s),se(s,"leading",!1)&&n());let i=setInterval(n,r);return()=>{clearInterval(i)}}});p({name:"on-signal-patch",requirement:{value:"must"},argNames:["patch"],returnsValue:!0,apply({el:e,key:t,mods:n,rx:r,error:s}){if(t&&t!=="filter")throw s("KeyNotAllowed");let i=K(`${this.name}-filter`),o=e.getAttribute(i),a={};o&&(a=ce(o));let c=!1,l=le(u=>{if(c)return;P();let f=q(a,u.detail);if(O(),!gt(f)){c=!0,x();try{r(f)}finally{N(),c=!1}}},n);return document.addEventListener(ee,l),()=>{document.removeEventListener(ee,l)}}});p({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?C(t,n):r;E([[s,e]])}});var jt="none",Bt="display";p({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===jt&&e.style.removeProperty(Bt):e.style.setProperty(Bt,jt),r.observe(e,{attributeFilter:["style"]})},r=new MutationObserver(n),s=A(n);return()=>{r.disconnect(),s()}}});p({name:"signals",returnsValue:!0,apply({key:e,mods:t,rx:n}){let r=t.has("ifmissing");if(e){e=C(e,t);let s=n?.();E([[e,s]],{ifMissing:r})}else{let s=Object.assign({},n?.());D(s,{ifMissing:r})}}});p({name:"style",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,rx:n}){let{style:r}=t,s=new Map,i=(l,u)=>{let f=s.get(l);!u&&u!==0?f!==void 0&&(f?r.setProperty(l,f):r.removeProperty(l)):(f===void 0&&s.set(l,r.getPropertyValue(l)),r.setProperty(l,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let l=n();for(let[u,f]of s)u in l||(f?r.setProperty(u,f):r.removeProperty(u));for(let u in l)i(ae(u),l[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),c=A(o);return()=>{a.disconnect(),c();for(let[l,u]of s)u?r.setProperty(l,u):r.removeProperty(l)}}});p({name:"text",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),e.textContent=`${t()}`,r.observe(e,{childList:!0,characterData:!0,subtree:!0})},r=new MutationObserver(n),s=A(n);return()=>{r.disconnect(),s()}}});var Wt=(e,t)=>e.includes(t),Nn=["remove","outer","inner","replace","prepend","append","before","after"],Pn=["html","svg","mathml"];Se({name:"datastar-patch-elements",apply(e,t){let n=typeof t.selector=="string"?t.selector:"",r=typeof t.mode=="string"?t.mode:"outer",s=typeof t.namespace=="string"?t.namespace:"html",i=typeof t.useViewTransition=="string"&&t.useViewTransition.trim()==="true",o=typeof t.viewTransitionSelector=="string"?t.viewTransitionSelector:"",a=t.elements;if(!Wt(Nn,r))throw e.error("PatchElementsInvalidMode",{mode:r});if(!n&&r!=="outer"&&r!=="replace")throw e.error("PatchElementsExpectedSelector");if(!Wt(Pn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let c={selector:n,mode:r,namespace:s,elements:a};if(i&&qe()){let l=document.documentElement;if(o){let u=document.querySelector(o);u&&qe(u)&&(l=u)}l.startViewTransition(()=>Ut(e,c))}else Ut(e,c)}});var Ut=({error:e},{selector:t,mode:n,namespace:r,elements:s})=>{let i=document.createDocumentFragment(),o=typeof s!="string"&&!!s;if(typeof s=="string"){let a=s.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,""),c=/<\/html>/.test(a),l=/<\/head>/.test(a),u=/<\/body>/.test(a),f=r==="svg"?"svg":r==="mathml"?"math":"",m=f?`<${f}>${s}`:s,y=new DOMParser().parseFromString(c||l||u?s:``,"text/html");if(c)i.appendChild(y.documentElement);else if(l&&u)i.appendChild(y.head),i.appendChild(y.body);else if(l)i.appendChild(y.head);else if(u)i.appendChild(y.body);else if(f){let v=y.querySelector("template").content.querySelector(f);for(let d of v.childNodes)i.appendChild(d)}else i=y.querySelector("template").content}else s&&(s instanceof DocumentFragment?i=s:s instanceof Element&&i.appendChild(s));if(!t&&(n==="outer"||n==="replace")){let a=Array.from(i.children);for(let c of a){let l;if(c instanceof HTMLHtmlElement)l=document.documentElement;else if(c instanceof HTMLBodyElement)l=document.body;else if(c instanceof HTMLHeadElement)l=document.head;else if(l=document.getElementById(c.id),!l){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:c.id}});continue}Kt(n,c,[l],!0)}}else{let a=document.querySelectorAll(t);if(!a.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}let c=o&&n!=="remove"?[a[0]]:a;c.length===1&&(o=!0),Kt(n,i,c,o)}},ft=new WeakSet;for(let e of document.querySelectorAll("script"))ft.add(e);var Yt=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!ft.has(n)){let r=document.createElement("script");for(let{name:s,value:i}of n.attributes)r.setAttribute(s,i);r.text=n.text,n.replaceWith(r),ft.add(r)}},Jt=(e,t,n,r)=>{let s=!1;for(let i of e){if(r&&s)break;let o=r?t:t.cloneNode(!0);Yt(o),i[n](o),s=!0}},Kt=(e,t,n,r)=>{switch(e){case"remove":for(let s of n)s.remove();break;case"outer":case"inner":{let s=!1;for(let i of n){if(r&&s)break;let o=r?t:t.cloneNode(!0);Cn(i,o,e),Yt(i);let a=i.closest("[data-scope-children]");a&&a.dispatchEvent(new CustomEvent(Ke,{bubbles:!1})),s=!0}}break;case"replace":Jt(n,t,"replaceWith",r);break;case"prepend":case"append":case"before":case"after":Jt(n,t,e,r)}},$=new Map,fe=new Set,ue=new Map,Re=new Set,Ge=document.createElement("div");Ge.hidden=!0;var we=K("ignore-morph"),On=`[${we}]`,Cn=(e,t,n="outer")=>{if(Z(e)&&Z(t)&&e.hasAttribute(we)&&t.hasAttribute(we)||e.parentElement?.closest(On))return;let r=document.createElement("div");r.append(t),document.body.insertAdjacentElement("afterend",Ge);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:c}of s)ue.has(a)?Re.add(a):ue.set(a,c);e instanceof Element&&e.id&&(ue.has(e.id)?Re.add(e.id):ue.set(e.id,e.tagName)),fe.clear();let i=r.querySelectorAll("[id]");for(let{id:a,tagName:c}of i)fe.has(a)?Re.add(a):ue.get(a)===c&&fe.add(a);for(let a of Re)fe.delete(a);ue.clear(),Re.clear(),$.clear();let o=n==="outer"?e.parentElement:e;Zt(o,s),Zt(r,i),Xt(o,r,n==="outer"?e:null,e.nextSibling),Ge.remove()},Xt=(e,t,n=null,r=null)=>{e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement&&(e=e.content,t=t.content),n??=e.firstChild;for(let s of t.childNodes){if(n&&n!==r){let i=Fn(s,n,r);if(i){if(i!==n){let o=n;for(;o&&o!==i;){let a=o;o=o.nextSibling,Qt(a)}}ut(i,s),n=i.nextSibling;continue}}if(s instanceof Element&&fe.has(s.id)){let i=document.getElementById(s.id),o=i;for(;o=o.parentNode;){let a=$.get(o);a&&(a.delete(s.id),a.size||$.delete(o))}en(e,i,n),ut(i,s),n=i.nextSibling;continue}if($.has(s)){let i=s.namespaceURI,o=s.tagName,a=i&&i!=="http://www.w3.org/1999/xhtml"?document.createElementNS(i,o):document.createElement(o);e.insertBefore(a,n),ut(a,s),n=a.nextSibling}else{let i=document.importNode(s,!0);e.insertBefore(i,n),n=i.nextSibling}}for(;n&&n!==r;){let s=n;n=n.nextSibling,Qt(s)}},Fn=(e,t,n)=>{let r=null,s=e.nextSibling,i=0,o=0,a=$.get(e)?.size||0,c=t;for(;c&&c!==n;){if(zt(c,e)){let l=!1,u=$.get(c),f=$.get(e);if(f&&u){for(let m of u)if(f.has(m)){l=!0;break}}if(l)return c;if(!r&&!$.has(c)){if(!a)return c;r=c}}if(o+=$.get(c)?.size||0,o>a)break;r===null&&s&&zt(c,s)&&(i++,s=s.nextSibling,i>=2&&(r=void 0)),c=c.nextSibling}return r||null},zt=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),Qt=e=>{$.has(e)?en(Ge,e,null):e.parentNode?.removeChild(e)},en=(e,t,n)=>{if("moveBefore"in e){e.moveBefore(t,n);return}e.insertBefore(t,n)},Hn=K("preserve-attr"),ut=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,i=r.hasAttribute("data-scope-children");if(r.hasAttribute(we)&&s.hasAttribute(we))return e;let o=(t.getAttribute(Hn)??"").split(" "),a=(l,u,f)=>{let m=u.hasAttribute(f);return l.hasAttribute(f)!==m&&!o.includes(f)?(l[f]=m,!0):!1},c=!1;if(r instanceof HTMLInputElement&&s instanceof HTMLInputElement&&s.type!=="file"){let l=s.getAttribute("value");r.getAttribute("value")!==l&&!o.includes("value")&&(r.value=l??"",c=!0),c=a(r,s,"checked")||c,a(r,s,"disabled")}else if(r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement){let l=s.value;r.defaultValue!==l&&(r.value=l,c=!0)}else r instanceof HTMLOptionElement&&s instanceof HTMLOptionElement&&(c=a(r,s,"selected")||c);for(let{name:l,value:u}of s.attributes)r.getAttribute(l)!==u&&!o.includes(l)&&r.setAttribute(l,u);for(let{name:l}of Array.from(r.attributes))!s.hasAttribute(l)&&!o.includes(l)&&r.removeAttribute(l);c&&(r instanceof HTMLOptionElement?r.closest("select"):r)?.dispatchEvent(new Event(ge,{bubbles:!0})),i&&!r.hasAttribute("data-scope-children")&&r.setAttribute("data-scope-children",""),r instanceof HTMLTemplateElement&&s instanceof HTMLTemplateElement?r.innerHTML=s.innerHTML:r.isEqualNode(s)||Xt(r,s),i&&r.dispatchEvent(new CustomEvent(Ke,{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},Zt=(e,t)=>{for(let n of t)if(fe.has(n.id)){let r=n;for(;r&&r!==e;){let s=$.get(r);s||(s=new Set,$.set(r,s)),s.add(n.id),r=r.parentElement}}};Se({name:"datastar-patch-signals",apply({error:e},{signals:t,onlyIfMissing:n}){if(typeof t!="string")throw e("PatchSignalsExpectedSignals");let r=typeof n=="string"&&n.trim()==="true";D(ce(t),{ifMissing:r})}});export{V as action,Ft as actions,p as attribute,x as beginBatch,_e as computed,A as effect,N as endBatch,q as filtered,oe as getPath,D as mergePatch,E as mergePaths,ne as root,ye as signal,P as startPeeking,O as stopPeeking,Se as watcher}; +//# sourceMappingURL=datastar.js.map diff --git a/site/examples/bearer-starter/lib/datastar.capy b/site/examples/bearer-starter/lib/datastar.capy new file mode 100644 index 00000000..967f14b5 --- /dev/null +++ b/site/examples/bearer-starter/lib/datastar.capy @@ -0,0 +1,17 @@ +function datastar_sse_headers { + response_header("Content-Type", "text/event-stream; charset=utf-8") + response_header("Cache-Control", "no-cache, no-store, must-revalidate") + response_header("X-Accel-Buffering", "no") +} + +function datastar_patch_elements(elements : string) string { + return clone("event: datastar-patch-elements\ndata: elements ") + elements + "\n\n" +} + +function datastar_patch_signals(signals_json : string) string { + return clone("event: datastar-patch-signals\ndata: signals ") + signals_json + "\n\n" +} + +function CLI { + print(datastar_patch_signals("{\"datastar\":true}")) +} diff --git a/site/examples/bearer-starter/lib/datastar.uce b/site/examples/bearer-starter/lib/datastar.uce new file mode 100644 index 00000000..c9b75ded --- /dev/null +++ b/site/examples/bearer-starter/lib/datastar.uce @@ -0,0 +1,25 @@ +String datastar_data_lines(String field, String value) +{ + String out = ""; + for(String line : split(value, "\n")) + out += "data: " + field + " " + line + "\n"; + return(out); +} + +void datastar_sse_headers(Request& context) +{ + context.call["app"]["page_type"] = "blank"; + context.header["Content-Type"] = "text/event-stream; charset=utf-8"; + context.header["Cache-Control"] = "no-cache, no-store, must-revalidate"; + context.header["X-Accel-Buffering"] = "no"; +} + +String datastar_patch_elements(String html) +{ + return("event: datastar-patch-elements\n" + datastar_data_lines("elements", html) + "\n"); +} + +String datastar_patch_signals(String signals_json) +{ + return("event: datastar-patch-signals\n" + datastar_data_lines("signals", signals_json) + "\n"); +} diff --git a/site/examples/bearer-starter/views/datastar-example.uce b/site/examples/bearer-starter/views/datastar-example.uce new file mode 100644 index 00000000..8011e47e --- /dev/null +++ b/site/examples/bearer-starter/views/datastar-example.uce @@ -0,0 +1,20 @@ +#load "../lib/app.uce" +#load "../lib/datastar.uce" + +COMPONENT(Request& context) +{ + if(context.get["stream"] == "1") + { + datastar_sse_headers(context); + print(datastar_patch_elements("
Server-rendered Bearer Datastar fragment
")); + return; + } + + <> +

Datastar optional example

+

Datastar is vendored beside the starter client libraries for future server-rendered islands. It is not loaded globally.

+ + +
Waiting for a server patch.
+ ; +} diff --git a/site/info/js/datastar.js b/site/info/js/datastar.js new file mode 100644 index 00000000..94b7a88c --- /dev/null +++ b/site/info/js/datastar.js @@ -0,0 +1,9 @@ +// Datastar v1.0.2 +var U="datastar-fetch",ge="datastar-prop-change",mt="datastar-ready",Ke="datastar-scope-children",ee="datastar-signal-patch";var L=Object.hasOwn??Object.prototype.hasOwnProperty.call;var z=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),gt=e=>{for(let t in e)if(L(e,t))return!1;return!0},te=(e,t)=>{for(let n in e){let r=e[n];z(r)||Array.isArray(r)?te(r,t):e[n]=t(r)}},xe=e=>{let t={};for(let[n,r]of e){let s=n.split("."),i=s.pop(),o=s.reduce((a,c)=>a[c]??={},t);o[i]=r}return t};var Ne=[],ze=[],ke=0,Pe=0,Qe=0,he,J,Oe=0,x=()=>{ke++},N=()=>{--ke||(bt(),Q())},P=e=>{he={t:J,c:he},J=e},O=()=>{J=he?.t,he=he?.c},ye=e=>sn.bind(0,{previousValue:e,t:e,e:1}),Ze=Symbol("computed"),_e=e=>{let t=on.bind(0,{e:17,getter:e});return t[Ze]=1,t},A=e=>{let t={d:e,e:2};J&&Xe(t,J),P(t),x();try{t.d()}finally{N(),O()}return St.bind(0,t)},bt=()=>{for(;Pe"getter"in e?vt(e):Et(e,e.t),vt=e=>{P(e),At(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{O(),Rt(e)}},Et=(e,t)=>(e.e=1,e.previousValue!==(e.previousValue=t)),Ye=e=>{let t=e.e;if(!(t&64)){e.e=t|64;let n=e.r;n?Ye(n.o):ze[Qe++]=e}},Tt=(e,t)=>{if(t&16||t&32&&wt(e.s,e)){P(e),At(e),x();try{e.d()}finally{N(),O(),Rt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.l,s=r.e;s&64&&Tt(r,r.e=s&-65),n=n.i}},sn=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(an(r),ke||bt()),!0}return!1}let n=e.t;if(e.e&16&&Et(e,n)){let r=e.r;r&&He(r)}return J&&Xe(e,J),n},on=e=>{let t=e.e;if(t&16||t&32&&wt(e.s,e)){if(vt(e)){let n=e.r;n&&He(n)}}else t&32&&(e.e=t&-33);return J&&Xe(e,J),e.t},St=e=>{let t=e.s;for(;t;)t=Fe(t,e);let n=e.r;n&&Fe(n),e.e=0},Xe=(e,t)=>{let n=t.a;if(n&&n.l===e)return;let r=n?n.i:t.s;if(r&&r.l===e){r.p=Oe,t.a=r;return}let s=e.m;if(s&&s.p===Oe&&s.o===t)return;let i=t.a=e.m={p:Oe,l:e,o:t,u:n,i:r,f:s};r&&(r.u=i),n?n.i=i:t.s=i,s?s.n=i:e.r=i},Fe=(e,t=e.o)=>{let n=e.l,r=e.u,s=e.i,i=e.n,o=e.f;if(s?s.u=r:t.a=r,r?r.i=s:t.s=s,i?i.f=o:n.m=o,o)o.n=i;else if(!(n.r=i))if("getter"in n){let a=n.s;if(a){n.e=17;do a=Fe(a,n);while(a)}}else"previousValue"in n||St(n);return s},an=e=>{let t=e.n,n;e:for(;;){let r=e.o,s=r.e;if(s&60?s&12?s&4?!(s&48)&&cn(e,r)?(r.e=s|40,s&=1):s=0:r.e=s&-9|32:s=0:r.e=s|32,s&2&&Ye(r),s&1){let i=r.r;if(i){let o=(e=i).n;o&&(n={t,c:n},t=o);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.c,e){t=e.n;continue e}break}},At=e=>{Oe++,e.a=void 0,e.e=e.e&-57|4},Rt=e=>{let t=e.a,n=t?t.i:e.s;for(;n;)n=Fe(n,e);e.e&=-5},wt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let i=e.l,o=i.e;if(t.e&16)s=!0;else if((o&17)===17){if(yt(i)){let a=i.r;a.n&&He(a),s=!0}}else if((o&33)===33){(e.n||e.f)&&(n={t:e,c:n}),e=i.s,t=i,++r;continue}if(!s){let a=e.i;if(a){e=a;continue}}for(;r--;){let a=t.r,c=a.n;if(c?(e=n.t,n=n.c):e=a,s){if(yt(t)){c&&He(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.i){e=e.i;continue e}}return s}},He=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&Ye(t))}while(e=e.n)},cn=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.u}return!1},oe=e=>{let t=ne,n=e.split(".");for(let r of n){if(t==null||!L(t,r))return;t=t[r]}return t},Ce=(e,t="")=>{let n=Array.isArray(e);if(n||z(e)){let r=n?[]:{};for(let i in e)r[i]=ye(Ce(e[i],`${t+i}.`));let s=ye(0);return new Proxy(r,{get(i,o){if(!(o==="toJSON"&&!L(r,o)))return n&&o in Array.prototype?(s(),r[o]):typeof o=="symbol"?r[o]:((!L(r,o)||r[o]()==null)&&(r[o]=ye(""),Q(t+o,""),s(s()+1)),r[o]())},set(i,o,a){let c=t+o;if(n&&o==="length"){let l=r[o]-a;if(r[o]=a,l>0){let u={};for(let f=a;f{if(e!==void 0&&t!==void 0&&Ne.push([e,t]),!ke&&Ne.length){let n=xe(Ne);Ne.length=0,document.dispatchEvent(new CustomEvent(ee,{detail:n}))}},D=(e,{ifMissing:t}={})=>{x();for(let n in e)e[n]==null?t||delete ne[n]:Mt(e[n],n,ne,"",t);N()},E=(e,t)=>D(xe(e),t),Mt=(e,t,n,r,s)=>{if(z(e)){L(n,t)&&(z(n[t])||Array.isArray(n[t]))||(n[t]={});for(let i in e)e[i]==null?s||delete n[t][i]:Mt(e[i],i,n[t],`${r+t}.`,s)}else s&&L(n,t)||(n[t]=e)},ht=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,q=({include:e=/.*/,exclude:t=/(?!)/}={},n=ne)=>{let r=ht(e),s=ht(t),i=[],o=[[n,""]];for(;o.length;){let[a,c]=o.pop();for(let l in a){let u=c+l;z(a[l])?o.push([a[l],`${u}.`]):r.test(u)&&!s.test(u)&&i.push([u,oe(u)])}}return xe(i)},ne=Ce({});var Z=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var ae=e=>e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1-$2").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([a-z])([0-9]+)/gi,"$1-$2").replace(/([0-9]+)([a-z])/gi,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase(),Lt=e=>ae(e).replace(/-./g,t=>t[1].toUpperCase()),xt=e=>ae(e).replace(/-/g,"_");var ln=/^(?:(?:async\s+)?function\b|(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/,ce=(e,t={})=>{let{reviveFunctionStrings:n=!1}=t;try{return n?JSON.parse(e,(r,s)=>{if(typeof s!="string")return s;let i=s.trim();if(!ln.test(i))return s;try{let o=Function(`return (${i})`)();return typeof o=="function"?o:s}catch{return s}}):JSON.parse(e)}catch{return Function(`return (${e})`)()}},Nt={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+Nt.camel(e.slice(1))},C=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=Nt[r]?.(e)||e;return e},K=e=>`data-${e}`,et=e=>e;var un="https://data-star.dev/errors",be=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=xt(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return r.message=`${t} +More info: ${un}/${s}?${i} +Context: ${o}`,r},ve=new Map,tt=new Map,Ct=new Map,Ft=new Proxy({},{get:(e,t)=>ve.get(t)?.apply,has:(e,t)=>ve.has(t),ownKeys:()=>Reflect.ownKeys(ve),set:()=>!1,deleteProperty:()=>!1}),Te=new Map,Ie=[],nt=new Set,Ee=new Set,Pt=!1,p=e=>{Ie.push(e),Ie.length===1&&setTimeout(()=>{for(let n of Ie)nt.add(n.name),tt.set(n.name,n);Ie.length=0;let t=Ee.size?[...Ee]:[document.documentElement];for(let n of t)hn(n,!Ee.has(n));nt.clear()})},V=e=>{ve.set(e.name,e)};document.addEventListener(U,e=>{let t=Ct.get(e.detail.type);t&&t.apply({error:be.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var Se=e=>{Ct.set(e.name,e)},Ot=e=>{for(let t of e){let n=Te.get(t);if(n&&Te.delete(t))for(let r of n.values())for(let s of r.values())s()}},Ht=K("ignore"),fn=`[${Ht}]`,kt=e=>e.hasAttribute(`${Ht}__self`)||!!e.closest(fn),De=(e,t)=>{for(let n of e)if(!kt(n)){let r=new Set;for(let s in n.dataset){let i=s.replace(/[A-Z]/g,"-$&").toLowerCase();r.add(i),rt(n,i,n.dataset[s],t)}for(let s of Array.from(n.attributes)){if(!s.name.startsWith("data-"))continue;let i=s.name.slice(5);r.has(i)||rt(n,i,s.value,t)}}},dn=e=>{for(let{target:t,type:n,attributeName:r,addedNodes:s,removedNodes:i}of e)if(n==="childList"){for(let o of i)Z(o)&&(Ot([o]),Ot(o.querySelectorAll("*")));for(let o of s)Z(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&Z(t)&&!kt(t)){let o=r.slice(5),a=et(o);if(!a)continue;let c=t.getAttribute(r);if(c===null){let l=Te.get(t);if(l){let u=l.get(a);if(u){for(let f of u.values())f();l.delete(a)}}}else rt(t,o,c)}},pn=new MutationObserver(dn),mn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...c]=o.split(".");i.set(a,new Set(c))}return{pluginName:r,key:s,mods:i}},gn=()=>Ee.has(document.documentElement),yn=()=>{Pt||!gn()||(Pt=!0,document.dispatchEvent(new Event(mt)))},hn=(e=document.documentElement,t=!0)=>{Z(e)&&De([e],!0),De(e.querySelectorAll("*"),!0),t&&(pn.observe(e,{subtree:!0,childList:!0,attributes:!0}),Ee.add(e),yn())};var rt=(e,t,n,r)=>{let s=et(t);if(!s)return;let{pluginName:i,key:o,mods:a}=mn(s),c=tt.get(i);if((!r||nt.has(i))&&!!c){let u={el:e,rawKey:s,mods:a,error:be.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:s,key:o,value:n}}),key:o,value:n,loadedPluginNames:{actions:new Set(ve.keys()),attributes:new Set(tt.keys())},rx:void 0},f=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.key)||"allowed",m=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.value)||"allowed",y=o!=null&&o!=="",v=n!=null&&n!=="";if(y){if(f==="denied")throw u.error("KeyNotAllowed")}else if(f==="must")throw u.error("KeyRequired");if(v){if(m==="denied")throw u.error("ValueNotAllowed")}else if(m==="must")throw u.error("ValueRequired");if(f==="exclusive"||m==="exclusive"){if(y&&v)throw u.error("KeyAndValueProvided");if(!y&&!v)throw u.error("KeyOrValueRequired")}let d=new Map;if(v){let h;u.rx=(...G)=>(h||(h=bn(n,{returnsValue:c.returnsValue,argNames:c.argNames,cleanups:d})),h(e,...G))}let g=c.apply(u);g&&d.set("attribute",g);let b=Te.get(e);if(b){let h=b.get(s);if(h)for(let G of h.values())G()}else b=new Map,Te.set(e,b);b.set(s,d)}},bn=(e,{returnsValue:t=!1,argNames:n=[],cleanups:r=new Map}={})=>{let s="";if(t){let i=/(?:\/(?:\\\/|[^/])*\/|"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|`(?:\\`|[^`])*`|\(\s*(?:(?:function)\s*\(\s*\)|(?:\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,o=e.trim().match(i);if(o){let a=o.length-1,c=o[a].trim();c.startsWith("return")||(o[a]=`return (${c});`),s=o.join(`; +`)}}else s=e.trim();s=s.replace(/(?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\$]*(?:(?:\\.|\$(?!\{))[^`\\$]*)*`)|\$\{([^{}]*)\}|\$(\w+(?:[.-]\w+)*)/g,(i,o,a)=>{if(o===void 0&&a===void 0)return i;let c=l=>l.split(".").reduce((u,f)=>`${u}['${f}']`,"$");return o!==void 0?`\${${o.replace(/\$(\w+(?:[.-]\w+)*)/g,(l,u)=>c(u))}}`:c(a)}),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');try{let i=Function("el","$","__action","evt",...n,s);return(o,...a)=>{let c=(l,u,...f)=>{let m=be.bind(0,{plugin:{type:"action",name:l},element:{id:o.id,tag:o.tagName},expression:{fnContent:s,value:e}}),y=Ft[l];if(y)return y({el:o,evt:u,error:m,cleanups:r},...f);throw m("UndefinedAction")};try{return i(o,ne,c,void 0,...a)}catch(l){throw console.error(l),be({element:{id:o.id,tag:o.tagName},expression:{fnContent:s,value:e},error:l.message},"ExecuteExpression")}}}catch(i){throw console.error(i),be({expression:{fnContent:s,value:e},error:i.message},"GenerateExpression")}};V({name:"peek",apply(e,t){P();try{return t()}finally{O()}}});V({name:"setAll",apply(e,t,n){P();let r=q(n);te(r,()=>t),D(r),O()}});V({name:"toggleAll",apply(e,t){P();let n=q(t);te(n,r=>!r),D(n),O()}});var Ve=new Map,st=e=>!["GET","DELETE"].includes(e),Ae=(e,t,n=!0)=>V({name:e,apply:async({el:r,evt:s,error:i,cleanups:o},a,{selector:c,headers:l,contentType:u="json",filterSignals:{include:f=/.*/,exclude:m=/(^|\.)_/}={},openWhenHidden:y=n,payload:v,requestCancellation:d="auto",retry:g="auto",retryInterval:b=1e3,retryScaler:h=2,retryMaxWait:G=3e4,retryMaxCount:F=10}={})=>{let k=d instanceof AbortController?d:new AbortController;(d==="auto"||d==="cleanup")&&(Ve.get(t)?.get(a)?.abort(),Ve.has(t)||Ve.set(t,new Map),Ve.get(t).set(a,k)),d==="cleanup"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{k.abort(),await Promise.resolve()}));let de=()=>{};try{if(!a?.length)throw i("FetchNoUrlProvided",{action:V});let pe={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&st(t)&&(pe["Content-Type"]="application/json");let ie=Object.assign({},pe,l),H={input:"",method:t,headers:ie,openWhenHidden:y,retry:g,retryInterval:b,retryScaler:h,retryMaxWait:G,retryMaxCount:F,signal:k.signal,onopen:async T=>{T.status>=400&&re(vn,r,{status:T.status.toString()})},onmessage:T=>{if(!T.event.startsWith("datastar"))return;let W=T.event,S={};for(let R of T.data.split(` +`)){let M=R.indexOf(" "),w=R.slice(0,M),I=R.slice(M+1);(S[w]||=[]).push(I)}let _=Object.fromEntries(Object.entries(S).map(([R,M])=>[R,M.join(` +`)]));re(W,r,_)},onerror:T=>{if(_t(T))throw i("FetchExpectedTextEventStream",{url:a})}},je=()=>{let T=new URL(a,document.baseURI),W=new URLSearchParams(T.search);if(u==="json"){P();let S=v!==void 0?v:q({include:f,exclude:m});O();let _=JSON.stringify(S);st(t)?H.body=_:W.set("datastar",_)}else if(u==="form"){let S=c?document.querySelector(c):r.closest("form");if(!S)throw i("FetchFormNotFound",{action:V,selector:c});if(!S.noValidate&&!S.checkValidity()){S.reportValidity();return}let _=new FormData(S),R=r;if(r===S&&s instanceof SubmitEvent)R=s.submitter;else{let I=j=>j.preventDefault();S.addEventListener("submit",I),de=()=>{S.removeEventListener("submit",I)}}if(R instanceof HTMLButtonElement||R instanceof HTMLInputElement&&R.type==="submit"){let I=R.getAttribute("name");I&&_.append(I,R.value)}let M=S.getAttribute("enctype")==="multipart/form-data";M||(ie["Content-Type"]="application/x-www-form-urlencoded");let w=new URLSearchParams(_);if(st(t))M?H.body=_:H.body=w;else for(let[I,j]of w)W.append(I,j)}else throw i("FetchInvalidContentType",{action:V,contentType:u});return T.search=W.toString(),H.input=T.toString(),H};re(it,r,{});try{await Mn(r,je)}catch(T){if(!_t(T))throw i("FetchFailed",{method:t,url:a,error:T.message})}}finally{re(ot,r,{}),de(),o.delete(`@${e}`)}}});Ae("get","GET",!1);Ae("patch","PATCH");Ae("post","POST");Ae("put","PUT");Ae("delete","DELETE");var it="started",ot="finished",vn="error",En="retrying",Tn="retries-failed",re=(e,t,n)=>document.dispatchEvent(new CustomEvent(U,{detail:{type:e,el:t,argsRaw:n}})),_t=e=>`${e}`.includes("text/event-stream"),Sn=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},An=e=>{let t,n,r,s=!1;return i=>{t?t=wn(t,i):(t=i,n=0,r=-1);let o=t.length,a=0;for(;n{let r=It(),s=new TextDecoder;return(i,o)=>{if(!i.length)n?.(r),r=It();else if(o>0){let a=s.decode(i.subarray(0,o)),c=o+(i[o+1]===32?2:1),l=s.decode(i.subarray(c));switch(a){case"data":r.data=r.data?`${r.data} +${l}`:l;break;case"event":r.event=l;break;case"id":e(r.id=l);break;case"retry":{let u=+l;Number.isNaN(u)||t(r.retry=u);break}}}}},wn=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},It=()=>({data:"",event:"",id:"",retry:void 0}),Mn=(e,t)=>new Promise((n,r)=>{let s=t();if(!s)return;let{input:i,signal:o,headers:a,onopen:c,onmessage:l,onclose:u,openWhenHidden:f,fetch:m,retry:y="auto",retryInterval:v=1e3,retryScaler:d=2,retryMaxWait:g=3e4,retryMaxCount:b=10,responseOverrides:h,...G}=s,F={...a},k,de=()=>{let M=t();M&&(i=M.input,G.body=M.body,R())},pe=()=>{k.abort(),document.hidden||de()};f||document.addEventListener("visibilitychange",pe);let ie,H=()=>{document.removeEventListener("visibilitychange",pe),clearTimeout(ie),k.abort()};o?.addEventListener("abort",()=>{H(),n()});let je=m||window.fetch,T=c||(()=>{}),W=0,S=v,_=()=>{W{k=new AbortController;let M=k.signal;try{let w=await je(i,{...G,headers:F,signal:M});await T(w);let I=async(B,me,We,Me,...rn)=>{let pt={[We]:await me.text()};for(let Ue of rn){let Je=me.headers.get(`datastar-${ae(Ue)}`);if(Me){let Le=Me[Ue];Le&&(Je=typeof Le=="string"?Le:JSON.stringify(Le))}Je&&(pt[Ue]=Je)}re(B,e,pt),H(),n()},j=w.status,tn=j===204,dt=j>=300&&j<400,nn=j>=400&&j<600;if(j!==200){if(u?.(),y!=="never"&&!tn&&!dt&&(y==="always"||y==="error"&&nn)){_();return}H(),n();return}W=0,v=S;let Be=w.headers.get("Content-Type");if(Be?.includes("text/html"))return await I("datastar-patch-elements",w,"elements",h,"selector","mode","namespace","useViewTransition");if(Be?.includes("application/json"))return await I("datastar-patch-signals",w,"signals",h,"onlyIfMissing");if(Be?.includes("text/javascript")){let B=document.createElement("script"),me=w.headers.get("datastar-script-attributes");if(me)for(let[We,Me]of Object.entries(JSON.parse(me)))B.setAttribute(We,Me);B.textContent=await w.text(),document.head.appendChild(B),H();return}if(await Sn(w.body,An(Rn(B=>{B?F["last-event-id"]=B:delete F["last-event-id"]},B=>{S=v=B},l))),u?.(),y==="always"&&!dt){_();return}H(),n()}catch{if(!M.aborted)try{_()}catch(w){H(),r(w)}}};R()});p({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,c)=>{c===""||c===!0?e.setAttribute(a,""):c===!1||c==null?e.removeAttribute(a):typeof c=="string"?e.setAttribute(a,c):typeof c=="function"?e.setAttribute(a,c.toString()):e.setAttribute(a,JSON.stringify(c,(l,u)=>typeof u=="function"?u.toString():u))},s=t?()=>{i.disconnect();let a=n();r(t,a),i.observe(e,{attributeFilter:[t]})}:()=>{i.disconnect();let a=n(),c=Object.keys(a);for(let l of c)r(l,a[l]);i.observe(e,{attributeFilter:c})},i=new MutationObserver(s),o=A(s);return()=>{i.disconnect(),o()}}});var $e=(e,...t)=>({get:n=>n[e],set:(n,r)=>{n[e]=r},events:t}),Dt=(e,...t)=>({get:n=>n.getAttribute(e),set:(n,r)=>{n.setAttribute(e,`${r}`)},events:t}),at=(e=!1,...t)=>({get:(n,r)=>r==="string"||e&&r==="undefined"?n.value:+n.value,set:(n,r)=>{n.value=`${r}`},events:t}),Ln=/^data:(?[^;]+);base64,(?.*)$/,Vt=Symbol("empty"),xn=(e,t,n,r,s,i)=>{let o=K(CSS.escape(n)),a=t?`[${o}]`:`[${o}="${CSS.escape(r)}"]`;if(i===void 0&&e instanceof HTMLInputElement&&e.type==="radio"){let f=[...document.querySelectorAll(a)].find(m=>m instanceof HTMLInputElement&&m.checked);f&&E([[r,f.value]],{ifMissing:!0})}if(!Array.isArray(i)||e instanceof HTMLSelectElement&&e.multiple)return E([[r,s.get(e,typeof i)]],{ifMissing:!0}),r;let c=document.querySelectorAll(a),l=[],u=0;for(let f of c){if(l.push([`${r}.${u}`,s.get(f,typeof(L(i,u)?i[u]:void 0))]),e===f)break;u++}return E(l,{ifMissing:!0}),`${r}.${u}`};p({name:"bind",requirement:"exclusive",apply({el:e,key:t,rawKey:n,mods:r,value:s,error:i}){let o=t!=null?C(t,r):s,a=r.get("prop"),c=r.get("event"),l=null;if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":l=at(!1,"input");break;case"checkbox":l={get:(d,g)=>d.value!=="on"?g==="boolean"?d.checked:d.checked?d.value:"":g==="string"?d.checked?d.value:"":d.checked,set:(d,g)=>{d.checked=typeof g=="string"?g===d.value:g},events:["input"]};break;case"radio":e.getAttribute("name")?.length||e.setAttribute("name",o),l={get:(d,g)=>d.checked?g==="number"?+d.value:d.value:Vt,set:(d,g)=>{d.checked=g===(typeof g=="number"?+d.value:d.value)},events:["input"]};break;case"file":{let d=()=>{let g=[...e.files||[]],b=[];Promise.all(g.map(h=>new Promise(G=>{let F=new FileReader;F.onload=()=>{if(typeof F.result!="string")throw i("InvalidFileResultType",{resultType:typeof F.result});let k=F.result.match(Ln);if(!k?.groups)throw i("InvalidDataUri",{result:F.result});b.push({name:h.name,contents:k.groups.contents,mime:k.groups.mime})},F.onloadend=()=>G(),F.readAsDataURL(h)}))).then(()=>{E([[o,b]])})};return e.addEventListener("change",d),()=>{e.removeEventListener("change",d)}}default:l=at(!0,"input")}else if(e instanceof HTMLSelectElement&&e.multiple){let d=new Map;l={get:g=>[...g.selectedOptions].map(b=>{let h=d.get(b.value);return h==="string"||h==null?b.value:+b.value}),set:(g,b)=>{for(let h of g.options)b.includes(h.value)?(d.set(h.value,"string"),h.selected=!0):b.includes(+h.value)?(d.set(h.value,"number"),h.selected=!0):h.selected=!1},events:["change"]}}else e instanceof HTMLSelectElement?l=at(!0,"change"):e instanceof HTMLTextAreaElement?l=$e("value","input"):e instanceof HTMLElement&&e.tagName.includes("-")?l="value"in e?$e("value","input","change"):Dt("value","input","change"):e instanceof HTMLElement&&"value"in e?l=$e("value","change"):l=Dt("value","change");if(!l)throw i("InvalidBindAdapter");let u=a&&[...a][0];if(a&&!u)throw i("BindPropNameMissing");if(u){let d=Lt(u);l=$e(d,...c?[...c]:l.events)}else c&&(l.events=[...c]);let f=oe(o),m=xn(e,t,n,o,l,f),y=()=>{let d=oe(m);if(d!=null){let g=l.get(e,typeof d);g!==Vt&&E([[m,g]])}};for(let d of l.events)e.addEventListener(d,y);e.addEventListener(ge,y);let v=A(()=>{l.set(e,oe(m))});return()=>{v();for(let d of l.events)e.removeEventListener(d,y);e.removeEventListener(ge,y)}}});p({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=C(e,n,"kebab");let s,i=()=>{o.disconnect(),s=e?{[e]:r()}:r();for(let c in s){let l=c.split(/\s+/).filter(u=>u.length>0);if(s[c])for(let u of l)t.classList.contains(u)||t.classList.add(u);else for(let u of l)t.classList.contains(u)&&t.classList.remove(u)}o.observe(t,{attributeFilter:["class"]})},o=new MutationObserver(i),a=A(i);return()=>{o.disconnect(),a();for(let c in s){let l=c.split(/\s+/).filter(u=>u.length>0);for(let u of l)t.classList.remove(u)}}}});p({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)E([[C(e,t),_e(n)]]);else{let s=Object.assign({},n());te(s,i=>{if(typeof i=="function")return _e(i);throw r("ComputedExpectedFunction")}),D(s)}}});p({name:"effect",requirement:{key:"denied",value:"must"},apply:({rx:e})=>A(e)});p({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?C(t,n):r,i=0;E([[s,!1]]);let o=a=>{let{type:c,el:l}=a.detail;if(l===e)switch(c){case it:i++,E([[s,!0]]);break;case ot:i=Math.max(0,i-1),E([[s,i>0]]);break}};return document.addEventListener(U,o),()=>{i=0,E([[s,!1]]),document.removeEventListener(U,o)}}});var Y=e=>{if(!e||e.size<=0)return 0;for(let t of e){if(t.endsWith("ms"))return+t.replace("ms","");if(t.endsWith("s"))return+t.replace("s","")*1e3;try{return Number.parseFloat(t)}catch{}}return 0},se=(e,t,n=!1)=>e?e.has(t.toLowerCase()):n,$t=(e,t="")=>{if(e&&e.size>0)for(let n of e)return n;return t};var ct=(e,t)=>(...n)=>{setTimeout(()=>{e(...n)},t)},qt=(e,t,n=!0,r=!1,s=!1)=>{let i=null,o=0;return(...a)=>{n&&!o?(e(...a),i=null):i=a,(!o||s)&&(o&&clearTimeout(o),o=setTimeout(()=>{r&&i!==null&&e(...i),i=null,o=0},t))}},le=(e,t)=>{let n=t.get("delay");if(n){let i=Y(n);e=ct(e,i)}let r=t.get("debounce");if(r){let i=Y(r),o=se(r,"leading",!1),a=!se(r,"notrailing",!1);e=qt(e,i,o,a,!0)}let s=t.get("throttle");if(s){let i=Y(s),o=!se(s,"noleading",!1),a=se(s,"trailing",!1);e=qt(e,i,o,a)}return e};var qe=(e=document.documentElement)=>"startViewTransition"in e,X=(e,t)=>{if(t.has("viewtransition")&&qe()){let n=e;e=(...r)=>document.startViewTransition(()=>n(...r))}return e};p({name:"init",requirement:{key:"denied",value:"must"},apply({rx:e,mods:t}){let n=()=>{x();try{e()}finally{N()}};n=X(n,t);let r=0,s=t.get("delay");s&&(r=Y(s),r>0&&(n=ct(n,r))),n()}});p({name:"json-signals",requirement:{key:"denied"},apply({el:e,value:t,mods:n}){let r=n.has("terse")?0:2,s={};t&&(s=ce(t));let i=()=>{o.disconnect(),e.textContent=JSON.stringify(q(s),null,r),o.observe(e,{childList:!0,characterData:!0,subtree:!0})},o=new MutationObserver(i),a=A(i);return()=>{o.disconnect(),a()}}});p({name:"on",requirement:"must",argNames:["evt"],apply({el:e,key:t,mods:n,rx:r}){let s=e;n.has("window")?s=window:n.has("document")&&(s=document);let i=l=>{x();try{r(l)}finally{N()}};i=X(i,n),i=le(i,n);let o=C(t,n,"kebab"),a={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=document;let l=i;i=u=>{e.contains(u?.target)||l(u)}}(o===U||o===ee)&&(s=document);let c=l=>{l&&(n.has("prevent")&&l.preventDefault(),n.has("stop")&&l.stopPropagation(),e instanceof HTMLFormElement&&o==="submit"&&l.preventDefault()),i(l)};return s.addEventListener(o,c,a),()=>{s.removeEventListener(o,c,a)}}});var Gt=(e,t,n)=>Math.max(t,Math.min(n,e));var lt=new WeakSet;p({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{x();try{n()}finally{N()}};r=X(r,t),r=le(r,t);let s={threshold:0};if(t.has("full"))s.threshold=1;else if(t.has("half"))s.threshold=.5;else{let a=t.get("threshold");a&&(s.threshold=Gt(Number($t(a)),0,100)/100)}let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let c of a)c.isIntersecting!==i&&(r(),o&<.has(e)&&o.disconnect())},s);return o.observe(e),t.has("once")&<.add(e),()=>{t.has("once")||lt.delete(e),o&&(o.disconnect(),o=null)}}});p({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{x();try{t()}finally{N()}};n=X(n,e);let r=1e3,s=e.get("duration");s&&(r=Y(s),se(s,"leading",!1)&&n());let i=setInterval(n,r);return()=>{clearInterval(i)}}});p({name:"on-signal-patch",requirement:{value:"must"},argNames:["patch"],returnsValue:!0,apply({el:e,key:t,mods:n,rx:r,error:s}){if(t&&t!=="filter")throw s("KeyNotAllowed");let i=K(`${this.name}-filter`),o=e.getAttribute(i),a={};o&&(a=ce(o));let c=!1,l=le(u=>{if(c)return;P();let f=q(a,u.detail);if(O(),!gt(f)){c=!0,x();try{r(f)}finally{N(),c=!1}}},n);return document.addEventListener(ee,l),()=>{document.removeEventListener(ee,l)}}});p({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?C(t,n):r;E([[s,e]])}});var jt="none",Bt="display";p({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===jt&&e.style.removeProperty(Bt):e.style.setProperty(Bt,jt),r.observe(e,{attributeFilter:["style"]})},r=new MutationObserver(n),s=A(n);return()=>{r.disconnect(),s()}}});p({name:"signals",returnsValue:!0,apply({key:e,mods:t,rx:n}){let r=t.has("ifmissing");if(e){e=C(e,t);let s=n?.();E([[e,s]],{ifMissing:r})}else{let s=Object.assign({},n?.());D(s,{ifMissing:r})}}});p({name:"style",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,rx:n}){let{style:r}=t,s=new Map,i=(l,u)=>{let f=s.get(l);!u&&u!==0?f!==void 0&&(f?r.setProperty(l,f):r.removeProperty(l)):(f===void 0&&s.set(l,r.getPropertyValue(l)),r.setProperty(l,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let l=n();for(let[u,f]of s)u in l||(f?r.setProperty(u,f):r.removeProperty(u));for(let u in l)i(ae(u),l[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),c=A(o);return()=>{a.disconnect(),c();for(let[l,u]of s)u?r.setProperty(l,u):r.removeProperty(l)}}});p({name:"text",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),e.textContent=`${t()}`,r.observe(e,{childList:!0,characterData:!0,subtree:!0})},r=new MutationObserver(n),s=A(n);return()=>{r.disconnect(),s()}}});var Wt=(e,t)=>e.includes(t),Nn=["remove","outer","inner","replace","prepend","append","before","after"],Pn=["html","svg","mathml"];Se({name:"datastar-patch-elements",apply(e,t){let n=typeof t.selector=="string"?t.selector:"",r=typeof t.mode=="string"?t.mode:"outer",s=typeof t.namespace=="string"?t.namespace:"html",i=typeof t.useViewTransition=="string"&&t.useViewTransition.trim()==="true",o=typeof t.viewTransitionSelector=="string"?t.viewTransitionSelector:"",a=t.elements;if(!Wt(Nn,r))throw e.error("PatchElementsInvalidMode",{mode:r});if(!n&&r!=="outer"&&r!=="replace")throw e.error("PatchElementsExpectedSelector");if(!Wt(Pn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let c={selector:n,mode:r,namespace:s,elements:a};if(i&&qe()){let l=document.documentElement;if(o){let u=document.querySelector(o);u&&qe(u)&&(l=u)}l.startViewTransition(()=>Ut(e,c))}else Ut(e,c)}});var Ut=({error:e},{selector:t,mode:n,namespace:r,elements:s})=>{let i=document.createDocumentFragment(),o=typeof s!="string"&&!!s;if(typeof s=="string"){let a=s.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,""),c=/<\/html>/.test(a),l=/<\/head>/.test(a),u=/<\/body>/.test(a),f=r==="svg"?"svg":r==="mathml"?"math":"",m=f?`<${f}>${s}`:s,y=new DOMParser().parseFromString(c||l||u?s:``,"text/html");if(c)i.appendChild(y.documentElement);else if(l&&u)i.appendChild(y.head),i.appendChild(y.body);else if(l)i.appendChild(y.head);else if(u)i.appendChild(y.body);else if(f){let v=y.querySelector("template").content.querySelector(f);for(let d of v.childNodes)i.appendChild(d)}else i=y.querySelector("template").content}else s&&(s instanceof DocumentFragment?i=s:s instanceof Element&&i.appendChild(s));if(!t&&(n==="outer"||n==="replace")){let a=Array.from(i.children);for(let c of a){let l;if(c instanceof HTMLHtmlElement)l=document.documentElement;else if(c instanceof HTMLBodyElement)l=document.body;else if(c instanceof HTMLHeadElement)l=document.head;else if(l=document.getElementById(c.id),!l){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:c.id}});continue}Kt(n,c,[l],!0)}}else{let a=document.querySelectorAll(t);if(!a.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}let c=o&&n!=="remove"?[a[0]]:a;c.length===1&&(o=!0),Kt(n,i,c,o)}},ft=new WeakSet;for(let e of document.querySelectorAll("script"))ft.add(e);var Yt=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!ft.has(n)){let r=document.createElement("script");for(let{name:s,value:i}of n.attributes)r.setAttribute(s,i);r.text=n.text,n.replaceWith(r),ft.add(r)}},Jt=(e,t,n,r)=>{let s=!1;for(let i of e){if(r&&s)break;let o=r?t:t.cloneNode(!0);Yt(o),i[n](o),s=!0}},Kt=(e,t,n,r)=>{switch(e){case"remove":for(let s of n)s.remove();break;case"outer":case"inner":{let s=!1;for(let i of n){if(r&&s)break;let o=r?t:t.cloneNode(!0);Cn(i,o,e),Yt(i);let a=i.closest("[data-scope-children]");a&&a.dispatchEvent(new CustomEvent(Ke,{bubbles:!1})),s=!0}}break;case"replace":Jt(n,t,"replaceWith",r);break;case"prepend":case"append":case"before":case"after":Jt(n,t,e,r)}},$=new Map,fe=new Set,ue=new Map,Re=new Set,Ge=document.createElement("div");Ge.hidden=!0;var we=K("ignore-morph"),On=`[${we}]`,Cn=(e,t,n="outer")=>{if(Z(e)&&Z(t)&&e.hasAttribute(we)&&t.hasAttribute(we)||e.parentElement?.closest(On))return;let r=document.createElement("div");r.append(t),document.body.insertAdjacentElement("afterend",Ge);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:c}of s)ue.has(a)?Re.add(a):ue.set(a,c);e instanceof Element&&e.id&&(ue.has(e.id)?Re.add(e.id):ue.set(e.id,e.tagName)),fe.clear();let i=r.querySelectorAll("[id]");for(let{id:a,tagName:c}of i)fe.has(a)?Re.add(a):ue.get(a)===c&&fe.add(a);for(let a of Re)fe.delete(a);ue.clear(),Re.clear(),$.clear();let o=n==="outer"?e.parentElement:e;Zt(o,s),Zt(r,i),Xt(o,r,n==="outer"?e:null,e.nextSibling),Ge.remove()},Xt=(e,t,n=null,r=null)=>{e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement&&(e=e.content,t=t.content),n??=e.firstChild;for(let s of t.childNodes){if(n&&n!==r){let i=Fn(s,n,r);if(i){if(i!==n){let o=n;for(;o&&o!==i;){let a=o;o=o.nextSibling,Qt(a)}}ut(i,s),n=i.nextSibling;continue}}if(s instanceof Element&&fe.has(s.id)){let i=document.getElementById(s.id),o=i;for(;o=o.parentNode;){let a=$.get(o);a&&(a.delete(s.id),a.size||$.delete(o))}en(e,i,n),ut(i,s),n=i.nextSibling;continue}if($.has(s)){let i=s.namespaceURI,o=s.tagName,a=i&&i!=="http://www.w3.org/1999/xhtml"?document.createElementNS(i,o):document.createElement(o);e.insertBefore(a,n),ut(a,s),n=a.nextSibling}else{let i=document.importNode(s,!0);e.insertBefore(i,n),n=i.nextSibling}}for(;n&&n!==r;){let s=n;n=n.nextSibling,Qt(s)}},Fn=(e,t,n)=>{let r=null,s=e.nextSibling,i=0,o=0,a=$.get(e)?.size||0,c=t;for(;c&&c!==n;){if(zt(c,e)){let l=!1,u=$.get(c),f=$.get(e);if(f&&u){for(let m of u)if(f.has(m)){l=!0;break}}if(l)return c;if(!r&&!$.has(c)){if(!a)return c;r=c}}if(o+=$.get(c)?.size||0,o>a)break;r===null&&s&&zt(c,s)&&(i++,s=s.nextSibling,i>=2&&(r=void 0)),c=c.nextSibling}return r||null},zt=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),Qt=e=>{$.has(e)?en(Ge,e,null):e.parentNode?.removeChild(e)},en=(e,t,n)=>{if("moveBefore"in e){e.moveBefore(t,n);return}e.insertBefore(t,n)},Hn=K("preserve-attr"),ut=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,i=r.hasAttribute("data-scope-children");if(r.hasAttribute(we)&&s.hasAttribute(we))return e;let o=(t.getAttribute(Hn)??"").split(" "),a=(l,u,f)=>{let m=u.hasAttribute(f);return l.hasAttribute(f)!==m&&!o.includes(f)?(l[f]=m,!0):!1},c=!1;if(r instanceof HTMLInputElement&&s instanceof HTMLInputElement&&s.type!=="file"){let l=s.getAttribute("value");r.getAttribute("value")!==l&&!o.includes("value")&&(r.value=l??"",c=!0),c=a(r,s,"checked")||c,a(r,s,"disabled")}else if(r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement){let l=s.value;r.defaultValue!==l&&(r.value=l,c=!0)}else r instanceof HTMLOptionElement&&s instanceof HTMLOptionElement&&(c=a(r,s,"selected")||c);for(let{name:l,value:u}of s.attributes)r.getAttribute(l)!==u&&!o.includes(l)&&r.setAttribute(l,u);for(let{name:l}of Array.from(r.attributes))!s.hasAttribute(l)&&!o.includes(l)&&r.removeAttribute(l);c&&(r instanceof HTMLOptionElement?r.closest("select"):r)?.dispatchEvent(new Event(ge,{bubbles:!0})),i&&!r.hasAttribute("data-scope-children")&&r.setAttribute("data-scope-children",""),r instanceof HTMLTemplateElement&&s instanceof HTMLTemplateElement?r.innerHTML=s.innerHTML:r.isEqualNode(s)||Xt(r,s),i&&r.dispatchEvent(new CustomEvent(Ke,{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},Zt=(e,t)=>{for(let n of t)if(fe.has(n.id)){let r=n;for(;r&&r!==e;){let s=$.get(r);s||(s=new Set,$.set(r,s)),s.add(n.id),r=r.parentElement}}};Se({name:"datastar-patch-signals",apply({error:e},{signals:t,onlyIfMissing:n}){if(typeof t!="string")throw e("PatchSignalsExpectedSignals");let r=typeof n=="string"&&n.trim()==="true";D(ce(t),{ifMissing:r})}});export{V as action,Ft as actions,p as attribute,x as beginBatch,_e as computed,A as effect,N as endBatch,q as filtered,oe as getPath,D as mergePatch,E as mergePaths,ne as root,ye as signal,P as startPeeking,O as stopPeeking,Se as watcher}; +//# sourceMappingURL=datastar.js.map diff --git a/site/tests/capy-jobs.capy b/site/tests/capy-jobs.capy index 9749ab7d..f8f96d29 100644 --- a/site/tests/capy-jobs.capy +++ b/site/tests/capy-jobs.capy @@ -12,20 +12,37 @@ function CLI { var cancelling := shell_spawn(dval({"cmd": "sleep 5", "timeout_ms": 10000})) var cancelled := job_cancel(cancelling) var cancelled_status := job_await(cancelling, 5000) - var inactive_pid := task_pid("capy-jobs-no-such-task") + file_unlink("/tmp/bearer-task-cpp.txt") + file_unlink("/tmp/bearer-task-cpp-named.txt") + file_unlink("/tmp/bearer-task-capy.txt") + file_unlink("/tmp/bearer-task-capy-named.txt") + var task_props := dval({"nested": {"value": "capy-caller"}}) + var cpp_task := task("/tests/task-handlers.uce", task_props) + var cpp_named_task := task("/tests/task-handlers.uce:CPP", task_props) + var capy_task := task("/tests/task-handlers.capy", task_props) + var capy_named_task := task("/tests/task-handlers.capy:CAPY", task_props) + var cpp_status := task_status(cpp_task) + var cpp_done := task_await(cpp_task, 10000u64) + var cpp_named_done := task_await(cpp_named_task, 10000u64) + var capy_done := task_await(capy_task, 10000u64) + var capy_named_done := task_await(capy_named_task, 10000u64) + var cancel_task := task("/tests/task-handlers.capy", task_props) + var task_cancelled := task_cancel(cancel_task) + var cancel_done := task_await(cancel_task, 10000u64) var server := server_start_http("capy-jobs-server", "29994", "servers/http.uce", "named") var stopped := server_stop("capy-jobs-server") var shell_status := "bad-shell" if shell == "a'b; echo injected" { shell_status = "shell" } var cancel_status := "no-cancel" if cancelled { cancel_status = "cancel" } - var task_status := "bad-task-pid" - if inactive_pid == 0 { task_status = "no-task" } + var task_status_value := "bad-task" + if dval_to_string(cpp_status["id"]) == cpp_task && dval_to_string(cpp_done["state"]) == "succeeded" && dval_to_string(cpp_named_done["state"]) == "succeeded" && dval_to_string(capy_done["state"]) == "succeeded" && dval_to_string(capy_named_done["state"]) == "succeeded" && file_get_contents("/tmp/bearer-task-cpp.txt") == "capy-caller" && file_get_contents("/tmp/bearer-task-cpp-named.txt") == "capy-caller" && file_get_contents("/tmp/bearer-task-capy.txt") == "capy-caller" && file_get_contents("/tmp/bearer-task-capy-named.txt") == "capy-caller" { task_status_value = "tasks" } + if dval_to_string(task_cancelled["id"]) != cancel_task || (dval_to_string(cancel_done["state"]) != "canceled" && dval_to_string(cancel_done["state"]) != "succeeded") { task_status_value = "bad-cancel" } var cwd_status := "no-cwd" if process_start_directory() != "" { cwd_status = "cwd" } var server_status := "no-server" if server > 0 && stopped { server_status = "server" } - print(shell_status, "|", dval_to_string(dval_get_by_path(done, "result/stdout"), "missing"), "|", dval_to_string(dval_get_by_path(status, "state"), "missing"), "|", dval_to_string(dval_get_by_path(stored, "state"), "missing"), "|", dval_to_string(dval_get_by_path(failed, "state"), "missing"), "|", cancel_status, "|", dval_to_string(dval_get_by_path(cancelled_status, "state"), "missing"), "|", task_status, "|", cwd_status, "|", server_status, "|", task_kill(-1, 0), "|") + print(shell_status, "|", dval_to_string(dval_get_by_path(done, "result/stdout"), "missing"), "|", dval_to_string(dval_get_by_path(status, "state"), "missing"), "|", dval_to_string(dval_get_by_path(stored, "state"), "missing"), "|", dval_to_string(dval_get_by_path(failed, "state"), "missing"), "|", cancel_status, "|", dval_to_string(dval_get_by_path(cancelled_status, "state"), "missing"), "|", task_status_value, "|", cwd_status, "|", server_status, "|") } print(arc_live()) } diff --git a/site/tests/capy-task-concurrency.capy b/site/tests/capy-task-concurrency.capy new file mode 100644 index 00000000..433b0ab5 --- /dev/null +++ b/site/tests/capy-task-concurrency.capy @@ -0,0 +1,10 @@ +function CLI { + var started := time_precise() + var first := task("/tests/task-handlers.capy:SLOW", dval("")) + var second := task("/tests/task-handlers.capy:SLOW", dval("")) + var first_done := task_await(first, 15000u64) + var second_done := task_await(second, 15000u64) + var mode := "serial" + if time_precise() - started < 8.0 { mode = "parallel" } + print(dval_to_string(first_done["state"]), "|", dval_to_string(second_done["state"]), "|", mode) +} diff --git a/site/tests/capy-task-overflow.capy b/site/tests/capy-task-overflow.capy new file mode 100644 index 00000000..5ad1689f --- /dev/null +++ b/site/tests/capy-task-overflow.capy @@ -0,0 +1,5 @@ +function CLI { + task("/tests/task-handlers.capy:SLOW", dval("")) + task("/tests/task-handlers.capy:SLOW", dval("")) + print("must-not-run") +} diff --git a/site/tests/capy-task-runtime.capy b/site/tests/capy-task-runtime.capy new file mode 100644 index 00000000..227dea02 --- /dev/null +++ b/site/tests/capy-task-runtime.capy @@ -0,0 +1,35 @@ +function CLI { + file_unlink("/tmp/bearer-task-slow-finished.txt") + file_unlink("/tmp/bearer-task-capy.txt") + + var slow := task("/tests/task-handlers.capy:SLOW", dval("")) + var slow_status := task_status(slow) + var polls := 0 + while dval_to_string(slow_status["state"]) == "queued" && polls < 300 { + usleep(10000) + slow_status = task_status(slow) + polls = polls + 1 + } + task_cancel(slow) + var canceled := task_await(slow, 10000u64) + usleep(2000000) + + var trapped := task("/tests/task-handlers.capy:TRAP", dval("")) + var trap_status := task_await(trapped, 10000u64) + + var missing := task("/tests/task-handlers.capy:MISSING", dval("")) + var missing_status := task_await(missing, 10000u64) + + var recovered := task("/tests/task-handlers.capy", dval({"nested": {"value": "recovered"}})) + var recovered_status := task_await(recovered, 10000u64) + + var slow_result := "stopped" + if file_exists("/tmp/bearer-task-slow-finished.txt") { slow_result = "finished" } + print( + dval_to_string(canceled["state"]), "|", + slow_result, "|", + dval_to_string(trap_status["state"]), ":", dval_to_string(trap_status["failure_code"]), "|", + dval_to_string(missing_status["state"]), ":", dval_to_string(missing_status["failure_code"]), "|", + dval_to_string(recovered_status["state"]), ":", file_get_contents("/tmp/bearer-task-capy.txt") + ) +} diff --git a/site/tests/capy-task-timeout.capy b/site/tests/capy-task-timeout.capy new file mode 100644 index 00000000..bcc3aafe --- /dev/null +++ b/site/tests/capy-task-timeout.capy @@ -0,0 +1,5 @@ +function CLI { + var id := task("/tests/task-handlers.capy:SLOW", dval("")) + var status := task_await(id, 5000u64) + print(dval_to_string(status["state"]), ":", dval_to_string(status["failure_code"])) +} diff --git a/site/tests/cli.uce b/site/tests/cli.uce index f4e3d772..1f94b2fb 100644 --- a/site/tests/cli.uce +++ b/site/tests/cli.uce @@ -20,18 +20,6 @@ CLI(Request& context) print(cli_arg(context, "missing", "fallback"), "\n"); return; } - if(action == "task_repeat_unbounded") - { - String marker = "/tmp/uce-task-repeat-unbounded.txt"; - file_unlink(marker); - pid_t pid = task_repeat("uce-task-repeat-unbounded", 0.05, [marker]() { file_put_contents(marker, "ran"); }, 0); - usleep(200000); - bool ran = file_get_contents(marker) == "ran"; - if(pid > 0) task_kill(pid, 15); - file_unlink(marker); - print(pid > 0 && ran ? "task repeat unbounded ok\n" : "task repeat unbounded failed\n"); - return; - } if(action == "mysql_unsigned_params") { MySQL db; diff --git a/site/tests/cli_runner.uce b/site/tests/cli_runner.uce index 14cbb23d..10d1780c 100644 --- a/site/tests/cli_runner.uce +++ b/site/tests/cli_runner.uce @@ -155,12 +155,20 @@ DValue cli_demo_error_markers() void cli_run_demo_smoke() { - DValue files = split("call_file.uce\ncall_file_funcs.uce\ncollections.uce\ncomponents.uce\ncookie.uce\ndvalue.uce\nempty.uce\nerror-reporting.uce\nfile_append.uce\nfileio.uce\nheader.uce\nhello.uce\nindex.uce\njson.uce\nmarkdown.uce\nmemcached.uce\nmysql.uce\nonce-init.uce\nparse_time.uce\npost-multipart.uce\npost.uce\npreprocessor-comments.uce\nrandom.uce\nregex.uce\nscript.uce\nsession.uce\nsharedunit.uce\nshell.uce\nsqlite.uce\nstr_replace.uce\nstring.uce\ntask-status.uce\ntask.uce\ntask_repeat.uce\nunit-browser.uce\nunit-info.uce\nuri.uce\nutf8.uce\nwebsockets.ws.uce\nworking-dir.uce\nxml.uce\nyaml.uce\nzip.uce", "\n"); + DValue files = split("call_file.uce\ncall_file_funcs.uce\ncollections.uce\ncomponents.uce\ncookie.uce\ndvalue.uce\nempty.uce\nerror-reporting.uce\nfile_append.uce\nfileio.uce\nheader.uce\nhello.uce\nindex.uce\njson.uce\nmarkdown.uce\nmemcached.uce\nmysql.uce\nonce-init.uce\nparse_time.uce\npost-multipart.uce\npost.uce\npreprocessor-comments.uce\nrandom.uce\nregex.uce\nscript.uce\nsession.uce\nsharedunit.uce\nshell.uce\nsqlite.uce\nstr_replace.uce\nstring.uce\ntask.uce\nunit-browser.uce\nunit-info.uce\nuri.uce\nutf8.uce\nwebsockets.ws.uce\nworking-dir.uce\nxml.uce\nyaml.uce\nzip.uce", "\n"); for(String file : files) cli_expect_http("bearer_demo_smoke:demo page " + file, "/demo/" + file, 200, "", file == "unit-browser.uce" ? DValue() : cli_demo_error_markers()); } bool cli_doc_source_has_example(String source) +{ + for(String line : split(source, "\n")) + if(str_starts_with(trim(line), ":example")) + return(true); + return(false); +} + +bool cli_doc_source_has_legacy_example(String source) { for(String line : split(source, "\n")) if(trim(line) == ":example") @@ -201,6 +209,7 @@ void cli_run_doc_pages_gate(u64 shard = 0, u64 shard_count = 1) { DValue error_markers; error_markers.push_back("doc example error"); + error_markers.push_back("example format error"); error_markers.push_back(String("bearer compile ") + "error"); error_markers.push_back(String("wasm runtime error during ") + "request"); error_markers.push_back(String("fatal signal during ") + "request"); @@ -217,6 +226,7 @@ void cli_run_doc_pages_gate(u64 shard = 0, u64 shard_count = 1) if(page_index++ % shard_count != shard) continue; bool has_example = cli_doc_source_has_example(source); + bool has_legacy_examples = cli_doc_source_has_legacy_example(source); String path = "/doc/index.uce?p=" + uri_encode(page); CliHttpResponse res; String summary; @@ -247,6 +257,8 @@ void cli_run_doc_pages_gate(u64 shard = 0, u64 shard_count = 1) ok = false; summary += "; placeholder example (must exercise the API)"; } + if(has_legacy_examples) + summary += "; legacy C++ example retained during migration"; } if(ok) break; diff --git a/site/tests/task-handlers.capy b/site/tests/task-handlers.capy new file mode 100644 index 00000000..02f1fe12 --- /dev/null +++ b/site/tests/task-handlers.capy @@ -0,0 +1,16 @@ +function TASK(request : request) { + file_put_contents("/tmp/bearer-task-capy.txt", dval_to_string(dval_get_by_path(request_context(request), "props/nested/value"), "")) +} + +function TASK_CAPY(request : request) { + file_put_contents("/tmp/bearer-task-capy-named.txt", dval_to_string(dval_get_by_path(request_context(request), "props/nested/value"), "")) +} + +function TASK_SLOW(request : request) { + usleep(5000000) + file_put_contents("/tmp/bearer-task-slow-finished.txt", "finished") +} + +function TASK_TRAP(request : request) { + trap() +} diff --git a/site/tests/task-handlers.uce b/site/tests/task-handlers.uce new file mode 100644 index 00000000..3f0f7b50 --- /dev/null +++ b/site/tests/task-handlers.uce @@ -0,0 +1,7 @@ +TASK(Request& context) { + file_put_contents("/tmp/bearer-task-cpp.txt", context.props["nested"]["value"].to_string()); +} + +TASK:CPP(Request& context) { + file_put_contents("/tmp/bearer-task-cpp-named.txt", context.props["nested"]["value"].to_string()); +} diff --git a/site/tests/tasks.uce b/site/tests/tasks.uce index 723e4329..62174f02 100644 --- a/site/tests/tasks.uce +++ b/site/tests/tasks.uce @@ -1,102 +1,43 @@ #include "testlib.h" +TASK(Request& context) +{ + DValue nested = context.props["nested"]; + file_put_contents("/tmp/bearer-site-task-worker.txt", nested["value"].to_string()); +} + RENDER(Request& context) { if(!test_demo_request_allowed(context)) { - site_tests_restricted(context, "Tasks", "spawn and inspect background worker processes"); + site_tests_restricted(context, "Tasks", "enqueue and inspect named task workers"); return; } - - u64 passed = 0; - u64 failed = 0; - u64 skipped = 0; - - auto check = [&](String name, bool ok, String detail) - { - site_tests_case(name, ok ? "pass" : "fail", detail); - if(ok) - passed++; - else - failed++; - }; - - String mode = first(context.get["mode"], "run"); - if(mode == "late") - { - String late_file = "/tmp/bearer-site-tests-late-task.txt"; - file_unlink(late_file); - pid_t late_pid = task("site-tests-late-callback", [late_file]() { - sleep(2); - DValue perf = request_perf(); - file_put_contents(late_file, "late callback ran pid=" + std::to_string((u64)perf["worker_pid"].to_s64()) + " type=" + perf["worker_pid"].get_type_name()); - }, 10); - site_tests_page_start("Tasks", "Schedules a delayed task callback and returns before the callback runs."); - check("late task scheduled", late_pid != 0, "started=" + std::to_string(late_pid)); - site_tests_summary(passed, failed, skipped, "The CLI runner verifies this callback after the spawning request has returned."); - site_tests_page_end(); - return; - } - pid_t repeat_existing = task_pid("site-tests-repeat"); - if(mode == "stop" && repeat_existing != 0) - task_kill(repeat_existing, 15); - - pid_t short_pid = 0; - pid_t repeat_pid = 0; - if(mode != "stop") - { - short_pid = task("site-tests-short", []() { - sleep(5); - }); - - repeat_pid = task_repeat("site-tests-repeat", 1.0, []() { - file_put_contents("/tmp/bearer-site-tests-repeat.txt", time_format_utc("%Y-%m-%d %H:%M:%S")); - }, 4); - } - - pid_t timeout_pid = 0; - pid_t unsafe_key_pid = 0; - if(mode != "stop") - { - timeout_pid = task("site-tests-timeout", []() { - sleep(5); - }, 1); - unsafe_key_pid = task("site-tests/../unsafe key", []() { - sleep(5); - }); - sleep(2); - } - - pid_t seen_short_pid = task_pid("site-tests-short"); - pid_t seen_repeat_pid = task_pid("site-tests-repeat"); - pid_t seen_timeout_pid = task_pid("site-tests-timeout"); - pid_t seen_unsafe_key_pid = task_pid("site-tests/../unsafe key"); - int short_alive = seen_short_pid == 0 ? -1 : task_kill(seen_short_pid, 0); - int repeat_alive = seen_repeat_pid == 0 ? -1 : task_kill(seen_repeat_pid, 0); - - site_tests_page_start("Tasks", "Local-only checks for one-shot and repeating background task helpers."); - - if(mode == "stop") - { - site_tests_case("repeat worker stop request", "skip", "stop mode requested; no new tasks were started on this request"); - skipped++; - } - else - { - check("task()", short_pid != 0 && seen_short_pid != 0, "started=" + std::to_string(short_pid) + " seen=" + std::to_string(seen_short_pid)); - check("task_pid() + task_kill(pid, 0)", short_alive == 0, "kill(0) result=" + std::to_string(short_alive)); - check("task_repeat()", repeat_pid != 0 && seen_repeat_pid != 0, "started=" + std::to_string(repeat_pid) + " seen=" + std::to_string(seen_repeat_pid)); - check("repeat worker liveness", repeat_alive == 0, "kill(0) result=" + std::to_string(repeat_alive)); - check("task() timeout", timeout_pid != 0 && seen_timeout_pid == 0, "started=" + std::to_string(timeout_pid) + " seen_after_timeout=" + std::to_string(seen_timeout_pid)); - check("task key normalization", unsafe_key_pid != 0 && seen_unsafe_key_pid != 0, "started=" + std::to_string(unsafe_key_pid) + " seen=" + std::to_string(seen_unsafe_key_pid)); - check("task_kill() rejects negative pid", task_kill(-1, 0) == -1, "kill(-1, 0) rejected"); - } - - ?> #include +#include #include #include #include @@ -287,17 +288,32 @@ std::vector aggregate_elements(const std::string& type) return {}; } -bool is_handler(const std::string& name, std::string& exported) +bool task_suffix_is_valid(std::string_view suffix) +{ + if (suffix.empty() || !(std::isalpha(static_cast(suffix.front())) || suffix.front() == '_')) + return false; + return std::all_of(suffix.begin(), suffix.end(), [](unsigned char c) { return std::isalnum(c) || c == '_'; }); +} + +bool is_handler(const std::string& name, std::string& exported, bool& invalid_task_name) { static const std::map names = { {"RENDER", "__bearer_render"}, {"COMPONENT", "__bearer_component"}, {"CLI", "__bearer_cli"}, {"WS", "__bearer_websocket"}, {"ONCE", "__bearer_once"}, - {"INIT", "__bearer_init"}, {"SERVE_HTTP", "__bearer_serve_http"}, + {"INIT", "__bearer_init"}, {"SERVE_HTTP", "__bearer_serve_http"}, {"TASK", "__bearer_task"}, }; if (auto it = names.find(name); it != names.end()) { exported = it->second; return true; } + if (name.rfind("TASK_", 0) == 0) + { + const std::string_view suffix(name.data() + 5, name.size() - 5); + invalid_task_name = !task_suffix_is_valid(suffix); + if (!invalid_task_name) + exported = "__bearer_task_" + std::string(suffix); + return true; + } for (const auto& prefix : {std::pair{"RENDER_", "__bearer_render_"}, {"COMPONENT_", "__bearer_component_"}, {"SERVE_HTTP_", "__bearer_serve_http_"}}) @@ -4134,6 +4150,8 @@ void Module::collect() std::set handlers; auto add_custom_export = [&](const std::string& name, Definition& definition, const Location& location) { + if (handlers.contains(name)) + throw Error(location, "custom DValue export collides with Bearer handler export '" + name + "'"); for (const auto& existing : custom_exports_) if (existing.first == name) throw Error(location, "custom DValue export '" + name + "' is already declared"); @@ -4174,7 +4192,10 @@ void Module::collect() continue; } std::string exported; - bool handler = is_handler(function->name, exported); + bool invalid_task_name = false; + bool handler = is_handler(function->name, exported, invalid_task_name); + if (invalid_task_name) + throw Error(function->location, "TASK handler suffix must match [A-Za-z_][A-Za-z0-9_]*"); std::vector parameters; bool generic = false; for (const auto& parameter : function->parameters) @@ -4187,10 +4208,17 @@ void Module::collect() } if (handler && generic) throw Error(function->location, "Bearer handlers cannot use any parameters"); - if (handler && (function->parameters.size() > 1 || (!parameters.empty() && parameters != std::vector{"request"}))) + const bool task_handler = function->name == "TASK" || function->name.rfind("TASK_", 0) == 0; + if (task_handler && parameters != std::vector{"request"}) + throw Error(function->location, "TASK handler requires exactly one request parameter"); + if (handler && !task_handler && (function->parameters.size() > 1 || (!parameters.empty() && parameters != std::vector{"request"}))) throw Error(function->location, "Bearer handler accepts zero parameters or one request parameter"); + if (handler && function->return_type && value_type(function->return_type, true) != "void") + throw Error(function->location, "Bearer handlers must return void"); if (handler && !handlers.insert(exported).second) throw Error(function->location, "Bearer handler is already declared; handlers cannot be overloaded"); + if (handler && std::any_of(custom_exports_.begin(), custom_exports_.end(), [&](const auto& existing) { return existing.first == exported; })) + throw Error(function->location, "Bearer handler export collides with custom DValue export '" + exported + "'"); if (generic) { int dependent = -1; diff --git a/src/capy/parity_manifest.h b/src/capy/parity_manifest.h index f2076fa0..54791b0a 100644 --- a/src/capy/parity_manifest.h +++ b/src/capy/parity_manifest.h @@ -3,7 +3,7 @@ #include namespace capy::parity { struct Evidence { std::string_view name, path, marker; }; -inline constexpr std::array supported{{ +inline constexpr std::array supported{{ {"1_INIT","site/tests/capy-lifecycle-parity.capy","function INIT"}, {"1_ONCE","site/tests/capy-lifecycle-parity.capy","function ONCE"}, {"1_CLI","site/tests/capy-strings.capy","function CLI"}, @@ -207,8 +207,10 @@ inline constexpr std::array supported{{ {"memcache_delete","site/tests/capy-memcache.capy","memcache_delete("}, {"memcache_escape_key","site/tests/capy-memcache.capy","memcache_escape_key("}, {"memcache_escape_keys","site/tests/capy-memcache.capy","memcache_escape_keys("}, - {"task_kill","site/tests/capy-jobs.capy","task_kill("}, - {"task_pid","site/tests/capy-jobs.capy","task_pid("}, + {"task","site/tests/capy-jobs.capy","task("}, + {"task_status","site/tests/capy-jobs.capy","task_status("}, + {"task_await","site/tests/capy-jobs.capy","task_await("}, + {"task_cancel","site/tests/capy-jobs.capy","task_cancel("}, {"job_status","site/tests/capy-jobs.capy","job_status("}, {"job_result","site/tests/capy-jobs.capy","job_result("}, {"job_await","site/tests/capy-jobs.capy","job_await("}, @@ -263,14 +265,12 @@ inline constexpr std::array supported{{ }}; inline constexpr std::array partial{{}}; inline constexpr std::array cpp_specific{{"3_Blocked functions","3_C++ Preprocessor","3_Coming from React","3_Documentation format","error_pages","load"}}; -inline constexpr std::array unsupported_by_design{{ +inline constexpr std::array unsupported_by_design{{ {"2_DValue_is_reference","","Capy has value semantics; BRRB crossings dereference copies and retain no reference identity."}, {"2_DValue_reference_target","","Capy has no host DValue pointer/alias ABI by design."}, {"2_DValue_deref","","Capy has no host DValue pointer/alias ABI by design."}, {"2_DValue_set_reference","","Capy has no host DValue pointer/alias ABI by design."}, {"nibble","","The documented API mutates a caller String by reference; Capy strings are copied ARC values and expose no reference-parameter ABI."}, - {"task","","Capy closures store a private per-module Wasm table slot plus guest environment; after the task child re-enters the module, the C++ callback registry cannot safely resolve that slot or invoke arbitrary closure signatures with ARC-safe ownership."}, - {"task_repeat","","Same private Capy closure/table ABI limitation as task; exposing it without a stable child-reentry closure ABI would make repeat callbacks unsafe."}, }}; inline constexpr std::array missing_notes{{}}; } diff --git a/src/capy/stdlib.capy b/src/capy/stdlib.capy index 0fc262bd..599a6802 100644 --- a/src/capy/stdlib.capy +++ b/src/capy/stdlib.capy @@ -225,8 +225,10 @@ const __bearer_process_job_cancel : s32 = 6 const __bearer_process_process_start_directory : s32 = 7 const __bearer_process_server_start_http : s32 = 8 const __bearer_process_server_stop : s32 = 9 -const __bearer_process_task_pid : s32 = 10 -const __bearer_process_task_kill : s32 = 11 +const __bearer_process_task_submit : s32 = 10 +const __bearer_process_task_status : s32 = 11 +const __bearer_process_task_await : s32 = 12 +const __bearer_process_task_cancel : s32 = 13 const __bearer_network_socket_connect : s32 = 0 const __bearer_network_socket_close : s32 = 1 const __bearer_network_socket_write : s32 = 2 @@ -615,9 +617,10 @@ function process_start_directory() string { dval_string(__bearer_process_jobs_br function server_start_http(key : string, bind : string, file : string) s32 { server_start_http(key, bind, file, "") } function server_start_http(key : string, bind : string, file : string, callback : string) s32 { dval_s32(__bearer_process_jobs_brrb(__bearer_process_server_start_http, dval(key), bind, dval({"file": file, "function": callback}))) } function server_stop(key : string) bool { dval_bool(__bearer_process_jobs_brrb(__bearer_process_server_stop, dval(key), "", dval(""))) } -function task_pid(key : string) s32 { dval_s32(__bearer_process_jobs_brrb(__bearer_process_task_pid, dval(key), "", dval(""))) } -function task_kill(pid : s32) s32 { task_kill(pid, 0) } -function task_kill(pid : s32, signal : s32) s32 { dval_s32(__bearer_process_jobs_brrb(__bearer_process_task_kill, dval(pid), "", dval(signal))) } +function task(target : string, props : dval) string { dval_string(__bearer_process_jobs_brrb(__bearer_process_task_submit, dval(target), "", props)) } +function task_status(id : string) dval { __bearer_process_jobs_brrb(__bearer_process_task_status, dval(id), "", dval("")) } +function task_await(id : string, timeout_ms : u64) dval { __bearer_process_jobs_brrb(__bearer_process_task_await, dval(id), "", dval(timeout_ms)) } +function task_cancel(id : string) dval { __bearer_process_jobs_brrb(__bearer_process_task_cancel, dval(id), "", dval("")) } // Network resources remain request-owned by the workspace. Handles are encoded // as decimal DValues at the BRRB boundary, then parsed exactly as u64 values. diff --git a/src/capy/stdlib.embedded.h b/src/capy/stdlib.embedded.h index b761b252..e3ee7a2e 100644 --- a/src/capy/stdlib.embedded.h +++ b/src/capy/stdlib.embedded.h @@ -2,7 +2,7 @@ #pragma once #include namespace capy::stdlib { -inline constexpr char digest[] __attribute__((used)) = "442646a82c29b7668a36e8f9668a2501182adbb6f3f81dc21a9a5a2986eea5e0"; -inline constexpr unsigned char source[] = {47,47,32,80,114,105,118,97,116,101,32,116,121,112,101,100,32,104,111,115,116,32,65,66,73,32,100,101,99,108,97,114,97,116,105,111,110,115,46,32,32,78,97,109,101,115,32,109,97,112,32,100,105,114,101,99,116,108,121,32,116,111,32,101,110,118,32,115,121,109,98,111,108,115,46,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,100,118,95,115,54,52,95,98,114,114,98,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,115,54,52,41,32,115,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,100,118,95,109,101,114,103,101,95,98,114,114,98,40,108,101,102,116,32,58,32,100,118,97,108,44,32,114,105,103,104,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,102,111,114,109,97,116,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,114,101,103,105,115,116,114,121,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,102,105,110,100,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,115,51,50,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,110,111,110,98,108,97,110,107,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,114,101,112,108,97,99,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,108,111,119,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,117,112,112,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,117,98,115,116,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,116,97,114,116,32,58,32,115,54,52,44,32,108,101,110,103,116,104,32,58,32,115,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,116,114,112,111,115,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,44,32,111,102,102,115,101,116,32,58,32,115,54,52,41,32,115,54,52,10,116,114,97,99,101,32,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,97,112,121,95,98,97,99,107,116,114,97,99,101,40,109,97,120,95,102,114,97,109,101,115,32,58,32,115,51,50,44,32,115,107,105,112,95,102,114,97,109,101,115,32,58,32,115,51,50,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,116,105,109,101,40,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,112,114,101,99,105,115,101,40,41,32,102,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,97,110,100,111,109,95,98,121,116,101,115,40,99,111,117,110,116,32,58,32,117,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,51,50,40,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,97,32,58,32,117,54,52,44,32,98,32,58,32,117,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,44,32,112,114,101,99,105,115,105,111,110,32,58,32,102,54,52,41,32,102,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,111,112,101,110,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,109,111,100,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,112,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,117,54,52,44,32,108,101,110,103,116,104,32,58,32,117,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,112,119,114,105,116,101,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,117,54,52,44,32,100,97,116,97,32,58,32,115,116,114,105,110,103,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,108,101,110,103,116,104,32,58,32,117,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,119,114,105,116,101,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,100,97,116,97,32,58,32,115,116,114,105,110,103,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,115,101,101,107,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,115,54,52,44,32,119,104,101,110,99,101,32,58,32,115,54,52,41,32,115,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,116,101,108,108,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,102,115,121,110,99,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,99,108,111,115,101,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,118,111,105,100,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,116,101,109,112,40,112,114,101,102,105,120,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,117,110,108,105,110,107,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,118,111,105,100,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,99,111,110,110,101,99,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,51,50,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,101,114,114,111,114,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,44,32,112,97,114,97,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,99,111,110,110,101,99,116,40,104,111,115,116,32,58,32,115,116,114,105,110,103,44,32,117,115,101,114,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,97,115,115,119,111,114,100,32,58,32,115,116,114,105,110,103,44,32,100,97,116,97,98,97,115,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,99,111,110,110,101,99,116,101,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,51,50,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,101,114,114,111,114,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,101,115,99,97,112,101,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,113,117,111,116,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,44,32,112,97,114,97,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,107,105,110,100,32,58,32,115,51,50,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,98,111,100,121,40,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,95,98,114,114,98,40,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,95,102,111,114,95,98,114,114,98,40,118,97,108,117,101,32,58,32,114,101,113,117,101,115,116,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,115,112,111,110,115,101,95,115,101,116,95,104,101,97,100,101,114,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,109,101,115,115,97,103,101,40,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,99,111,110,110,101,99,116,105,111,110,95,105,100,40,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,115,99,111,112,101,40,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,111,112,99,111,100,101,40,41,32,115,51,50,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,105,115,95,98,105,110,97,114,121,40,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,40,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,95,115,99,111,112,101,40,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,44,32,115,99,111,112,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,95,116,111,40,99,111,110,110,101,99,116,105,111,110,95,105,100,32,58,32,115,116,114,105,110,103,44,32,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,99,108,111,115,101,40,99,111,110,110,101,99,116,105,111,110,95,105,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,95,112,114,111,112,115,95,98,114,114,98,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,95,98,121,116,101,115,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,118,111,105,100,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,95,112,114,111,112,115,95,98,114,114,98,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,101,120,105,115,116,115,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,115,111,108,118,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,114,101,110,100,101,114,95,98,121,116,101,115,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,118,111,105,100,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,108,111,97,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,109,111,100,117,108,101,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,111,100,117,108,101,95,99,97,108,108,95,98,114,114,98,40,104,97,110,100,108,101,32,58,32,109,111,100,117,108,101,44,32,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,105,110,112,117,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,99,97,108,108,95,98,114,114,98,40,102,105,108,101,32,58,32,115,116,114,105,110,103,44,32,102,117,110,99,116,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,105,110,102,111,95,98,114,114,98,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,115,95,108,105,115,116,95,98,114,114,98,40,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,99,111,109,112,105,108,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,109,97,116,99,104,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,116,101,120,116,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,116,101,120,116,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,100,118,97,108,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,10,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,117,115,104,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,111,112,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,114,101,109,111,118,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,99,108,101,97,114,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,98,121,95,112,97,116,104,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,111,114,95,99,114,101,97,116,101,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,97,114,114,97,121,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,98,111,111,108,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,116,121,112,101,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,116,121,112,101,95,110,97,109,101,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,105,115,95,97,114,114,97,121,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,105,115,95,108,105,115,116,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,107,101,121,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,107,101,121,115,32,58,32,115,51,50,32,61,32,49,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,118,97,108,117,101,115,32,58,32,115,51,50,32,61,32,49,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,106,115,111,110,32,58,32,115,51,50,32,61,32,49,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,115,116,114,105,110,103,109,97,112,32,58,32,115,51,50,32,61,32,49,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,117,116,32,58,32,115,51,50,32,61,32,49,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,115,116,114,105,110,103,32,58,32,115,51,50,32,61,32,49,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,102,54,52,32,58,32,115,51,50,32,61,32,50,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,98,111,111,108,32,58,32,115,51,50,32,61,32,50,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,97,115,99,105,105,95,115,97,102,101,95,110,97,109,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,97,102,101,95,110,97,109,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,116,114,105,109,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,102,108,111,97,116,95,118,97,108,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,105,110,116,95,118,97,108,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,116,111,95,98,111,111,108,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,116,114,95,115,116,97,114,116,115,95,119,105,116,104,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,116,114,95,101,110,100,115,95,119,105,116,104,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,101,110,99,111,100,101,95,113,117,101,114,121,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,101,95,113,117,101,114,121,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,115,112,97,99,101,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,117,116,102,56,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,104,116,116,112,95,104,101,97,100,101,114,115,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,107,118,32,58,32,115,51,50,32,61,32,49,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,111,114,116,32,58,32,115,51,50,32,61,32,49,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,114,115,101,95,117,114,105,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,110,111,114,109,97,108,105,122,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,105,115,95,115,97,102,101,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,115,97,110,105,116,105,122,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,117,110,116,105,109,101,95,115,97,102,101,95,107,101,121,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,115,105,103,110,97,108,95,110,97,109,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,98,97,99,107,116,114,97,99,101,95,99,97,112,116,117,114,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,117,115,108,101,101,112,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,118,97,114,95,100,117,109,112,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,98,114,98,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,98,114,98,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,120,109,108,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,120,109,108,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,121,97,109,108,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,121,97,109,108,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,104,116,109,108,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,97,115,116,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,99,111,110,115,117,109,101,95,115,112,97,99,101,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,101,110,99,111,100,101,95,49,48,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,104,116,109,108,95,101,115,99,97,112,101,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,103,122,95,99,111,109,112,114,101,115,115,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,103,122,95,117,110,99,111,109,112,114,101,115,115,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,108,105,115,116,32,58,32,115,51,50,32,61,32,49,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,114,101,97,100,32,58,32,115,51,50,32,61,32,49,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,99,114,101,97,116,101,32,58,32,115,51,50,32,61,32,49,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,101,120,116,114,97,99,116,32,58,32,115,51,50,32,61,32,49,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,103,101,110,95,115,104,97,49,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,115,104,97,50,53,54,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,115,104,97,50,53,54,95,104,101,120,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,104,109,97,99,95,115,104,97,50,53,54,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,104,109,97,99,95,115,104,97,50,53,54,95,104,101,120,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,99,114,121,112,116,111,95,101,113,117,97,108,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,104,97,115,104,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,118,101,114,105,102,121,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,110,101,101,100,115,95,114,101,104,97,115,104,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,97,115,101,110,97,109,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,110,97,109,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,106,111,105,110,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,114,101,97,108,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,105,115,95,119,105,116,104,105,110,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,101,120,112,97,110,100,95,112,97,116,104,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,103,101,116,95,99,111,110,116,101,110,116,115,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,112,117,116,95,99,111,110,116,101,110,116,115,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,97,112,112,101,110,100,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,99,111,112,121,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,114,101,110,97,109,101,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,115,116,97,116,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,109,116,105,109,101,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,101,120,105,115,116,115,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,116,114,117,110,99,97,116,101,32,58,32,115,51,50,32,61,32,49,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,99,104,109,111,100,32,58,32,115,51,50,32,61,32,49,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,115,121,109,108,105,110,107,32,58,32,115,51,50,32,61,32,49,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,108,115,32,58,32,115,51,50,32,61,32,49,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,109,107,100,105,114,32,58,32,115,51,50,32,61,32,49,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,95,108,105,115,116,32,58,32,115,51,50,32,61,32,49,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,95,114,101,109,111,118,101,32,58,32,115,51,50,32,61,32,50,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,99,119,100,95,103,101,116,32,58,32,115,51,50,32,61,32,50,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,99,119,100,95,115,101,116,32,58,32,115,51,50,32,61,32,50,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,115,116,97,114,116,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,99,108,111,115,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,103,101,116,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,103,101,116,95,99,108,111,115,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,115,112,111,110,115,101,95,115,116,97,116,117,115,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,100,105,114,101,99,116,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,115,116,97,114,116,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,115,101,116,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,115,112,111,110,115,101,95,99,111,111,107,105,101,32,58,32,115,51,50,32,61,32,50,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,100,101,115,116,114,111,121,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,105,100,95,99,114,101,97,116,101,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,116,111,107,101,110,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,118,97,108,105,100,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,114,111,116,97,116,101,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,102,105,101,108,100,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,108,105,95,105,110,112,117,116,32,58,32,115,51,50,32,61,32,49,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,108,105,95,97,114,103,32,58,32,115,51,50,32,61,32,49,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,98,97,115,101,95,117,114,108,32,58,32,115,51,50,32,61,32,49,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,115,99,114,105,112,116,95,117,114,108,32,58,32,115,51,50,32,61,32,49,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,113,117,101,114,121,95,112,97,116,104,32,58,32,115,51,50,32,61,32,49,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,113,117,101,114,121,95,114,111,117,116,101,32,58,32,115,51,50,32,61,32,49,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,114,111,117,116,101,95,102,114,111,109,95,114,97,119,95,112,97,116,104,32,58,32,115,51,50,32,61,32,50,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,112,101,114,102,32,58,32,115,51,50,32,61,32,50,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,99,111,110,110,101,99,116,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,99,111,109,109,97,110,100,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,115,101,116,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,100,101,108,101,116,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,103,101,116,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,103,101,116,95,109,117,108,116,105,112,108,101,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,115,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,101,115,99,97,112,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,101,120,101,99,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,115,112,97,119,110,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,115,116,97,116,117,115,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,114,101,115,117,108,116,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,97,119,97,105,116,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,99,97,110,99,101,108,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,112,114,111,99,101,115,115,95,115,116,97,114,116,95,100,105,114,101,99,116,111,114,121,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,101,114,118,101,114,95,115,116,97,114,116,95,104,116,116,112,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,101,114,118,101,114,95,115,116,111,112,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,112,105,100,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,107,105,108,108,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,99,111,110,110,101,99,116,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,99,108,111,115,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,119,114,105,116,101,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,114,101,97,100,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,114,101,113,117,101,115,116,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,114,101,113,117,101,115,116,95,97,115,121,110,99,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,112,97,114,115,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,114,101,108,97,116,105,118,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,115,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,95,99,111,117,110,116,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,54,52,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,105,110,116,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,100,114,97,119,95,105,110,116,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,48,49,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,102,108,111,97,116,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,100,114,97,119,95,102,108,111,97,116,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,112,97,114,97,109,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,103,101,116,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,112,111,115,116,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,99,111,111,107,105,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,112,108,105,116,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,95,97,108,108,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,114,101,112,108,97,99,101,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,98,97,115,101,54,52,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,98,97,115,101,54,52,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,117,114,105,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,117,114,105,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,106,115,111,110,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,52,10,10,47,47,32,68,86,97,108,117,101,115,32,99,114,111,115,115,32,116,104,101,32,66,101,97,114,101,114,32,98,111,117,110,100,97,114,121,32,97,115,32,99,111,112,105,101,100,32,65,82,67,32,118,97,108,117,101,115,46,32,32,77,117,116,97,116,111,114,115,32,114,101,116,117,114,110,32,116,104,101,10,47,47,32,114,101,112,108,97,99,101,109,101,110,116,32,118,97,108,117,101,58,32,96,118,97,108,117,101,32,61,32,100,118,97,108,95,112,117,115,104,40,118,97,108,117,101,44,32,99,104,105,108,100,41,96,59,32,110,111,32,104,111,115,116,32,97,108,105,97,115,32,101,115,99,97,112,101,115,46,10,102,117,110,99,116,105,111,110,32,116,111,95,108,111,119,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,108,111,119,101,114,40,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,117,112,112,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,117,112,112,101,114,40,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,110,100,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,115,51,50,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,102,105,110,100,40,104,97,121,115,116,97,99,107,44,32,110,101,101,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,110,116,97,105,110,115,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,102,105,110,100,40,104,97,121,115,116,97,99,107,44,32,110,101,101,100,108,101,41,32,33,61,32,45,49,32,125,10,102,117,110,99,116,105,111,110,32,114,101,112,108,97,99,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,114,101,112,108,97,99,101,40,118,97,108,117,101,44,32,110,101,101,100,108,101,44,32,114,101,112,108,97,99,101,109,101,110,116,41,32,125,10,102,117,110,99,116,105,111,110,32,108,111,119,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,108,111,119,101,114,40,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,117,112,112,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,117,112,112,101,114,40,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,114,115,116,40,41,32,115,116,114,105,110,103,32,123,32,114,101,116,117,114,110,32,34,34,32,125,10,102,117,110,99,116,105,111,110,32,102,105,114,115,116,40,111,110,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,114,101,116,117,114,110,32,111,110,101,32,125,10,102,117,110,99,116,105,111,110,32,102,105,114,115,116,40,111,110,101,32,58,32,115,116,114,105,110,103,44,32,116,119,111,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,116,119,111,59,32,105,102,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,110,111,110,98,108,97,110,107,40,111,110,101,41,32,123,32,114,101,115,117,108,116,32,61,32,111,110,101,32,125,59,32,114,101,116,117,114,110,32,114,101,115,117,108,116,32,125,10,102,117,110,99,116,105,111,110,32,102,105,114,115,116,40,111,110,101,32,58,32,115,116,114,105,110,103,44,32,116,119,111,32,58,32,115,116,114,105,110,103,44,32,116,104,114,101,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,114,101,116,117,114,110,32,102,105,114,115,116,40,102,105,114,115,116,40,111,110,101,44,32,116,119,111,41,44,32,116,104,114,101,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,114,115,116,40,111,110,101,32,58,32,115,116,114,105,110,103,44,32,116,119,111,32,58,32,115,116,114,105,110,103,44,32,116,104,114,101,101,32,58,32,115,116,114,105,110,103,44,32,102,111,117,114,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,114,101,116,117,114,110,32,102,105,114,115,116,40,102,105,114,115,116,40,111,110,101,44,32,116,119,111,41,44,32,102,105,114,115,116,40,116,104,114,101,101,44,32,102,111,117,114,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,117,98,115,116,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,116,97,114,116,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,117,98,115,116,114,40,118,97,108,117,101,44,32,115,116,97,114,116,32,97,115,32,115,54,52,44,32,108,101,110,103,116,104,40,118,97,108,117,101,41,32,97,115,32,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,115,117,98,115,116,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,116,97,114,116,32,58,32,115,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,117,98,115,116,114,40,118,97,108,117,101,44,32,115,116,97,114,116,44,32,108,101,110,103,116,104,40,118,97,108,117,101,41,32,97,115,32,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,115,117,98,115,116,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,116,97,114,116,32,58,32,115,51,50,44,32,108,101,110,103,116,104,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,117,98,115,116,114,40,118,97,108,117,101,44,32,115,116,97,114,116,32,97,115,32,115,54,52,44,32,108,101,110,103,116,104,32,97,115,32,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,115,117,98,115,116,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,116,97,114,116,32,58,32,115,54,52,44,32,108,101,110,103,116,104,32,58,32,115,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,117,98,115,116,114,40,118,97,108,117,101,44,32,115,116,97,114,116,44,32,108,101,110,103,116,104,41,32,125,10,102,117,110,99,116,105,111,110,32,115,116,114,112,111,115,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,116,114,112,111,115,40,104,97,121,115,116,97,99,107,44,32,110,101,101,100,108,101,44,32,48,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,115,116,114,112,111,115,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,44,32,111,102,102,115,101,116,32,58,32,115,54,52,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,116,114,112,111,115,40,104,97,121,115,116,97,99,107,44,32,110,101,101,100,108,101,44,32,111,102,102,115,101,116,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,115,101,116,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,115,111,117,114,99,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,44,32,118,97,108,117,101,44,32,34,34,44,32,115,111,117,114,99,101,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,97,115,115,105,103,110,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,115,111,117,114,99,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,100,118,97,108,95,115,101,116,40,118,97,108,117,101,44,32,115,111,117,114,99,101,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,112,117,115,104,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,99,104,105,108,100,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,117,115,104,44,32,118,97,108,117,101,44,32,34,34,44,32,99,104,105,108,100,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,112,111,112,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,111,112,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,114,101,109,111,118,101,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,114,101,109,111,118,101,44,32,118,97,108,117,101,44,32,107,101,121,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,99,108,101,97,114,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,99,108,101,97,114,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,103,101,116,95,98,121,95,112,97,116,104,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,98,121,95,112,97,116,104,44,32,118,97,108,117,101,44,32,112,97,116,104,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,103,101,116,95,111,114,95,99,114,101,97,116,101,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,111,114,95,99,114,101,97,116,101,44,32,118,97,108,117,101,44,32,107,101,121,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,115,101,116,95,97,114,114,97,121,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,97,114,114,97,121,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,115,101,116,95,98,111,111,108,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,108,97,103,32,58,32,98,111,111,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,98,111,111,108,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,102,108,97,103,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,115,101,116,95,116,121,112,101,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,116,121,112,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,116,121,112,101,44,32,118,97,108,117,101,44,32,116,121,112,101,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,103,101,116,95,116,121,112,101,95,110,97,109,101,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,116,121,112,101,95,110,97,109,101,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,105,115,95,97,114,114,97,121,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,105,115,95,97,114,114,97,121,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,105,115,95,108,105,115,116,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,105,115,95,108,105,115,116,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,107,101,121,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,107,101,121,44,32,118,97,108,117,101,44,32,107,101,121,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,107,101,121,115,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,107,101,121,115,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,118,97,108,117,101,115,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,118,97,108,117,101,115,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,106,115,111,110,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,106,115,111,110,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,106,115,111,110,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,113,117,111,116,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,106,115,111,110,44,32,118,97,108,117,101,44,32,113,117,111,116,101,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,115,116,114,105,110,103,109,97,112,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,115,116,114,105,110,103,109,97,112,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,112,117,116,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,99,104,105,108,100,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,117,116,44,32,118,97,108,117,101,44,32,107,101,121,44,32,99,104,105,108,100,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,115,116,114,105,110,103,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,115,116,114,105,110,103,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,115,116,114,105,110,103,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,115,116,114,105,110,103,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,102,97,108,108,98,97,99,107,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,102,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,102,54,52,32,123,32,100,118,97,108,95,102,54,52,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,102,54,52,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,48,46,48,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,102,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,102,54,52,41,32,102,54,52,32,123,32,100,118,97,108,95,102,54,52,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,102,54,52,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,102,97,108,108,98,97,99,107,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,98,111,111,108,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,98,111,111,108,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,98,111,111,108,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,98,111,111,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,98,111,111,108,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,102,97,108,108,98,97,99,107,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,115,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,115,54,52,95,98,114,114,98,40,118,97,108,117,101,44,32,48,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,115,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,115,54,52,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,115,54,52,95,98,114,114,98,40,118,97,108,117,101,44,32,102,97,108,108,98,97,99,107,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,117,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,118,97,108,117,101,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,117,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,118,97,108,117,101,44,32,102,97,108,108,98,97,99,107,41,32,125,10,10,47,47,32,83,116,114,105,110,103,76,105,115,116,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,105,115,116,45,115,104,97,112,101,100,32,99,111,112,105,101,100,32,68,86,97,108,117,101,46,32,32,84,104,101,115,101,32,99,97,108,108,98,97,99,107,115,10,47,47,32,100,101,108,105,98,101,114,97,116,101,108,121,32,115,116,97,121,32,105,110,32,67,97,112,121,44,32,106,117,115,116,32,108,105,107,101,32,100,118,97,108,95,109,97,112,47,100,118,97,108,95,102,105,108,116,101,114,46,10,102,117,110,99,116,105,111,110,32,101,118,101,114,121,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,112,114,101,100,105,99,97,116,101,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,41,32,98,111,111,108,32,123,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,105,102,32,33,112,114,101,100,105,99,97,116,101,40,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,41,32,123,32,114,101,116,117,114,110,32,102,97,108,115,101,32,125,32,125,10,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,10,125,10,102,117,110,99,116,105,111,110,32,115,111,109,101,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,112,114,101,100,105,99,97,116,101,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,41,32,98,111,111,108,32,123,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,105,102,32,112,114,101,100,105,99,97,116,101,40,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,41,32,123,32,114,101,116,117,114,110,32,116,114,117,101,32,125,32,125,10,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,10,125,10,102,117,110,99,116,105,111,110,32,115,116,114,105,110,103,95,108,105,115,116,95,102,105,110,100,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,112,114,101,100,105,99,97,116,101,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,44,32,102,97,108,108,98,97,99,107,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,118,97,114,32,118,97,108,117,101,32,58,61,32,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,59,32,105,102,32,112,114,101,100,105,99,97,116,101,40,118,97,108,117,101,41,32,123,32,114,101,116,117,114,110,32,118,97,108,117,101,32,125,32,125,10,32,32,32,32,114,101,116,117,114,110,32,102,97,108,108,98,97,99,107,10,125,10,102,117,110,99,116,105,111,110,32,107,101,121,115,40,105,116,101,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,91,93,41,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,100,118,97,108,40,107,101,121,41,41,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,102,117,110,99,116,105,111,110,32,109,97,112,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,109,97,112,112,101,114,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,91,93,41,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,100,118,97,108,40,109,97,112,112,101,114,40,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,41,41,41,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,102,117,110,99,116,105,111,110,32,102,105,108,116,101,114,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,112,114,101,100,105,99,97,116,101,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,91,93,41,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,118,97,114,32,118,97,108,117,101,32,58,61,32,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,59,32,105,102,32,112,114,101,100,105,99,97,116,101,40,118,97,108,117,101,41,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,100,118,97,108,40,118,97,108,117,101,41,41,32,125,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,102,117,110,99,116,105,111,110,32,117,110,105,113,117,101,40,105,116,101,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,91,93,41,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,118,97,108,117,101,32,58,61,32,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,10,32,32,32,32,32,32,32,32,105,102,32,33,115,111,109,101,40,114,101,115,117,108,116,44,32,102,117,110,99,116,105,111,110,40,99,97,110,100,105,100,97,116,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,99,97,110,100,105,100,97,116,101,32,61,61,32,118,97,108,117,101,32,125,41,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,100,118,97,108,40,118,97,108,117,101,41,41,32,125,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,109,97,112,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,109,97,112,112,101,114,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,123,58,125,41,10,32,32,32,32,118,97,114,32,108,105,115,116,32,58,61,32,100,118,97,108,95,105,115,95,108,105,115,116,40,118,97,108,117,101,41,10,32,32,32,32,105,102,32,108,105,115,116,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,115,101,116,95,97,114,114,97,121,40,114,101,115,117,108,116,41,32,125,10,32,32,32,32,105,102,32,100,118,97,108,95,105,115,95,97,114,114,97,121,40,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,118,97,108,117,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,109,97,112,112,101,100,32,58,61,32,109,97,112,112,101,114,40,105,116,101,109,44,32,107,101,121,41,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,108,105,115,116,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,109,97,112,112,101,100,41,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,116,40,114,101,115,117,108,116,44,32,107,101,121,44,32,109,97,112,112,101,100,41,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,109,97,112,112,101,114,40,118,97,108,117,101,44,32,34,34,41,41,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,102,105,108,116,101,114,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,112,114,101,100,105,99,97,116,101,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,123,58,125,41,10,32,32,32,32,118,97,114,32,108,105,115,116,32,58,61,32,100,118,97,108,95,105,115,95,108,105,115,116,40,118,97,108,117,101,41,10,32,32,32,32,105,102,32,108,105,115,116,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,115,101,116,95,97,114,114,97,121,40,114,101,115,117,108,116,41,32,125,10,32,32,32,32,105,102,32,100,118,97,108,95,105,115,95,97,114,114,97,121,40,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,118,97,108,117,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,112,114,101,100,105,99,97,116,101,40,105,116,101,109,44,32,107,101,121,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,108,105,115,116,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,105,116,101,109,41,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,116,40,114,101,115,117,108,116,44,32,107,101,121,44,32,105,116,101,109,41,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,105,102,32,112,114,101,100,105,99,97,116,101,40,118,97,108,117,101,44,32,34,34,41,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,118,97,108,117,101,41,32,125,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,10,47,47,32,67,111,114,101,32,117,116,105,108,105,116,121,32,97,100,97,112,116,101,114,115,32,114,101,116,97,105,110,32,116,104,101,32,67,43,43,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,97,115,32,116,104,101,32,115,101,109,97,110,116,105,99,32,97,117,116,104,111,114,105,116,121,46,10,47,47,32,116,101,120,116,47,112,97,114,115,105,110,103,47,99,111,108,108,101,99,116,105,111,110,32,111,112,101,114,97,116,105,111,110,32,111,114,100,101,114,58,32,110,97,109,101,115,44,32,115,99,97,108,97,114,115,44,32,112,114,101,100,105,99,97,116,101,115,44,32,113,117,101,114,121,44,32,115,112,108,105,116,47,115,111,114,116,10,102,117,110,99,116,105,111,110,32,97,115,99,105,105,95,115,97,102,101,95,110,97,109,101,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,97,115,99,105,105,95,115,97,102,101,95,110,97,109,101,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,97,102,101,95,110,97,109,101,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,97,102,101,95,110,97,109,101,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,114,105,109,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,116,114,105,109,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,108,111,97,116,95,118,97,108,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,102,54,52,32,123,32,100,118,97,108,95,102,54,52,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,102,108,111,97,116,95,118,97,108,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,48,46,48,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,105,110,116,95,118,97,108,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,105,110,116,95,118,97,108,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,49,48,46,48,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,105,110,116,95,118,97,108,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,98,97,115,101,32,58,32,115,51,50,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,105,110,116,95,118,97,108,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,98,97,115,101,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,98,111,111,108,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,116,111,95,98,111,111,108,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,98,111,111,108,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,98,111,111,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,116,111,95,98,111,111,108,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,108,98,97,99,107,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,102,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,102,54,52,32,123,32,100,118,97,108,95,116,111,95,102,54,52,40,100,118,97,108,40,114,97,119,41,44,32,48,46,48,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,102,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,102,54,52,41,32,102,54,52,32,123,32,100,118,97,108,95,116,111,95,102,54,52,40,100,118,97,108,40,114,97,119,41,44,32,102,97,108,108,98,97,99,107,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,115,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,115,54,52,95,98,114,114,98,40,100,118,97,108,40,114,97,119,41,44,32,48,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,115,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,115,54,52,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,115,54,52,95,98,114,114,98,40,100,118,97,108,40,114,97,119,41,44,32,102,97,108,108,98,97,99,107,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,117,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,100,118,97,108,40,114,97,119,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,117,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,100,118,97,108,40,114,97,119,41,44,32,102,97,108,108,98,97,99,107,41,32,125,10,102,117,110,99,116,105,111,110,32,115,116,114,95,115,116,97,114,116,115,95,119,105,116,104,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,116,114,95,115,116,97,114,116,115,95,119,105,116,104,44,32,100,118,97,108,40,104,97,121,115,116,97,99,107,41,44,32,110,101,101,100,108,101,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,116,114,95,101,110,100,115,95,119,105,116,104,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,116,114,95,101,110,100,115,95,119,105,116,104,44,32,100,118,97,108,40,104,97,121,115,116,97,99,107,41,44,32,110,101,101,100,108,101,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,101,110,99,111,100,101,95,113,117,101,114,121,40,109,97,112,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,101,110,99,111,100,101,95,113,117,101,114,121,44,32,109,97,112,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,114,115,101,95,113,117,101,114,121,40,113,117,101,114,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,101,95,113,117,101,114,121,44,32,100,118,97,108,40,113,117,101,114,121,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,47,47,32,114,111,117,116,101,47,112,97,116,104,32,111,112,101,114,97,116,105,111,110,32,111,114,100,101,114,58,32,85,82,73,32,112,97,114,115,101,44,32,110,111,114,109,97,108,105,122,101,44,32,118,97,108,105,100,97,116,101,44,32,115,97,110,105,116,105,122,101,44,32,107,101,121,10,102,117,110,99,116,105,111,110,32,112,97,114,115,101,95,117,114,105,40,117,114,105,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,114,115,101,95,117,114,105,44,32,100,118,97,108,40,117,114,105,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,111,117,116,101,95,112,97,116,104,95,110,111,114,109,97,108,105,122,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,110,111,114,109,97,108,105,122,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,111,117,116,101,95,112,97,116,104,95,105,115,95,115,97,102,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,105,115,95,115,97,102,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,111,117,116,101,95,112,97,116,104,95,115,97,110,105,116,105,122,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,115,97,110,105,116,105,122,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,105,110,100,101,120,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,111,117,116,101,95,112,97,116,104,95,115,97,110,105,116,105,122,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,115,97,110,105,116,105,122,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,102,97,108,108,98,97,99,107,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,117,110,116,105,109,101,95,115,97,102,101,95,107,101,121,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,117,110,116,105,109,101,95,115,97,102,101,95,107,101,121,44,32,100,118,97,108,40,107,101,121,41,44,32,34,114,117,110,116,105,109,101,32,107,101,121,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,117,110,116,105,109,101,95,115,97,102,101,95,107,101,121,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,108,97,98,101,108,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,117,110,116,105,109,101,95,115,97,102,101,95,107,101,121,44,32,100,118,97,108,40,107,101,121,41,44,32,108,97,98,101,108,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,100,101,108,105,109,105,116,101,114,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,100,101,108,105,109,105,116,101,114,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,105,110,40,105,116,101,109,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,106,111,105,110,40,105,116,101,109,115,44,32,34,92,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,105,110,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,100,101,108,105,109,105,116,101,114,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,34,34,10,32,32,32,32,118,97,114,32,102,105,114,115,116,32,58,61,32,116,114,117,101,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,105,102,32,33,102,105,114,115,116,32,123,32,114,101,115,117,108,116,32,61,32,114,101,115,117,108,116,32,43,32,100,101,108,105,109,105,116,101,114,32,125,59,32,114,101,115,117,108,116,32,61,32,114,101,115,117,108,116,32,43,32,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,59,32,102,105,114,115,116,32,61,32,102,97,108,115,101,32,125,10,32,32,32,32,114,101,115,117,108,116,10,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,112,108,105,116,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,112,108,105,116,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,112,108,105,116,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,112,108,105,116,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,102,108,97,103,115,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,115,112,97,99,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,115,112,97,99,101,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,117,116,102,56,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,117,116,102,56,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,117,116,102,56,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,99,111,109,112,111,117,110,100,32,58,32,98,111,111,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,117,116,102,56,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,99,111,109,112,111,117,110,100,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,104,116,116,112,95,104,101,97,100,101,114,115,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,104,116,116,112,95,104,101,97,100,101,114,115,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,107,118,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,115,112,108,105,116,95,107,118,40,118,97,108,117,101,44,32,34,61,34,44,32,116,114,117,101,44,32,102,97,108,115,101,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,107,118,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,101,112,97,114,97,116,111,114,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,115,112,108,105,116,95,107,118,40,118,97,108,117,101,44,32,115,101,112,97,114,97,116,111,114,44,32,116,114,117,101,44,32,102,97,108,115,101,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,107,118,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,101,112,97,114,97,116,111,114,32,58,32,115,116,114,105,110,103,44,32,116,114,105,109,95,119,104,105,116,101,115,112,97,99,101,32,58,32,98,111,111,108,44,32,117,112,112,101,114,99,97,115,101,95,107,101,121,115,32,58,32,98,111,111,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,107,118,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,115,101,112,97,114,97,116,111,114,44,32,100,118,97,108,40,123,34,116,114,105,109,34,58,32,116,114,105,109,95,119,104,105,116,101,115,112,97,99,101,44,32,34,117,112,112,101,114,99,97,115,101,34,58,32,117,112,112,101,114,99,97,115,101,95,107,101,121,115,125,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,114,116,40,105,116,101,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,111,114,116,44,32,105,116,101,109,115,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,101,97,99,104,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,99,97,108,108,98,97,99,107,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,41,32,123,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,99,97,108,108,98,97,99,107,40,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,41,32,125,32,125,10,47,47,32,114,117,110,116,105,109,101,45,100,105,97,103,110,111,115,116,105,99,32,111,112,101,114,97,116,105,111,110,32,111,114,100,101,114,58,32,115,105,103,110,97,108,44,32,98,97,99,107,116,114,97,99,101,44,32,115,108,101,101,112,44,32,118,97,108,117,101,32,100,117,109,112,10,102,117,110,99,116,105,111,110,32,115,105,103,110,97,108,95,110,97,109,101,40,115,105,103,110,97,108,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,115,105,103,110,97,108,95,110,97,109,101,44,32,100,118,97,108,40,115,105,103,110,97,108,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,98,97,99,107,116,114,97,99,101,95,99,97,112,116,117,114,101,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,98,97,99,107,116,114,97,99,101,95,99,97,112,116,117,114,101,44,32,100,118,97,108,40,51,50,46,48,41,44,32,34,34,44,32,100,118,97,108,40,48,46,48,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,98,97,99,107,116,114,97,99,101,95,99,97,112,116,117,114,101,40,109,97,120,95,102,114,97,109,101,115,32,58,32,115,51,50,44,32,115,107,105,112,95,102,114,97,109,101,115,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,98,97,99,107,116,114,97,99,101,95,99,97,112,116,117,114,101,44,32,100,118,97,108,40,109,97,120,95,102,114,97,109,101,115,41,44,32,34,34,44,32,100,118,97,108,40,115,107,105,112,95,102,114,97,109,101,115,41,41,41,32,125,10,47,47,32,67,97,112,121,32,101,120,112,111,115,101,115,32,115,111,117,114,99,101,45,109,97,112,112,101,100,32,103,117,101,115,116,32,102,114,97,109,101,115,32,114,97,116,104,101,114,32,116,104,97,110,32,116,104,101,32,110,97,116,105,118,101,32,118,111,105,100,42,32,65,66,73,46,10,102,117,110,99,116,105,111,110,32,98,97,99,107,116,114,97,99,101,95,103,101,116,95,102,114,97,109,101,115,40,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,97,112,121,95,98,97,99,107,116,114,97,99,101,40,51,50,44,32,48,41,32,125,10,102,117,110,99,116,105,111,110,32,98,97,99,107,116,114,97,99,101,95,103,101,116,95,102,114,97,109,101,115,40,109,97,120,95,102,114,97,109,101,115,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,97,112,121,95,98,97,99,107,116,114,97,99,101,40,109,97,120,95,102,114,97,109,101,115,44,32,48,41,32,125,10,102,117,110,99,116,105,111,110,32,98,97,99,107,116,114,97,99,101,95,103,101,116,95,102,114,97,109,101,115,40,109,97,120,95,102,114,97,109,101,115,32,58,32,115,51,50,44,32,115,107,105,112,95,102,114,97,109,101,115,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,97,112,121,95,98,97,99,107,116,114,97,99,101,40,109,97,120,95,102,114,97,109,101,115,44,32,115,107,105,112,95,102,114,97,109,101,115,41,32,125,10,102,117,110,99,116,105,111,110,32,117,115,108,101,101,112,40,117,115,101,99,32,58,32,115,51,50,41,32,115,51,50,32,123,32,100,118,97,108,95,115,51,50,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,117,115,108,101,101,112,44,32,100,118,97,108,40,117,115,101,99,41,44,32,34,34,44,32,100,118,97,108,40,48,46,48,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,118,97,114,95,100,117,109,112,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,118,97,114,95,100,117,109,112,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,118,97,114,95,100,117,109,112,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,112,114,101,102,105,120,32,58,32,115,116,114,105,110,103,44,32,112,111,115,116,102,105,120,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,118,97,114,95,100,117,109,112,44,32,118,97,108,117,101,44,32,112,114,101,102,105,120,44,32,100,118,97,108,40,112,111,115,116,102,105,120,41,41,41,32,125,10,10,47,47,32,67,111,100,101,99,115,32,99,114,111,115,115,32,116,104,101,32,99,111,112,105,101,100,45,68,86,97,108,117,101,32,109,101,109,98,114,97,110,101,59,32,110,97,116,105,118,101,32,112,97,114,115,101,114,115,32,114,101,109,97,105,110,32,97,117,116,104,111,114,105,116,97,116,105,118,101,46,10,102,117,110,99,116,105,111,110,32,98,114,98,95,100,101,99,111,100,101,40,101,110,99,111,100,101,100,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,98,114,98,95,100,101,99,111,100,101,44,32,100,118,97,108,40,101,110,99,111,100,101,100,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,98,114,98,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,98,114,98,95,101,110,99,111,100,101,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,120,109,108,95,100,101,99,111,100,101,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,120,109,108,95,100,101,99,111,100,101,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,120,109,108,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,120,109,108,95,101,110,99,111,100,101,44,32,118,97,108,117,101,44,32,34,114,111,111,116,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,120,109,108,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,114,111,111,116,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,120,109,108,95,101,110,99,111,100,101,44,32,118,97,108,117,101,44,32,114,111,111,116,95,110,97,109,101,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,121,97,109,108,95,100,101,99,111,100,101,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,121,97,109,108,95,100,101,99,111,100,101,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,121,97,109,108,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,121,97,109,108,95,101,110,99,111,100,101,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,97,114,107,100,111,119,110,95,116,111,95,104,116,109,108,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,104,116,109,108,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,123,58,125,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,97,114,107,100,111,119,110,95,116,111,95,104,116,109,108,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,44,32,111,112,116,105,111,110,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,104,116,109,108,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,111,112,116,105,111,110,115,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,97,114,107,100,111,119,110,95,116,111,95,97,115,116,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,97,115,116,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,123,58,125,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,97,114,107,100,111,119,110,95,116,111,95,97,115,116,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,44,32,111,112,116,105,111,110,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,97,115,116,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,111,112,116,105,111,110,115,41,32,125,10,47,47,32,67,97,112,121,32,115,99,97,108,97,114,115,32,97,114,101,32,118,97,108,117,101,115,58,32,114,101,116,117,114,110,32,116,104,101,32,97,100,118,97,110,99,101,100,32,111,102,102,115,101,116,32,102,111,114,32,114,101,97,115,115,105,103,110,109,101,110,116,46,10,102,117,110,99,116,105,111,110,32,106,115,111,110,95,99,111,110,115,117,109,101,95,115,112,97,99,101,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,44,32,105,110,100,101,120,32,58,32,115,51,50,41,32,115,51,50,32,123,32,100,118,97,108,95,115,51,50,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,99,111,110,115,117,109,101,95,115,112,97,99,101,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,105,110,100,101,120,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,115,111,110,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,101,110,99,111,100,101,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,115,111,110,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,101,110,99,111,100,101,95,49,48,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,104,116,109,108,95,101,115,99,97,112,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,104,116,109,108,95,101,115,99,97,112,101,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,103,122,95,99,111,109,112,114,101,115,115,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,103,122,95,99,111,109,112,114,101,115,115,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,103,122,95,117,110,99,111,109,112,114,101,115,115,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,103,122,95,117,110,99,111,109,112,114,101,115,115,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,122,105,112,95,108,105,115,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,108,105,115,116,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,122,105,112,95,114,101,97,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,101,110,116,114,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,114,101,97,100,44,32,100,118,97,108,40,112,97,116,104,41,44,32,101,110,116,114,121,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,122,105,112,95,99,114,101,97,116,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,101,110,116,114,105,101,115,32,58,32,100,118,97,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,99,114,101,97,116,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,101,110,116,114,105,101,115,41,41,32,125,10,102,117,110,99,116,105,111,110,32,122,105,112,95,101,120,116,114,97,99,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,100,101,115,116,105,110,97,116,105,111,110,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,101,120,116,114,97,99,116,44,32,100,118,97,108,40,112,97,116,104,41,44,32,100,101,115,116,105,110,97,116,105,111,110,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,10,47,47,32,70,105,108,101,115,121,115,116,101,109,32,112,111,108,105,99,121,32,115,116,97,121,115,32,105,110,32,116,104,101,32,99,111,114,101,47,104,111,115,116,32,98,111,117,110,100,97,114,121,59,32,116,104,101,115,101,32,119,114,97,112,112,101,114,115,32,111,110,108,121,32,117,110,112,97,99,107,10,47,47,32,99,111,112,105,101,100,32,118,97,108,117,101,115,32,102,114,111,109,32,116,104,97,116,32,97,117,116,104,111,114,105,116,97,116,105,118,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46,10,102,117,110,99,116,105,111,110,32,98,97,115,101,110,97,109,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,97,115,101,110,97,109,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,105,114,110,97,109,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,110,97,109,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,116,104,95,106,111,105,110,40,98,97,115,101,32,58,32,115,116,114,105,110,103,44,32,99,104,105,108,100,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,106,111,105,110,44,32,100,118,97,108,40,98,97,115,101,41,44,32,99,104,105,108,100,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,116,104,95,114,101,97,108,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,114,101,97,108,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,116,104,95,105,115,95,119,105,116,104,105,110,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,114,111,111,116,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,105,115,95,119,105,116,104,105,110,44,32,100,118,97,108,40,112,97,116,104,41,44,32,114,111,111,116,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,101,120,112,97,110,100,95,112,97,116,104,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,101,120,112,97,110,100,95,112,97,116,104,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,101,120,112,97,110,100,95,112,97,116,104,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,114,101,108,97,116,105,118,101,95,116,111,95,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,101,120,112,97,110,100,95,112,97,116,104,44,32,100,118,97,108,40,112,97,116,104,41,44,32,114,101,108,97,116,105,118,101,95,116,111,95,112,97,116,104,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,103,101,116,95,99,111,110,116,101,110,116,115,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,103,101,116,95,99,111,110,116,101,110,116,115,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,112,117,116,95,99,111,110,116,101,110,116,115,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,99,111,110,116,101,110,116,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,112,117,116,95,99,111,110,116,101,110,116,115,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,99,111,110,116,101,110,116,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,97,112,112,101,110,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,99,111,110,116,101,110,116,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,97,112,112,101,110,100,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,99,111,110,116,101,110,116,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,97,112,112,101,110,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,102,105,114,115,116,32,58,32,115,116,114,105,110,103,44,32,115,101,99,111,110,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,102,105,108,101,95,97,112,112,101,110,100,40,112,97,116,104,44,32,102,105,114,115,116,32,43,32,115,101,99,111,110,100,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,97,112,112,101,110,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,102,105,114,115,116,32,58,32,115,116,114,105,110,103,44,32,115,101,99,111,110,100,32,58,32,115,116,114,105,110,103,44,32,116,104,105,114,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,102,105,108,101,95,97,112,112,101,110,100,40,112,97,116,104,44,32,102,105,114,115,116,32,43,32,115,101,99,111,110,100,32,43,32,116,104,105,114,100,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,112,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,117,54,52,44,32,108,101,110,103,116,104,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,112,114,101,97,100,40,104,97,110,100,108,101,44,32,111,102,102,115,101,116,44,32,108,101,110,103,116,104,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,112,119,114,105,116,101,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,117,54,52,44,32,100,97,116,97,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,112,119,114,105,116,101,40,104,97,110,100,108,101,44,32,111,102,102,115,101,116,44,32,100,97,116,97,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,99,111,112,121,40,102,114,111,109,32,58,32,115,116,114,105,110,103,44,32,116,111,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,99,111,112,121,44,32,100,118,97,108,40,102,114,111,109,41,44,32,116,111,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,114,101,110,97,109,101,40,102,114,111,109,32,58,32,115,116,114,105,110,103,44,32,116,111,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,114,101,110,97,109,101,44,32,100,118,97,108,40,102,114,111,109,41,44,32,116,111,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,115,116,97,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,115,116,97,116,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,109,116,105,109,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,109,116,105,109,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,101,120,105,115,116,115,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,101,120,105,115,116,115,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,116,114,117,110,99,97,116,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,115,105,122,101,32,58,32,117,54,52,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,116,114,117,110,99,97,116,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,115,105,122,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,99,104,109,111,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,109,111,100,101,32,58,32,115,51,50,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,99,104,109,111,100,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,109,111,100,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,115,121,109,108,105,110,107,40,116,97,114,103,101,116,32,58,32,115,116,114,105,110,103,44,32,108,105,110,107,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,115,121,109,108,105,110,107,44,32,100,118,97,108,40,116,97,114,103,101,116,41,44,32,108,105,110,107,112,97,116,104,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,108,115,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,108,115,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,107,100,105,114,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,109,107,100,105,114,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,105,114,95,108,105,115,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,95,108,105,115,116,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,105,114,95,114,101,109,111,118,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,95,114,101,109,111,118,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,105,114,95,114,101,109,111,118,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,114,101,99,117,114,115,105,118,101,32,58,32,98,111,111,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,95,114,101,109,111,118,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,114,101,99,117,114,115,105,118,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,119,100,95,103,101,116,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,99,119,100,95,103,101,116,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,119,100,95,115,101,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,99,119,100,95,115,101,116,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,10,47,47,32,82,101,113,117,101,115,116,47,119,111,114,107,115,112,97,99,101,32,111,112,101,114,97,116,105,111,110,115,32,99,114,111,115,115,32,116,104,101,32,99,111,112,105,101,100,45,68,86,97,108,117,101,32,109,101,109,98,114,97,110,101,46,32,32,84,104,101,32,99,111,114,101,32,111,119,110,115,10,47,47,32,116,104,101,32,108,105,118,101,32,82,101,113,117,101,115,116,32,97,110,100,32,97,108,108,32,115,101,115,115,105,111,110,44,32,114,111,117,116,105,110,103,44,32,97,110,100,32,114,101,115,112,111,110,115,101,32,112,111,108,105,99,121,46,10,102,117,110,99,116,105,111,110,32,111,98,95,115,116,97,114,116,40,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,115,116,97,114,116,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,111,98,95,99,108,111,115,101,40,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,99,108,111,115,101,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,111,98,95,103,101,116,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,103,101,116,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,111,98,95,103,101,116,95,99,108,111,115,101,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,103,101,116,95,99,108,111,115,101,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,115,112,111,110,115,101,95,115,116,97,116,117,115,40,99,111,100,101,32,58,32,115,51,50,41,32,123,32,114,101,115,112,111,110,115,101,95,115,116,97,116,117,115,40,99,111,100,101,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,115,112,111,110,115,101,95,115,116,97,116,117,115,40,99,111,100,101,32,58,32,115,51,50,44,32,114,101,97,115,111,110,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,115,112,111,110,115,101,95,115,116,97,116,117,115,44,32,100,118,97,108,40,99,111,100,101,41,44,32,114,101,97,115,111,110,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,100,105,114,101,99,116,40,117,114,108,32,58,32,115,116,114,105,110,103,41,32,123,32,114,101,100,105,114,101,99,116,40,117,114,108,44,32,51,48,50,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,100,105,114,101,99,116,40,117,114,108,32,58,32,115,116,114,105,110,103,44,32,99,111,100,101,32,58,32,115,51,50,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,100,105,114,101,99,116,44,32,100,118,97,108,40,117,114,108,41,44,32,34,34,44,32,100,118,97,108,40,99,111,100,101,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,115,116,97,114,116,40,41,32,115,116,114,105,110,103,32,123,32,115,101,115,115,105,111,110,95,115,116,97,114,116,40,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,115,116,97,114,116,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,115,116,97,114,116,44,32,100,118,97,108,40,110,97,109,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,115,101,116,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,115,101,116,44,32,100,118,97,108,40,107,101,121,41,44,32,34,115,101,116,34,44,32,100,118,97,108,40,118,97,108,117,101,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,114,101,109,111,118,101,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,115,101,116,44,32,100,118,97,108,40,107,101,121,41,44,32,34,114,101,109,111,118,101,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,115,112,111,110,115,101,95,99,111,111,107,105,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,115,112,111,110,115,101,95,99,111,111,107,105,101,44,32,100,118,97,108,40,110,97,109,101,41,44,32,34,34,44,32,100,118,97,108,40,118,97,108,117,101,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,100,101,115,116,114,111,121,40,41,32,123,32,115,101,115,115,105,111,110,95,100,101,115,116,114,111,121,40,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,100,101,115,116,114,111,121,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,100,101,115,116,114,111,121,44,32,100,118,97,108,40,110,97,109,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,105,100,95,99,114,101,97,116,101,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,105,100,95,99,114,101,97,116,101,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,116,111,107,101,110,40,41,32,115,116,114,105,110,103,32,123,32,99,115,114,102,95,116,111,107,101,110,40,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,116,111,107,101,110,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,99,115,114,102,95,116,111,107,101,110,40,115,101,115,115,105,111,110,95,110,97,109,101,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,116,111,107,101,110,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,116,111,107,101,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,116,111,107,101,110,44,32,100,118,97,108,40,115,101,115,115,105,111,110,95,110,97,109,101,41,44,32,116,111,107,101,110,95,110,97,109,101,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,118,97,108,105,100,40,115,117,98,109,105,116,116,101,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,99,115,114,102,95,118,97,108,105,100,40,115,117,98,109,105,116,116,101,100,44,32,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,118,97,108,105,100,40,115,117,98,109,105,116,116,101,100,32,58,32,115,116,114,105,110,103,44,32,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,99,115,114,102,95,118,97,108,105,100,40,115,117,98,109,105,116,116,101,100,44,32,115,101,115,115,105,111,110,95,110,97,109,101,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,118,97,108,105,100,40,115,117,98,109,105,116,116,101,100,32,58,32,115,116,114,105,110,103,44,32,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,116,111,107,101,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,118,97,108,105,100,44,32,100,118,97,108,40,115,117,98,109,105,116,116,101,100,41,44,32,115,101,115,115,105,111,110,95,110,97,109,101,44,32,100,118,97,108,40,116,111,107,101,110,95,110,97,109,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,114,111,116,97,116,101,40,41,32,123,32,99,115,114,102,95,114,111,116,97,116,101,40,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,114,111,116,97,116,101,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,123,32,99,115,114,102,95,114,111,116,97,116,101,40,115,101,115,115,105,111,110,95,110,97,109,101,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,114,111,116,97,116,101,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,116,111,107,101,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,114,111,116,97,116,101,44,32,100,118,97,108,40,115,101,115,115,105,111,110,95,110,97,109,101,41,44,32,116,111,107,101,110,95,110,97,109,101,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,102,105,101,108,100,40,41,32,115,116,114,105,110,103,32,123,32,99,115,114,102,95,102,105,101,108,100,40,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,44,32,34,99,115,114,102,95,116,111,107,101,110,34,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,102,105,101,108,100,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,99,115,114,102,95,102,105,101,108,100,40,115,101,115,115,105,111,110,95,110,97,109,101,44,32,34,99,115,114,102,95,116,111,107,101,110,34,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,102,105,101,108,100,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,116,111,107,101,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,99,115,114,102,95,102,105,101,108,100,40,115,101,115,115,105,111,110,95,110,97,109,101,44,32,116,111,107,101,110,95,110,97,109,101,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,102,105,101,108,100,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,116,111,107,101,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,102,105,101,108,100,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,102,105,101,108,100,44,32,100,118,97,108,40,115,101,115,115,105,111,110,95,110,97,109,101,41,44,32,116,111,107,101,110,95,110,97,109,101,44,32,100,118,97,108,40,102,105,101,108,100,95,110,97,109,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,108,105,95,105,110,112,117,116,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,108,105,95,105,110,112,117,116,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,108,105,95,97,114,103,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,99,108,105,95,97,114,103,40,107,101,121,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,108,105,95,97,114,103,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,108,105,95,97,114,103,44,32,100,118,97,108,40,107,101,121,41,44,32,102,97,108,108,98,97,99,107,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,98,97,115,101,95,117,114,108,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,98,97,115,101,95,117,114,108,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,115,99,114,105,112,116,95,117,114,108,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,115,99,114,105,112,116,95,117,114,108,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,112,97,116,104,40,41,32,115,116,114,105,110,103,32,123,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,112,97,116,104,40,34,105,110,100,101,120,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,112,97,116,104,40,100,101,102,97,117,108,116,95,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,113,117,101,114,121,95,112,97,116,104,44,32,100,118,97,108,40,34,34,41,44,32,100,101,102,97,117,108,116,95,112,97,116,104,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,114,111,117,116,101,40,41,32,100,118,97,108,32,123,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,114,111,117,116,101,40,34,105,110,100,101,120,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,114,111,117,116,101,40,100,101,102,97,117,108,116,95,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,113,117,101,114,121,95,114,111,117,116,101,44,32,100,118,97,108,40,34,34,41,44,32,100,101,102,97,117,108,116,95,112,97,116,104,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,114,111,117,116,101,95,102,114,111,109,95,114,97,119,95,112,97,116,104,40,114,97,119,95,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,114,101,113,117,101,115,116,95,114,111,117,116,101,95,102,114,111,109,95,114,97,119,95,112,97,116,104,40,114,97,119,95,112,97,116,104,44,32,34,105,110,100,101,120,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,114,111,117,116,101,95,102,114,111,109,95,114,97,119,95,112,97,116,104,40,114,97,119,95,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,100,101,102,97,117,108,116,95,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,114,111,117,116,101,95,102,114,111,109,95,114,97,119,95,112,97,116,104,44,32,100,118,97,108,40,114,97,119,95,112,97,116,104,41,44,32,100,101,102,97,117,108,116,95,112,97,116,104,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,112,101,114,102,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,112,101,114,102,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,10,102,117,110,99,116,105,111,110,32,103,101,110,95,115,104,97,49,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,103,101,110,95,115,104,97,49,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,115,104,97,49,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,97,115,95,98,105,110,97,114,121,32,58,32,98,111,111,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,103,101,110,95,115,104,97,49,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,97,115,95,98,105,110,97,114,121,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,104,97,50,53,54,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,115,104,97,50,53,54,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,104,97,50,53,54,95,104,101,120,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,115,104,97,50,53,54,95,104,101,120,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,104,109,97,99,95,115,104,97,50,53,54,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,104,109,97,99,95,115,104,97,50,53,54,44,32,100,118,97,108,40,107,101,121,41,44,32,34,34,44,32,100,118,97,108,40,118,97,108,117,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,104,109,97,99,95,115,104,97,50,53,54,95,104,101,120,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,104,109,97,99,95,115,104,97,50,53,54,95,104,101,120,44,32,100,118,97,108,40,107,101,121,41,44,32,34,34,44,32,100,118,97,108,40,118,97,108,117,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,114,121,112,116,111,95,101,113,117,97,108,40,108,101,102,116,32,58,32,115,116,114,105,110,103,44,32,114,105,103,104,116,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,99,114,121,112,116,111,95,101,113,117,97,108,44,32,100,118,97,108,40,108,101,102,116,41,44,32,34,34,44,32,100,118,97,108,40,114,105,103,104,116,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,115,115,119,111,114,100,95,104,97,115,104,40,112,97,115,115,119,111,114,100,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,104,97,115,104,44,32,100,118,97,108,40,112,97,115,115,119,111,114,100,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,115,115,119,111,114,100,95,118,101,114,105,102,121,40,112,97,115,115,119,111,114,100,32,58,32,115,116,114,105,110,103,44,32,101,110,99,111,100,101,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,118,101,114,105,102,121,44,32,100,118,97,108,40,112,97,115,115,119,111,114,100,41,44,32,34,34,44,32,100,118,97,108,40,101,110,99,111,100,101,100,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,115,115,119,111,114,100,95,110,101,101,100,115,95,114,101,104,97,115,104,40,101,110,99,111,100,101,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,110,101,101,100,115,95,114,101,104,97,115,104,44,32,100,118,97,108,40,101,110,99,111,100,101,100,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,99,111,110,110,101,99,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,99,111,110,110,101,99,116,40,112,97,116,104,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,101,114,114,111,114,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,101,114,114,111,114,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,113,117,101,114,121,40,104,97,110,100,108,101,44,32,113,117,101,114,121,44,32,100,118,97,108,40,123,58,125,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,44,32,112,97,114,97,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,113,117,101,114,121,40,104,97,110,100,108,101,44,32,113,117,101,114,121,44,32,112,97,114,97,109,115,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,41,32,125,10,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,99,111,110,110,101,99,116,40,104,111,115,116,32,58,32,115,116,114,105,110,103,44,32,117,115,101,114,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,97,115,115,119,111,114,100,32,58,32,115,116,114,105,110,103,44,32,100,97,116,97,98,97,115,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,99,111,110,110,101,99,116,40,104,111,115,116,44,32,117,115,101,114,110,97,109,101,44,32,112,97,115,115,119,111,114,100,44,32,100,97,116,97,98,97,115,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,99,111,110,110,101,99,116,101,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,99,111,110,110,101,99,116,101,100,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,101,114,114,111,114,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,101,114,114,111,114,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,101,115,99,97,112,101,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,109,121,115,113,108,95,101,115,99,97,112,101,95,100,101,102,97,117,108,116,40,114,97,119,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,101,115,99,97,112,101,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,113,117,111,116,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,101,115,99,97,112,101,40,114,97,119,44,32,113,117,111,116,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,101,115,99,97,112,101,95,100,101,102,97,117,108,116,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,101,115,99,97,112,101,40,114,97,119,44,32,34,39,34,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,113,117,101,114,121,40,104,97,110,100,108,101,44,32,113,117,101,114,121,44,32,100,118,97,108,40,123,58,125,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,44,32,112,97,114,97,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,113,117,101,114,121,40,104,97,110,100,108,101,44,32,113,117,101,114,121,44,32,112,97,114,97,109,115,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,41,32,125,10,10,102,117,110,99,116,105,111,110,32,114,97,110,100,111,109,95,98,121,116,101,115,40,99,111,117,110,116,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,97,110,100,111,109,95,98,121,116,101,115,40,99,111,117,110,116,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,51,50,40,105,110,100,101,120,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,51,50,40,105,110,100,101,120,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,51,50,40,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,51,50,40,105,110,100,101,120,44,32,115,101,101,100,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,54,52,40,105,110,100,101,120,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,54,52,44,32,105,110,100,101,120,44,32,48,117,54,52,44,32,48,117,54,52,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,54,52,40,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,54,52,44,32,105,110,100,101,120,44,32,115,101,101,100,44,32,48,117,54,52,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,48,49,40,105,110,100,101,120,32,58,32,117,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,48,49,44,32,48,46,48,44,32,48,46,48,44,32,105,110,100,101,120,44,32,48,117,54,52,44,32,48,46,48,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,48,49,40,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,48,49,44,32,48,46,48,44,32,48,46,48,44,32,105,110,100,101,120,44,32,115,101,101,100,44,32,48,46,48,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,105,110,116,40,102,114,111,109,32,58,32,117,54,52,44,32,116,111,32,58,32,117,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,105,110,116,44,32,102,114,111,109,44,32,116,111,44,32,105,110,100,101,120,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,105,110,116,40,102,114,111,109,32,58,32,117,54,52,44,32,116,111,32,58,32,117,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,105,110,116,44,32,102,114,111,109,44,32,116,111,44,32,105,110,100,101,120,44,32,115,101,101,100,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,102,108,111,97,116,40,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,102,108,111,97,116,44,32,102,114,111,109,44,32,116,111,44,32,105,110,100,101,120,44,32,48,117,54,52,44,32,48,46,48,48,48,48,48,48,48,48,48,48,48,49,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,102,108,111,97,116,40,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,102,108,111,97,116,44,32,102,114,111,109,44,32,116,111,44,32,105,110,100,101,120,44,32,115,101,101,100,44,32,48,46,48,48,48,48,48,48,48,48,48,48,48,49,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,102,108,111,97,116,40,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,44,32,112,114,101,99,105,115,105,111,110,32,58,32,102,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,102,108,111,97,116,44,32,102,114,111,109,44,32,116,111,44,32,105,110,100,101,120,44,32,115,101,101,100,44,32,112,114,101,99,105,115,105,111,110,41,32,125,10,102,117,110,99,116,105,111,110,32,100,114,97,119,95,105,110,116,40,102,114,111,109,32,58,32,117,54,52,44,32,116,111,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,100,114,97,119,95,105,110,116,44,32,102,114,111,109,44,32,116,111,44,32,48,117,54,52,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,100,114,97,119,95,102,108,111,97,116,40,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,100,114,97,119,95,102,108,111,97,116,44,32,102,114,111,109,44,32,116,111,44,32,48,117,54,52,44,32,48,117,54,52,44,32,48,46,48,48,48,48,48,48,48,48,48,48,48,49,41,32,125,10,102,117,110,99,116,105,111,110,32,100,114,97,119,95,102,108,111,97,116,40,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,44,32,112,114,101,99,105,115,105,111,110,32,58,32,102,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,100,114,97,119,95,102,108,111,97,116,44,32,102,114,111,109,44,32,116,111,44,32,48,117,54,52,44,32,48,117,54,52,44,32,112,114,101,99,105,115,105,111,110,41,32,125,10,10,47,47,32,67,97,99,104,101,32,97,110,100,32,112,114,111,99,101,115,115,32,112,111,108,105,99,121,32,114,101,109,97,105,110,115,32,105,110,32,115,121,115,46,99,112,112,47,119,111,114,107,101,114,59,32,67,97,112,121,32,112,97,115,115,101,115,32,99,111,112,105,101,100,32,118,97,108,117,101,115,46,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,99,111,110,110,101,99,116,40,41,32,117,54,52,32,123,32,109,101,109,99,97,99,104,101,95,99,111,110,110,101,99,116,40,34,49,50,55,46,48,46,48,46,49,34,44,32,49,49,50,49,49,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,99,111,110,110,101,99,116,40,104,111,115,116,32,58,32,115,116,114,105,110,103,44,32,112,111,114,116,32,58,32,115,51,50,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,99,111,110,110,101,99,116,44,32,100,118,97,108,40,104,111,115,116,41,44,32,34,34,44,32,100,118,97,108,40,112,111,114,116,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,99,111,109,109,97,110,100,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,99,111,109,109,97,110,100,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,99,111,109,109,97,110,100,44,32,100,118,97,108,40,99,111,110,110,101,99,116,105,111,110,41,44,32,99,111,109,109,97,110,100,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,115,101,116,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,109,101,109,99,97,99,104,101,95,115,101,116,40,99,111,110,110,101,99,116,105,111,110,44,32,107,101,121,44,32,118,97,108,117,101,44,32,51,54,48,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,115,101,116,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,101,120,112,105,114,101,115,95,105,110,32,58,32,117,54,52,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,115,101,116,44,32,100,118,97,108,40,99,111,110,110,101,99,116,105,111,110,41,44,32,107,101,121,44,32,100,118,97,108,40,123,34,118,97,108,117,101,34,58,32,118,97,108,117,101,44,32,34,101,120,112,105,114,101,115,34,58,32,101,120,112,105,114,101,115,95,105,110,125,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,100,101,108,101,116,101,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,100,101,108,101,116,101,44,32,100,118,97,108,40,99,111,110,110,101,99,116,105,111,110,41,44,32,107,101,121,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,103,101,116,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,109,101,109,99,97,99,104,101,95,103,101,116,40,99,111,110,110,101,99,116,105,111,110,44,32,107,101,121,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,103,101,116,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,100,101,102,97,117,108,116,95,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,103,101,116,44,32,100,118,97,108,40,99,111,110,110,101,99,116,105,111,110,41,44,32,107,101,121,44,32,100,118,97,108,40,100,101,102,97,117,108,116,95,118,97,108,117,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,103,101,116,95,109,117,108,116,105,112,108,101,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,103,101,116,95,109,117,108,116,105,112,108,101,44,32,100,118,97,108,40,99,111,110,110,101,99,116,105,111,110,41,44,32,34,34,44,32,107,101,121,115,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,44,32,100,118,97,108,40,107,101,121,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,115,40,107,101,121,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,115,44,32,107,101,121,115,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,10,102,117,110,99,116,105,111,110,32,115,104,101,108,108,95,101,115,99,97,112,101,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,101,115,99,97,112,101,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,104,101,108,108,95,101,120,101,99,40,99,111,109,109,97,110,100,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,101,120,101,99,44,32,100,118,97,108,40,99,111,109,109,97,110,100,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,47,47,32,74,111,98,32,73,68,115,32,114,101,109,97,105,110,32,99,111,112,105,101,100,32,68,86,97,108,117,101,115,32,105,110,32,67,97,112,121,32,115,111,32,116,104,101,32,104,111,115,116,39,115,32,101,120,97,99,116,32,117,54,52,32,114,101,103,105,115,116,114,121,32,73,68,115,10,47,47,32,110,101,118,101,114,32,99,114,111,115,115,32,97,32,108,111,115,115,121,32,115,99,97,108,97,114,32,99,111,110,118,101,114,115,105,111,110,46,10,102,117,110,99,116,105,111,110,32,115,104,101,108,108,95,115,112,97,119,110,40,115,112,101,99,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,115,112,97,119,110,44,32,115,112,101,99,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,98,95,115,116,97,116,117,115,40,106,111,98,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,115,116,97,116,117,115,44,32,106,111,98,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,98,95,114,101,115,117,108,116,40,106,111,98,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,114,101,115,117,108,116,44,32,106,111,98,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,98,95,97,119,97,105,116,40,106,111,98,32,58,32,100,118,97,108,44,32,116,105,109,101,111,117,116,95,109,115,32,58,32,115,51,50,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,97,119,97,105,116,44,32,106,111,98,44,32,34,34,44,32,100,118,97,108,40,116,105,109,101,111,117,116,95,109,115,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,98,95,99,97,110,99,101,108,40,106,111,98,32,58,32,100,118,97,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,99,97,110,99,101,108,44,32,106,111,98,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,114,111,99,101,115,115,95,115,116,97,114,116,95,100,105,114,101,99,116,111,114,121,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,112,114,111,99,101,115,115,95,115,116,97,114,116,95,100,105,114,101,99,116,111,114,121,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,114,118,101,114,95,115,116,97,114,116,95,104,116,116,112,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,98,105,110,100,32,58,32,115,116,114,105,110,103,44,32,102,105,108,101,32,58,32,115,116,114,105,110,103,41,32,115,51,50,32,123,32,115,101,114,118,101,114,95,115,116,97,114,116,95,104,116,116,112,40,107,101,121,44,32,98,105,110,100,44,32,102,105,108,101,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,114,118,101,114,95,115,116,97,114,116,95,104,116,116,112,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,98,105,110,100,32,58,32,115,116,114,105,110,103,44,32,102,105,108,101,32,58,32,115,116,114,105,110,103,44,32,99,97,108,108,98,97,99,107,32,58,32,115,116,114,105,110,103,41,32,115,51,50,32,123,32,100,118,97,108,95,115,51,50,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,101,114,118,101,114,95,115,116,97,114,116,95,104,116,116,112,44,32,100,118,97,108,40,107,101,121,41,44,32,98,105,110,100,44,32,100,118,97,108,40,123,34,102,105,108,101,34,58,32,102,105,108,101,44,32,34,102,117,110,99,116,105,111,110,34,58,32,99,97,108,108,98,97,99,107,125,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,114,118,101,114,95,115,116,111,112,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,101,114,118,101,114,95,115,116,111,112,44,32,100,118,97,108,40,107,101,121,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,97,115,107,95,112,105,100,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,51,50,32,123,32,100,118,97,108,95,115,51,50,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,112,105,100,44,32,100,118,97,108,40,107,101,121,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,97,115,107,95,107,105,108,108,40,112,105,100,32,58,32,115,51,50,41,32,115,51,50,32,123,32,116,97,115,107,95,107,105,108,108,40,112,105,100,44,32,48,41,32,125,10,102,117,110,99,116,105,111,110,32,116,97,115,107,95,107,105,108,108,40,112,105,100,32,58,32,115,51,50,44,32,115,105,103,110,97,108,32,58,32,115,51,50,41,32,115,51,50,32,123,32,100,118,97,108,95,115,51,50,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,107,105,108,108,44,32,100,118,97,108,40,112,105,100,41,44,32,34,34,44,32,100,118,97,108,40,115,105,103,110,97,108,41,41,41,32,125,10,10,47,47,32,78,101,116,119,111,114,107,32,114,101,115,111,117,114,99,101,115,32,114,101,109,97,105,110,32,114,101,113,117,101,115,116,45,111,119,110,101,100,32,98,121,32,116,104,101,32,119,111,114,107,115,112,97,99,101,46,32,72,97,110,100,108,101,115,32,97,114,101,32,101,110,99,111,100,101,100,10,47,47,32,97,115,32,100,101,99,105,109,97,108,32,68,86,97,108,117,101,115,32,97,116,32,116,104,101,32,66,82,82,66,32,98,111,117,110,100,97,114,121,44,32,116,104,101,110,32,112,97,114,115,101,100,32,101,120,97,99,116,108,121,32,97,115,32,117,54,52,32,118,97,108,117,101,115,46,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,99,111,110,110,101,99,116,40,104,111,115,116,32,58,32,115,116,114,105,110,103,44,32,112,111,114,116,32,58,32,115,51,50,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,99,111,110,110,101,99,116,44,32,100,118,97,108,40,104,111,115,116,41,44,32,34,34,44,32,100,118,97,108,40,112,111,114,116,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,99,108,111,115,101,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,99,108,111,115,101,44,32,100,118,97,108,40,104,97,110,100,108,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,119,114,105,116,101,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,100,97,116,97,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,119,114,105,116,101,44,32,100,118,97,108,40,104,97,110,100,108,101,41,44,32,100,97,116,97,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,115,111,99,107,101,116,95,114,101,97,100,40,104,97,110,100,108,101,44,32,49,51,49,48,55,50,44,32,49,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,109,97,120,95,108,101,110,103,116,104,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,115,111,99,107,101,116,95,114,101,97,100,40,104,97,110,100,108,101,44,32,109,97,120,95,108,101,110,103,116,104,44,32,49,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,109,97,120,95,108,101,110,103,116,104,32,58,32,115,51,50,44,32,116,105,109,101,111,117,116,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,114,101,97,100,44,32,100,118,97,108,40,104,97,110,100,108,101,41,44,32,34,34,44,32,100,118,97,108,40,123,34,109,97,120,95,108,101,110,103,116,104,34,58,32,109,97,120,95,108,101,110,103,116,104,44,32,34,116,105,109,101,111,117,116,34,58,32,116,105,109,101,111,117,116,125,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,104,116,116,112,95,114,101,113,117,101,115,116,40,114,101,113,117,101,115,116,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,114,101,113,117,101,115,116,44,32,114,101,113,117,101,115,116,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,104,116,116,112,95,114,101,113,117,101,115,116,95,97,115,121,110,99,40,114,101,113,117,101,115,116,32,58,32,100,118,97,108,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,114,101,113,117,101,115,116,95,97,115,121,110,99,44,32,114,101,113,117,101,115,116,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,44,32,48,117,54,52,41,32,125,10,10,47,47,32,67,43,43,32,117,110,105,116,47,99,111,109,112,111,110,101,110,116,32,112,111,108,105,99,121,32,114,101,109,97,105,110,115,32,105,110,32,116,104,101,32,101,120,105,115,116,105,110,103,32,119,111,114,107,115,112,97,99,101,32,100,105,115,112,97,116,99,104,101,114,46,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,44,32,112,114,111,112,115,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,99,97,108,108,40,102,105,108,101,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,102,117,110,99,116,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,117,110,105,116,95,99,97,108,108,40,102,105,108,101,95,110,97,109,101,44,32,102,117,110,99,116,105,111,110,95,110,97,109,101,44,32,100,118,97,108,40,34,34,41,41,32,125,10,10,47,47,32,84,105,109,101,32,112,97,114,115,105,110,103,47,102,111,114,109,97,116,116,105,110,103,32,115,116,97,121,115,32,105,110,32,115,121,115,46,99,112,112,59,32,117,54,52,32,118,97,108,117,101,115,32,99,114,111,115,115,32,66,82,82,66,32,97,115,32,101,120,97,99,116,32,116,101,120,116,46,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,112,97,114,115,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,102,111,114,109,97,116,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,112,97,114,115,101,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,40,41,32,115,116,114,105,110,103,32,123,32,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,40,34,34,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,40,102,111,114,109,97,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,40,102,111,114,109,97,116,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,40,102,111,114,109,97,116,32,58,32,115,116,114,105,110,103,44,32,116,105,109,101,115,116,97,109,112,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,102,111,114,109,97,116,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,44,32,100,118,97,108,40,102,111,114,109,97,116,41,44,32,34,34,44,32,100,118,97,108,40,116,105,109,101,115,116,97,109,112,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,40,41,32,115,116,114,105,110,103,32,123,32,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,40,34,34,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,40,102,111,114,109,97,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,40,102,111,114,109,97,116,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,40,102,111,114,109,97,116,32,58,32,115,116,114,105,110,103,44,32,116,105,109,101,115,116,97,109,112,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,102,111,114,109,97,116,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,44,32,100,118,97,108,40,102,111,114,109,97,116,41,44,32,34,34,44,32,100,118,97,108,40,116,105,109,101,115,116,97,109,112,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,114,101,108,97,116,105,118,101,40,116,105,109,101,115,116,97,109,112,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,116,105,109,101,95,102,111,114,109,97,116,95,114,101,108,97,116,105,118,101,40,116,105,109,101,115,116,97,109,112,44,32,34,34,44,32,48,117,54,52,44,32,34,34,44,32,48,117,54,52,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,114,101,108,97,116,105,118,101,40,116,105,109,101,115,116,97,109,112,32,58,32,117,54,52,44,32,118,101,114,121,95,114,101,99,101,110,116,32,58,32,115,116,114,105,110,103,44,32,109,101,100,105,117,109,95,115,101,99,111,110,100,115,32,58,32,117,54,52,44,32,109,101,100,105,117,109,95,114,101,99,101,110,116,32,58,32,115,116,114,105,110,103,44,32,110,111,116,95,114,101,99,101,110,116,95,115,101,99,111,110,100,115,32,58,32,117,54,52,44,32,110,111,116,95,114,101,99,101,110,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,102,111,114,109,97,116,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,114,101,108,97,116,105,118,101,44,32,100,118,97,108,40,116,105,109,101,115,116,97,109,112,41,44,32,118,101,114,121,95,114,101,99,101,110,116,44,32,100,118,97,108,40,123,34,109,101,100,105,117,109,95,115,101,99,111,110,100,115,34,58,32,109,101,100,105,117,109,95,115,101,99,111,110,100,115,44,32,34,109,101,100,105,117,109,95,114,101,99,101,110,116,34,58,32,109,101,100,105,117,109,95,114,101,99,101,110,116,44,32,34,110,111,116,95,114,101,99,101,110,116,95,115,101,99,111,110,100,115,34,58,32,110,111,116,95,114,101,99,101,110,116,95,115,101,99,111,110,100,115,44,32,34,110,111,116,95,114,101,99,101,110,116,34,58,32,110,111,116,95,114,101,99,101,110,116,125,41,41,41,32,125,10,10,102,117,110,99,116,105,111,110,32,119,115,95,99,111,110,110,101,99,116,105,111,110,115,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,114,101,103,105,115,116,114,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,115,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,111,110,110,101,99,116,105,111,110,115,40,115,99,111,112,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,114,101,103,105,115,116,114,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,115,44,32,100,118,97,108,40,115,99,111,112,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,111,110,110,101,99,116,105,111,110,95,99,111,117,110,116,40,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,114,101,103,105,115,116,114,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,95,99,111,117,110,116,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,111,110,110,101,99,116,105,111,110,95,99,111,117,110,116,40,115,99,111,112,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,114,101,103,105,115,116,114,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,95,99,111,117,110,116,44,32,100,118,97,108,40,115,99,111,112,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,44,32,48,117,54,52,41,32,125,10,10,47,47,32,68,105,114,101,99,116,32,98,121,116,101,45,115,112,97,110,32,97,100,97,112,116,101,114,115,32,114,101,109,97,105,110,32,112,114,105,118,97,116,101,59,32,112,117,98,108,105,99,32,110,97,109,101,115,32,98,101,108,111,119,32,116,104,105,115,32,98,111,117,110,100,97,114,121,32,97,114,101,10,47,47,32,111,114,100,105,110,97,114,121,32,100,101,99,108,97,114,97,116,105,111,110,115,32,115,101,108,101,99,116,101,100,32,102,114,111,109,32,116,104,105,115,32,115,111,117,114,99,101,32,119,105,116,104,32,117,115,101,114,45,99,97,108,108,32,112,114,111,118,101,110,97,110,99,101,46,10,102,117,110,99,116,105,111,110,32,97,114,114,97,121,95,109,101,114,103,101,40,108,101,102,116,32,58,32,100,118,97,108,44,32,114,105,103,104,116,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,109,101,114,103,101,95,98,114,114,98,40,108,101,102,116,44,32,114,105,103,104,116,41,32,125,10,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,112,97,114,97,109,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,112,97,114,97,109,44,32,107,101,121,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,103,101,116,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,103,101,116,44,32,107,101,121,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,112,111,115,116,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,112,111,115,116,44,32,107,101,121,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,99,111,111,107,105,101,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,99,111,111,107,105,101,44,32,107,101,121,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,44,32,107,101,121,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,98,111,100,121,40,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,98,111,100,121,40,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,95,98,114,114,98,40,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,40,118,97,108,117,101,32,58,32,114,101,113,117,101,115,116,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,95,102,111,114,95,98,114,114,98,40,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,115,112,111,110,115,101,95,104,101,97,100,101,114,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,123,32,105,102,32,33,95,95,98,101,97,114,101,114,95,114,101,115,112,111,110,115,101,95,115,101,116,95,104,101,97,100,101,114,40,110,97,109,101,44,32,118,97,108,117,101,41,32,123,32,116,114,97,112,40,41,32,125,32,125,10,10,102,117,110,99,116,105,111,110,32,119,115,95,109,101,115,115,97,103,101,40,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,109,101,115,115,97,103,101,40,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,111,110,110,101,99,116,105,111,110,95,105,100,40,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,99,111,110,110,101,99,116,105,111,110,95,105,100,40,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,115,99,111,112,101,40,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,115,99,111,112,101,40,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,111,112,99,111,100,101,40,41,32,115,51,50,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,111,112,99,111,100,101,40,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,105,115,95,98,105,110,97,114,121,40,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,105,115,95,98,105,110,97,114,121,40,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,115,101,110,100,40,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,40,109,101,115,115,97,103,101,44,32,98,105,110,97,114,121,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,115,101,110,100,40,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,44,32,115,99,111,112,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,95,115,99,111,112,101,40,109,101,115,115,97,103,101,44,32,98,105,110,97,114,121,44,32,115,99,111,112,101,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,115,101,110,100,95,116,111,40,99,111,110,110,101,99,116,105,111,110,95,105,100,32,58,32,115,116,114,105,110,103,44,32,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,95,116,111,40,99,111,110,110,101,99,116,105,111,110,95,105,100,44,32,109,101,115,115,97,103,101,44,32,98,105,110,97,114,121,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,108,111,115,101,40,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,99,108,111,115,101,40,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,108,111,115,101,40,99,111,110,110,101,99,116,105,111,110,95,105,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,99,108,111,115,101,40,99,111,110,110,101,99,116,105,111,110,95,105,100,41,32,125,10,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,95,112,114,111,112,115,95,98,114,114,98,40,110,97,109,101,44,32,112,114,111,112,115,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,95,98,121,116,101,115,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,95,112,114,111,112,115,95,98,114,114,98,40,110,97,109,101,44,32,112,114,111,112,115,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,101,120,105,115,116,115,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,101,120,105,115,116,115,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,114,101,115,111,108,118,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,115,111,108,118,101,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,114,101,110,100,101,114,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,114,101,110,100,101,114,95,98,121,116,101,115,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,108,111,97,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,109,111,100,117,108,101,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,108,111,97,100,40,112,97,116,104,41,32,125,10,102,117,110,99,116,105,111,110,32,99,97,108,108,40,104,97,110,100,108,101,32,58,32,109,111,100,117,108,101,44,32,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,99,97,108,108,40,104,97,110,100,108,101,44,32,110,97,109,101,44,32,100,118,97,108,40,123,58,125,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,97,108,108,40,104,97,110,100,108,101,32,58,32,109,111,100,117,108,101,44,32,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,105,110,112,117,116,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,109,111,100,117,108,101,95,99,97,108,108,95,98,114,114,98,40,104,97,110,100,108,101,44,32,110,97,109,101,44,32,105,110,112,117,116,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,99,97,108,108,40,102,105,108,101,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,102,117,110,99,116,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,99,97,108,108,95,98,114,114,98,40,102,105,108,101,95,110,97,109,101,44,32,102,117,110,99,116,105,111,110,95,110,97,109,101,44,32,112,114,111,112,115,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,105,110,102,111,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,105,110,102,111,95,98,114,114,98,40,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,105,110,102,111,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,105,110,102,111,95,98,114,114,98,40,112,97,116,104,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,115,95,108,105,115,116,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,115,95,108,105,115,116,95,98,114,114,98,40,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,99,111,109,112,105,108,101,40,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,99,111,109,112,105,108,101,40,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,99,111,109,112,105,108,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,99,111,109,112,105,108,101,40,112,97,116,104,41,32,125,10,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,109,97,116,99,104,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,109,97,116,99,104,40,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,109,97,116,99,104,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,109,97,116,99,104,40,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,102,108,97,103,115,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,101,97,114,99,104,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,101,97,114,99,104,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,102,108,97,103,115,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,101,97,114,99,104,95,97,108,108,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,95,97,108,108,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,101,97,114,99,104,95,97,108,108,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,95,97,108,108,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,102,108,97,103,115,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,114,101,112,108,97,99,101,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,114,101,112,108,97,99,101,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,114,101,112,108,97,99,101,109,101,110,116,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,114,101,112,108,97,99,101,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,114,101,112,108,97,99,101,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,114,101,112,108,97,99,101,109,101,110,116,44,32,102,108,97,103,115,41,32,125,10,10,102,117,110,99,116,105,111,110,32,98,97,115,101,54,52,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,98,97,115,101,54,52,95,101,110,99,111,100,101,44,32,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,98,97,115,101,54,52,95,100,101,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,98,97,115,101,54,52,95,100,101,99,111,100,101,44,32,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,117,114,105,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,117,114,105,95,101,110,99,111,100,101,44,32,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,117,114,105,95,100,101,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,117,114,105,95,100,101,99,111,100,101,44,32,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,106,115,111,110,95,100,101,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,106,115,111,110,95,100,101,99,111,100,101,44,32,118,97,108,117,101,41,32,125,10,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,111,112,101,110,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,109,111,100,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,111,112,101,110,40,112,97,116,104,44,32,109,111,100,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,99,111,117,110,116,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,114,101,97,100,40,104,97,110,100,108,101,44,32,99,111,117,110,116,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,119,114,105,116,101,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,119,114,105,116,101,40,104,97,110,100,108,101,44,32,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,115,101,101,107,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,115,54,52,44,32,119,104,101,110,99,101,32,58,32,115,54,52,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,115,101,101,107,40,104,97,110,100,108,101,44,32,111,102,102,115,101,116,44,32,119,104,101,110,99,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,116,101,108,108,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,116,101,108,108,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,102,115,121,110,99,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,102,115,121,110,99,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,99,108,111,115,101,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,99,108,111,115,101,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,116,101,109,112,40,112,114,101,102,105,120,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,116,101,109,112,40,112,114,101,102,105,120,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,117,110,108,105,110,107,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,117,110,108,105,110,107,40,112,97,116,104,41,32,125,10,10,102,117,110,99,116,105,111,110,32,116,105,109,101,40,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,116,105,109,101,40,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,112,114,101,99,105,115,101,40,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,112,114,101,99,105,115,101,40,41,32,125,10}; +inline constexpr char digest[] __attribute__((used)) = "4bb75bc80abd316c9b077fd2e1ddee59c0b90136271d73ff15f7f6aa3e0a4130"; +inline constexpr unsigned char source[] = {47,47,32,80,114,105,118,97,116,101,32,116,121,112,101,100,32,104,111,115,116,32,65,66,73,32,100,101,99,108,97,114,97,116,105,111,110,115,46,32,32,78,97,109,101,115,32,109,97,112,32,100,105,114,101,99,116,108,121,32,116,111,32,101,110,118,32,115,121,109,98,111,108,115,46,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,100,118,95,115,54,52,95,98,114,114,98,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,115,54,52,41,32,115,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,100,118,95,109,101,114,103,101,95,98,114,114,98,40,108,101,102,116,32,58,32,100,118,97,108,44,32,114,105,103,104,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,102,111,114,109,97,116,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,114,101,103,105,115,116,114,121,95,98,114,114,98,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,97,114,103,117,109,101,110,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,102,105,110,100,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,115,51,50,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,110,111,110,98,108,97,110,107,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,114,101,112,108,97,99,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,108,111,119,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,117,112,112,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,117,98,115,116,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,116,97,114,116,32,58,32,115,54,52,44,32,108,101,110,103,116,104,32,58,32,115,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,116,114,112,111,115,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,44,32,111,102,102,115,101,116,32,58,32,115,54,52,41,32,115,54,52,10,116,114,97,99,101,32,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,97,112,121,95,98,97,99,107,116,114,97,99,101,40,109,97,120,95,102,114,97,109,101,115,32,58,32,115,51,50,44,32,115,107,105,112,95,102,114,97,109,101,115,32,58,32,115,51,50,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,116,105,109,101,40,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,112,114,101,99,105,115,101,40,41,32,102,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,97,110,100,111,109,95,98,121,116,101,115,40,99,111,117,110,116,32,58,32,117,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,51,50,40,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,97,32,58,32,117,54,52,44,32,98,32,58,32,117,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,44,32,112,114,101,99,105,115,105,111,110,32,58,32,102,54,52,41,32,102,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,111,112,101,110,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,109,111,100,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,112,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,117,54,52,44,32,108,101,110,103,116,104,32,58,32,117,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,112,119,114,105,116,101,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,117,54,52,44,32,100,97,116,97,32,58,32,115,116,114,105,110,103,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,108,101,110,103,116,104,32,58,32,117,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,119,114,105,116,101,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,100,97,116,97,32,58,32,115,116,114,105,110,103,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,115,101,101,107,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,115,54,52,44,32,119,104,101,110,99,101,32,58,32,115,54,52,41,32,115,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,116,101,108,108,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,102,115,121,110,99,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,99,108,111,115,101,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,118,111,105,100,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,116,101,109,112,40,112,114,101,102,105,120,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,117,110,108,105,110,107,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,118,111,105,100,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,99,111,110,110,101,99,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,51,50,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,101,114,114,111,114,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,44,32,112,97,114,97,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,99,111,110,110,101,99,116,40,104,111,115,116,32,58,32,115,116,114,105,110,103,44,32,117,115,101,114,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,97,115,115,119,111,114,100,32,58,32,115,116,114,105,110,103,44,32,100,97,116,97,98,97,115,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,99,111,110,110,101,99,116,101,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,51,50,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,101,114,114,111,114,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,101,115,99,97,112,101,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,113,117,111,116,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,44,32,112,97,114,97,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,107,105,110,100,32,58,32,115,51,50,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,98,111,100,121,40,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,95,98,114,114,98,40,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,95,102,111,114,95,98,114,114,98,40,118,97,108,117,101,32,58,32,114,101,113,117,101,115,116,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,115,112,111,110,115,101,95,115,101,116,95,104,101,97,100,101,114,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,109,101,115,115,97,103,101,40,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,99,111,110,110,101,99,116,105,111,110,95,105,100,40,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,115,99,111,112,101,40,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,111,112,99,111,100,101,40,41,32,115,51,50,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,105,115,95,98,105,110,97,114,121,40,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,40,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,95,115,99,111,112,101,40,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,44,32,115,99,111,112,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,95,116,111,40,99,111,110,110,101,99,116,105,111,110,95,105,100,32,58,32,115,116,114,105,110,103,44,32,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,119,115,95,99,108,111,115,101,40,99,111,110,110,101,99,116,105,111,110,95,105,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,95,112,114,111,112,115,95,98,114,114,98,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,95,98,121,116,101,115,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,118,111,105,100,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,95,112,114,111,112,115,95,98,114,114,98,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,101,120,105,115,116,115,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,115,111,108,118,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,114,101,110,100,101,114,95,98,121,116,101,115,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,118,111,105,100,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,108,111,97,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,109,111,100,117,108,101,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,109,111,100,117,108,101,95,99,97,108,108,95,98,114,114,98,40,104,97,110,100,108,101,32,58,32,109,111,100,117,108,101,44,32,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,105,110,112,117,116,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,99,97,108,108,95,98,114,114,98,40,102,105,108,101,32,58,32,115,116,114,105,110,103,44,32,102,117,110,99,116,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,105,110,102,111,95,98,114,114,98,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,115,95,108,105,115,116,95,98,114,114,98,40,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,99,111,109,112,105,108,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,109,97,116,99,104,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,116,101,120,116,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,116,101,120,116,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,10,104,111,115,116,32,102,117,110,99,116,105,111,110,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,100,118,97,108,40,111,112,101,114,97,116,105,111,110,32,58,32,115,51,50,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,10,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,117,115,104,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,111,112,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,114,101,109,111,118,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,99,108,101,97,114,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,98,121,95,112,97,116,104,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,111,114,95,99,114,101,97,116,101,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,97,114,114,97,121,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,98,111,111,108,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,116,121,112,101,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,116,121,112,101,95,110,97,109,101,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,105,115,95,97,114,114,97,121,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,105,115,95,108,105,115,116,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,107,101,121,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,107,101,121,115,32,58,32,115,51,50,32,61,32,49,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,118,97,108,117,101,115,32,58,32,115,51,50,32,61,32,49,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,106,115,111,110,32,58,32,115,51,50,32,61,32,49,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,115,116,114,105,110,103,109,97,112,32,58,32,115,51,50,32,61,32,49,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,117,116,32,58,32,115,51,50,32,61,32,49,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,115,116,114,105,110,103,32,58,32,115,51,50,32,61,32,49,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,102,54,52,32,58,32,115,51,50,32,61,32,50,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,98,111,111,108,32,58,32,115,51,50,32,61,32,50,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,97,115,99,105,105,95,115,97,102,101,95,110,97,109,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,97,102,101,95,110,97,109,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,116,114,105,109,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,102,108,111,97,116,95,118,97,108,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,105,110,116,95,118,97,108,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,116,111,95,98,111,111,108,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,116,114,95,115,116,97,114,116,115,95,119,105,116,104,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,116,114,95,101,110,100,115,95,119,105,116,104,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,101,110,99,111,100,101,95,113,117,101,114,121,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,101,95,113,117,101,114,121,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,115,112,97,99,101,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,117,116,102,56,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,104,116,116,112,95,104,101,97,100,101,114,115,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,107,118,32,58,32,115,51,50,32,61,32,49,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,111,114,116,32,58,32,115,51,50,32,61,32,49,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,114,115,101,95,117,114,105,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,110,111,114,109,97,108,105,122,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,105,115,95,115,97,102,101,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,115,97,110,105,116,105,122,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,117,110,116,105,109,101,95,115,97,102,101,95,107,101,121,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,115,105,103,110,97,108,95,110,97,109,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,98,97,99,107,116,114,97,99,101,95,99,97,112,116,117,114,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,117,115,108,101,101,112,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,118,97,114,95,100,117,109,112,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,98,114,98,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,98,114,98,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,120,109,108,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,120,109,108,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,121,97,109,108,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,121,97,109,108,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,104,116,109,108,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,97,115,116,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,99,111,110,115,117,109,101,95,115,112,97,99,101,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,101,110,99,111,100,101,95,49,48,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,104,116,109,108,95,101,115,99,97,112,101,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,103,122,95,99,111,109,112,114,101,115,115,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,103,122,95,117,110,99,111,109,112,114,101,115,115,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,108,105,115,116,32,58,32,115,51,50,32,61,32,49,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,114,101,97,100,32,58,32,115,51,50,32,61,32,49,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,99,114,101,97,116,101,32,58,32,115,51,50,32,61,32,49,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,101,120,116,114,97,99,116,32,58,32,115,51,50,32,61,32,49,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,103,101,110,95,115,104,97,49,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,115,104,97,50,53,54,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,115,104,97,50,53,54,95,104,101,120,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,104,109,97,99,95,115,104,97,50,53,54,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,104,109,97,99,95,115,104,97,50,53,54,95,104,101,120,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,99,114,121,112,116,111,95,101,113,117,97,108,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,104,97,115,104,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,118,101,114,105,102,121,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,110,101,101,100,115,95,114,101,104,97,115,104,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,97,115,101,110,97,109,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,110,97,109,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,106,111,105,110,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,114,101,97,108,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,105,115,95,119,105,116,104,105,110,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,101,120,112,97,110,100,95,112,97,116,104,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,103,101,116,95,99,111,110,116,101,110,116,115,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,112,117,116,95,99,111,110,116,101,110,116,115,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,97,112,112,101,110,100,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,99,111,112,121,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,114,101,110,97,109,101,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,115,116,97,116,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,109,116,105,109,101,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,101,120,105,115,116,115,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,116,114,117,110,99,97,116,101,32,58,32,115,51,50,32,61,32,49,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,99,104,109,111,100,32,58,32,115,51,50,32,61,32,49,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,115,121,109,108,105,110,107,32,58,32,115,51,50,32,61,32,49,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,108,115,32,58,32,115,51,50,32,61,32,49,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,109,107,100,105,114,32,58,32,115,51,50,32,61,32,49,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,95,108,105,115,116,32,58,32,115,51,50,32,61,32,49,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,95,114,101,109,111,118,101,32,58,32,115,51,50,32,61,32,50,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,99,119,100,95,103,101,116,32,58,32,115,51,50,32,61,32,50,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,99,119,100,95,115,101,116,32,58,32,115,51,50,32,61,32,50,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,115,116,97,114,116,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,99,108,111,115,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,103,101,116,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,103,101,116,95,99,108,111,115,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,115,112,111,110,115,101,95,115,116,97,116,117,115,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,100,105,114,101,99,116,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,115,116,97,114,116,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,115,101,116,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,115,112,111,110,115,101,95,99,111,111,107,105,101,32,58,32,115,51,50,32,61,32,50,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,100,101,115,116,114,111,121,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,105,100,95,99,114,101,97,116,101,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,116,111,107,101,110,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,118,97,108,105,100,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,114,111,116,97,116,101,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,102,105,101,108,100,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,108,105,95,105,110,112,117,116,32,58,32,115,51,50,32,61,32,49,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,108,105,95,97,114,103,32,58,32,115,51,50,32,61,32,49,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,98,97,115,101,95,117,114,108,32,58,32,115,51,50,32,61,32,49,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,115,99,114,105,112,116,95,117,114,108,32,58,32,115,51,50,32,61,32,49,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,113,117,101,114,121,95,112,97,116,104,32,58,32,115,51,50,32,61,32,49,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,113,117,101,114,121,95,114,111,117,116,101,32,58,32,115,51,50,32,61,32,49,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,114,111,117,116,101,95,102,114,111,109,95,114,97,119,95,112,97,116,104,32,58,32,115,51,50,32,61,32,50,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,112,101,114,102,32,58,32,115,51,50,32,61,32,50,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,99,111,110,110,101,99,116,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,99,111,109,109,97,110,100,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,115,101,116,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,100,101,108,101,116,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,103,101,116,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,103,101,116,95,109,117,108,116,105,112,108,101,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,115,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,101,115,99,97,112,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,101,120,101,99,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,115,112,97,119,110,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,115,116,97,116,117,115,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,114,101,115,117,108,116,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,97,119,97,105,116,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,99,97,110,99,101,108,32,58,32,115,51,50,32,61,32,54,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,112,114,111,99,101,115,115,95,115,116,97,114,116,95,100,105,114,101,99,116,111,114,121,32,58,32,115,51,50,32,61,32,55,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,101,114,118,101,114,95,115,116,97,114,116,95,104,116,116,112,32,58,32,115,51,50,32,61,32,56,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,101,114,118,101,114,95,115,116,111,112,32,58,32,115,51,50,32,61,32,57,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,115,117,98,109,105,116,32,58,32,115,51,50,32,61,32,49,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,115,116,97,116,117,115,32,58,32,115,51,50,32,61,32,49,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,97,119,97,105,116,32,58,32,115,51,50,32,61,32,49,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,99,97,110,99,101,108,32,58,32,115,51,50,32,61,32,49,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,99,111,110,110,101,99,116,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,99,108,111,115,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,119,114,105,116,101,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,114,101,97,100,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,114,101,113,117,101,115,116,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,114,101,113,117,101,115,116,95,97,115,121,110,99,32,58,32,115,51,50,32,61,32,53,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,112,97,114,115,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,114,101,108,97,116,105,118,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,115,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,95,99,111,117,110,116,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,54,52,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,105,110,116,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,100,114,97,119,95,105,110,116,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,48,49,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,102,108,111,97,116,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,100,114,97,119,95,102,108,111,97,116,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,112,97,114,97,109,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,103,101,116,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,112,111,115,116,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,99,111,111,107,105,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,32,58,32,115,51,50,32,61,32,52,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,112,108,105,116,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,95,97,108,108,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,114,101,112,108,97,99,101,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,98,97,115,101,54,52,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,48,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,98,97,115,101,54,52,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,49,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,117,114,105,95,101,110,99,111,100,101,32,58,32,115,51,50,32,61,32,50,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,117,114,105,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,51,10,99,111,110,115,116,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,106,115,111,110,95,100,101,99,111,100,101,32,58,32,115,51,50,32,61,32,52,10,10,47,47,32,68,86,97,108,117,101,115,32,99,114,111,115,115,32,116,104,101,32,66,101,97,114,101,114,32,98,111,117,110,100,97,114,121,32,97,115,32,99,111,112,105,101,100,32,65,82,67,32,118,97,108,117,101,115,46,32,32,77,117,116,97,116,111,114,115,32,114,101,116,117,114,110,32,116,104,101,10,47,47,32,114,101,112,108,97,99,101,109,101,110,116,32,118,97,108,117,101,58,32,96,118,97,108,117,101,32,61,32,100,118,97,108,95,112,117,115,104,40,118,97,108,117,101,44,32,99,104,105,108,100,41,96,59,32,110,111,32,104,111,115,116,32,97,108,105,97,115,32,101,115,99,97,112,101,115,46,10,102,117,110,99,116,105,111,110,32,116,111,95,108,111,119,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,108,111,119,101,114,40,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,117,112,112,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,117,112,112,101,114,40,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,110,100,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,115,51,50,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,102,105,110,100,40,104,97,121,115,116,97,99,107,44,32,110,101,101,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,110,116,97,105,110,115,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,102,105,110,100,40,104,97,121,115,116,97,99,107,44,32,110,101,101,100,108,101,41,32,33,61,32,45,49,32,125,10,102,117,110,99,116,105,111,110,32,114,101,112,108,97,99,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,114,101,112,108,97,99,101,40,118,97,108,117,101,44,32,110,101,101,100,108,101,44,32,114,101,112,108,97,99,101,109,101,110,116,41,32,125,10,102,117,110,99,116,105,111,110,32,108,111,119,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,108,111,119,101,114,40,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,117,112,112,101,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,117,112,112,101,114,40,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,114,115,116,40,41,32,115,116,114,105,110,103,32,123,32,114,101,116,117,114,110,32,34,34,32,125,10,102,117,110,99,116,105,111,110,32,102,105,114,115,116,40,111,110,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,114,101,116,117,114,110,32,111,110,101,32,125,10,102,117,110,99,116,105,111,110,32,102,105,114,115,116,40,111,110,101,32,58,32,115,116,114,105,110,103,44,32,116,119,111,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,116,119,111,59,32,105,102,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,110,111,110,98,108,97,110,107,40,111,110,101,41,32,123,32,114,101,115,117,108,116,32,61,32,111,110,101,32,125,59,32,114,101,116,117,114,110,32,114,101,115,117,108,116,32,125,10,102,117,110,99,116,105,111,110,32,102,105,114,115,116,40,111,110,101,32,58,32,115,116,114,105,110,103,44,32,116,119,111,32,58,32,115,116,114,105,110,103,44,32,116,104,114,101,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,114,101,116,117,114,110,32,102,105,114,115,116,40,102,105,114,115,116,40,111,110,101,44,32,116,119,111,41,44,32,116,104,114,101,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,114,115,116,40,111,110,101,32,58,32,115,116,114,105,110,103,44,32,116,119,111,32,58,32,115,116,114,105,110,103,44,32,116,104,114,101,101,32,58,32,115,116,114,105,110,103,44,32,102,111,117,114,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,114,101,116,117,114,110,32,102,105,114,115,116,40,102,105,114,115,116,40,111,110,101,44,32,116,119,111,41,44,32,102,105,114,115,116,40,116,104,114,101,101,44,32,102,111,117,114,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,117,98,115,116,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,116,97,114,116,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,117,98,115,116,114,40,118,97,108,117,101,44,32,115,116,97,114,116,32,97,115,32,115,54,52,44,32,108,101,110,103,116,104,40,118,97,108,117,101,41,32,97,115,32,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,115,117,98,115,116,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,116,97,114,116,32,58,32,115,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,117,98,115,116,114,40,118,97,108,117,101,44,32,115,116,97,114,116,44,32,108,101,110,103,116,104,40,118,97,108,117,101,41,32,97,115,32,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,115,117,98,115,116,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,116,97,114,116,32,58,32,115,51,50,44,32,108,101,110,103,116,104,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,117,98,115,116,114,40,118,97,108,117,101,44,32,115,116,97,114,116,32,97,115,32,115,54,52,44,32,108,101,110,103,116,104,32,97,115,32,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,115,117,98,115,116,114,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,116,97,114,116,32,58,32,115,54,52,44,32,108,101,110,103,116,104,32,58,32,115,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,117,98,115,116,114,40,118,97,108,117,101,44,32,115,116,97,114,116,44,32,108,101,110,103,116,104,41,32,125,10,102,117,110,99,116,105,111,110,32,115,116,114,112,111,115,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,116,114,112,111,115,40,104,97,121,115,116,97,99,107,44,32,110,101,101,100,108,101,44,32,48,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,115,116,114,112,111,115,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,44,32,111,102,102,115,101,116,32,58,32,115,54,52,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,115,116,114,105,110,103,95,115,116,114,112,111,115,40,104,97,121,115,116,97,99,107,44,32,110,101,101,100,108,101,44,32,111,102,102,115,101,116,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,115,101,116,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,115,111,117,114,99,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,44,32,118,97,108,117,101,44,32,34,34,44,32,115,111,117,114,99,101,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,97,115,115,105,103,110,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,115,111,117,114,99,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,100,118,97,108,95,115,101,116,40,118,97,108,117,101,44,32,115,111,117,114,99,101,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,112,117,115,104,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,99,104,105,108,100,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,117,115,104,44,32,118,97,108,117,101,44,32,34,34,44,32,99,104,105,108,100,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,112,111,112,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,111,112,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,114,101,109,111,118,101,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,114,101,109,111,118,101,44,32,118,97,108,117,101,44,32,107,101,121,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,99,108,101,97,114,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,99,108,101,97,114,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,103,101,116,95,98,121,95,112,97,116,104,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,98,121,95,112,97,116,104,44,32,118,97,108,117,101,44,32,112,97,116,104,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,103,101,116,95,111,114,95,99,114,101,97,116,101,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,111,114,95,99,114,101,97,116,101,44,32,118,97,108,117,101,44,32,107,101,121,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,115,101,116,95,97,114,114,97,121,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,97,114,114,97,121,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,115,101,116,95,98,111,111,108,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,108,97,103,32,58,32,98,111,111,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,98,111,111,108,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,102,108,97,103,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,115,101,116,95,116,121,112,101,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,116,121,112,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,115,101,116,95,116,121,112,101,44,32,118,97,108,117,101,44,32,116,121,112,101,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,103,101,116,95,116,121,112,101,95,110,97,109,101,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,103,101,116,95,116,121,112,101,95,110,97,109,101,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,105,115,95,97,114,114,97,121,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,105,115,95,97,114,114,97,121,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,105,115,95,108,105,115,116,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,105,115,95,108,105,115,116,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,107,101,121,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,107,101,121,44,32,118,97,108,117,101,44,32,107,101,121,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,107,101,121,115,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,107,101,121,115,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,118,97,108,117,101,115,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,118,97,108,117,101,115,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,106,115,111,110,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,106,115,111,110,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,106,115,111,110,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,113,117,111,116,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,106,115,111,110,44,32,118,97,108,117,101,44,32,113,117,111,116,101,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,115,116,114,105,110,103,109,97,112,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,115,116,114,105,110,103,109,97,112,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,112,117,116,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,99,104,105,108,100,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,112,117,116,44,32,118,97,108,117,101,44,32,107,101,121,44,32,99,104,105,108,100,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,115,116,114,105,110,103,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,115,116,114,105,110,103,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,115,116,114,105,110,103,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,115,116,114,105,110,103,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,102,97,108,108,98,97,99,107,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,102,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,102,54,52,32,123,32,100,118,97,108,95,102,54,52,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,102,54,52,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,48,46,48,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,102,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,102,54,52,41,32,102,54,52,32,123,32,100,118,97,108,95,102,54,52,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,102,54,52,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,102,97,108,108,98,97,99,107,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,98,111,111,108,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,98,111,111,108,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,98,111,111,108,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,98,111,111,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,100,118,95,97,112,112,108,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,118,97,108,95,100,118,97,108,95,116,111,95,98,111,111,108,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,102,97,108,108,98,97,99,107,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,115,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,115,54,52,95,98,114,114,98,40,118,97,108,117,101,44,32,48,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,115,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,115,54,52,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,115,54,52,95,98,114,114,98,40,118,97,108,117,101,44,32,102,97,108,108,98,97,99,107,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,117,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,118,97,108,117,101,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,116,111,95,117,54,52,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,102,97,108,108,98,97,99,107,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,118,97,108,117,101,44,32,102,97,108,108,98,97,99,107,41,32,125,10,10,47,47,32,83,116,114,105,110,103,76,105,115,116,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,105,115,116,45,115,104,97,112,101,100,32,99,111,112,105,101,100,32,68,86,97,108,117,101,46,32,32,84,104,101,115,101,32,99,97,108,108,98,97,99,107,115,10,47,47,32,100,101,108,105,98,101,114,97,116,101,108,121,32,115,116,97,121,32,105,110,32,67,97,112,121,44,32,106,117,115,116,32,108,105,107,101,32,100,118,97,108,95,109,97,112,47,100,118,97,108,95,102,105,108,116,101,114,46,10,102,117,110,99,116,105,111,110,32,101,118,101,114,121,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,112,114,101,100,105,99,97,116,101,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,41,32,98,111,111,108,32,123,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,105,102,32,33,112,114,101,100,105,99,97,116,101,40,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,41,32,123,32,114,101,116,117,114,110,32,102,97,108,115,101,32,125,32,125,10,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,10,125,10,102,117,110,99,116,105,111,110,32,115,111,109,101,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,112,114,101,100,105,99,97,116,101,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,41,32,98,111,111,108,32,123,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,105,102,32,112,114,101,100,105,99,97,116,101,40,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,41,32,123,32,114,101,116,117,114,110,32,116,114,117,101,32,125,32,125,10,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,10,125,10,102,117,110,99,116,105,111,110,32,115,116,114,105,110,103,95,108,105,115,116,95,102,105,110,100,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,112,114,101,100,105,99,97,116,101,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,44,32,102,97,108,108,98,97,99,107,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,118,97,114,32,118,97,108,117,101,32,58,61,32,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,59,32,105,102,32,112,114,101,100,105,99,97,116,101,40,118,97,108,117,101,41,32,123,32,114,101,116,117,114,110,32,118,97,108,117,101,32,125,32,125,10,32,32,32,32,114,101,116,117,114,110,32,102,97,108,108,98,97,99,107,10,125,10,102,117,110,99,116,105,111,110,32,107,101,121,115,40,105,116,101,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,91,93,41,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,100,118,97,108,40,107,101,121,41,41,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,102,117,110,99,116,105,111,110,32,109,97,112,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,109,97,112,112,101,114,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,91,93,41,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,100,118,97,108,40,109,97,112,112,101,114,40,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,41,41,41,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,102,117,110,99,116,105,111,110,32,102,105,108,116,101,114,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,112,114,101,100,105,99,97,116,101,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,91,93,41,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,118,97,114,32,118,97,108,117,101,32,58,61,32,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,59,32,105,102,32,112,114,101,100,105,99,97,116,101,40,118,97,108,117,101,41,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,100,118,97,108,40,118,97,108,117,101,41,41,32,125,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,102,117,110,99,116,105,111,110,32,117,110,105,113,117,101,40,105,116,101,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,91,93,41,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,118,97,108,117,101,32,58,61,32,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,10,32,32,32,32,32,32,32,32,105,102,32,33,115,111,109,101,40,114,101,115,117,108,116,44,32,102,117,110,99,116,105,111,110,40,99,97,110,100,105,100,97,116,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,99,97,110,100,105,100,97,116,101,32,61,61,32,118,97,108,117,101,32,125,41,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,100,118,97,108,40,118,97,108,117,101,41,41,32,125,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,109,97,112,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,109,97,112,112,101,114,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,123,58,125,41,10,32,32,32,32,118,97,114,32,108,105,115,116,32,58,61,32,100,118,97,108,95,105,115,95,108,105,115,116,40,118,97,108,117,101,41,10,32,32,32,32,105,102,32,108,105,115,116,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,115,101,116,95,97,114,114,97,121,40,114,101,115,117,108,116,41,32,125,10,32,32,32,32,105,102,32,100,118,97,108,95,105,115,95,97,114,114,97,121,40,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,118,97,108,117,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,109,97,112,112,101,100,32,58,61,32,109,97,112,112,101,114,40,105,116,101,109,44,32,107,101,121,41,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,108,105,115,116,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,109,97,112,112,101,100,41,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,116,40,114,101,115,117,108,116,44,32,107,101,121,44,32,109,97,112,112,101,100,41,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,109,97,112,112,101,114,40,118,97,108,117,101,44,32,34,34,41,41,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,10,102,117,110,99,116,105,111,110,32,100,118,97,108,95,102,105,108,116,101,114,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,112,114,101,100,105,99,97,116,101,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,41,32,100,118,97,108,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,100,118,97,108,40,123,58,125,41,10,32,32,32,32,118,97,114,32,108,105,115,116,32,58,61,32,100,118,97,108,95,105,115,95,108,105,115,116,40,118,97,108,117,101,41,10,32,32,32,32,105,102,32,108,105,115,116,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,115,101,116,95,97,114,114,97,121,40,114,101,115,117,108,116,41,32,125,10,32,32,32,32,105,102,32,100,118,97,108,95,105,115,95,97,114,114,97,121,40,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,118,97,108,117,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,112,114,101,100,105,99,97,116,101,40,105,116,101,109,44,32,107,101,121,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,108,105,115,116,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,105,116,101,109,41,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,116,40,114,101,115,117,108,116,44,32,107,101,121,44,32,105,116,101,109,41,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,105,102,32,112,114,101,100,105,99,97,116,101,40,118,97,108,117,101,44,32,34,34,41,32,123,32,114,101,115,117,108,116,32,61,32,100,118,97,108,95,112,117,115,104,40,114,101,115,117,108,116,44,32,118,97,108,117,101,41,32,125,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,10,125,10,10,47,47,32,67,111,114,101,32,117,116,105,108,105,116,121,32,97,100,97,112,116,101,114,115,32,114,101,116,97,105,110,32,116,104,101,32,67,43,43,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,97,115,32,116,104,101,32,115,101,109,97,110,116,105,99,32,97,117,116,104,111,114,105,116,121,46,10,47,47,32,116,101,120,116,47,112,97,114,115,105,110,103,47,99,111,108,108,101,99,116,105,111,110,32,111,112,101,114,97,116,105,111,110,32,111,114,100,101,114,58,32,110,97,109,101,115,44,32,115,99,97,108,97,114,115,44,32,112,114,101,100,105,99,97,116,101,115,44,32,113,117,101,114,121,44,32,115,112,108,105,116,47,115,111,114,116,10,102,117,110,99,116,105,111,110,32,97,115,99,105,105,95,115,97,102,101,95,110,97,109,101,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,97,115,99,105,105,95,115,97,102,101,95,110,97,109,101,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,97,102,101,95,110,97,109,101,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,97,102,101,95,110,97,109,101,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,114,105,109,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,116,114,105,109,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,108,111,97,116,95,118,97,108,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,102,54,52,32,123,32,100,118,97,108,95,102,54,52,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,102,108,111,97,116,95,118,97,108,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,48,46,48,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,105,110,116,95,118,97,108,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,105,110,116,95,118,97,108,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,49,48,46,48,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,105,110,116,95,118,97,108,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,98,97,115,101,32,58,32,115,51,50,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,105,110,116,95,118,97,108,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,98,97,115,101,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,98,111,111,108,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,116,111,95,98,111,111,108,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,98,111,111,108,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,98,111,111,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,116,111,95,98,111,111,108,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,108,98,97,99,107,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,102,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,102,54,52,32,123,32,100,118,97,108,95,116,111,95,102,54,52,40,100,118,97,108,40,114,97,119,41,44,32,48,46,48,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,102,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,102,54,52,41,32,102,54,52,32,123,32,100,118,97,108,95,116,111,95,102,54,52,40,100,118,97,108,40,114,97,119,41,44,32,102,97,108,108,98,97,99,107,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,115,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,115,54,52,95,98,114,114,98,40,100,118,97,108,40,114,97,119,41,44,32,48,115,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,115,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,115,54,52,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,115,54,52,95,98,114,114,98,40,100,118,97,108,40,114,97,119,41,44,32,102,97,108,108,98,97,99,107,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,117,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,100,118,97,108,40,114,97,119,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,111,95,117,54,52,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,100,118,97,108,40,114,97,119,41,44,32,102,97,108,108,98,97,99,107,41,32,125,10,102,117,110,99,116,105,111,110,32,115,116,114,95,115,116,97,114,116,115,95,119,105,116,104,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,116,114,95,115,116,97,114,116,115,95,119,105,116,104,44,32,100,118,97,108,40,104,97,121,115,116,97,99,107,41,44,32,110,101,101,100,108,101,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,116,114,95,101,110,100,115,95,119,105,116,104,40,104,97,121,115,116,97,99,107,32,58,32,115,116,114,105,110,103,44,32,110,101,101,100,108,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,116,114,95,101,110,100,115,95,119,105,116,104,44,32,100,118,97,108,40,104,97,121,115,116,97,99,107,41,44,32,110,101,101,100,108,101,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,101,110,99,111,100,101,95,113,117,101,114,121,40,109,97,112,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,101,110,99,111,100,101,95,113,117,101,114,121,44,32,109,97,112,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,114,115,101,95,113,117,101,114,121,40,113,117,101,114,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,101,95,113,117,101,114,121,44,32,100,118,97,108,40,113,117,101,114,121,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,47,47,32,114,111,117,116,101,47,112,97,116,104,32,111,112,101,114,97,116,105,111,110,32,111,114,100,101,114,58,32,85,82,73,32,112,97,114,115,101,44,32,110,111,114,109,97,108,105,122,101,44,32,118,97,108,105,100,97,116,101,44,32,115,97,110,105,116,105,122,101,44,32,107,101,121,10,102,117,110,99,116,105,111,110,32,112,97,114,115,101,95,117,114,105,40,117,114,105,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,114,115,101,95,117,114,105,44,32,100,118,97,108,40,117,114,105,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,111,117,116,101,95,112,97,116,104,95,110,111,114,109,97,108,105,122,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,110,111,114,109,97,108,105,122,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,111,117,116,101,95,112,97,116,104,95,105,115,95,115,97,102,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,105,115,95,115,97,102,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,111,117,116,101,95,112,97,116,104,95,115,97,110,105,116,105,122,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,115,97,110,105,116,105,122,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,105,110,100,101,120,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,111,117,116,101,95,112,97,116,104,95,115,97,110,105,116,105,122,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,111,117,116,101,95,112,97,116,104,95,115,97,110,105,116,105,122,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,102,97,108,108,98,97,99,107,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,117,110,116,105,109,101,95,115,97,102,101,95,107,101,121,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,117,110,116,105,109,101,95,115,97,102,101,95,107,101,121,44,32,100,118,97,108,40,107,101,121,41,44,32,34,114,117,110,116,105,109,101,32,107,101,121,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,117,110,116,105,109,101,95,115,97,102,101,95,107,101,121,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,108,97,98,101,108,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,112,97,116,104,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,111,117,116,101,95,114,117,110,116,105,109,101,95,115,97,102,101,95,107,101,121,44,32,100,118,97,108,40,107,101,121,41,44,32,108,97,98,101,108,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,100,101,108,105,109,105,116,101,114,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,100,101,108,105,109,105,116,101,114,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,105,110,40,105,116,101,109,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,106,111,105,110,40,105,116,101,109,115,44,32,34,92,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,105,110,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,100,101,108,105,109,105,116,101,114,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,10,32,32,32,32,118,97,114,32,114,101,115,117,108,116,32,58,61,32,34,34,10,32,32,32,32,118,97,114,32,102,105,114,115,116,32,58,61,32,116,114,117,101,10,32,32,32,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,105,102,32,33,102,105,114,115,116,32,123,32,114,101,115,117,108,116,32,61,32,114,101,115,117,108,116,32,43,32,100,101,108,105,109,105,116,101,114,32,125,59,32,114,101,115,117,108,116,32,61,32,114,101,115,117,108,116,32,43,32,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,59,32,102,105,114,115,116,32,61,32,102,97,108,115,101,32,125,10,32,32,32,32,114,101,115,117,108,116,10,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,112,108,105,116,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,112,108,105,116,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,112,108,105,116,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,112,108,105,116,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,102,108,97,103,115,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,115,112,97,99,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,115,112,97,99,101,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,117,116,102,56,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,117,116,102,56,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,117,116,102,56,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,99,111,109,112,111,117,110,100,32,58,32,98,111,111,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,117,116,102,56,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,99,111,109,112,111,117,110,100,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,104,116,116,112,95,104,101,97,100,101,114,115,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,104,116,116,112,95,104,101,97,100,101,114,115,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,107,118,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,115,112,108,105,116,95,107,118,40,118,97,108,117,101,44,32,34,61,34,44,32,116,114,117,101,44,32,102,97,108,115,101,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,107,118,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,101,112,97,114,97,116,111,114,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,115,112,108,105,116,95,107,118,40,118,97,108,117,101,44,32,115,101,112,97,114,97,116,111,114,44,32,116,114,117,101,44,32,102,97,108,115,101,41,32,125,10,102,117,110,99,116,105,111,110,32,115,112,108,105,116,95,107,118,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,115,101,112,97,114,97,116,111,114,32,58,32,115,116,114,105,110,103,44,32,116,114,105,109,95,119,104,105,116,101,115,112,97,99,101,32,58,32,98,111,111,108,44,32,117,112,112,101,114,99,97,115,101,95,107,101,121,115,32,58,32,98,111,111,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,112,108,105,116,95,107,118,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,115,101,112,97,114,97,116,111,114,44,32,100,118,97,108,40,123,34,116,114,105,109,34,58,32,116,114,105,109,95,119,104,105,116,101,115,112,97,99,101,44,32,34,117,112,112,101,114,99,97,115,101,34,58,32,117,112,112,101,114,99,97,115,101,95,107,101,121,115,125,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,114,116,40,105,116,101,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,116,101,120,116,95,112,97,114,115,105,110,103,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,101,120,116,95,115,111,114,116,44,32,105,116,101,109,115,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,101,97,99,104,40,105,116,101,109,115,32,58,32,100,118,97,108,44,32,99,97,108,108,98,97,99,107,32,58,32,102,117,110,99,116,105,111,110,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,41,32,123,32,102,111,114,32,107,101,121,44,32,105,116,101,109,32,61,32,105,116,101,109,115,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,99,97,108,108,98,97,99,107,40,100,118,97,108,95,115,116,114,105,110,103,40,105,116,101,109,41,41,32,125,32,125,10,47,47,32,114,117,110,116,105,109,101,45,100,105,97,103,110,111,115,116,105,99,32,111,112,101,114,97,116,105,111,110,32,111,114,100,101,114,58,32,115,105,103,110,97,108,44,32,98,97,99,107,116,114,97,99,101,44,32,115,108,101,101,112,44,32,118,97,108,117,101,32,100,117,109,112,10,102,117,110,99,116,105,111,110,32,115,105,103,110,97,108,95,110,97,109,101,40,115,105,103,110,97,108,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,115,105,103,110,97,108,95,110,97,109,101,44,32,100,118,97,108,40,115,105,103,110,97,108,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,98,97,99,107,116,114,97,99,101,95,99,97,112,116,117,114,101,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,98,97,99,107,116,114,97,99,101,95,99,97,112,116,117,114,101,44,32,100,118,97,108,40,51,50,46,48,41,44,32,34,34,44,32,100,118,97,108,40,48,46,48,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,98,97,99,107,116,114,97,99,101,95,99,97,112,116,117,114,101,40,109,97,120,95,102,114,97,109,101,115,32,58,32,115,51,50,44,32,115,107,105,112,95,102,114,97,109,101,115,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,98,97,99,107,116,114,97,99,101,95,99,97,112,116,117,114,101,44,32,100,118,97,108,40,109,97,120,95,102,114,97,109,101,115,41,44,32,34,34,44,32,100,118,97,108,40,115,107,105,112,95,102,114,97,109,101,115,41,41,41,32,125,10,47,47,32,67,97,112,121,32,101,120,112,111,115,101,115,32,115,111,117,114,99,101,45,109,97,112,112,101,100,32,103,117,101,115,116,32,102,114,97,109,101,115,32,114,97,116,104,101,114,32,116,104,97,110,32,116,104,101,32,110,97,116,105,118,101,32,118,111,105,100,42,32,65,66,73,46,10,102,117,110,99,116,105,111,110,32,98,97,99,107,116,114,97,99,101,95,103,101,116,95,102,114,97,109,101,115,40,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,97,112,121,95,98,97,99,107,116,114,97,99,101,40,51,50,44,32,48,41,32,125,10,102,117,110,99,116,105,111,110,32,98,97,99,107,116,114,97,99,101,95,103,101,116,95,102,114,97,109,101,115,40,109,97,120,95,102,114,97,109,101,115,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,97,112,121,95,98,97,99,107,116,114,97,99,101,40,109,97,120,95,102,114,97,109,101,115,44,32,48,41,32,125,10,102,117,110,99,116,105,111,110,32,98,97,99,107,116,114,97,99,101,95,103,101,116,95,102,114,97,109,101,115,40,109,97,120,95,102,114,97,109,101,115,32,58,32,115,51,50,44,32,115,107,105,112,95,102,114,97,109,101,115,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,97,112,121,95,98,97,99,107,116,114,97,99,101,40,109,97,120,95,102,114,97,109,101,115,44,32,115,107,105,112,95,102,114,97,109,101,115,41,32,125,10,102,117,110,99,116,105,111,110,32,117,115,108,101,101,112,40,117,115,101,99,32,58,32,115,51,50,41,32,115,51,50,32,123,32,100,118,97,108,95,115,51,50,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,117,115,108,101,101,112,44,32,100,118,97,108,40,117,115,101,99,41,44,32,34,34,44,32,100,118,97,108,40,48,46,48,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,118,97,114,95,100,117,109,112,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,118,97,114,95,100,117,109,112,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,118,97,114,95,100,117,109,112,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,112,114,101,102,105,120,32,58,32,115,116,114,105,110,103,44,32,112,111,115,116,102,105,120,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,117,110,116,105,109,101,95,100,105,97,103,110,111,115,116,105,99,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,100,105,97,103,110,111,115,116,105,99,95,118,97,114,95,100,117,109,112,44,32,118,97,108,117,101,44,32,112,114,101,102,105,120,44,32,100,118,97,108,40,112,111,115,116,102,105,120,41,41,41,32,125,10,10,47,47,32,67,111,100,101,99,115,32,99,114,111,115,115,32,116,104,101,32,99,111,112,105,101,100,45,68,86,97,108,117,101,32,109,101,109,98,114,97,110,101,59,32,110,97,116,105,118,101,32,112,97,114,115,101,114,115,32,114,101,109,97,105,110,32,97,117,116,104,111,114,105,116,97,116,105,118,101,46,10,102,117,110,99,116,105,111,110,32,98,114,98,95,100,101,99,111,100,101,40,101,110,99,111,100,101,100,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,98,114,98,95,100,101,99,111,100,101,44,32,100,118,97,108,40,101,110,99,111,100,101,100,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,98,114,98,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,98,114,98,95,101,110,99,111,100,101,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,120,109,108,95,100,101,99,111,100,101,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,120,109,108,95,100,101,99,111,100,101,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,120,109,108,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,120,109,108,95,101,110,99,111,100,101,44,32,118,97,108,117,101,44,32,34,114,111,111,116,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,120,109,108,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,100,118,97,108,44,32,114,111,111,116,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,120,109,108,95,101,110,99,111,100,101,44,32,118,97,108,117,101,44,32,114,111,111,116,95,110,97,109,101,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,121,97,109,108,95,100,101,99,111,100,101,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,121,97,109,108,95,100,101,99,111,100,101,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,121,97,109,108,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,121,97,109,108,95,101,110,99,111,100,101,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,97,114,107,100,111,119,110,95,116,111,95,104,116,109,108,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,104,116,109,108,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,123,58,125,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,97,114,107,100,111,119,110,95,116,111,95,104,116,109,108,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,44,32,111,112,116,105,111,110,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,104,116,109,108,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,111,112,116,105,111,110,115,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,97,114,107,100,111,119,110,95,116,111,95,97,115,116,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,97,115,116,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,123,58,125,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,97,114,107,100,111,119,110,95,116,111,95,97,115,116,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,44,32,111,112,116,105,111,110,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,109,97,114,107,100,111,119,110,95,116,111,95,97,115,116,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,111,112,116,105,111,110,115,41,32,125,10,47,47,32,67,97,112,121,32,115,99,97,108,97,114,115,32,97,114,101,32,118,97,108,117,101,115,58,32,114,101,116,117,114,110,32,116,104,101,32,97,100,118,97,110,99,101,100,32,111,102,102,115,101,116,32,102,111,114,32,114,101,97,115,115,105,103,110,109,101,110,116,46,10,102,117,110,99,116,105,111,110,32,106,115,111,110,95,99,111,110,115,117,109,101,95,115,112,97,99,101,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,44,32,105,110,100,101,120,32,58,32,115,51,50,41,32,115,51,50,32,123,32,100,118,97,108,95,115,51,50,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,99,111,110,115,117,109,101,95,115,112,97,99,101,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,105,110,100,101,120,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,115,111,110,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,101,110,99,111,100,101,44,32,118,97,108,117,101,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,115,111,110,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,106,115,111,110,95,101,110,99,111,100,101,95,49,48,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,104,116,109,108,95,101,115,99,97,112,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,104,116,109,108,95,101,115,99,97,112,101,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,103,122,95,99,111,109,112,114,101,115,115,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,103,122,95,99,111,109,112,114,101,115,115,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,103,122,95,117,110,99,111,109,112,114,101,115,115,40,115,111,117,114,99,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,103,122,95,117,110,99,111,109,112,114,101,115,115,44,32,100,118,97,108,40,115,111,117,114,99,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,122,105,112,95,108,105,115,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,108,105,115,116,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,122,105,112,95,114,101,97,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,101,110,116,114,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,114,101,97,100,44,32,100,118,97,108,40,112,97,116,104,41,44,32,101,110,116,114,121,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,122,105,112,95,99,114,101,97,116,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,101,110,116,114,105,101,115,32,58,32,100,118,97,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,99,114,101,97,116,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,101,110,116,114,105,101,115,41,41,32,125,10,102,117,110,99,116,105,111,110,32,122,105,112,95,101,120,116,114,97,99,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,100,101,115,116,105,110,97,116,105,111,110,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,97,114,99,104,105,118,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,97,114,99,104,105,118,101,95,122,105,112,95,101,120,116,114,97,99,116,44,32,100,118,97,108,40,112,97,116,104,41,44,32,100,101,115,116,105,110,97,116,105,111,110,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,10,47,47,32,70,105,108,101,115,121,115,116,101,109,32,112,111,108,105,99,121,32,115,116,97,121,115,32,105,110,32,116,104,101,32,99,111,114,101,47,104,111,115,116,32,98,111,117,110,100,97,114,121,59,32,116,104,101,115,101,32,119,114,97,112,112,101,114,115,32,111,110,108,121,32,117,110,112,97,99,107,10,47,47,32,99,111,112,105,101,100,32,118,97,108,117,101,115,32,102,114,111,109,32,116,104,97,116,32,97,117,116,104,111,114,105,116,97,116,105,118,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46,10,102,117,110,99,116,105,111,110,32,98,97,115,101,110,97,109,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,97,115,101,110,97,109,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,105,114,110,97,109,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,110,97,109,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,116,104,95,106,111,105,110,40,98,97,115,101,32,58,32,115,116,114,105,110,103,44,32,99,104,105,108,100,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,106,111,105,110,44,32,100,118,97,108,40,98,97,115,101,41,44,32,99,104,105,108,100,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,116,104,95,114,101,97,108,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,114,101,97,108,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,116,104,95,105,115,95,119,105,116,104,105,110,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,114,111,111,116,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,112,97,116,104,95,105,115,95,119,105,116,104,105,110,44,32,100,118,97,108,40,112,97,116,104,41,44,32,114,111,111,116,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,101,120,112,97,110,100,95,112,97,116,104,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,101,120,112,97,110,100,95,112,97,116,104,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,101,120,112,97,110,100,95,112,97,116,104,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,114,101,108,97,116,105,118,101,95,116,111,95,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,101,120,112,97,110,100,95,112,97,116,104,44,32,100,118,97,108,40,112,97,116,104,41,44,32,114,101,108,97,116,105,118,101,95,116,111,95,112,97,116,104,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,103,101,116,95,99,111,110,116,101,110,116,115,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,103,101,116,95,99,111,110,116,101,110,116,115,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,112,117,116,95,99,111,110,116,101,110,116,115,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,99,111,110,116,101,110,116,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,112,117,116,95,99,111,110,116,101,110,116,115,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,99,111,110,116,101,110,116,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,97,112,112,101,110,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,99,111,110,116,101,110,116,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,97,112,112,101,110,100,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,99,111,110,116,101,110,116,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,97,112,112,101,110,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,102,105,114,115,116,32,58,32,115,116,114,105,110,103,44,32,115,101,99,111,110,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,102,105,108,101,95,97,112,112,101,110,100,40,112,97,116,104,44,32,102,105,114,115,116,32,43,32,115,101,99,111,110,100,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,97,112,112,101,110,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,102,105,114,115,116,32,58,32,115,116,114,105,110,103,44,32,115,101,99,111,110,100,32,58,32,115,116,114,105,110,103,44,32,116,104,105,114,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,102,105,108,101,95,97,112,112,101,110,100,40,112,97,116,104,44,32,102,105,114,115,116,32,43,32,115,101,99,111,110,100,32,43,32,116,104,105,114,100,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,112,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,117,54,52,44,32,108,101,110,103,116,104,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,112,114,101,97,100,40,104,97,110,100,108,101,44,32,111,102,102,115,101,116,44,32,108,101,110,103,116,104,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,112,119,114,105,116,101,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,117,54,52,44,32,100,97,116,97,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,112,119,114,105,116,101,40,104,97,110,100,108,101,44,32,111,102,102,115,101,116,44,32,100,97,116,97,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,99,111,112,121,40,102,114,111,109,32,58,32,115,116,114,105,110,103,44,32,116,111,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,99,111,112,121,44,32,100,118,97,108,40,102,114,111,109,41,44,32,116,111,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,114,101,110,97,109,101,40,102,114,111,109,32,58,32,115,116,114,105,110,103,44,32,116,111,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,114,101,110,97,109,101,44,32,100,118,97,108,40,102,114,111,109,41,44,32,116,111,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,115,116,97,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,115,116,97,116,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,109,116,105,109,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,109,116,105,109,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,101,120,105,115,116,115,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,101,120,105,115,116,115,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,116,114,117,110,99,97,116,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,115,105,122,101,32,58,32,117,54,52,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,116,114,117,110,99,97,116,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,115,105,122,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,99,104,109,111,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,109,111,100,101,32,58,32,115,51,50,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,99,104,109,111,100,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,109,111,100,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,115,121,109,108,105,110,107,40,116,97,114,103,101,116,32,58,32,115,116,114,105,110,103,44,32,108,105,110,107,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,102,105,108,101,95,115,121,109,108,105,110,107,44,32,100,118,97,108,40,116,97,114,103,101,116,41,44,32,108,105,110,107,112,97,116,104,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,108,115,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,108,115,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,107,100,105,114,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,109,107,100,105,114,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,105,114,95,108,105,115,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,95,108,105,115,116,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,105,114,95,114,101,109,111,118,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,95,114,101,109,111,118,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,100,105,114,95,114,101,109,111,118,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,114,101,99,117,114,115,105,118,101,32,58,32,98,111,111,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,100,105,114,95,114,101,109,111,118,101,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,114,101,99,117,114,115,105,118,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,119,100,95,103,101,116,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,99,119,100,95,103,101,116,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,119,100,95,115,101,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,102,105,108,101,115,121,115,116,101,109,95,99,119,100,95,115,101,116,44,32,100,118,97,108,40,112,97,116,104,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,10,47,47,32,82,101,113,117,101,115,116,47,119,111,114,107,115,112,97,99,101,32,111,112,101,114,97,116,105,111,110,115,32,99,114,111,115,115,32,116,104,101,32,99,111,112,105,101,100,45,68,86,97,108,117,101,32,109,101,109,98,114,97,110,101,46,32,32,84,104,101,32,99,111,114,101,32,111,119,110,115,10,47,47,32,116,104,101,32,108,105,118,101,32,82,101,113,117,101,115,116,32,97,110,100,32,97,108,108,32,115,101,115,115,105,111,110,44,32,114,111,117,116,105,110,103,44,32,97,110,100,32,114,101,115,112,111,110,115,101,32,112,111,108,105,99,121,46,10,102,117,110,99,116,105,111,110,32,111,98,95,115,116,97,114,116,40,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,115,116,97,114,116,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,111,98,95,99,108,111,115,101,40,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,99,108,111,115,101,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,111,98,95,103,101,116,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,103,101,116,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,111,98,95,103,101,116,95,99,108,111,115,101,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,111,98,95,103,101,116,95,99,108,111,115,101,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,115,112,111,110,115,101,95,115,116,97,116,117,115,40,99,111,100,101,32,58,32,115,51,50,41,32,123,32,114,101,115,112,111,110,115,101,95,115,116,97,116,117,115,40,99,111,100,101,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,115,112,111,110,115,101,95,115,116,97,116,117,115,40,99,111,100,101,32,58,32,115,51,50,44,32,114,101,97,115,111,110,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,115,112,111,110,115,101,95,115,116,97,116,117,115,44,32,100,118,97,108,40,99,111,100,101,41,44,32,114,101,97,115,111,110,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,100,105,114,101,99,116,40,117,114,108,32,58,32,115,116,114,105,110,103,41,32,123,32,114,101,100,105,114,101,99,116,40,117,114,108,44,32,51,48,50,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,100,105,114,101,99,116,40,117,114,108,32,58,32,115,116,114,105,110,103,44,32,99,111,100,101,32,58,32,115,51,50,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,100,105,114,101,99,116,44,32,100,118,97,108,40,117,114,108,41,44,32,34,34,44,32,100,118,97,108,40,99,111,100,101,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,115,116,97,114,116,40,41,32,115,116,114,105,110,103,32,123,32,115,101,115,115,105,111,110,95,115,116,97,114,116,40,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,115,116,97,114,116,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,115,116,97,114,116,44,32,100,118,97,108,40,110,97,109,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,115,101,116,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,115,101,116,44,32,100,118,97,108,40,107,101,121,41,44,32,34,115,101,116,34,44,32,100,118,97,108,40,118,97,108,117,101,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,114,101,109,111,118,101,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,115,101,116,44,32,100,118,97,108,40,107,101,121,41,44,32,34,114,101,109,111,118,101,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,115,112,111,110,115,101,95,99,111,111,107,105,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,115,112,111,110,115,101,95,99,111,111,107,105,101,44,32,100,118,97,108,40,110,97,109,101,41,44,32,34,34,44,32,100,118,97,108,40,118,97,108,117,101,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,100,101,115,116,114,111,121,40,41,32,123,32,115,101,115,115,105,111,110,95,100,101,115,116,114,111,121,40,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,100,101,115,116,114,111,121,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,100,101,115,116,114,111,121,44,32,100,118,97,108,40,110,97,109,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,115,115,105,111,110,95,105,100,95,99,114,101,97,116,101,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,95,105,100,95,99,114,101,97,116,101,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,116,111,107,101,110,40,41,32,115,116,114,105,110,103,32,123,32,99,115,114,102,95,116,111,107,101,110,40,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,116,111,107,101,110,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,99,115,114,102,95,116,111,107,101,110,40,115,101,115,115,105,111,110,95,110,97,109,101,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,116,111,107,101,110,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,116,111,107,101,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,116,111,107,101,110,44,32,100,118,97,108,40,115,101,115,115,105,111,110,95,110,97,109,101,41,44,32,116,111,107,101,110,95,110,97,109,101,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,118,97,108,105,100,40,115,117,98,109,105,116,116,101,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,99,115,114,102,95,118,97,108,105,100,40,115,117,98,109,105,116,116,101,100,44,32,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,118,97,108,105,100,40,115,117,98,109,105,116,116,101,100,32,58,32,115,116,114,105,110,103,44,32,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,99,115,114,102,95,118,97,108,105,100,40,115,117,98,109,105,116,116,101,100,44,32,115,101,115,115,105,111,110,95,110,97,109,101,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,118,97,108,105,100,40,115,117,98,109,105,116,116,101,100,32,58,32,115,116,114,105,110,103,44,32,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,116,111,107,101,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,118,97,108,105,100,44,32,100,118,97,108,40,115,117,98,109,105,116,116,101,100,41,44,32,115,101,115,115,105,111,110,95,110,97,109,101,44,32,100,118,97,108,40,116,111,107,101,110,95,110,97,109,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,114,111,116,97,116,101,40,41,32,123,32,99,115,114,102,95,114,111,116,97,116,101,40,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,114,111,116,97,116,101,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,123,32,99,115,114,102,95,114,111,116,97,116,101,40,115,101,115,115,105,111,110,95,110,97,109,101,44,32,34,99,115,114,102,95,116,111,107,101,110,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,114,111,116,97,116,101,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,116,111,107,101,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,114,111,116,97,116,101,44,32,100,118,97,108,40,115,101,115,115,105,111,110,95,110,97,109,101,41,44,32,116,111,107,101,110,95,110,97,109,101,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,102,105,101,108,100,40,41,32,115,116,114,105,110,103,32,123,32,99,115,114,102,95,102,105,101,108,100,40,34,98,101,97,114,101,114,45,115,101,115,115,105,111,110,34,44,32,34,99,115,114,102,95,116,111,107,101,110,34,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,102,105,101,108,100,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,99,115,114,102,95,102,105,101,108,100,40,115,101,115,115,105,111,110,95,110,97,109,101,44,32,34,99,115,114,102,95,116,111,107,101,110,34,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,102,105,101,108,100,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,116,111,107,101,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,99,115,114,102,95,102,105,101,108,100,40,115,101,115,115,105,111,110,95,110,97,109,101,44,32,116,111,107,101,110,95,110,97,109,101,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,115,114,102,95,102,105,101,108,100,40,115,101,115,115,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,116,111,107,101,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,102,105,101,108,100,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,115,114,102,95,102,105,101,108,100,44,32,100,118,97,108,40,115,101,115,115,105,111,110,95,110,97,109,101,41,44,32,116,111,107,101,110,95,110,97,109,101,44,32,100,118,97,108,40,102,105,101,108,100,95,110,97,109,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,108,105,95,105,110,112,117,116,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,108,105,95,105,110,112,117,116,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,108,105,95,97,114,103,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,99,108,105,95,97,114,103,40,107,101,121,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,99,108,105,95,97,114,103,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,102,97,108,108,98,97,99,107,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,108,105,95,97,114,103,44,32,100,118,97,108,40,107,101,121,41,44,32,102,97,108,108,98,97,99,107,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,98,97,115,101,95,117,114,108,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,98,97,115,101,95,117,114,108,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,115,99,114,105,112,116,95,117,114,108,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,115,99,114,105,112,116,95,117,114,108,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,112,97,116,104,40,41,32,115,116,114,105,110,103,32,123,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,112,97,116,104,40,34,105,110,100,101,120,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,112,97,116,104,40,100,101,102,97,117,108,116,95,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,113,117,101,114,121,95,112,97,116,104,44,32,100,118,97,108,40,34,34,41,44,32,100,101,102,97,117,108,116,95,112,97,116,104,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,114,111,117,116,101,40,41,32,100,118,97,108,32,123,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,114,111,117,116,101,40,34,105,110,100,101,120,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,113,117,101,114,121,95,114,111,117,116,101,40,100,101,102,97,117,108,116,95,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,113,117,101,114,121,95,114,111,117,116,101,44,32,100,118,97,108,40,34,34,41,44,32,100,101,102,97,117,108,116,95,112,97,116,104,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,114,111,117,116,101,95,102,114,111,109,95,114,97,119,95,112,97,116,104,40,114,97,119,95,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,114,101,113,117,101,115,116,95,114,111,117,116,101,95,102,114,111,109,95,114,97,119,95,112,97,116,104,40,114,97,119,95,112,97,116,104,44,32,34,105,110,100,101,120,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,114,111,117,116,101,95,102,114,111,109,95,114,97,119,95,112,97,116,104,40,114,97,119,95,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,100,101,102,97,117,108,116,95,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,114,111,117,116,101,95,102,114,111,109,95,114,97,119,95,112,97,116,104,44,32,100,118,97,108,40,114,97,119,95,112,97,116,104,41,44,32,100,101,102,97,117,108,116,95,112,97,116,104,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,112,101,114,102,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,119,111,114,107,115,112,97,99,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,114,101,113,117,101,115,116,95,112,101,114,102,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,10,102,117,110,99,116,105,111,110,32,103,101,110,95,115,104,97,49,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,103,101,110,95,115,104,97,49,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,102,97,108,115,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,115,104,97,49,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,97,115,95,98,105,110,97,114,121,32,58,32,98,111,111,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,103,101,110,95,115,104,97,49,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,97,115,95,98,105,110,97,114,121,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,104,97,50,53,54,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,115,104,97,50,53,54,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,104,97,50,53,54,95,104,101,120,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,115,104,97,50,53,54,95,104,101,120,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,104,109,97,99,95,115,104,97,50,53,54,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,104,109,97,99,95,115,104,97,50,53,54,44,32,100,118,97,108,40,107,101,121,41,44,32,34,34,44,32,100,118,97,108,40,118,97,108,117,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,104,109,97,99,95,115,104,97,50,53,54,95,104,101,120,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,104,109,97,99,95,115,104,97,50,53,54,95,104,101,120,44,32,100,118,97,108,40,107,101,121,41,44,32,34,34,44,32,100,118,97,108,40,118,97,108,117,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,114,121,112,116,111,95,101,113,117,97,108,40,108,101,102,116,32,58,32,115,116,114,105,110,103,44,32,114,105,103,104,116,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,99,114,121,112,116,111,95,101,113,117,97,108,44,32,100,118,97,108,40,108,101,102,116,41,44,32,34,34,44,32,100,118,97,108,40,114,105,103,104,116,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,115,115,119,111,114,100,95,104,97,115,104,40,112,97,115,115,119,111,114,100,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,104,97,115,104,44,32,100,118,97,108,40,112,97,115,115,119,111,114,100,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,115,115,119,111,114,100,95,118,101,114,105,102,121,40,112,97,115,115,119,111,114,100,32,58,32,115,116,114,105,110,103,44,32,101,110,99,111,100,101,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,118,101,114,105,102,121,44,32,100,118,97,108,40,112,97,115,115,119,111,114,100,41,44,32,34,34,44,32,100,118,97,108,40,101,110,99,111,100,101,100,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,97,115,115,119,111,114,100,95,110,101,101,100,115,95,114,101,104,97,115,104,40,101,110,99,111,100,101,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,114,121,112,116,111,95,112,97,115,115,119,111,114,100,95,110,101,101,100,115,95,114,101,104,97,115,104,44,32,100,118,97,108,40,101,110,99,111,100,101,100,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,99,111,110,110,101,99,116,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,99,111,110,110,101,99,116,40,112,97,116,104,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,101,114,114,111,114,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,101,114,114,111,114,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,113,117,101,114,121,40,104,97,110,100,108,101,44,32,113,117,101,114,121,44,32,100,118,97,108,40,123,58,125,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,44,32,112,97,114,97,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,113,117,101,114,121,40,104,97,110,100,108,101,44,32,113,117,101,114,121,44,32,112,97,114,97,109,115,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,115,113,108,105,116,101,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,115,113,108,105,116,101,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,41,32,125,10,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,99,111,110,110,101,99,116,40,104,111,115,116,32,58,32,115,116,114,105,110,103,44,32,117,115,101,114,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,97,115,115,119,111,114,100,32,58,32,115,116,114,105,110,103,44,32,100,97,116,97,98,97,115,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,99,111,110,110,101,99,116,40,104,111,115,116,44,32,117,115,101,114,110,97,109,101,44,32,112,97,115,115,119,111,114,100,44,32,100,97,116,97,98,97,115,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,99,111,110,110,101,99,116,101,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,99,111,110,110,101,99,116,101,100,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,100,105,115,99,111,110,110,101,99,116,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,101,114,114,111,114,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,101,114,114,111,114,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,101,115,99,97,112,101,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,109,121,115,113,108,95,101,115,99,97,112,101,95,100,101,102,97,117,108,116,40,114,97,119,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,101,115,99,97,112,101,40,114,97,119,32,58,32,115,116,114,105,110,103,44,32,113,117,111,116,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,101,115,99,97,112,101,40,114,97,119,44,32,113,117,111,116,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,101,115,99,97,112,101,95,100,101,102,97,117,108,116,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,101,115,99,97,112,101,40,114,97,119,44,32,34,39,34,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,113,117,101,114,121,40,104,97,110,100,108,101,44,32,113,117,101,114,121,44,32,100,118,97,108,40,123,58,125,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,113,117,101,114,121,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,113,117,101,114,121,32,58,32,115,116,114,105,110,103,44,32,112,97,114,97,109,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,113,117,101,114,121,40,104,97,110,100,108,101,44,32,113,117,101,114,121,44,32,112,97,114,97,109,115,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,105,110,115,101,114,116,95,105,100,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,109,121,115,113,108,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,109,121,115,113,108,95,97,102,102,101,99,116,101,100,95,114,111,119,115,40,104,97,110,100,108,101,41,32,125,10,10,102,117,110,99,116,105,111,110,32,114,97,110,100,111,109,95,98,121,116,101,115,40,99,111,117,110,116,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,97,110,100,111,109,95,98,121,116,101,115,40,99,111,117,110,116,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,51,50,40,105,110,100,101,120,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,51,50,40,105,110,100,101,120,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,51,50,40,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,51,50,40,105,110,100,101,120,44,32,115,101,101,100,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,54,52,40,105,110,100,101,120,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,54,52,44,32,105,110,100,101,120,44,32,48,117,54,52,44,32,48,117,54,52,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,54,52,40,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,54,52,44,32,105,110,100,101,120,44,32,115,101,101,100,44,32,48,117,54,52,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,48,49,40,105,110,100,101,120,32,58,32,117,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,48,49,44,32,48,46,48,44,32,48,46,48,44,32,105,110,100,101,120,44,32,48,117,54,52,44,32,48,46,48,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,110,111,105,115,101,48,49,40,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,110,111,105,115,101,48,49,44,32,48,46,48,44,32,48,46,48,44,32,105,110,100,101,120,44,32,115,101,101,100,44,32,48,46,48,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,105,110,116,40,102,114,111,109,32,58,32,117,54,52,44,32,116,111,32,58,32,117,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,105,110,116,44,32,102,114,111,109,44,32,116,111,44,32,105,110,100,101,120,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,105,110,116,40,102,114,111,109,32,58,32,117,54,52,44,32,116,111,32,58,32,117,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,105,110,116,44,32,102,114,111,109,44,32,116,111,44,32,105,110,100,101,120,44,32,115,101,101,100,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,102,108,111,97,116,40,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,102,108,111,97,116,44,32,102,114,111,109,44,32,116,111,44,32,105,110,100,101,120,44,32,48,117,54,52,44,32,48,46,48,48,48,48,48,48,48,48,48,48,48,49,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,102,108,111,97,116,40,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,102,108,111,97,116,44,32,102,114,111,109,44,32,116,111,44,32,105,110,100,101,120,44,32,115,101,101,100,44,32,48,46,48,48,48,48,48,48,48,48,48,48,48,49,41,32,125,10,102,117,110,99,116,105,111,110,32,103,101,110,95,102,108,111,97,116,40,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,44,32,105,110,100,101,120,32,58,32,117,54,52,44,32,115,101,101,100,32,58,32,117,54,52,44,32,112,114,101,99,105,115,105,111,110,32,58,32,102,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,103,101,110,95,102,108,111,97,116,44,32,102,114,111,109,44,32,116,111,44,32,105,110,100,101,120,44,32,115,101,101,100,44,32,112,114,101,99,105,115,105,111,110,41,32,125,10,102,117,110,99,116,105,111,110,32,100,114,97,119,95,105,110,116,40,102,114,111,109,32,58,32,117,54,52,44,32,116,111,32,58,32,117,54,52,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,117,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,100,114,97,119,95,105,110,116,44,32,102,114,111,109,44,32,116,111,44,32,48,117,54,52,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,100,114,97,119,95,102,108,111,97,116,40,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,100,114,97,119,95,102,108,111,97,116,44,32,102,114,111,109,44,32,116,111,44,32,48,117,54,52,44,32,48,117,54,52,44,32,48,46,48,48,48,48,48,48,48,48,48,48,48,49,41,32,125,10,102,117,110,99,116,105,111,110,32,100,114,97,119,95,102,108,111,97,116,40,102,114,111,109,32,58,32,102,54,52,44,32,116,111,32,58,32,102,54,52,44,32,112,114,101,99,105,115,105,111,110,32,58,32,102,54,52,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,102,54,52,40,95,95,98,101,97,114,101,114,95,110,111,105,115,101,95,100,114,97,119,95,102,108,111,97,116,44,32,102,114,111,109,44,32,116,111,44,32,48,117,54,52,44,32,48,117,54,52,44,32,112,114,101,99,105,115,105,111,110,41,32,125,10,10,47,47,32,67,97,99,104,101,32,97,110,100,32,112,114,111,99,101,115,115,32,112,111,108,105,99,121,32,114,101,109,97,105,110,115,32,105,110,32,115,121,115,46,99,112,112,47,119,111,114,107,101,114,59,32,67,97,112,121,32,112,97,115,115,101,115,32,99,111,112,105,101,100,32,118,97,108,117,101,115,46,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,99,111,110,110,101,99,116,40,41,32,117,54,52,32,123,32,109,101,109,99,97,99,104,101,95,99,111,110,110,101,99,116,40,34,49,50,55,46,48,46,48,46,49,34,44,32,49,49,50,49,49,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,99,111,110,110,101,99,116,40,104,111,115,116,32,58,32,115,116,114,105,110,103,44,32,112,111,114,116,32,58,32,115,51,50,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,99,111,110,110,101,99,116,44,32,100,118,97,108,40,104,111,115,116,41,44,32,34,34,44,32,100,118,97,108,40,112,111,114,116,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,99,111,109,109,97,110,100,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,99,111,109,109,97,110,100,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,99,111,109,109,97,110,100,44,32,100,118,97,108,40,99,111,110,110,101,99,116,105,111,110,41,44,32,99,111,109,109,97,110,100,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,115,101,116,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,109,101,109,99,97,99,104,101,95,115,101,116,40,99,111,110,110,101,99,116,105,111,110,44,32,107,101,121,44,32,118,97,108,117,101,44,32,51,54,48,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,115,101,116,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,44,32,101,120,112,105,114,101,115,95,105,110,32,58,32,117,54,52,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,115,101,116,44,32,100,118,97,108,40,99,111,110,110,101,99,116,105,111,110,41,44,32,107,101,121,44,32,100,118,97,108,40,123,34,118,97,108,117,101,34,58,32,118,97,108,117,101,44,32,34,101,120,112,105,114,101,115,34,58,32,101,120,112,105,114,101,115,95,105,110,125,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,100,101,108,101,116,101,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,100,101,108,101,116,101,44,32,100,118,97,108,40,99,111,110,110,101,99,116,105,111,110,41,44,32,107,101,121,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,103,101,116,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,109,101,109,99,97,99,104,101,95,103,101,116,40,99,111,110,110,101,99,116,105,111,110,44,32,107,101,121,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,103,101,116,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,32,58,32,115,116,114,105,110,103,44,32,100,101,102,97,117,108,116,95,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,103,101,116,44,32,100,118,97,108,40,99,111,110,110,101,99,116,105,111,110,41,44,32,107,101,121,44,32,100,118,97,108,40,100,101,102,97,117,108,116,95,118,97,108,117,101,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,103,101,116,95,109,117,108,116,105,112,108,101,40,99,111,110,110,101,99,116,105,111,110,32,58,32,117,54,52,44,32,107,101,121,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,103,101,116,95,109,117,108,116,105,112,108,101,44,32,100,118,97,108,40,99,111,110,110,101,99,116,105,111,110,41,44,32,34,34,44,32,107,101,121,115,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,44,32,100,118,97,108,40,107,101,121,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,115,40,107,101,121,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,99,97,99,104,101,95,109,101,109,99,97,99,104,101,95,101,115,99,97,112,101,95,107,101,121,115,44,32,107,101,121,115,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,10,102,117,110,99,116,105,111,110,32,115,104,101,108,108,95,101,115,99,97,112,101,40,114,97,119,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,101,115,99,97,112,101,44,32,100,118,97,108,40,114,97,119,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,104,101,108,108,95,101,120,101,99,40,99,111,109,109,97,110,100,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,101,120,101,99,44,32,100,118,97,108,40,99,111,109,109,97,110,100,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,47,47,32,74,111,98,32,73,68,115,32,114,101,109,97,105,110,32,99,111,112,105,101,100,32,68,86,97,108,117,101,115,32,105,110,32,67,97,112,121,32,115,111,32,116,104,101,32,104,111,115,116,39,115,32,101,120,97,99,116,32,117,54,52,32,114,101,103,105,115,116,114,121,32,73,68,115,10,47,47,32,110,101,118,101,114,32,99,114,111,115,115,32,97,32,108,111,115,115,121,32,115,99,97,108,97,114,32,99,111,110,118,101,114,115,105,111,110,46,10,102,117,110,99,116,105,111,110,32,115,104,101,108,108,95,115,112,97,119,110,40,115,112,101,99,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,104,101,108,108,95,115,112,97,119,110,44,32,115,112,101,99,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,98,95,115,116,97,116,117,115,40,106,111,98,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,115,116,97,116,117,115,44,32,106,111,98,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,98,95,114,101,115,117,108,116,40,106,111,98,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,114,101,115,117,108,116,44,32,106,111,98,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,98,95,97,119,97,105,116,40,106,111,98,32,58,32,100,118,97,108,44,32,116,105,109,101,111,117,116,95,109,115,32,58,32,115,51,50,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,97,119,97,105,116,44,32,106,111,98,44,32,34,34,44,32,100,118,97,108,40,116,105,109,101,111,117,116,95,109,115,41,41,32,125,10,102,117,110,99,116,105,111,110,32,106,111,98,95,99,97,110,99,101,108,40,106,111,98,32,58,32,100,118,97,108,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,95,99,97,110,99,101,108,44,32,106,111,98,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,112,114,111,99,101,115,115,95,115,116,97,114,116,95,100,105,114,101,99,116,111,114,121,40,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,112,114,111,99,101,115,115,95,115,116,97,114,116,95,100,105,114,101,99,116,111,114,121,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,114,118,101,114,95,115,116,97,114,116,95,104,116,116,112,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,98,105,110,100,32,58,32,115,116,114,105,110,103,44,32,102,105,108,101,32,58,32,115,116,114,105,110,103,41,32,115,51,50,32,123,32,115,101,114,118,101,114,95,115,116,97,114,116,95,104,116,116,112,40,107,101,121,44,32,98,105,110,100,44,32,102,105,108,101,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,114,118,101,114,95,115,116,97,114,116,95,104,116,116,112,40,107,101,121,32,58,32,115,116,114,105,110,103,44,32,98,105,110,100,32,58,32,115,116,114,105,110,103,44,32,102,105,108,101,32,58,32,115,116,114,105,110,103,44,32,99,97,108,108,98,97,99,107,32,58,32,115,116,114,105,110,103,41,32,115,51,50,32,123,32,100,118,97,108,95,115,51,50,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,101,114,118,101,114,95,115,116,97,114,116,95,104,116,116,112,44,32,100,118,97,108,40,107,101,121,41,44,32,98,105,110,100,44,32,100,118,97,108,40,123,34,102,105,108,101,34,58,32,102,105,108,101,44,32,34,102,117,110,99,116,105,111,110,34,58,32,99,97,108,108,98,97,99,107,125,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,101,114,118,101,114,95,115,116,111,112,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,115,101,114,118,101,114,95,115,116,111,112,44,32,100,118,97,108,40,107,101,121,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,97,115,107,40,116,97,114,103,101,116,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,115,117,98,109,105,116,44,32,100,118,97,108,40,116,97,114,103,101,116,41,44,32,34,34,44,32,112,114,111,112,115,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,97,115,107,95,115,116,97,116,117,115,40,105,100,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,115,116,97,116,117,115,44,32,100,118,97,108,40,105,100,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,97,115,107,95,97,119,97,105,116,40,105,100,32,58,32,115,116,114,105,110,103,44,32,116,105,109,101,111,117,116,95,109,115,32,58,32,117,54,52,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,97,119,97,105,116,44,32,100,118,97,108,40,105,100,41,44,32,34,34,44,32,100,118,97,108,40,116,105,109,101,111,117,116,95,109,115,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,97,115,107,95,99,97,110,99,101,108,40,105,100,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,106,111,98,115,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,112,114,111,99,101,115,115,95,116,97,115,107,95,99,97,110,99,101,108,44,32,100,118,97,108,40,105,100,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,10,47,47,32,78,101,116,119,111,114,107,32,114,101,115,111,117,114,99,101,115,32,114,101,109,97,105,110,32,114,101,113,117,101,115,116,45,111,119,110,101,100,32,98,121,32,116,104,101,32,119,111,114,107,115,112,97,99,101,46,32,72,97,110,100,108,101,115,32,97,114,101,32,101,110,99,111,100,101,100,10,47,47,32,97,115,32,100,101,99,105,109,97,108,32,68,86,97,108,117,101,115,32,97,116,32,116,104,101,32,66,82,82,66,32,98,111,117,110,100,97,114,121,44,32,116,104,101,110,32,112,97,114,115,101,100,32,101,120,97,99,116,108,121,32,97,115,32,117,54,52,32,118,97,108,117,101,115,46,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,99,111,110,110,101,99,116,40,104,111,115,116,32,58,32,115,116,114,105,110,103,44,32,112,111,114,116,32,58,32,115,51,50,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,99,111,110,110,101,99,116,44,32,100,118,97,108,40,104,111,115,116,41,44,32,34,34,44,32,100,118,97,108,40,112,111,114,116,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,99,108,111,115,101,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,123,32,118,97,114,32,105,103,110,111,114,101,100,32,58,61,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,99,108,111,115,101,44,32,100,118,97,108,40,104,97,110,100,108,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,119,114,105,116,101,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,100,97,116,97,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,100,118,97,108,95,98,111,111,108,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,119,114,105,116,101,44,32,100,118,97,108,40,104,97,110,100,108,101,41,44,32,100,97,116,97,44,32,100,118,97,108,40,34,34,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,115,111,99,107,101,116,95,114,101,97,100,40,104,97,110,100,108,101,44,32,49,51,49,48,55,50,44,32,49,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,109,97,120,95,108,101,110,103,116,104,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,115,111,99,107,101,116,95,114,101,97,100,40,104,97,110,100,108,101,44,32,109,97,120,95,108,101,110,103,116,104,44,32,49,41,32,125,10,102,117,110,99,116,105,111,110,32,115,111,99,107,101,116,95,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,109,97,120,95,108,101,110,103,116,104,32,58,32,115,51,50,44,32,116,105,109,101,111,117,116,32,58,32,115,51,50,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,115,111,99,107,101,116,95,114,101,97,100,44,32,100,118,97,108,40,104,97,110,100,108,101,41,44,32,34,34,44,32,100,118,97,108,40,123,34,109,97,120,95,108,101,110,103,116,104,34,58,32,109,97,120,95,108,101,110,103,116,104,44,32,34,116,105,109,101,111,117,116,34,58,32,116,105,109,101,111,117,116,125,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,104,116,116,112,95,114,101,113,117,101,115,116,40,114,101,113,117,101,115,116,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,114,101,113,117,101,115,116,44,32,114,101,113,117,101,115,116,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,104,116,116,112,95,114,101,113,117,101,115,116,95,97,115,121,110,99,40,114,101,113,117,101,115,116,32,58,32,100,118,97,108,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,110,101,116,119,111,114,107,95,104,116,116,112,95,114,101,113,117,101,115,116,95,97,115,121,110,99,44,32,114,101,113,117,101,115,116,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,44,32,48,117,54,52,41,32,125,10,10,47,47,32,67,43,43,32,117,110,105,116,47,99,111,109,112,111,110,101,110,116,32,112,111,108,105,99,121,32,114,101,109,97,105,110,115,32,105,110,32,116,104,101,32,101,120,105,115,116,105,110,103,32,119,111,114,107,115,112,97,99,101,32,100,105,115,112,97,116,99,104,101,114,46,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,44,32,112,114,111,112,115,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,99,97,108,108,40,102,105,108,101,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,102,117,110,99,116,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,117,110,105,116,95,99,97,108,108,40,102,105,108,101,95,110,97,109,101,44,32,102,117,110,99,116,105,111,110,95,110,97,109,101,44,32,100,118,97,108,40,34,34,41,41,32,125,10,10,47,47,32,84,105,109,101,32,112,97,114,115,105,110,103,47,102,111,114,109,97,116,116,105,110,103,32,115,116,97,121,115,32,105,110,32,115,121,115,46,99,112,112,59,32,117,54,52,32,118,97,108,117,101,115,32,99,114,111,115,115,32,66,82,82,66,32,97,115,32,101,120,97,99,116,32,116,101,120,116,46,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,112,97,114,115,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,102,111,114,109,97,116,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,112,97,114,115,101,44,32,100,118,97,108,40,118,97,108,117,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,40,41,32,115,116,114,105,110,103,32,123,32,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,40,34,34,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,40,102,111,114,109,97,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,40,102,111,114,109,97,116,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,40,102,111,114,109,97,116,32,58,32,115,116,114,105,110,103,44,32,116,105,109,101,115,116,97,109,112,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,102,111,114,109,97,116,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,108,111,99,97,108,44,32,100,118,97,108,40,102,111,114,109,97,116,41,44,32,34,34,44,32,100,118,97,108,40,116,105,109,101,115,116,97,109,112,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,40,41,32,115,116,114,105,110,103,32,123,32,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,40,34,34,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,40,102,111,114,109,97,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,40,102,111,114,109,97,116,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,40,102,111,114,109,97,116,32,58,32,115,116,114,105,110,103,44,32,116,105,109,101,115,116,97,109,112,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,102,111,114,109,97,116,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,117,116,99,44,32,100,118,97,108,40,102,111,114,109,97,116,41,44,32,34,34,44,32,100,118,97,108,40,116,105,109,101,115,116,97,109,112,41,41,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,114,101,108,97,116,105,118,101,40,116,105,109,101,115,116,97,109,112,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,116,105,109,101,95,102,111,114,109,97,116,95,114,101,108,97,116,105,118,101,40,116,105,109,101,115,116,97,109,112,44,32,34,34,44,32,48,117,54,52,44,32,34,34,44,32,48,117,54,52,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,102,111,114,109,97,116,95,114,101,108,97,116,105,118,101,40,116,105,109,101,115,116,97,109,112,32,58,32,117,54,52,44,32,118,101,114,121,95,114,101,99,101,110,116,32,58,32,115,116,114,105,110,103,44,32,109,101,100,105,117,109,95,115,101,99,111,110,100,115,32,58,32,117,54,52,44,32,109,101,100,105,117,109,95,114,101,99,101,110,116,32,58,32,115,116,114,105,110,103,44,32,110,111,116,95,114,101,99,101,110,116,95,115,101,99,111,110,100,115,32,58,32,117,54,52,44,32,110,111,116,95,114,101,99,101,110,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,100,118,97,108,95,115,116,114,105,110,103,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,102,111,114,109,97,116,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,116,105,109,101,95,116,105,109,101,95,102,111,114,109,97,116,95,114,101,108,97,116,105,118,101,44,32,100,118,97,108,40,116,105,109,101,115,116,97,109,112,41,44,32,118,101,114,121,95,114,101,99,101,110,116,44,32,100,118,97,108,40,123,34,109,101,100,105,117,109,95,115,101,99,111,110,100,115,34,58,32,109,101,100,105,117,109,95,115,101,99,111,110,100,115,44,32,34,109,101,100,105,117,109,95,114,101,99,101,110,116,34,58,32,109,101,100,105,117,109,95,114,101,99,101,110,116,44,32,34,110,111,116,95,114,101,99,101,110,116,95,115,101,99,111,110,100,115,34,58,32,110,111,116,95,114,101,99,101,110,116,95,115,101,99,111,110,100,115,44,32,34,110,111,116,95,114,101,99,101,110,116,34,58,32,110,111,116,95,114,101,99,101,110,116,125,41,41,41,32,125,10,10,102,117,110,99,116,105,111,110,32,119,115,95,99,111,110,110,101,99,116,105,111,110,115,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,114,101,103,105,115,116,114,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,115,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,111,110,110,101,99,116,105,111,110,115,40,115,99,111,112,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,114,101,103,105,115,116,114,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,115,44,32,100,118,97,108,40,115,99,111,112,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,111,110,110,101,99,116,105,111,110,95,99,111,117,110,116,40,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,114,101,103,105,115,116,114,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,95,99,111,117,110,116,44,32,100,118,97,108,40,34,34,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,44,32,48,117,54,52,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,111,110,110,101,99,116,105,111,110,95,99,111,117,110,116,40,115,99,111,112,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,117,54,52,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,114,101,103,105,115,116,114,121,95,98,114,114,98,40,95,95,98,101,97,114,101,114,95,119,101,98,115,111,99,107,101,116,95,119,115,95,99,111,110,110,101,99,116,105,111,110,95,99,111,117,110,116,44,32,100,118,97,108,40,115,99,111,112,101,41,44,32,34,34,44,32,100,118,97,108,40,34,34,41,41,44,32,48,117,54,52,41,32,125,10,10,47,47,32,68,105,114,101,99,116,32,98,121,116,101,45,115,112,97,110,32,97,100,97,112,116,101,114,115,32,114,101,109,97,105,110,32,112,114,105,118,97,116,101,59,32,112,117,98,108,105,99,32,110,97,109,101,115,32,98,101,108,111,119,32,116,104,105,115,32,98,111,117,110,100,97,114,121,32,97,114,101,10,47,47,32,111,114,100,105,110,97,114,121,32,100,101,99,108,97,114,97,116,105,111,110,115,32,115,101,108,101,99,116,101,100,32,102,114,111,109,32,116,104,105,115,32,115,111,117,114,99,101,32,119,105,116,104,32,117,115,101,114,45,99,97,108,108,32,112,114,111,118,101,110,97,110,99,101,46,10,102,117,110,99,116,105,111,110,32,97,114,114,97,121,95,109,101,114,103,101,40,108,101,102,116,32,58,32,100,118,97,108,44,32,114,105,103,104,116,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,100,118,95,109,101,114,103,101,95,98,114,114,98,40,108,101,102,116,44,32,114,105,103,104,116,41,32,125,10,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,112,97,114,97,109,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,112,97,114,97,109,44,32,107,101,121,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,103,101,116,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,103,101,116,44,32,107,101,121,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,112,111,115,116,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,112,111,115,116,44,32,107,101,121,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,99,111,111,107,105,101,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,99,111,111,107,105,101,44,32,107,101,121,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,40,107,101,121,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,40,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,118,97,108,117,101,95,114,101,113,117,101,115,116,95,115,101,115,115,105,111,110,44,32,107,101,121,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,98,111,100,121,40,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,98,111,100,121,40,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,95,98,114,114,98,40,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,40,118,97,108,117,101,32,58,32,114,101,113,117,101,115,116,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,113,117,101,115,116,95,99,111,110,116,101,120,116,95,102,111,114,95,98,114,114,98,40,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,115,112,111,110,115,101,95,104,101,97,100,101,114,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,123,32,105,102,32,33,95,95,98,101,97,114,101,114,95,114,101,115,112,111,110,115,101,95,115,101,116,95,104,101,97,100,101,114,40,110,97,109,101,44,32,118,97,108,117,101,41,32,123,32,116,114,97,112,40,41,32,125,32,125,10,10,102,117,110,99,116,105,111,110,32,119,115,95,109,101,115,115,97,103,101,40,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,109,101,115,115,97,103,101,40,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,111,110,110,101,99,116,105,111,110,95,105,100,40,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,99,111,110,110,101,99,116,105,111,110,95,105,100,40,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,115,99,111,112,101,40,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,115,99,111,112,101,40,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,111,112,99,111,100,101,40,41,32,115,51,50,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,111,112,99,111,100,101,40,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,105,115,95,98,105,110,97,114,121,40,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,105,115,95,98,105,110,97,114,121,40,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,115,101,110,100,40,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,40,109,101,115,115,97,103,101,44,32,98,105,110,97,114,121,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,115,101,110,100,40,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,44,32,115,99,111,112,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,95,115,99,111,112,101,40,109,101,115,115,97,103,101,44,32,98,105,110,97,114,121,44,32,115,99,111,112,101,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,115,101,110,100,95,116,111,40,99,111,110,110,101,99,116,105,111,110,95,105,100,32,58,32,115,116,114,105,110,103,44,32,109,101,115,115,97,103,101,32,58,32,115,116,114,105,110,103,44,32,98,105,110,97,114,121,32,58,32,98,111,111,108,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,115,101,110,100,95,116,111,40,99,111,110,110,101,99,116,105,111,110,95,105,100,44,32,109,101,115,115,97,103,101,44,32,98,105,110,97,114,121,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,108,111,115,101,40,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,99,108,111,115,101,40,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,119,115,95,99,108,111,115,101,40,99,111,110,110,101,99,116,105,111,110,95,105,100,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,119,115,95,99,108,111,115,101,40,99,111,110,110,101,99,116,105,111,110,95,105,100,41,32,125,10,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,99,97,112,116,117,114,101,95,112,114,111,112,115,95,98,114,114,98,40,110,97,109,101,44,32,112,114,111,112,115,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,95,98,121,116,101,115,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,40,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,110,100,101,114,95,112,114,111,112,115,95,98,114,114,98,40,110,97,109,101,44,32,112,114,111,112,115,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,101,120,105,115,116,115,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,101,120,105,115,116,115,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,99,111,109,112,111,110,101,110,116,95,114,101,115,111,108,118,101,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,109,112,111,110,101,110,116,95,114,101,115,111,108,118,101,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,114,101,110,100,101,114,40,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,114,101,110,100,101,114,95,98,121,116,101,115,40,110,97,109,101,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,108,111,97,100,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,109,111,100,117,108,101,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,108,111,97,100,40,112,97,116,104,41,32,125,10,102,117,110,99,116,105,111,110,32,99,97,108,108,40,104,97,110,100,108,101,32,58,32,109,111,100,117,108,101,44,32,110,97,109,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,99,97,108,108,40,104,97,110,100,108,101,44,32,110,97,109,101,44,32,100,118,97,108,40,123,58,125,41,41,32,125,10,102,117,110,99,116,105,111,110,32,99,97,108,108,40,104,97,110,100,108,101,32,58,32,109,111,100,117,108,101,44,32,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,105,110,112,117,116,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,109,111,100,117,108,101,95,99,97,108,108,95,98,114,114,98,40,104,97,110,100,108,101,44,32,110,97,109,101,44,32,105,110,112,117,116,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,99,97,108,108,40,102,105,108,101,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,102,117,110,99,116,105,111,110,95,110,97,109,101,32,58,32,115,116,114,105,110,103,44,32,112,114,111,112,115,32,58,32,100,118,97,108,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,99,97,108,108,95,98,114,114,98,40,102,105,108,101,95,110,97,109,101,44,32,102,117,110,99,116,105,111,110,95,110,97,109,101,44,32,112,114,111,112,115,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,105,110,102,111,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,105,110,102,111,95,98,114,114,98,40,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,105,110,102,111,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,105,110,102,111,95,98,114,114,98,40,112,97,116,104,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,115,95,108,105,115,116,40,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,115,95,108,105,115,116,95,98,114,114,98,40,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,99,111,109,112,105,108,101,40,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,99,111,109,112,105,108,101,40,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,117,110,105,116,95,99,111,109,112,105,108,101,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,117,110,105,116,95,99,111,109,112,105,108,101,40,112,97,116,104,41,32,125,10,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,109,97,116,99,104,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,109,97,116,99,104,40,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,109,97,116,99,104,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,109,97,116,99,104,40,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,102,108,97,103,115,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,101,97,114,99,104,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,101,97,114,99,104,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,102,108,97,103,115,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,101,97,114,99,104,95,97,108,108,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,95,97,108,108,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,115,101,97,114,99,104,95,97,108,108,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,115,101,97,114,99,104,95,97,108,108,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,34,34,44,32,102,108,97,103,115,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,114,101,112,108,97,99,101,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,114,101,112,108,97,99,101,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,114,101,112,108,97,99,101,109,101,110,116,44,32,34,34,41,32,125,10,102,117,110,99,116,105,111,110,32,114,101,103,101,120,95,114,101,112,108,97,99,101,40,112,97,116,116,101,114,110,32,58,32,115,116,114,105,110,103,44,32,114,101,112,108,97,99,101,109,101,110,116,32,58,32,115,116,114,105,110,103,44,32,115,117,98,106,101,99,116,32,58,32,115,116,114,105,110,103,44,32,102,108,97,103,115,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,114,101,103,101,120,95,114,101,103,101,120,95,114,101,112,108,97,99,101,44,32,112,97,116,116,101,114,110,44,32,115,117,98,106,101,99,116,44,32,114,101,112,108,97,99,101,109,101,110,116,44,32,102,108,97,103,115,41,32,125,10,10,102,117,110,99,116,105,111,110,32,98,97,115,101,54,52,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,98,97,115,101,54,52,95,101,110,99,111,100,101,44,32,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,98,97,115,101,54,52,95,100,101,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,98,97,115,101,54,52,95,100,101,99,111,100,101,44,32,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,117,114,105,95,101,110,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,117,114,105,95,101,110,99,111,100,101,44,32,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,117,114,105,95,100,101,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,116,101,120,116,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,117,114,105,95,100,101,99,111,100,101,44,32,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,106,115,111,110,95,100,101,99,111,100,101,40,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,100,118,97,108,32,123,32,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,100,118,97,108,40,95,95,98,101,97,114,101,114,95,99,111,100,101,99,95,106,115,111,110,95,100,101,99,111,100,101,44,32,118,97,108,117,101,41,32,125,10,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,111,112,101,110,40,112,97,116,104,32,58,32,115,116,114,105,110,103,44,32,109,111,100,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,111,112,101,110,40,112,97,116,104,44,32,109,111,100,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,114,101,97,100,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,99,111,117,110,116,32,58,32,117,54,52,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,114,101,97,100,40,104,97,110,100,108,101,44,32,99,111,117,110,116,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,119,114,105,116,101,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,118,97,108,117,101,32,58,32,115,116,114,105,110,103,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,119,114,105,116,101,40,104,97,110,100,108,101,44,32,118,97,108,117,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,115,101,101,107,40,104,97,110,100,108,101,32,58,32,117,54,52,44,32,111,102,102,115,101,116,32,58,32,115,54,52,44,32,119,104,101,110,99,101,32,58,32,115,54,52,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,115,101,101,107,40,104,97,110,100,108,101,44,32,111,102,102,115,101,116,44,32,119,104,101,110,99,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,116,101,108,108,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,115,54,52,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,116,101,108,108,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,102,115,121,110,99,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,98,111,111,108,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,102,115,121,110,99,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,99,108,111,115,101,40,104,97,110,100,108,101,32,58,32,117,54,52,41,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,99,108,111,115,101,40,104,97,110,100,108,101,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,116,101,109,112,40,112,114,101,102,105,120,32,58,32,115,116,114,105,110,103,41,32,115,116,114,105,110,103,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,116,101,109,112,40,112,114,101,102,105,120,41,32,125,10,102,117,110,99,116,105,111,110,32,102,105,108,101,95,117,110,108,105,110,107,40,112,97,116,104,32,58,32,115,116,114,105,110,103,41,32,123,32,95,95,98,101,97,114,101,114,95,102,105,108,101,95,117,110,108,105,110,107,40,112,97,116,104,41,32,125,10,10,102,117,110,99,116,105,111,110,32,116,105,109,101,40,41,32,117,54,52,32,123,32,95,95,98,101,97,114,101,114,95,116,105,109,101,40,41,32,125,10,102,117,110,99,116,105,111,110,32,116,105,109,101,95,112,114,101,99,105,115,101,40,41,32,102,54,52,32,123,32,95,95,98,101,97,114,101,114,95,116,105,109,101,95,112,114,101,99,105,115,101,40,41,32,125,10}; inline const std::string_view text(reinterpret_cast(source), sizeof(source)); } diff --git a/src/lib/compiler-parser.cpp b/src/lib/compiler-parser.cpp index f5455f9d..f48aca40 100644 --- a/src/lib/compiler-parser.cpp +++ b/src/lib/compiler-parser.cpp @@ -2,11 +2,14 @@ #include "compiler.h" +#include + namespace { const char* BEARER_NAMED_RENDER_SYMBOL = "__bearer_render"; const char* BEARER_NAMED_COMPONENT_SYMBOL = "__bearer_component"; const char* BEARER_NAMED_SERVE_HTTP_SYMBOL = "__bearer_serve_http"; +const char* BEARER_NAMED_TASK_SYMBOL = "__bearer_task"; struct CompilerCodeState { @@ -430,7 +433,17 @@ String compiler_rewrite_fragment_attributes(String content) return(result); } -bool compiler_rewrite_named_entrypoint_line(String& line, String macro_prefix, String symbol_prefix) +bool compiler_task_suffix_is_valid(const String& suffix) +{ + if(suffix == "" || !(isalpha((unsigned char)suffix[0]) || suffix[0] == '_')) + return(false); + for(char c : suffix) + if(!(isalnum((unsigned char)c) || c == '_')) + return(false); + return(true); +} + +bool compiler_rewrite_named_entrypoint_line(String& line, String macro_prefix, String symbol_prefix, std::set* task_exports = 0) { u32 indent_length = 0; while(indent_length < line.length() && isspace(line[indent_length])) @@ -446,12 +459,47 @@ bool compiler_rewrite_named_entrypoint_line(String& line, String macro_prefix, S if(open_paren_pos == String::npos) return(false); - String render_name = trim(signature.substr(0, open_paren_pos)); - String render_signature = signature.substr(open_paren_pos); - if(render_name == "") - return(false); + String name = trim(signature.substr(0, open_paren_pos)); + String handler_signature = signature.substr(open_paren_pos); + if(name == "") + { + if(!task_exports) + return(false); + line = indent + "#error invalid TASK handler name"; + return(true); + } + if(task_exports && !compiler_task_suffix_is_valid(name)) + { + line = indent + "#error invalid TASK handler name"; + return(true); + } - line = indent + "EXPORT void " + symbol_prefix + "_" + safe_name(render_name) + render_signature; + String exported = symbol_prefix + "_" + (task_exports ? name : safe_name(name)); + if(task_exports && !task_exports->insert(exported).second) + { + line = indent + "#error duplicate TASK handler export"; + return(true); + } + if(!task_exports) + { + line = indent + "EXPORT void " + exported + handler_signature; + return(true); + } + u32 depth = 0; + u32 close_paren_pos = String::npos; + for(u32 i = open_paren_pos; i < signature.length(); i++) + { + if(signature[i] == '(') + depth += 1; + else if(signature[i] == ')' && --depth == 0) + { + close_paren_pos = i; + break; + } + } + if(close_paren_pos == String::npos) + return(false); + line = indent + "BEARER_NAMED_TASK(" + exported + ", " + signature.substr(0, close_paren_pos + 1) + ")" + signature.substr(close_paren_pos + 1); return(true); } @@ -459,6 +507,7 @@ String compiler_rewrite_named_render_syntax(String content) { String result = ""; String current_line = ""; + std::set task_exports; auto flush_line = [&]() { if(current_line.length() == 0) @@ -474,7 +523,8 @@ String compiler_rewrite_named_render_syntax(String content) compiler_rewrite_named_entrypoint_line(line, "RENDER:", BEARER_NAMED_RENDER_SYMBOL) || compiler_rewrite_named_entrypoint_line(line, "COMPONENT:", BEARER_NAMED_COMPONENT_SYMBOL) || - compiler_rewrite_named_entrypoint_line(line, "SERVE_HTTP:", BEARER_NAMED_SERVE_HTTP_SYMBOL); + compiler_rewrite_named_entrypoint_line(line, "SERVE_HTTP:", BEARER_NAMED_SERVE_HTTP_SYMBOL) || + compiler_rewrite_named_entrypoint_line(line, "TASK:", BEARER_NAMED_TASK_SYMBOL, &task_exports); result += line + line_break; current_line = ""; diff --git a/src/lib/compiler.h b/src/lib/compiler.h index e7ebb708..2cde74e2 100644 --- a/src/lib/compiler.h +++ b/src/lib/compiler.h @@ -1,5 +1,7 @@ #pragma once +#include + #if defined(__BEARER_WASM_UNIT__) #define BEARER_UNIT_EXPORT __attribute__((visibility("default"))) #else @@ -13,6 +15,9 @@ #define WS(X) extern "C" BEARER_UNIT_EXPORT void __bearer_websocket(X) #define CLI(X) extern "C" BEARER_UNIT_EXPORT void __bearer_cli(X) #define SERVE_HTTP(X) extern "C" BEARER_UNIT_EXPORT void __bearer_serve_http(X) +#define BEARER_TASK_SIGNATURE_ASSERT(SYMBOL) static_assert(std::is_same_v, "TASK must have exact signature void(Request&)") +#define TASK(X) extern "C" BEARER_UNIT_EXPORT void __bearer_task(X); BEARER_TASK_SIGNATURE_ASSERT(__bearer_task); extern "C" BEARER_UNIT_EXPORT void __bearer_task(X) +#define BEARER_NAMED_TASK(SYMBOL, X) extern "C" BEARER_UNIT_EXPORT void SYMBOL X; BEARER_TASK_SIGNATURE_ASSERT(SYMBOL); extern "C" BEARER_UNIT_EXPORT void SYMBOL X #define EXPORT extern "C" BEARER_UNIT_EXPORT String preprocess_shared_unit(Request* context, SharedUnit* su); diff --git a/src/lib/sys.cpp b/src/lib/sys.cpp index 6d838fab..ea6c45ed 100644 --- a/src/lib/sys.cpp +++ b/src/lib/sys.cpp @@ -40,9 +40,7 @@ size_t bearer_host_file_temp(const char* prefix, size_t prefix_len, const char* int bearer_host_file_chmod(const char* path, size_t path_len, const char* current, size_t current_len, uint32_t mode); int bearer_host_file_symlink(const char* target, size_t target_len, const char* linkpath, size_t linkpath_len, const char* current, size_t current_len); int bearer_host_file_fsync(uint64_t handle); -int bearer_host_task_spawn(const char* key, size_t key_len, uint64_t callback_id, double interval, uint64_t timeout, int repeat); -int bearer_host_task_pid(const char* key, size_t key_len); -int bearer_host_task_kill(int pid, int sig); +size_t bearer_host_task(const char* in, size_t in_len, char* out, size_t cap); unsigned int bearer_host_sleep_us(uint64_t usec); uint64_t bearer_host_socket_connect(const char* host, size_t host_len, int port); void bearer_host_socket_close(uint64_t sockfd); @@ -673,42 +671,42 @@ StringMap memcache_get_multiple(u64 connection, DValue keys) } void on_segfault(int sig) { (void)sig; } -static u64 wasm_next_task_callback_id = 1; -static std::map> wasm_task_callbacks; - -extern "C" int bearer_wasm_task_run(uint64_t callback_id) -{ - auto it = wasm_task_callbacks.find(callback_id); - if(it == wasm_task_callbacks.end()) - return(1); - it->second(); - return(0); -} - -int task_kill(pid_t pid, s32 sig) { return(bearer_host_task_kill(pid, (int)sig)); } String runtime_safe_key(String key, String label) { (void)label; key = trim(key); - if(key == "") - return(""); - return(gen_sha1(key)); + return(key == "" ? "" : gen_sha1(key)); } -pid_t task(String key, std::function exec_after_spawn, u64 timeout) + +static DValue wasm_task_call(String operation, String target_or_id, DValue props, u64 timeout_ms) { - u64 id = wasm_next_task_callback_id++; - wasm_task_callbacks[id] = exec_after_spawn; - return((pid_t)bearer_host_task_spawn(key.data(), key.size(), id, 0.0, timeout, 0)); + DValue request; + request["op"] = operation; + request[operation == "submit" ? "target" : "id"] = target_or_id; + request["props"] = props; + request["timeout_ms"] = std::to_string(timeout_ms); + String encoded = brb_encode(request); + size_t need = bearer_host_task(encoded.data(), encoded.size(), 0, 0); + if(need == 0 || need > 16 * 1024 * 1024) + __builtin_trap(); + String response(need, 0); + size_t got = bearer_host_task(encoded.data(), encoded.size(), response.data(), response.size()); + DValue decoded; + if(got == 0 || got > response.size() || !brb_decode(String(response.data(), got), decoded, 0)) + __builtin_trap(); + return(decoded); } -pid_t task_repeat(String key, f64 interval, std::function exec_after_spawn, u64 timeout) + +String task(String target, DValue props) { - if(!(interval > 0) || !std::isfinite(interval)) - return(0); - u64 id = wasm_next_task_callback_id++; - wasm_task_callbacks[id] = exec_after_spawn; - return((pid_t)bearer_host_task_spawn(key.data(), key.size(), id, interval, timeout, 1)); + DValue response = wasm_task_call("submit", target, props, 0); + if(response["error"].to_string() != "") + __builtin_trap(); + return(response["id"].to_string()); } -pid_t task_pid(String key) { return((pid_t)bearer_host_task_pid(key.data(), key.size())); } +DValue task_status(String id) { return(wasm_task_call("status", id, DValue(), 0)); } +DValue task_await(String id, u64 timeout_ms) { return(wasm_task_call("await", id, DValue(), timeout_ms)); } +DValue task_cancel(String id) { return(wasm_task_call("cancel", id, DValue(), 0)); } extern "C" unsigned int sleep(unsigned int seconds) { return(bearer_host_sleep_us((uint64_t)seconds * 1000000ull)); } extern "C" s32 usleep(u32 usec) { bearer_host_sleep_us(usec); return(0); } pid_t server_start_http(String key, String socket_fn_or_port, String call_bearer_filename, String call_function) @@ -732,6 +730,7 @@ StringMap default_config() } #else +#include "task_workers.h" #include #include #include @@ -762,7 +761,6 @@ bool password_needs_rehash(String encoded) { return(password_needs_rehash_native // Single definitions for the native split_strings build (declared extern in sys.h). pid_t parent_pid = 0; pid_t my_pid = 0; -bool task_child_process = false; namespace { @@ -1652,213 +1650,21 @@ String runtime_safe_key(String key, String label) return(gen_sha1(key)); } -String task_file_prefix(String key) +static DValue task_result_value(const task_queue::Result& result) { - return(path_join(context->server->config["BIN_DIRECTORY"], "task-" + runtime_safe_key(key, "task key"))); + if(result.ok()) return(result.status); + DValue error; error["error"] = result.code; return(error); } -struct TaskStatus { - pid_t pid = 0; - String process_start_ticks = ""; -}; - -TaskStatus task_status_parse(String status_file) +String task(String target, DValue props) { - TaskStatus status; - auto lines = split_strings(trim(status_file), "\n"); - if(lines.size() > 0) - status.pid = (pid_t)int_val(trim(lines[0])); - if(lines.size() > 1) - status.process_start_ticks = trim(lines[1]); - return(status); -} - -String task_process_start_ticks(pid_t pid) -{ - if(pid <= 0) - return(""); - String stat_file_name = "/proc/" + std::to_string(pid) + "/stat"; - int fd = open(stat_file_name.c_str(), O_RDONLY); - if(fd == -1) - return(""); - char buffer[4096]; - ssize_t bytes_read = read(fd, buffer, sizeof(buffer) - 1); - close(fd); - if(bytes_read <= 0) - return(""); - buffer[bytes_read] = '\0'; - String stat = buffer; - size_t command_end = stat.rfind(") "); - if(command_end == String::npos) - return(""); - String after_command = stat.substr(command_end + 2); - auto fields = split_space_strings(after_command); - if(fields.size() <= 19) - return(""); - return(fields[19]); -} - -String task_status_content(pid_t pid) -{ - return(std::to_string(pid) + "\n" + task_process_start_ticks(pid) + "\n"); -} - -bool task_status_is_alive(TaskStatus status) -{ - if(status.pid <= 0) - return(false); - if(kill(status.pid, 0) != 0) - return(false); - if(status.process_start_ticks == "") - return(true); - return(task_process_start_ticks(status.pid) == status.process_start_ticks); -} - -void task_close_inherited_fds() -{ - long max_fd = sysconf(_SC_OPEN_MAX); - if(max_fd < 0 || max_fd > 65536) - max_fd = 4096; - for(int fd = 3; fd < max_fd; fd++) - close(fd); -} - -int task_kill(pid_t pid, s32 sig) -{ - if(pid <= 0) - { - errno = EINVAL; - return(-1); - } - return(kill(pid, sig)); -} - -pid_t task_pid(String key) -{ - String status_file_name = task_file_prefix(key); - String lock_file_name = status_file_name + ".lock"; - int lock_fd = open_locked_file(lock_file_name, O_RDWR | O_CREAT, LOCK_EX, 0644); - if(lock_fd == -1) - { - fprintf(stderr, "task_pid(): could not lock task key '%s'\n", key.c_str()); - return(0); - } - String status_file = file_exists(status_file_name) ? file_get_contents(status_file_name) : ""; - if(status_file != "") - { - TaskStatus status = task_status_parse(status_file); - if(task_status_is_alive(status)) - { - close_locked_file(lock_fd); - return(status.pid); - } - file_unlink(status_file_name); - } - close_locked_file(lock_fd); - return(0); -} - -pid_t task(String key, std::function exec_after_spawn, u64 timeout) -{ - String status_file_name = task_file_prefix(key); - String lock_file_name = status_file_name + ".lock"; - int lock_fd = open_locked_file(lock_file_name, O_RDWR | O_CREAT, LOCK_EX, 0644); - if(lock_fd == -1) - { - fprintf(stderr, "task(): could not lock task key '%s'\n", key.c_str()); - return(0); - } - String status_file = file_exists(status_file_name) ? file_get_contents(status_file_name) : ""; - pid_t p = 0; - if(status_file != "") - { - TaskStatus status = task_status_parse(status_file); - if(task_status_is_alive(status)) - { - printf("(P) worker process '%s' already running: PID %i\n", key.c_str(), status.pid); - close_locked_file(lock_fd); - return(status.pid); - } - file_unlink(status_file_name); - } - p = fork(); - if(p < 0) - { - fprintf(stderr, "task(): fork failed for key '%s': %s\n", key.c_str(), strerror(errno)); - close_locked_file(lock_fd); - return(0); - } - if(p == 0) - { - close_locked_file(lock_fd); - my_pid = getpid(); - task_child_process = true; - // The FastCGI worker handles termination to drain accepted requests. - // Generic task children do not run that drain loop, so inheriting those - // handlers would turn task_kill(SIGTERM) into a no-op. - signal(SIGTERM, SIG_DFL); - signal(SIGINT, SIG_DFL); - signal(SIGHUP, SIG_DFL); - signal(SIGALRM, SIG_DFL); - if(timeout > 0) - alarm(timeout); - - if(context->resources.client_socket > 0) - { - close(context->resources.client_socket); - context->resources.client_socket = 0; - } - task_close_inherited_fds(); - exec_after_spawn(); - int exit_lock_fd = open_locked_file(lock_file_name, O_RDWR | O_CREAT, LOCK_EX, 0644); - if(exit_lock_fd != -1) - { - file_unlink(status_file_name); - close_locked_file(exit_lock_fd); - } - else - { - fprintf(stderr, "task(): could not lock task key '%s' during child cleanup\n", key.c_str()); - } - printf("(P) worker process '%s' terminated: PID %i\n", key.c_str(), my_pid); - exit(0); - } - - if(!file_put_contents(status_file_name, task_status_content(p))) - { - fprintf(stderr, "task(): could not write status file for key '%s'; terminating child PID %i\n", key.c_str(), p); - kill(p, SIGTERM); - close_locked_file(lock_fd); - return(0); - } - close_locked_file(lock_fd); - printf("(P) worker process '%s' spawned: PID %i\n", key.c_str(), p); - return(p); -} - -#include -pid_t task_repeat(String key, f64 interval, std::function exec_after_spawn, u64 timeout) -{ - if(interval <= 0) - throw std::runtime_error("task_repeat(): interval must be greater than zero"); - auto repeater_function = [key, interval, exec_after_spawn, timeout]() { - f64 started_at = time_precise(); - while (timeout == 0 || time_precise() - started_at < (f64)timeout) - { - exec_after_spawn(); - f64 elapsed = time_precise() - started_at; - if(timeout > 0 && elapsed >= (f64)timeout) - break; - f64 sleep_seconds = interval; - if(timeout > 0 && elapsed + sleep_seconds > (f64)timeout) - sleep_seconds = (f64)timeout - elapsed; - printf("(P) worker process '%s' sleeping\n", key.c_str()); - if(sleep_seconds > 0) - usleep((useconds_t)(sleep_seconds * 1000000.0)); - } - }; - return(task(key, repeater_function, timeout)); + auto result = task_workers::submit(target, props); + if(!result.ok()) throw std::runtime_error("task: " + result.code); + return(result.task.id); } +DValue task_status(String id) { return(task_result_value(task_workers::status(id))); } +DValue task_await(String id, u64 timeout_ms) { return(task_result_value(task_workers::await(id, timeout_ms))); } +DValue task_cancel(String id) { return(task_result_value(task_workers::cancel(id))); } void on_child_exit(int sig) { @@ -1875,7 +1681,7 @@ void on_child_exit(int sig) else { child_exit_status_publish(pid, status); - printf("(P) task child reaped (PID:%i)\n", pid); + printf("(P) untracked child reaped (PID:%i)\n", pid); } } } @@ -1960,6 +1766,13 @@ StringMap make_server_settings() cfg["HTTP_PORT"] = std::to_string(8080); cfg["SESSION_TIME"] = std::to_string(60*60*24*30); cfg["WORKER_COUNT"] = std::to_string(4); + cfg["TASK_DIRECTORY"] = "/var/lib/bearer/tasks"; + cfg["TASK_WORKERS"] = "1"; + cfg["TASK_QUEUE_CAPACITY"] = "1024"; + cfg["TASK_PAYLOAD_MAX_BYTES"] = std::to_string(1024 * 1024); + cfg["TASK_EXECUTION_TIMEOUT_MS"] = "30000"; + cfg["TASK_STATUS_RETENTION_SECONDS"] = "86400"; + cfg["TASK_POLL_MS"] = "50"; cfg["MAX_MEMORY"] = std::to_string(1024*1024*16); for(auto& it : split_kv(file_get_contents("/etc/bearer/settings.cfg"))) diff --git a/src/lib/sys.h b/src/lib/sys.h index 57b9dee5..3377ab7b 100644 --- a/src/lib/sys.h +++ b/src/lib/sys.h @@ -140,19 +140,17 @@ StringMap memcache_get_multiple(u64 connection, DValue keys); #if defined(__BEARER_WASM_CORE__) || defined(__BEARER_WASM_UNIT__) pid_t parent_pid = 0; pid_t my_pid = 0; -bool task_child_process = false; #else extern pid_t parent_pid; extern pid_t my_pid; -extern bool task_child_process; #endif void on_segfault(int sig); -int task_kill(pid_t pid, s32 sig = 0); String runtime_safe_key(String key, String label = "runtime key"); -pid_t task(String key, std::function exec_after_spawn, u64 timeout = 60*10); -pid_t task_repeat(String key, f64 interval, std::function exec_after_spawn, u64 timeout = 60*10); -pid_t task_pid(String key); +String task(String target, DValue props); +DValue task_status(String id); +DValue task_await(String id, u64 timeout_ms); +DValue task_cancel(String id); pid_t server_start_http(String key, String socket_fn_or_port, String call_bearer_filename, String call_function = ""); bool server_stop(String key); diff --git a/src/lib/task_queue.cpp b/src/lib/task_queue.cpp new file mode 100644 index 00000000..34c25fdd --- /dev/null +++ b/src/lib/task_queue.cpp @@ -0,0 +1,79 @@ +#include "task_queue.h" +#include "sys.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace task_queue { +namespace { +constexpr size_t id_bytes=32, id_length=id_bytes*2, target_max=4096, failure_max=256; +constexpr u64 max_capacity=100000, max_bytes=16*1024*1024, max_wait_ms=24ULL*60*60*1000, max_retention_seconds=365ULL*24*60*60; +#ifdef TASK_QUEUE_TESTING +bool claim_crash_after_rename=false; +#endif +struct Lock { int fd=-1; Lock(const String& p) { fd=open(p.c_str(),O_RDWR|O_CREAT|O_CLOEXEC|O_NOFOLLOW,0600); if(fd>=0) { int r; do r=flock(fd,LOCK_EX); while(r&&errno==EINTR); if(r) { close(fd); fd=-1; } } } ~Lock() { if(fd>=0) { flock(fd,LOCK_UN); close(fd); } } bool ok() const { return fd>=0; } }; +bool valid_limits(const Limits& l) { return l.capacity&&l.capacity<=max_capacity&&l.payload_max&&l.payload_max<=max_bytes&&l.retention_seconds<=max_retention_seconds&&l.scan_max>=l.capacity&&l.scan_max<=max_capacity&&l.status_max&&l.status_max<=max_bytes&&l.await_max_ms&&l.await_max_ms<=max_wait_ms; } +bool decimal(const String& s,u64& n) { if(s.empty())return false;for(char c:s)if(c<'0'||c>'9')return false;auto r=std::from_chars(s.data(),s.data()+s.size(),n);return r.ec==std::errc()&&r.ptr==s.data()+s.size(); } +bool opaque_id(const String& s) { if(s.size()!=id_length)return false;for(char c:s)if(!((c>='0'&&c<='9')||(c>='a'&&c<='f')))return false;return true; } +bool target_valid(const String& s) { if(s.empty()||s.size()>target_max)return false;for(unsigned char c:s)if(c<0x20||c==0x7f)return false;return true; } +String hex_id() { String b=random_bytes(id_bytes),out;if(b.size()!=id_bytes)return "";static const char h[]="0123456789abcdef";out.reserve(id_length);for(unsigned char c:b){out+=h[c>>4];out+=h[c&15];}return out; } +String now_ms() { timespec ts{};return clock_gettime(CLOCK_REALTIME,&ts)?"0":std::to_string((u64)ts.tv_sec*1000+(u64)ts.tv_nsec/1000000); } +u64 monotonic_ms() { timespec ts{};return clock_gettime(CLOCK_MONOTONIC,&ts)?0:(u64)ts.tv_sec*1000+(u64)ts.tv_nsec/1000000; } +String join(const String&a,const String&b){return a+"/"+b;} String join(const String&a,const String&b,const String&c){return join(join(a,b),c);} +bool directory(const String&p){struct stat s{};return !lstat(p.c_str(),&s)&&S_ISDIR(s.st_mode);} bool make_directory(const String&p){return (mkdir(p.c_str(),0700)==0||errno==EEXIST)&&directory(p);} +bool fsync_directory(const String&p){int fd=open(p.c_str(),O_RDONLY|O_DIRECTORY|O_CLOEXEC);bool ok=fd>=0&&fsync(fd)==0;if(fd>=0)close(fd);return ok;} bool prepare(const String&r){return make_directory(r)&&make_directory(join(r,"pending"))&&make_directory(join(r,"running"))&&make_directory(join(r,"status"));} +bool write_all(int fd,const String&s){for(size_t at=0;atmax)return false;int fd=open(p.c_str(),O_RDONLY|O_CLOEXEC|O_NOFOLLOW);if(fd<0)return false;out.resize((size_t)s.st_size);size_t at=0;while(at records(const String&dir,u64 max,bool&complete){std::vectorout;complete=false;DIR*d=opendir(dir.c_str());if(!d)return out;while(dirent*e=readdir(d)){String n=e->d_name;if(n.size()>5&&n.ends_with(".task")){if(out.size()>=max){closedir(d);return out;}out.push_back(n);}}closedir(d);complete=true;std::sort(out.begin(),out.end());return out;} +bool sequence_name(const String&name,String&seq,String&id){if(name.size()!=20+1+id_length+5||name[20]!='-'||!name.ends_with(".task"))return false;seq=name.substr(0,20);u64 n=0;id=name.substr(21,id_length);return decimal(seq,n)&&seq.size()==20&&opaque_id(id);} +bool status_name(const String&name,String&id){if(name.size()!=id_length+5||!name.ends_with(".task"))return false;id=name.substr(0,id_length);return opaque_id(id);} +const DValue& field(const DValue&v,const String&n){static const DValue empty;const DValue*f=v.key(n);return f?*f:empty;} +DValue record_value(const String&id,const String&target,const DValue&props,const String&seq,u64 attempt,const String&created){DValue r;r["id"]=id;r["target"]=target;r["props"]=props;r["sequence"]=seq;r["attempt"]=std::to_string(attempt);r["created_ms"]=created;r["lease_id"]="";r["cancel_requested"].set_bool(false);r["failure_code"]="";return r;} +bool parse_record(const String&raw,size_t max,DValue&r){if(raw.size()>max||!brb_decode(raw,r,0)||r.type!='M')return false;u64 attempt=0,seq=0,created=0;const DValue*props=r.key("props");return opaque_id(field(r,"id").to_string())&&target_valid(field(r,"target").to_string())&&props&&decimal(field(r,"attempt").to_string(),attempt)&&decimal(field(r,"sequence").to_string(),seq)&&field(r,"sequence").to_string().size()==20&&decimal(field(r,"created_ms").to_string(),created)&&(!field(r,"lease_id").to_string().empty()?opaque_id(field(r,"lease_id").to_string()):true)&&field(r,"cancel_requested").type=='B'&&field(r,"failure_code").to_string().size()<=failure_max;} +bool terminal(const String&s){return s=="succeeded"||s=="failed"||s=="canceled";} +DValue status_value(const DValue&r,const String&state,const String&completed=""){DValue s;s["id"]=field(r,"id").to_string();s["state"]=state;s["target"]=field(r,"target").to_string();s["attempt"]=field(r,"attempt").to_string();s["created_ms"]=field(r,"created_ms").to_string();s["failure_code"]=field(r,"failure_code").to_string();s["cancel_requested"].set_bool(field(r,"cancel_requested").to_bool());s["done"].set_bool(terminal(state));if(terminal(state))s["completed_ms"]=completed.empty()?now_ms():completed;return s;} +DValue missing_value(const String&id){DValue s;s["id"]=id;s["state"]="missing";s["done"].set_bool(false);return s;} +Result error(const String&code){Result r;r.code=code;return r;} Result ok_status(const DValue&s){Result r;r.code="ok";r.status=s;return r;} +bool valid_failure(const String&s){if(s.empty()||s.size()>failure_max)return false;for(char c:s)if(!((c>='a'&&c<='z')||(c>='0'&&c<='9')||c=='_'))return false;return true;} +bool publish_failed(const String&root,const Limits&l,const String&id,const DValue*record=nullptr){DValue r;if(record)r=*record;else{r["id"]=id;r["attempt"]="0";r["created_ms"]=now_ms();r["cancel_requested"].set_bool(false);}r["failure_code"]="malformed_record";String data=brb_encode(status_value(r,"failed"));return data.size()<=l.status_max&&publish(join(root,"status"),id+".task",data);} +bool quarantine(const String&root,const Limits&l,const String&dir,const String&name){String raw,id,seq;DValue r;bool parsed=read_file(join(dir,name),l.payload_max+l.status_max,raw)&&parse_record(raw,l.payload_max+l.status_max,r);if(parsed)id=field(r,"id").to_string();else if(!sequence_name(name,seq,id))id=hex_id();if(id.empty())return false;if(access(join(join(root,"status"),id+".task").c_str(),F_OK)==0)return remove_file(dir,name);if(!publish_failed(root,l,id,parsed?&r:nullptr))return false;return remove_file(dir,name);} +bool parse_status(const String&raw,size_t max,DValue&s,const String&expected_id=""){u64 completed=0;return raw.size()<=max&&brb_decode(raw,s,0)&&s.type=='M'&&opaque_id(field(s,"id").to_string())&&(expected_id.empty()||field(s,"id").to_string()==expected_id)&&terminal(field(s,"state").to_string())&&field(s,"done").type=='B'&&field(s,"done").to_bool()&&decimal(field(s,"completed_ms").to_string(),completed);} +Result status_locked(const String&root,const Limits&l,const String&id){String raw;DValue r;String status_dir=join(root,"status");if(read_file(join(status_dir,id+".task"),l.status_max,raw)){if(!parse_status(raw,l.status_max,r,id)){if(!publish_failed(root,l,id))return error("storage_error");return status_locked(root,l,id);}return ok_status(r);}for(const String&dir:{String("pending"),String("running")}){bool complete;auto names=records(join(root,dir),l.scan_max,complete);if(!complete)return error("scan_limit");for(const String&name:names){String seq,found;if(!sequence_name(name,seq,found)||found!=id)continue;if(!read_file(join(root,dir,name),l.payload_max+l.status_max,raw)||!parse_record(raw,l.payload_max+l.status_max,r)){if(!quarantine(root,l,join(root,dir),name))return error("storage_error");return status_locked(root,l,id);}return ok_status(status_value(r,dir=="pending"?"queued":"running"));}}return ok_status(missing_value(id));} +} +#ifdef TASK_QUEUE_TESTING +void set_claim_crash_after_rename_for_test(bool enabled){claim_crash_after_rename=enabled;} +#endif + +Result submit(const String&root,const Limits&l,const String&target,const DValue&props){if(!valid_limits(l)||!target_valid(target))return error("invalid_input");String payload=brb_encode(props);if(payload.size()>l.payload_max)return error("payload_too_large");if(!prepare(root))return error("storage_error");Lock lock(join(root,"lock"));if(!lock.ok())return error("lock_error");bool a,b;auto pending=records(join(root,"pending"),l.scan_max,a),running=records(join(root,"running"),l.scan_max,b);if(!a||!b)return error("scan_limit");if(pending.size()+running.size()>=l.capacity)return error("queue_full");u64 next=0;String counter;if(read_file(join(root,"sequence"),32,counter)){if(!decimal(counter,next)||next==ULLONG_MAX)return error("malformed_sequence");}else{struct stat st{};if(!lstat(join(root,"sequence").c_str(),&st))return error("malformed_sequence");}++next;String seq=std::to_string(next);if(seq.size()>20)return error("sequence_exhausted");seq=String(20-seq.size(),'0')+seq;String id=hex_id();if(id.empty())return error("random_error");String data=brb_encode(record_value(id,target,props,seq,0,now_ms()));if(data.size()>l.payload_max+l.status_max)return error("payload_too_large");if(!publish(root,"sequence",std::to_string(next))||!publish(join(root,"pending"),seq+"-"+id+".task",data))return error("storage_error");Result out;out.code="ok";out.task.id=id;out.status=missing_value(id);out.status["state"]="queued";return out;} + +Result claim(const String&root,const Limits&l,const String&lease){if(!valid_limits(l)||!opaque_id(lease)||!prepare(root))return error("invalid_input");Lock lock(join(root,"lock"));if(!lock.ok())return error("lock_error");bool complete;auto names=records(join(root,"pending"),l.scan_max,complete);if(!complete)return error("scan_limit");for(const String&name:names){String raw,seq,id;DValue r;if(!sequence_name(name,seq,id)||!read_file(join(root,"pending",name),l.payload_max+l.status_max,raw)||!parse_record(raw,l.payload_max+l.status_max,r)){if(!quarantine(root,l,join(root,"pending"),name))return error("storage_error");continue;}if(access(join(join(root,"status"),id+".task").c_str(),F_OK)==0){if(!remove_file(join(root,"pending"),name))return error("storage_error");continue;} + // Rename is the ownership transfer: after this point recovery sees one orphaned running file, never two live records. + if(!move_file(join(root,"pending"),name,join(root,"running")))return error("storage_error"); +#ifdef TASK_QUEUE_TESTING + if(claim_crash_after_rename)return error("injected_crash"); +#endif + u64 attempt=field(r,"attempt").to_u64()+1;r["attempt"]=std::to_string(attempt);r["lease_id"]=lease;String data=brb_encode(r);if(data.size()>l.payload_max+l.status_max||!publish(join(root,"running"),name,data))return error("storage_error");Result out;out.code="ok";out.task={id,field(r,"target").to_string(),field(r,"props"),lease,attempt};out.status=status_value(r,"running");return out;}return error("empty");} + +Result succeed(const String&root,const Limits&l,const String&id,const String&lease){if(!valid_limits(l)||!opaque_id(id)||!opaque_id(lease)||!prepare(root))return error("invalid_input");Lock lock(join(root,"lock"));if(!lock.ok())return error("lock_error");bool complete;auto names=records(join(root,"running"),l.scan_max,complete);if(!complete)return error("scan_limit");for(const String&name:names){String seq,found,raw;DValue r;if(!sequence_name(name,seq,found)||found!=id)continue;if(!read_file(join(root,"running",name),l.payload_max+l.status_max,raw)||!parse_record(raw,l.payload_max+l.status_max,r)){if(!quarantine(root,l,join(root,"running"),name))return error("storage_error");return status_locked(root,l,id);}if(field(r,"lease_id").to_string()!=lease)return error("lease_mismatch");String state=field(r,"cancel_requested").to_bool()?"canceled":"succeeded",data=brb_encode(status_value(r,state));if(data.size()>l.status_max||!publish(join(root,"status"),id+".task",data)||!remove_file(join(root,"running"),name))return error("storage_error");return ok_status(status_value(r,state));}return status_locked(root,l,id);} + +Result fail(const String&root,const Limits&l,const String&id,const String&lease,const String&failure){if(!valid_limits(l)||!opaque_id(id)||!opaque_id(lease)||!valid_failure(failure)||!prepare(root))return error("invalid_input");Lock lock(join(root,"lock"));if(!lock.ok())return error("lock_error");bool complete;auto names=records(join(root,"running"),l.scan_max,complete);if(!complete)return error("scan_limit");for(const String&name:names){String seq,found,raw;DValue r;if(!sequence_name(name,seq,found)||found!=id)continue;if(!read_file(join(root,"running",name),l.payload_max+l.status_max,raw)||!parse_record(raw,l.payload_max+l.status_max,r)){if(!quarantine(root,l,join(root,"running"),name))return error("storage_error");return status_locked(root,l,id);}if(field(r,"lease_id").to_string()!=lease)return error("lease_mismatch");r["failure_code"]=failure;String state=field(r,"cancel_requested").to_bool()?"canceled":"failed",data=brb_encode(status_value(r,state));if(data.size()>l.status_max||!publish(join(root,"status"),id+".task",data)||!remove_file(join(root,"running"),name))return error("storage_error");return ok_status(status_value(r,state));}return status_locked(root,l,id);} + +Result status(const String&root,const Limits&l,const String&id){if(!valid_limits(l)||!opaque_id(id)||!prepare(root))return error("invalid_input");Lock lock(join(root,"lock"));return lock.ok()?status_locked(root,l,id):error("lock_error");} +Result await(const String&root,const Limits&l,const String&id,u64 timeout_ms,u64 poll_ms){if(!valid_limits(l)||!opaque_id(id)||!poll_ms||timeout_ms>l.await_max_ms||poll_ms>l.await_max_ms)return error("invalid_input");u64 start=monotonic_ms();for(;;){Result r=status(root,l,id);if(!r.ok()||terminal(field(r.status,"state").to_string()))return r;u64 now=monotonic_ms();if(now=timeout_ms)return r;u64 wait=std::min(poll_ms,timeout_ms-(now-start));usleep((useconds_t)std::min(wait*1000,UINT_MAX));}} +Result cancel(const String&root,const Limits&l,const String&id){if(!valid_limits(l)||!opaque_id(id)||!prepare(root))return error("invalid_input");Lock lock(join(root,"lock"));if(!lock.ok())return error("lock_error");bool complete;auto pending=records(join(root,"pending"),l.scan_max,complete);if(!complete)return error("scan_limit");for(const String&name:pending){String seq,found,raw;DValue r;if(!sequence_name(name,seq,found)||found!=id)continue;if(!read_file(join(root,"pending",name),l.payload_max+l.status_max,raw)||!parse_record(raw,l.payload_max+l.status_max,r)){if(!quarantine(root,l,join(root,"pending"),name))return error("storage_error");return status_locked(root,l,id);}String data=brb_encode(status_value(r,"canceled"));if(data.size()>l.status_max||!publish(join(root,"status"),id+".task",data)||!remove_file(join(root,"pending"),name))return error("storage_error");return ok_status(status_value(r,"canceled"));}auto running=records(join(root,"running"),l.scan_max,complete);if(!complete)return error("scan_limit");for(const String&name:running){String seq,found,raw;DValue r;if(!sequence_name(name,seq,found)||found!=id)continue;if(!read_file(join(root,"running",name),l.payload_max+l.status_max,raw)||!parse_record(raw,l.payload_max+l.status_max,r)){if(!quarantine(root,l,join(root,"running"),name))return error("storage_error");return status_locked(root,l,id);}r["cancel_requested"].set_bool(true);String data=brb_encode(r);if(data.size()>l.payload_max+l.status_max||!publish(join(root,"running"),name,data))return error("storage_error");Result out=ok_status(status_value(r,"running"));out.task.lease_id=field(r,"lease_id").to_string();return out;}return status_locked(root,l,id);} + +Result cancellation_requests(const String&root,const Limits&l,u64 maximum){if(!valid_limits(l)||!maximum||maximum>l.scan_max||maximum>l.status_max/(id_length*2+32)||!prepare(root))return error("invalid_input");Lock lock(join(root,"lock"));if(!lock.ok())return error("lock_error");bool complete;auto names=records(join(root,"running"),l.scan_max,complete);if(!complete)return error("scan_limit");DValue requests;u64 count=0;for(const String&name:names){if(count>=maximum)break;String seq,id,raw;DValue r;if(!sequence_name(name,seq,id)||!read_file(join(root,"running",name),l.payload_max+l.status_max,raw)||!parse_record(raw,l.payload_max+l.status_max,r)){if(!quarantine(root,l,join(root,"running"),name))return error("storage_error");continue;}if(field(r,"cancel_requested").to_bool()&&!field(r,"lease_id").to_string().empty()){requests[id]=field(r,"lease_id").to_string();++count;}}Result out;out.code="ok";out.status["requests"]=requests;out.status["done"].set_bool(false);out.count=count;return out;} + +Result recover_worker(const String&root,const Limits&l,const String&lease){if(!valid_limits(l)||(!lease.empty()&&!opaque_id(lease))||!prepare(root))return error("invalid_input");Lock lock(join(root,"lock"));if(!lock.ok())return error("lock_error");bool complete;auto names=records(join(root,"running"),l.scan_max,complete);if(!complete)return error("scan_limit");Result out;out.code="ok";for(const String&name:names){String seq,id,raw;DValue r;if(!sequence_name(name,seq,id)||!read_file(join(root,"running",name),l.payload_max+l.status_max,raw)||!parse_record(raw,l.payload_max+l.status_max,r)){if(!quarantine(root,l,join(root,"running"),name))return error("storage_error");++out.count;continue;}if(access(join(join(root,"status"),id+".task").c_str(),F_OK)==0){if(!remove_file(join(root,"running"),name))return error("storage_error");++out.count;continue;}String record_lease=field(r,"lease_id").to_string();if(!record_lease.empty()&&!lease.empty()&&record_lease!=lease)continue;r["failure_code"]=field(r,"cancel_requested").to_bool()?"":"worker_lost";String state=field(r,"cancel_requested").to_bool()?"canceled":"failed",data=brb_encode(status_value(r,state));if(data.size()>l.status_max||!publish(join(root,"status"),id+".task",data)||!remove_file(join(root,"running"),name))return error("storage_error");++out.count;}return out;} +Result reap(const String&root,const Limits&l){if(!valid_limits(l)||!prepare(root))return error("invalid_input");Lock lock(join(root,"lock"));if(!lock.ok())return error("lock_error");bool complete;auto names=records(join(root,"status"),l.scan_max,complete);Result out;out.code="ok";u64 wall=0;timespec ts{};if(clock_gettime(CLOCK_REALTIME,&ts))return error("clock_error");wall=(u64)ts.tv_sec*1000+(u64)ts.tv_nsec/1000000;for(const String&name:names){String id,raw;DValue r;if(!status_name(name,id))continue;if(!read_file(join(root,"status",name),l.status_max,raw)||!parse_status(raw,l.status_max,r,id)){if(!publish_failed(root,l,id))return error("storage_error");continue;}u64 completed=0;decimal(field(r,"completed_ms").to_string(),completed);if(wall>=completed&&wall-completed>=l.retention_seconds*1000){if(!remove_file(join(root,"status"),name))return error("storage_error");++out.count;}}return out;} +} // namespace task_queue diff --git a/src/lib/task_queue.h b/src/lib/task_queue.h new file mode 100644 index 00000000..854805c7 --- /dev/null +++ b/src/lib/task_queue.h @@ -0,0 +1,50 @@ +#pragma once + +#include "types.h" + +// Internal durable task transport. It intentionally carries only copied values. +namespace task_queue { + +struct Limits { + u64 capacity = 0; + u64 payload_max = 0; + u64 retention_seconds = 0; + u64 scan_max = 0; + u64 status_max = 0; + u64 await_max_ms = 0; +}; + +struct Task { + String id; + String target; + DValue props; + String lease_id; + u64 attempt = 0; +}; + +struct Result { + String code; + Task task; + DValue status; + u64 count = 0; + bool ok() const { return(code == "ok"); } +}; + +Result submit(const String& root, const Limits& limits, const String& target, const DValue& props); +Result claim(const String& root, const Limits& limits, const String& worker_lease_id); +Result succeed(const String& root, const Limits& limits, const String& id, const String& worker_lease_id); +Result fail(const String& root, const Limits& limits, const String& id, const String& worker_lease_id, const String& failure_code); +Result status(const String& root, const Limits& limits, const String& id); +Result await(const String& root, const Limits& limits, const String& id, u64 timeout_ms, u64 poll_ms); +Result cancel(const String& root, const Limits& limits, const String& id); +// Returns at most maximum id -> lease_id cancellation requests; never exposes worker PIDs. +Result cancellation_requests(const String& root, const Limits& limits, u64 maximum); +// Empty lease recovers every orphaned running record during parent startup. +Result recover_worker(const String& root, const Limits& limits, const String& worker_lease_id); +Result reap(const String& root, const Limits& limits); + +#ifdef TASK_QUEUE_TESTING +void set_claim_crash_after_rename_for_test(bool enabled); +#endif + +} // namespace task_queue diff --git a/src/lib/task_workers.h b/src/lib/task_workers.h new file mode 100644 index 00000000..00324c09 --- /dev/null +++ b/src/lib/task_workers.h @@ -0,0 +1,15 @@ +#pragma once + +#include "task_queue.h" + +// Native-only TASK admission/status seam. The FastCGI parent owns its pool; +// request workers never call claim(). A target is canonicalized as +// /absolute/unit.{uce,capy}#TASK[:NAME] internally before it enters the durable queue. +namespace task_workers { + +task_queue::Result submit(const String& target, const DValue& props); +task_queue::Result status(const String& id); +task_queue::Result await(const String& id, u64 timeout_ms); +task_queue::Result cancel(const String& id); + +} // namespace task_workers diff --git a/src/linux_fastcgi.cpp b/src/linux_fastcgi.cpp index f9426d51..c4df93b0 100644 --- a/src/linux_fastcgi.cpp +++ b/src/linux_fastcgi.cpp @@ -1,4 +1,6 @@ #include "lib/bearer_lib.cpp" +#include "lib/task_queue.cpp" +#include "lib/task_workers.h" // The wasm backend is its own object (src/wasm/wasm_module.cpp → wasm.o); the // main object only needs its declarations, so editing the wasm runtime no // longer recompiles the whole native TU. @@ -10,6 +12,7 @@ #include #include #include +#include #include ServerState server_state; @@ -20,6 +23,15 @@ FastCGIServer server; std::vector proactive_compiler_pids; pid_t priority_compiler_pid = 0; +struct TaskWorkerProcess { + pid_t pid = 0; + String lease_id; + int startup_fd = -1; + int pid_fd = -1; + bool ready = false; +}; +std::vector task_worker_processes; + // The central WS broker process: owns the WS port + every connection, forwards // renders to the worker pool over bearer.sock, and applies ws_* commands flushed // back from workers. ws_broker_outbound holds in-flight async render @@ -43,6 +55,7 @@ static void* request_fault_frames[64]; static volatile sig_atomic_t request_fault_frame_count = 0; void close_inherited_server_sockets(); +void custom_server_http_dispatcher_loop(String key); u64 request_seed_from_time(f64 time_value); using WasmInvocationClock = std::chrono::steady_clock; @@ -805,11 +818,6 @@ String custom_server_config_file(String key) return(path_join(server_state.config["BIN_DIRECTORY"], "server-" + custom_server_safe_key(key) + ".cfg")); } -String custom_server_task_key(String key) -{ - return("server:" + custom_server_safe_key(key)); -} - String custom_server_config_encode(String key, String type, String bind, String file_name, String function_name) { DValue config; @@ -869,16 +877,52 @@ u64 custom_server_registry_count() return(count); } -bool custom_server_wait_for_stop(String task_key, f64 timeout_seconds = 2.0) +String custom_server_pid_file(const String& key) +{ + return(path_join(server_state.config["BIN_DIRECTORY"], "custom-server-" + custom_server_safe_key(key) + ".pid")); +} + +pid_t custom_server_pid(const String& key) +{ + String file = custom_server_pid_file(key); + pid_t pid = (pid_t)to_u64(trim(file_get_contents(file)), 0); + if(pid > 0 && kill(pid, 0) == 0) + return(pid); + file_unlink(file); + return(0); +} + +bool custom_server_wait_for_stop(const String& key, f64 timeout_seconds = 2.0) { f64 deadline = time_precise() + timeout_seconds; while(time_precise() < deadline) { - if(task_pid(task_key) == 0) + if(custom_server_pid(key) == 0) return(true); usleep(50000); } - return(task_pid(task_key) == 0); + return(custom_server_pid(key) == 0); +} + +pid_t spawn_custom_server(const String& key) +{ + pid_t pid = fork(); + if(pid < 0) + return(0); + if(pid == 0) + { + prctl(PR_SET_PDEATHSIG, SIGHUP); + signal(SIGTERM, SIG_DFL); + signal(SIGHUP, SIG_DFL); + custom_server_http_dispatcher_loop(key); + _exit(0); + } + if(!file_put_contents(custom_server_pid_file(key), std::to_string(pid))) + { + kill(pid, SIGTERM); + return(0); + } + return(pid); } int custom_server_bind_http(FastCGIServer& dispatcher, String bind) @@ -1145,7 +1189,7 @@ void run_ws_broker() bool ws_broker_alive() { - return(ws_broker_pid > 0 && task_kill(ws_broker_pid, 0) == 0); + return(ws_broker_pid > 0 && kill(ws_broker_pid, 0) == 0); } void ensure_ws_broker() @@ -1227,24 +1271,24 @@ pid_t server_start_http(String key, String socket_fn_or_port, String call_bearer if(file_exists(config_file)) previous_config = custom_server_config_decode(file_get_contents(config_file)); String new_config = custom_server_config_encode(key, "http", socket_fn_or_port, call_bearer_filename, call_function); - String task_key = custom_server_task_key(key); u64 max_servers = to_u64(server_state.config["CUSTOM_SERVER_MAX_SERVERS"], 16); if(!file_exists(config_file) && max_servers > 0 && custom_server_registry_count() >= max_servers) throw std::runtime_error("server_start_http(): custom server quota exceeded"); - pid_t existing_pid = task_pid(task_key); + pid_t existing_pid = custom_server_pid(key); if(existing_pid != 0 && previous_config["bind"] != "" && previous_config["bind"] != socket_fn_or_port) { - task_kill(existing_pid, SIGTERM); - custom_server_wait_for_stop(task_key); + kill(existing_pid, SIGTERM); + custom_server_wait_for_stop(key); existing_pid = 0; } if(!file_put_contents(config_file, new_config)) throw std::runtime_error("server_start_http(): could not write server config"); if(existing_pid != 0) return(existing_pid); - return(task(task_key, [key]() { - custom_server_http_dispatcher_loop(key); - }, 0)); + pid_t started = spawn_custom_server(key); + if(started == 0) + throw std::runtime_error("server_start_http(): could not spawn dispatcher"); + return(started); } bool server_stop(String key) @@ -1252,14 +1296,13 @@ bool server_stop(String key) key = trim(key); if(key == "") return(false); - String task_key = custom_server_task_key(key); - pid_t pid = task_pid(task_key); + pid_t pid = custom_server_pid(key); file_unlink(custom_server_config_file(key)); if(pid == 0) return(true); - if(task_kill(pid, SIGTERM) != 0) + if(kill(pid, SIGTERM) != 0) return(false); - return(custom_server_wait_for_stop(task_key)); + return(custom_server_wait_for_stop(key)); } bool proactive_compile_queue_has(std::vector& queue, String file_name) @@ -1503,7 +1546,7 @@ void run_priority_compiler() bool proactive_compiler_alive(pid_t pid) { - return(pid > 0 && task_kill(pid, 0) == 0); + return(pid > 0 && kill(pid, 0) == 0); } pid_t spawn_compiler(const char* label, void (*runner)()) @@ -1556,10 +1599,435 @@ void ensure_proactive_compiler() for(u64 worker = 0; worker < jobs; worker++) if(!proactive_compiler_alive(proactive_compiler_pids[worker])) proactive_compiler_pids[worker] = spawn_proactive_compiler(worker, jobs); - if(priority_compiler_pid <= 0 || task_kill(priority_compiler_pid, 0) != 0) + if(priority_compiler_pid <= 0 || kill(priority_compiler_pid, 0) != 0) priority_compiler_pid = spawn_compiler("priority compiler", run_priority_compiler); } +namespace { +u64 task_config_u64(const char* key, u64 maximum) +{ + u64 value = to_u64(server_state.config[key], 0); + return(value > 0 && value <= maximum ? value : 0); +} + +String task_directory() +{ + return(server_state.config["TASK_DIRECTORY"]); +} + +task_queue::Limits task_limits() +{ + task_queue::Limits limits; + limits.capacity = task_config_u64("TASK_QUEUE_CAPACITY", 100000); + limits.payload_max = task_config_u64("TASK_PAYLOAD_MAX_BYTES", 16 * 1024 * 1024); + limits.retention_seconds = task_config_u64("TASK_STATUS_RETENTION_SECONDS", 365ull * 24 * 60 * 60); + limits.scan_max = limits.capacity; + limits.status_max = 64 * 1024; + limits.await_max_ms = 24ull * 60 * 60 * 1000; + return(limits); +} + +bool task_handler_valid(const String& handler) +{ + if(handler == "TASK") return(true); + if(handler.size() < 6 || handler.rfind("TASK:", 0) != 0) return(false); + if(!(isalpha((unsigned char)handler[5]) || handler[5] == '_')) return(false); + for(size_t i = 5; i < handler.size(); ++i) + if(!(isalnum((unsigned char)handler[i]) || handler[i] == '_')) return(false); + return(true); +} + +bool task_selector_resolve(const String& selector, String& unit, String& handler) +{ + auto mark = selector.rfind('#'); + if(mark == String::npos || !task_handler_valid(selector.substr(mark + 1))) return(false); + Request policy; + policy.server = &server_state; + unit = compiler_normalize_unit_path(&policy, selector.substr(0, mark)); + handler = selector.substr(mark + 1); + String root = path_real(path_join(server_state.config["COMPILER_SYS_PATH"], server_state.config["SITE_DIRECTORY"])); + return(unit != "" && root != "" && compiler_is_known_unit_file(unit) && path_is_within(unit, root)); +} + +bool task_target_resolve(const String& target, String& unit, String& handler) +{ + String file = target; + handler = "TASK"; + auto mark = target.rfind(':'); + if(mark != String::npos) + { + String name = target.substr(mark + 1); + if(!task_handler_valid("TASK:" + name)) return(false); + file = target.substr(0, mark); + handler = "TASK:" + name; + } + if(file == "" || file.find('#') != String::npos) return(false); + return(task_selector_resolve(file + "#" + handler, unit, handler)); +} + +String task_selector_handler(const String& handler) +{ + return(handler == "TASK" ? String("task") : "task:" + handler.substr(5)); +} + +String task_failure_code(const String& error, bool missing) +{ + if(missing) return("missing_handler"); + if(error.find("BEARER_INVOCATION_TIMEOUT") != String::npos) return("execution_timeout"); + if(error.find("compile") != String::npos || error.find("artifact") != String::npos) return("compile_failed"); + return("handler_trap"); +} + +void run_task_worker(String lease_id, int startup_fd) +{ + my_pid = getpid(); + prctl(PR_SET_PDEATHSIG, SIGHUP); + close_inherited_server_sockets(); + // A supervised cancellation terminates this process; do not inherit the + // parent drain handler and accidentally continue the claimed invocation. + signal(SIGTERM, SIG_DFL); + signal(SIGINT, SIG_DFL); + signal(SIGHUP, SIG_DFL); + Request startup; + startup.server = &server_state; + String start_error = wasm_backend_start(startup); + if(start_error != "") + { + fprintf(stderr, "(!) task worker wasm initialization failed: %s\n", start_error.c_str()); + close(startup_fd); + _exit(1); + } + char ready = '1'; + if(write(startup_fd, &ready, 1) != 1) + _exit(1); + close(startup_fd); + const u64 poll_ms = task_config_u64("TASK_POLL_MS", 1000); + while(true) + { + auto claimed = task_queue::claim(task_directory(), task_limits(), lease_id); + if(claimed.code == "empty") + { + usleep((useconds_t)(poll_ms * 1000)); + continue; + } + if(!claimed.ok()) + { + fprintf(stderr, "(!) task worker claim failed: %s\n", claimed.code.c_str()); + usleep((useconds_t)(poll_ms * 1000)); + continue; + } + String unit, handler; + if(!task_selector_resolve(claimed.task.target, unit, handler)) + { + task_queue::fail(task_directory(), task_limits(), claimed.task.id, lease_id, "invalid_target"); + continue; + } + Request request; + request.server = &server_state; + request.props = claimed.task.props; + request.random_seed = request_seed_from_time(time_precise()); + request.ob_start(); + Request* previous = set_active_request(request); + const u64 execution_timeout_ms = task_config_u64("TASK_EXECUTION_TIMEOUT_MS", 86400000); + const auto execution_deadline = WasmInvocationClock::now() + std::chrono::milliseconds(execution_timeout_ms); + bool timed_out = false; + String error; + if(!wasm_backend_should_handle(request, unit)) + { + u64 remaining_ms = wasm_invocation_remaining_ms(execution_deadline); + if(remaining_ms == 0) + timed_out = true; + else + get_shared_unit_bounded(&request, unit, remaining_ms, &timed_out); + } + if(timed_out || !wasm_backend_should_handle(request, unit)) + error = timed_out ? "BEARER_INVOCATION_TIMEOUT" : "compile failed or wasm artifact unavailable"; + else + { + u64 remaining_ms = wasm_invocation_remaining_ms(execution_deadline); + error = remaining_ms == 0 ? "BEARER_INVOCATION_TIMEOUT" : wasm_backend_serve(request, unit, task_selector_handler(handler), remaining_ms); + } + bool missing = error == "" && request.flags.status == 404; + if(error == "" && !missing) + task_queue::succeed(task_directory(), task_limits(), claimed.task.id, lease_id); + else + { + fprintf(stderr, "(!) task %s failed: %s\n", claimed.task.id.c_str(), error.c_str()); + task_queue::fail(task_directory(), task_limits(), claimed.task.id, lease_id, task_failure_code(error, missing)); + } + cleanup_mysql_connections(); + cleanup_sqlite_connections(); + restore_active_request(previous); + } +} + +bool task_pool_healthy = false; +std::chrono::steady_clock::time_point task_retry_not_before; + +String task_admission_health_file() +{ + return(path_join(task_directory(), "admission_healthy")); +} + +void set_task_pool_healthy(bool healthy) +{ + task_pool_healthy = healthy; + if(healthy) + { + if(!file_put_contents(task_admission_health_file(), "ready")) + task_pool_healthy = false; + } + else + file_unlink(task_admission_health_file()); +} + +bool task_admission_healthy() +{ + return(file_get_contents(task_admission_health_file()) == "ready"); +} +String task_retry_error; +u64 task_retry_failures = 0; + +bool task_worker_alive(pid_t pid) +{ + if(pid <= 0) + return(false); + int status = 0; + pid_t reaped = waitpid(pid, &status, WNOHANG); + return(reaped == 0 && kill(pid, 0) == 0); +} + +void task_retry_later(const String& error) +{ + set_task_pool_healthy(false); + task_retry_failures = std::min(task_retry_failures + 1, 6); + u64 delay_seconds = 1ull << task_retry_failures; + task_retry_not_before = std::chrono::steady_clock::now() + std::chrono::seconds(delay_seconds); + if(task_retry_error != error) + { + fprintf(stderr, "(!) task worker supervision unhealthy: %s; retrying in %llu seconds\n", error.c_str(), (unsigned long long)delay_seconds); + task_retry_error = error; + } +} + +void task_retry_clear() +{ + task_retry_failures = 0; + task_retry_error.clear(); + task_retry_not_before = {}; +} + +bool task_worker_count(u64& count) +{ + String configured = server_state.config["TASK_WORKERS"]; + if(configured.empty()) + return(false); + count = 0; + for(char c : configured) + { + if(c < '0' || c > '9' || count > 6) + return(false); + count = count * 10 + (u64)(c - '0'); + } + return(count > 0 && count <= 64); +} + +String task_lease_id() +{ + String bytes = random_bytes(32); + if(bytes.size() != 32) + return(""); + static const char hex[] = "0123456789abcdef"; + String encoded; + for(unsigned char byte : bytes) { encoded += hex[byte >> 4]; encoded += hex[byte & 15]; } + return(encoded); +} + +bool recover_task_lease(const String& lease_id, const char* stage) +{ + auto recovered = task_queue::recover_worker(task_directory(), task_limits(), lease_id); + if(recovered.ok()) + return(true); + task_retry_later(String(stage) + ": " + recovered.code); + return(false); +} + +bool task_worker_ready(TaskWorkerProcess& worker) +{ + if(worker.ready) + return(true); + if(worker.startup_fd < 0) + return(false); + char ready = 0; + ssize_t read_count = read(worker.startup_fd, &ready, 1); + if(read_count == 1 && ready == '1') + { + close(worker.startup_fd); + worker.startup_fd = -1; + worker.ready = true; + return(true); + } + if(read_count == 0 || (read_count < 0 && errno != EAGAIN && errno != EINTR)) + { + close(worker.startup_fd); + worker.startup_fd = -1; + } + return(false); +} + +void supervise_task_cancellations() +{ + task_queue::Limits limits = task_limits(); + auto requests = task_queue::cancellation_requests(task_directory(), limits, std::min(limits.scan_max, 64)); + if(!requests.ok()) + { + task_retry_later("cancellation lease read: " + requests.code); + return; + } + requests.status["requests"].each([&](const DValue& requested_lease, String) { + for(auto& worker : task_worker_processes) + if(worker.ready && worker.lease_id == requested_lease.to_string() && task_worker_alive(worker.pid)) + { + // pidfd pins this signal to the child we forked, even after PID reuse. + if(worker.pid_fd >= 0 && syscall(SYS_pidfd_send_signal, worker.pid_fd, SIGTERM, nullptr, 0) == 0) + set_task_pool_healthy(false); + } + }); +} + +void ensure_task_workers() +{ + static bool recovered_orphans = false; + static bool supervision_started = false; + static u64 configured_workers = 0; + if(!supervision_started) + { + set_task_pool_healthy(false); + supervision_started = true; + } + u64 wanted = 0; + if(!task_worker_count(wanted)) + { + task_retry_later("invalid TASK_WORKERS (must be a decimal value from 1 through 64)"); + return; + } + if(configured_workers == 0) + configured_workers = wanted; + else if(wanted != configured_workers) + { + task_retry_later("TASK_WORKERS changes require restart"); + return; + } + if(std::chrono::steady_clock::now() < task_retry_not_before) + return; + if(!recovered_orphans) + { + if(!recover_task_lease("", "startup orphan recovery")) + return; + recovered_orphans = true; + } + for(auto& worker : task_worker_processes) + { + if(task_worker_alive(worker.pid)) + continue; + set_task_pool_healthy(false); + if(worker.pid > 0 && !worker.ready) + task_retry_later("task worker wasm initialization failed"); + if(worker.startup_fd >= 0) + close(worker.startup_fd); + if(worker.pid_fd >= 0) + close(worker.pid_fd); + worker.startup_fd = -1; + worker.pid_fd = -1; + worker.pid = 0; + worker.ready = false; + if(worker.lease_id != "" && !recover_task_lease(worker.lease_id, "dead worker lease recovery")) + return; + worker.lease_id.clear(); + } + if(task_retry_not_before > std::chrono::steady_clock::now()) + return; + while(task_worker_processes.size() < configured_workers) + task_worker_processes.push_back({}); + for(auto& worker : task_worker_processes) + { + if(worker.pid > 0) + continue; + worker.lease_id = task_lease_id(); + int startup_pipe[2]; + if(worker.lease_id == "" || pipe2(startup_pipe, O_CLOEXEC | O_NONBLOCK) != 0) + { + task_retry_later("could not create task worker startup channel"); + worker.lease_id.clear(); + return; + } + pid_t pid = fork(); + if(pid < 0) + { + close(startup_pipe[0]); + close(startup_pipe[1]); + perror("fork task worker"); + task_retry_later("fork task worker failed"); + worker.lease_id.clear(); + return; + } + if(pid == 0) + { + close(startup_pipe[0]); + run_task_worker(worker.lease_id, startup_pipe[1]); + _exit(0); + } + close(startup_pipe[1]); + worker.pid_fd = (int)syscall(SYS_pidfd_open, pid, 0); + if(worker.pid_fd < 0) + { + close(startup_pipe[0]); + kill(pid, SIGTERM); + waitpid(pid, nullptr, 0); + task_retry_later("could not pin task worker PID"); + worker.lease_id.clear(); + return; + } + worker.pid = pid; + worker.startup_fd = startup_pipe[0]; + printf("(P) task worker spawned: PID %i\n", pid); + } + bool all_ready = true; + for(auto& worker : task_worker_processes) + all_ready = task_worker_ready(worker) && all_ready; + if(!all_ready) + return; + task_retry_clear(); + set_task_pool_healthy(true); + if(!task_pool_healthy) + { + task_retry_later("could not publish task admission health"); + return; + } + supervise_task_cancellations(); + if(task_pool_healthy) + task_queue::reap(task_directory(), task_limits()); +} +} // namespace + +namespace task_workers { +task_queue::Result submit(const String& target, const DValue& props) +{ + String unit, handler; + if(!task_target_resolve(target, unit, handler)) { task_queue::Result result; result.code = "invalid_target"; return(result); } + if(!task_admission_healthy()) { task_queue::Result result; result.code = "worker_unavailable"; return(result); } + return(task_queue::submit(task_directory(), task_limits(), unit + "#" + handler, props)); +} +task_queue::Result status(const String& id) { return(task_queue::status(task_directory(), task_limits(), id)); } +task_queue::Result await(const String& id, u64 timeout_ms) { return(task_queue::await(task_directory(), task_limits(), id, timeout_ms, task_config_u64("TASK_POLL_MS", 1000))); } +task_queue::Result cancel(const String& id) +{ + // Request workers only persist cancellation. Their inherited process table + // is intentionally never used to signal a PID. + return(task_queue::cancel(task_directory(), task_limits(), id)); +} +} // namespace task_workers + void listen_for_connections() { install_process_fault_handlers(); @@ -1906,13 +2374,14 @@ int main(int argc, char** argv) init_base_process(); ensure_proactive_compiler(); ensure_ws_broker(); + ensure_task_workers(); while(!termination_signal_received) { for(auto& pid : proactive_compiler_pids) if(!proactive_compiler_alive(pid)) pid = 0; - if(priority_compiler_pid > 0 && task_kill(priority_compiler_pid, 0) != 0) + if(priority_compiler_pid > 0 && kill(priority_compiler_pid, 0) != 0) priority_compiler_pid = 0; if(!termination_signal_received) ensure_proactive_compiler(); @@ -1924,6 +2393,8 @@ int main(int argc, char** argv) ws_broker_pid = 0; if(!termination_signal_received) ensure_ws_broker(); + if(!termination_signal_received) + ensure_task_workers(); while(workers.size() < int_val(server_state.config["WORKER_COUNT"])) { @@ -1936,6 +2407,8 @@ int main(int argc, char** argv) printf("(P) draining %zu workers before shutdown\n", workers.size()); for(auto& worker : workers) kill(worker.first, SIGTERM); + for(const auto& worker : task_worker_processes) + if(worker.pid > 0) kill(worker.pid, SIGTERM); for(auto pid : proactive_compiler_pids) if(pid > 0) kill(pid, SIGTERM); @@ -1945,10 +2418,12 @@ int main(int argc, char** argv) kill(ws_broker_pid, SIGTERM); f64 drain_deadline = time_precise() + (f64)to_u64(server_state.config["WORKER_DRAIN_TIMEOUT_SECONDS"], 10); auto background_children_alive = [&]() { - bool alive = priority_compiler_pid > 0 && task_kill(priority_compiler_pid, 0) == 0; - alive = alive || (ws_broker_pid > 0 && task_kill(ws_broker_pid, 0) == 0); + bool alive = priority_compiler_pid > 0 && kill(priority_compiler_pid, 0) == 0; + alive = alive || (ws_broker_pid > 0 && kill(ws_broker_pid, 0) == 0); for(auto pid : proactive_compiler_pids) alive = alive || proactive_compiler_alive(pid); + for(const auto& worker : task_worker_processes) + alive = alive || task_worker_alive(worker.pid); return(alive); }; while((!workers.empty() || background_children_alive()) && time_precise() < drain_deadline) @@ -1958,12 +2433,14 @@ int main(int argc, char** argv) } for(auto& worker : workers) kill(worker.first, SIGKILL); + for(const auto& worker : task_worker_processes) + if(task_worker_alive(worker.pid)) kill(worker.pid, SIGKILL); for(auto pid : proactive_compiler_pids) if(proactive_compiler_alive(pid)) kill(pid, SIGKILL); - if(priority_compiler_pid > 0 && task_kill(priority_compiler_pid, 0) == 0) + if(priority_compiler_pid > 0 && kill(priority_compiler_pid, 0) == 0) kill(priority_compiler_pid, SIGKILL); - if(ws_broker_pid > 0 && task_kill(ws_broker_pid, 0) == 0) + if(ws_broker_pid > 0 && kill(ws_broker_pid, 0) == 0) kill(ws_broker_pid, SIGKILL); server.shutdown(); diff --git a/src/wasm/abi.h b/src/wasm/abi.h index b8ec72b0..f5c895ac 100644 --- a/src/wasm/abi.h +++ b/src/wasm/abi.h @@ -1,4 +1,4 @@ #pragma once -#define BEARER_WASM_CORE_ABI_VERSION 24 +#define BEARER_WASM_CORE_ABI_VERSION 25 #define BEARER_COMPILER_UNIT_ABI_VERSION 31 diff --git a/src/wasm/core.cpp b/src/wasm/core.cpp index c513fee0..28a82cad 100644 --- a/src/wasm/core.cpp +++ b/src/wasm/core.cpp @@ -1038,20 +1038,20 @@ struct WasmRequestEnvelopeSegment }; static bool wasm_decode_request_envelope(const char* encoded, size_t encoded_size, - WasmRequestEnvelopeSegment (&segments)[12], String& error) + WasmRequestEnvelopeSegment (&segments)[13], String& error) { if(encoded_size < 6 || memcmp(encoded, "BRRQ", 4) != 0) { error = "missing BEARER request-envelope header"; return(false); } - if((u8)encoded[4] != 1 || (u8)encoded[5] != 12) + if((u8)encoded[4] != 2 || (u8)encoded[5] != 13) { error = "unsupported BEARER request-envelope version or segment count"; return(false); } size_t offset = 6; - for(u32 i = 0; i < 12; i++) + for(u32 i = 0; i < 13; i++) { u64 segment_size = 0; if(!brb_read_varint(encoded, encoded_size, offset, segment_size) || segment_size > encoded_size - offset) @@ -1185,7 +1185,8 @@ int bearer_wasm_apply_context(const char* config_buf, size_t config_len, const c StringMap decoded_session; DValue decoded_call; DValue decoded_ws; - WasmRequestEnvelopeSegment segments[12]; + DValue decoded_props; + WasmRequestEnvelopeSegment segments[13]; String error; if(!brb_decode_flat_string_map(config_buf, config_len, decoded_config, &error)) { @@ -1224,8 +1225,14 @@ int bearer_wasm_apply_context(const char* config_buf, size_t config_len, const c bearer_host_log(3, error.data(), error.size()); return(4); } + if(!decode_tree(12, decoded_props, "request props")) + { + bearer_host_log(3, error.data(), error.size()); + return(5); + } wasm_server.config = std::move(decoded_config); wasm_request.call = std::move(decoded_call); + wasm_request.props = std::move(decoded_props); wasm_request.params = std::move(decoded_params); wasm_request.get = std::move(decoded_get); wasm_request.post = std::move(decoded_post); @@ -2546,7 +2553,7 @@ size_t bearer_process_jobs_brrb(s32 operation, const char* value, size_t value_l String text; if(!bearer_brrb_call_decode(value, value_len, key, key_len, argument, argument_len, result, supplied, text)) return(std::numeric_limits::max()); - enum class ProcessOperation { process_shell_escape = 0, process_shell_exec = 1, process_shell_spawn = 2, process_job_status = 3, process_job_result = 4, process_job_await = 5, process_job_cancel = 6, process_process_start_directory = 7, process_server_start_http = 8, process_server_stop = 9, process_task_pid = 10, process_task_kill = 11 }; + enum class ProcessOperation { process_shell_escape = 0, process_shell_exec = 1, process_shell_spawn = 2, process_job_status = 3, process_job_result = 4, process_job_await = 5, process_job_cancel = 6, process_process_start_directory = 7, process_server_start_http = 8, process_server_stop = 9, process_task_submit = 10, process_task_status = 11, process_task_await = 12, process_task_cancel = 13 }; switch(static_cast(operation)) { case ProcessOperation::process_shell_escape: result.set(shell_escape(result.to_string())); break; @@ -2559,8 +2566,10 @@ size_t bearer_process_jobs_brrb(s32 operation, const char* value, size_t value_l case ProcessOperation::process_process_start_directory: result.set(process_start_directory()); break; case ProcessOperation::process_server_start_http: result.set((f64)server_start_http(result.to_string(), text, supplied["file"].to_string(), supplied["function"].to_string())); break; case ProcessOperation::process_server_stop: result.set_bool(server_stop(result.to_string())); break; - case ProcessOperation::process_task_pid: result.set((f64)task_pid(result.to_string())); break; - case ProcessOperation::process_task_kill: result.set((f64)task_kill((pid_t)result.to_s64(), (s32)supplied.to_s64())); break; + case ProcessOperation::process_task_submit: result.set(task(result.to_string(), supplied)); break; + case ProcessOperation::process_task_status: result = task_status(result.to_string()); break; + case ProcessOperation::process_task_await: result = task_await(result.to_string(), supplied.to_u64()); break; + case ProcessOperation::process_task_cancel: result = task_cancel(result.to_string()); break; // Network handles are stringified before BRRB so exact u64 values never // transit f64. The worker owns and closes the underlying descriptors. default: return(std::numeric_limits::max()); diff --git a/src/wasm/core_hostcalls.syms b/src/wasm/core_hostcalls.syms index 93d9d434..b77966be 100644 --- a/src/wasm/core_hostcalls.syms +++ b/src/wasm/core_hostcalls.syms @@ -14,9 +14,7 @@ bearer_host_password_hash bearer_host_password_verify bearer_host_password_needs_rehash bearer_host_crypto_operation -bearer_host_task_spawn -bearer_host_task_pid -bearer_host_task_kill +bearer_host_task bearer_host_sleep_us bearer_host_socket_connect bearer_host_socket_close diff --git a/src/wasm/worker.cpp b/src/wasm/worker.cpp index 2cbdc317..d5200bf1 100644 --- a/src/wasm/worker.cpp +++ b/src/wasm/worker.cpp @@ -24,6 +24,7 @@ // - bearer.abi stamp must match the core ABI version; fail loudly, never guess #include +#include "../lib/task_workers.h" #ifdef BEARER_WASM_HOST_CONNECTORS #include "../3rdparty/sqlite/sqlite3.h" #endif @@ -1821,8 +1822,8 @@ static void wasm_request_envelope_append(String& envelope, const String& value) static String wasm_encode_request_envelope(const Request& request, const String& entry_unit, const String& handler) { String envelope = "BRRQ"; - envelope.push_back(1); - envelope.push_back(12); + envelope.push_back(2); + envelope.push_back(13); wasm_request_envelope_append(envelope, brb_encode(request.call)); wasm_request_envelope_append(envelope, brb_encode_flat_string_map(request.params)); wasm_request_envelope_append(envelope, brb_encode_flat_string_map(request.get)); @@ -1852,6 +1853,7 @@ static String wasm_encode_request_envelope(const Request& request, const String& websocket = brb_encode(ws); } wasm_request_envelope_append(envelope, websocket); + wasm_request_envelope_append(envelope, brb_encode(request.props)); return(envelope); } @@ -2094,6 +2096,7 @@ struct WasmWorkspace : public WasmRequestProfile // to fetch). For side-effecting ops (sqlite) re-executing on the fetch is // wrong, so the result is staged on the first call (keyed on the exact // input bytes) and replayed on the second without re-running the op. + String current_entry_unit; String staged_hostcall_input; String staged_hostcall_result; String staged_socket_read_key; @@ -2402,6 +2405,7 @@ struct WasmWorkspace : public WasmRequestProfile String apply_context(const Request& request, const String& entry_unit, const String& handler) { + current_entry_unit = entry_unit; auto phase_start = std::chrono::steady_clock::now(); auto phase_us = [&]() -> u64 { auto now = std::chrono::steady_clock::now(); @@ -3545,18 +3549,6 @@ struct WasmWorkspace : public WasmRequestProfile return(slot); } - String run_task_callback(u64 callback_id, u64 timeout_cap_ms) - { - InvocationScope invocation(*this, timeout_cap_ms, true); - auto runner = core_func("bearer_wasm_task_run"); - if(!runner) - return("core does not export bearer_wasm_task_run"); - auto result = call_guest(*runner, { wasmtime::Val((int64_t)callback_id) }); - if(!result) - return(trap_text(result.err())); - return(""); - } - // ---- host imports for the core ----------------------------------------- String make_host_import(wasmtime::Linker& linker, const String& mod, const String& name, const wasmtime::FuncType& func_type) @@ -4821,53 +4813,74 @@ struct WasmWorkspace : public WasmRequestProfile results[0] = Val(::server_stop(key) ? (int32_t)1 : (int32_t)0); return(std::monostate()); })); - if(mod == "env" && name == "bearer_host_task_spawn") + if(mod == "env" && name == "bearer_host_task") return(add([self](Caller, Span args, Span results) -> Result { - String key; - self->hostcall_read(args[0].i32(), args[1].i32(), key); - u64 callback_id = (u64)args[2].i64(); - f64 interval = args[3].f64(); - u64 timeout = (u64)args[4].i64(); - bool repeat = args[5].i32() != 0; - // task()/task_repeat() fork and invoke this lambda only in the child - // before the hostcall stack unwinds, so `self` points to the child's - // copy of this per-request workspace. The parent request can return and - // destroy its workspace without invalidating the child copy. - u64 task_timeout_ms = timeout > UINT64_MAX / 1000 ? UINT64_MAX : timeout * 1000; - auto run_callback = [self, callback_id, task_timeout_ms]() { - String error = self->run_task_callback(callback_id, task_timeout_ms); - if(error != "") - fprintf(stderr, "[wasm task] callback failed: %s\n", error.c_str()); - }; - pid_t pid = 0; - try + String encoded, out; + int32_t input_size = args[1].i32(); + u32 cap = (u32)args[3].i32(); + int32_t buf = args[2].i32(); + if(input_size <= 0 || input_size > 16 * 1024 * 1024 || self->hostcall_read(args[0].i32(), input_size, encoded) != "") { - if(!repeat || (interval > 0 && std::isfinite(interval))) - pid = repeat - ? ::task_repeat(key, interval, run_callback, timeout) - : ::task(key, run_callback, timeout); + DValue response; response["error"] = "invalid_input"; out = brb_encode(response); + if(buf != 0 && cap >= out.size()) self->hostcall_write(buf, out); + results[0] = Val((int32_t)out.size()); return(std::monostate()); } - catch(const std::exception& e) + String stage_key = "task:" + encoded; + bool replay = self->staged_hostcall_input == stage_key; + if(replay) + out = self->staged_hostcall_result; + else { - fprintf(stderr, "[wasm task] spawn failed for key '%s': %s\n", key.c_str(), e.what()); + DValue request, response; + String error; + if(!brb_decode(encoded, request, &error) || request.type != 'M') + response["error"] = "invalid_input"; + else + { + String operation = request["op"].to_string(); + task_queue::Result result; + if(operation == "submit") + { + String target = request["target"].to_string(), name; + auto separator = target.rfind(':'); + if(separator != String::npos) + { + name = target.substr(separator); + target = target.substr(0, separator); + } + String current = self->current_entry_unit; + if(target == "") target = current; + String resolved = self->resolve_source_path(target, current); + result = resolved == "" ? task_queue::Result{} : task_workers::submit(resolved + name, request["props"]); + if(resolved == "") result.code = "invalid_target"; + } + else if(operation == "status") result = task_workers::status(request["id"].to_string()); + else if(operation == "await") result = task_workers::await(request["id"].to_string(), request["timeout_ms"].to_u64()); + else if(operation == "cancel") result = task_workers::cancel(request["id"].to_string()); + else response["error"] = "invalid_operation"; + if(operation == "submit" || operation == "status" || operation == "await" || operation == "cancel") + if(result.ok()) { if(operation == "submit") response["id"] = result.task.id; else response = result.status; } + else + { + fprintf(stderr, "[wasm task] %s failed: %s\n", operation.c_str(), result.code.c_str()); + response["error"] = result.code; + } + } + out = brb_encode(response); + if(buf == 0) self->hostcall_stage(stage_key, out); } - catch(...) + if(buf != 0 && cap >= out.size()) { - fprintf(stderr, "[wasm task] spawn failed for key '%s'\n", key.c_str()); + self->hostcall_write(buf, out); + if(replay) + { + self->staged_hostcall_input = ""; + self->staged_hostcall_result = ""; + } } - results[0] = Val((int32_t)pid); - return(std::monostate()); - })); - if(mod == "env" && name == "bearer_host_task_pid") - return(add([self](Caller, Span args, Span results) -> Result { - String key; - self->hostcall_read(args[0].i32(), args[1].i32(), key); - results[0] = Val((int32_t)::task_pid(key)); - return(std::monostate()); - })); - if(mod == "env" && name == "bearer_host_task_kill") - return(add([](Caller, Span args, Span results) -> Result { - results[0] = Val((int32_t)::task_kill((pid_t)args[0].i32(), args[1].i32())); + else if(buf != 0 && !replay) + self->hostcall_stage(stage_key, out); + results[0] = Val((int32_t)out.size()); return(std::monostate()); })); if(mod == "env" && name == "bearer_host_sleep_us")