Files
2026-10-25 22:35:32 +03:00

576 lines
85 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"runtime": {
"api_documentation_cb3d2229": "API documentation",
"openflare_provides_a_simple_powerful_api_for_ba400468": "OpenFlare provides a simple, powerful API for a range of programming languages and development environments. Its standard RESTful interface makes backend integration and customization straightforward.",
"platform_user_guide_d0ead991": "Platform user guide",
"welcome_to_the_openflare_management_platform_this_e8ecbe4d": "Welcome to the OpenFlare management platform. This guide introduces its core components, roles and permissions, and customization workflow to help you get started.",
"privacy_policy_b6da1ca6": "Privacy policy",
"we_value_your_privacy_this_policy_explains_2c9e3c0b": "We value your privacy. This policy explains how we collect, use, and store your personal information, ",
"and_the_rights_you_have_over_it_4560abf2": "and the rights you have over it.",
"terms_of_service_4e80a140": "Terms of service",
"please_read_the_following_terms_carefully_to_c46a6a61": "Please read the following terms carefully to understand your rights.",
"use_1b3d699e": ": use ",
"or_07d4e3c0": "(or ",
"place_the_lucide_icon_directly_inside_the_104f794c": ": place the Lucide icon directly inside the title container and apply ",
"use_only_5e12eecb": ": use only ",
"for_pages_with_multiple_tabs_keep_each_5f721959": ": for pages with multiple tabs, keep each tab's content in its own component file (for example, ",
"beyond_tabs_when_a_page_exceeds_600_d152cfdc": ": when a page exceeds 600 ",
"message_18ab4763": ") ",
"and_de1d5dd0": " and ",
"inputs_fabee312": "Inputs (",
"and_selectors_e4875cdf": ") and selectors (",
"should_share_the_compact_height_f1fe2218": ") should share the compact height ",
"with_font_size_e7c29991": ", with font size ",
"and_use_ca398a12": ", and use ",
"to_remove_overlapping_native_shadows_dd65b475": " to remove overlapping native shadows.",
"align_checkboxes_toward_the_top_left_using_092dcef0": "Align checkboxes toward the top left using a container with ",
"add_bf15da3a": ". Add ",
"to_the_checkbox_so_multiline_descriptions_stay_1bb85c4b": " to the checkbox so multiline descriptions stay aligned at the top.",
"use_the_default_primary_or_secondary_db7513e5": "Use the default Primary or secondary ",
"button_for_forms_and_create_save_actions_a657dba8": " button for forms and create/save actions, with compact height ",
"outline_buttons_must_include_the_66ace005": ". Outline buttons must include the ",
"class_43eff5ff": " class.",
"1_align_label_and_input_32d4558d": "// 1. Align Label and Input",
"div_classname_space_y_1_5_label_32230ad7": "<div className=\"space-y-1.5\">\n <Label htmlFor=\"id\" className=\"text-xs font-medium text-foreground\">Title</Label>\n <Input id=\"id\" className=\"h-8 text-xs shadow-none\" />\n</div>",
"2_align_checkbox_to_the_top_bdf68ad8": "// 2. Align Checkbox to the top",
"div_classname_flex_items_start_gap_2_ccf0d526": "<div className=\"flex items-start gap-2.5\">\n <Checkbox id=\"c\" className=\"mt-0.5\" />\n <div className=\"grid gap-1\">\n <label htmlFor=\"c\" className=\"text-xs font-medium leading-none\">Title</label>\n <p className=\"text-[10px] text-muted-foreground\">Multiline description</p>\n </div>\n</div>",
"card_classname_border_dashed_shadow_none_cardheader_35727acf": "<Card className=\"border-dashed shadow-none\">\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">Metric title</span>\n <Cpu className=\"size-4 text-primary\" />\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"text-2xl font-semibold tracking-tight\">42.8 %</div>\n <Progress value={42.8} className=\"h-1.5\" />\n <p className=\"text-[10px] text-muted-foreground\">Status description</p>\n </CardContent>\n</Card>",
"div_classname_border_border_dashed_shadow_none_b430b520": "<div className=\"border border-dashed shadow-none rounded-lg overflow-hidden bg-background\">\n <Table>\n <TableHeader className=\"bg-muted/40\">\n <TableRow className=\"border-dashed hover:bg-transparent\">\n <TableHead className=\"text-xs font-semibold\">ID</TableHead>\n <TableHead className=\"text-xs font-semibold\">Status</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow className=\"border-dashed hover:bg-muted/10 transition-colors\">\n <TableCell className=\"font-mono text-xs\">ID-1001</TableCell>\n <TableCell>\n <Badge variant=\"outline\" className=\"text-[10px] bg-emerald-500/10 border-emerald-500/20 text-emerald-600 rounded-full py-0 px-2\">\n <span className=\"size-1 bg-emerald-500 rounded-full mr-1.5 shrink-0\" />\n Success\n </Badge>\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n</div>",
"disabled_f95ea7f4": "Disabled",
"title_administrator_login_alert_content_administrator_user_6f32cf7c": "{\"title\": \"Administrator login alert\", \"content\": \"Administrator {{user.username}} ...\", \"level\": \"INFO\"}",
"lark_webhook_c2e0b312": "Lark Webhook",
"title_content_view_details_url_7af4b7d5": "### $title\n$content\n\n[View details]($url)",
"dingtalk_group_bot_5d8efec9": "DingTalk group bot",
"wecom_group_bot_138ea7a8": "WeCom group bot",
"under_development_78c33fbf": "Under development",
"this_feature_is_being_migrated_and_developed_61ebaf78": "This feature is being migrated and developed. Please check back later.",
"port_for_the_built_in_frps_web_cfab540f": "Port for the built-in FRPS web administration interface",
"request_failed_please_try_again_later_8977b79a": "Request failed. Please try again later.",
"operation_failed_0c3b4cf7": "Operation failed",
"automatic_configuration_must_be_a_json_object_90ba17a4": "Automatic configuration must be a JSON object.",
"high_frequency_404_scan_from_one_ip_f7d27ffb": "High-frequency 404 scan from one IP",
"abnormal_direct_access_from_one_ip_732dbeee": "Abnormal direct access from one IP",
"permanent_3e71ccc8": "Permanent",
"expired_2fe0e333": "Expired",
"in_value0_minutes_fd2a5b53": "In {value0} minutes",
"in_value0_hours_5ca37144": "In {value0} hours",
"node_2410d860": "Node",
"edge_099db313": "Edge",
"edge_s_id_74f6affc": "Edge(?:\\s+ID)?",
"value0_s_value1_s_40960c98": "{value0}\\s+{value1}(?=$|[\\s,.:])",
"rule_graph_schema_version_must_be_1_ea9a1161": "Rule graph schema_version must be 1",
"rule_graph_exceeds_the_size_limit_337651b9": "Rule graph exceeds the size limit",
"node_id_must_not_be_empty_51a5de58": "Node ID must not be empty",
"duplicate_node_id_value0_621230af": "Duplicate node ID {value0}",
"edge_id_must_not_be_empty_bc8f69cb": "Edge ID must not be empty",
"duplicate_edge_id_value0_0a9d1c7c": "Duplicate edge ID {value0}",
"the_start_node_must_not_have_incoming_50a07b17": "The start node must not have incoming edges",
"the_rule_graph_must_contain_exactly_one_7dfbc027": "The rule graph must contain exactly one start node",
"the_rule_graph_must_contain_exactly_one_0036eb82": "The rule graph must contain exactly one allow node",
"edge_value0_has_an_invalid_endpoint_or_9d84eb7e": "Edge {value0} has an invalid endpoint or output",
"node_value0_output_value1_is_not_connected_c3038e81": "Node {value0} output {value1} is not connected",
"node_value0_output_value1_can_only_be_903e54ce": "Node {value0} output {value1} can only be connected once",
"node_value0_is_unreachable_from_the_start_086531dc": "Node {value0} is unreachable from the start node",
"node_value0_cannot_reach_a_terminal_node_8de2ff6e": "Node {value0} cannot reach a terminal node",
"the_rule_graph_must_not_contain_cycles_fd6fe797": "The rule graph must not contain cycles",
"node_value0_contains_an_invalid_ip_address_1873ab94": "Node {value0} contains an invalid IP address",
"node_value0_contains_an_invalid_cidr_00c880d9": "Node {value0} contains an invalid CIDR",
"node_value0_contains_an_invalid_ip_group_589219a5": "Node {value0} contains an invalid IP group",
"node_value0_contains_an_invalid_geography_code_1a9f469b": "Node {value0} contains an invalid geography code",
"node_value0_has_pow_settings_outside_the_9fd2a4cb": "Node {value0} has PoW settings outside the allowed range",
"node_value0_has_invalid_block_response_settings_ae4c35ca": "Node {value0} has invalid block response settings",
"node_value0_match_mode_must_be_and_242c1ae7": "Node {value0} match mode must be and or or",
"node_value0_contains_an_invalid_browser_tag_4d0e6740": "Node {value0} contains an invalid browser tag",
"node_value0_contains_an_invalid_operating_system_45bea1fb": "Node {value0} contains an invalid operating system tag",
"node_value0_allows_at_most_32_custom_497938c6": "Node {value0} allows at most 32 custom UA patterns",
"node_value0_custom_ua_pattern_must_not_a72718be": "Node {value0} custom UA pattern must not be empty",
"node_value0_custom_ua_pattern_is_too_c2c83c0e": "Node {value0} custom UA pattern is too long",
"node_value0_has_an_invalid_custom_ua_c47ffd0d": "Node {value0} has an invalid custom UA pattern",
"node_value0_requires_at_least_one_pattern_6114bb93": "Node {value0} requires at least one pattern when custom UA blocking is enabled",
"start_d2bb025a": "Start",
"ip_match_43f4b6d4": "IP match",
"geography_match_9acb08c4": "Location match",
"ua_check_b56dac23": "UA check",
"security_checks_e09822e6": "Security checks",
"pow_challenge_3c043088": "PoW challenge",
"allow_1e9f2561": "Allow",
"block_2a366d09": "Block",
"wechat_81b430b6": "WeChat",
"wildcard_c6b0739e": "Wildcard",
"exact_match_391fe725": "Exact match",
"value0_expires_value1_7d8600f8": "{value0} (expires: {value1})",
"sorry_the_page_you_requested_seems_to_ba66cd83": "The page you requested could not be found.",
"check_the_path_or_return_to_safety_b1f31888": "Check the URL or return to the dashboard.",
"previous_c9b9ae7a": "Previous",
"home_203c08e0": "Home",
"1_api_conventions_and_authentication_e6d4df61": "1. API conventions and authentication",
"standard_api_request_conventions_and_developer_access_39eb956e": "Standard API request conventions and developer access token authentication",
"1_1_standard_response_format_5cddae2f": "1.1 Standard response format",
"all_api_endpoints_use_a_standard_json_87c92fb0": "All API endpoints use a standard JSON response structure:",
"field_49ecd0e3": "Field",
"type_ba40014f": "Type",
"description_4262c45d": "Description",
"error_message_empty_on_success_contains_error_d89d457f": "Error message. Empty (\"\") on success; contains error details on failure.",
"the_response_payload_null_when_the_request_97b8b29c": "The response payload. null when the request fails or no data is returned.",
"successful_response_example_8917e853": "Successful response example:",
"failed_response_example_eae899e1": "Failed response example:",
"error_msg_incorrect_password_data_null_b2eccc86": "{\n \"error_msg\": \"Incorrect password\",\n \"data\": null\n}",
"1_2_authentication_methods_3c5db38a": "1.2 Authentication methods",
"protected_endpoints_require_credentials_except_public_endpoints_1fa0a24c": "Authentication is required except for public endpoints, such as login, registration, and public configuration:",
"session_credentials_de72024d": "Session credentials:",
"browser_clients_can_stay_signed_in_using_f316279b": "Browser clients can stay signed in using a standard session cookie.",
"access_tokens_8de23550": "Access tokens:",
"for_backend_calls_and_third_party_integrations_dfd8bf0f": "For backend calls and third-party integrations. Generate an API access token and include it in a request header to authenticate.",
"use_either_of_the_following_request_headers_1e03b04b": "Use either of the following request headers:",
"2_user_and_authentication_endpoints_4a89d429": "2. User and authentication endpoints",
"2_1_user_registration_4f332f85": "2.1 User registration",
"endpoint_79a2369a": "Endpoint:",
"description_3e633a20": "Description:",
"register_a_local_account_when_registration_is_938891dc": "Register a local account when registration is enabled in the administration settings.",
"parameter_9634fb08": "Parameter",
"required_11da9dc4": "Required",
"yes_b5141d3d": "Yes",
"username_must_be_unique_and_contain_no_e81c1e5c": "Username; must be unique and contain no spaces.",
"password_at_least_8_characters_37cdc807": "Password; at least 8 characters.",
"no_0c70665b": "No",
"nickname_defaults_to_the_username_when_omitted_676aae7e": "Nickname. Defaults to the username when omitted.",
"2_2_password_login_271483ba": "2.2 Password login",
"authenticate_with_a_username_and_password_establishing_a38ff252": "Authenticate with a username and password, establishing a session cookie on success.",
"username_1a3f0617": "Username",
"password_a621ab60": "Password",
"2_3_sign_out_3252611d": "2.3 Sign out",
"delete_the_current_session_cookie_and_sign_c213ffd9": "Delete the current session cookie and sign out.",
"2_4_get_profile_7b96110a": "2.4 Get profile",
"get_the_signed_in_account_s_basic_b0eb8cfa": "Get the signed-in account's basic information, including ID, role, and nickname.",
"3_personal_access_token_endpoints_989f5d7c": "3. Personal access token endpoints",
"access_token_management_requires_a_session_login_42d91543": "Access token management requires a session login and is available to regular users.",
"3_1_list_tokens_9840c227": "3.1 List tokens",
"list_the_current_user_s_tokens_with_c34d2210": "List the current user's tokens with secret values masked.",
"3_2_create_an_access_token_e53bd784": "3.2 Create an access token",
"parameters_ba89685c": "Parameters:",
"name_token_name_is_admin_false_4f3e4868": "{\"name\": \"token name\", \"is_admin\": false}",
"generate_an_access_token_the_response_includes_70552390": "Generate an access token. The response includes its plaintext value once; store it securely.",
"optional_default_210b9d8f": " (optional, default ",
"grant_administrator_privileges_to_the_token_only_2292cad8": "): grant administrator privileges to the token. Only administrators can enable this. Regular tokens cannot access ",
"endpoints_815c88e5": " endpoints.",
"successful_response_example_7783a39c": "Successful response example:",
"3_3_revoke_delete_a_token_ae510f58": "3.3 Revoke/delete a token",
"permanently_delete_a_token_by_id_immediately_145287f6": "Permanently delete a token by ID, immediately invalidating it.",
"3_4_rotate_a_token_secret_79209983": "3.4 Rotate a token secret",
"replace_a_token_s_secret_and_return_d2caca89": "Replace a token's secret and return its new plaintext value. The previous secret becomes invalid; its name and ID stay the same.",
"4_public_configuration_and_administration_17ebdbd5": "4. Public configuration and administration",
"4_1_public_system_configuration_2be912e4": "4.1 Public system configuration",
"get_publicly_visible_configuration_keys_and_values_bc7bff66": "Get publicly visible configuration keys and values for dynamic frontend rendering.",
"response_example_d3087445": "Response example:",
"4_2_system_configuration_crud_administrator_2ce66c8b": "4.2 System configuration CRUD (administrator)",
"manage_system_configs_dynamically_through_an_administrator_acdcdb99": "Manage system_configs dynamically through an administrator session.",
"list_configuration_3d58680b": "List configuration:",
"create_a_configuration_entry_1d995264": "Create a configuration entry:",
"update_a_configuration_value_2a0b0b76": "Update a configuration value:",
"delete_a_configuration_entry_1b77a6ea": "Delete a configuration entry:",
"1_quick_start_ef8fbb58": "1. Quick start",
"a_guide_to_the_general_purpose_full_9cd8c987": "A guide to the general-purpose full-stack development platform",
"architecture_e992b65c": "Architecture:",
"go_gin_gorm_redis_asynq_backend_react_d5fe02d3": "Go (Gin + GORM + Redis + Asynq) backend + React (Next.js 16 + Tailwind CSS 4 + shadcn/ui) frontend",
"authentication_d36b345b": "Authentication:",
"local_username_password_registration_and_login_plus_583ab638": "Local username/password registration and login, plus third-party OIDC (OAuth2) account linking",
"access_tokens_b7b856d3": "Access tokens:",
"personal_developer_access_tokens_api_keys_for_4b407149": "Personal developer access tokens (API keys) for calling system APIs through HTTP headers",
"observability_ea0cc1bf": "Observability:",
"zap_structured_logging_and_opentelemetry_distributed_tracing_9fd6da9f": "Zap structured logging and OpenTelemetry distributed tracing",
"2_authentication_and_security_settings_76967059": "2. Authentication and security settings",
"the_platform_combines_authentication_methods_to_support_bc9f1772": "The platform combines authentication methods to support different deployments and use cases:",
"2_1_username_and_password_authentication_97184f8f": "2.1 Username and password authentication",
"registration_and_password_login_c5bd6cb4": "Registration and password login:",
"users_can_register_and_create_sessions_with_21883e04": "Users can register and create sessions with a username and password. Passwords are stored using ",
"salted_hashing_dc2a9b63": " salted hashing.",
"system_switches_53741557": "System switches:",
"administrators_can_disable_password_registration_or_login_a2648e62": "Administrators can disable password registration or login at any time to require third-party authentication.",
"2_2_third_party_oidc_providers_f14083c8": "2.2 Third-party OIDC providers",
"users_can_link_external_accounts_from_their_c08d3f5a": "Users can link external accounts from their profile page:",
"open_4540d74d": "Open ",
"settings_profile_32835b0d": "Settings / Profile",
"message_a173cce8": ".",
"under_linked_accounts_view_existing_connections_or_5151eb9b": "Under Linked accounts, view existing connections or select an available OIDC provider to start an OAuth2 linking flow.",
"after_linking_use_the_oidc_login_button_6095b15d": "After linking, use the OIDC login button on the login page for quick access.",
"3_integrating_personal_access_tokens_af2647b5": "3. Integrating personal access tokens",
"personal_access_tokens_allow_developers_and_third_9a242a0e": "Personal access tokens allow developers and third-party tools to call system APIs directly.",
"3_1_token_generation_and_storage_2b78c681": "3.1 Token generation and storage",
"one_time_plaintext_display_fd13912a": "One-time plaintext display:",
"a_newly_generated_plaintext_token_such_as_57eb11a1": "A newly generated plaintext token (such as ",
"is_displayed_only_once_copy_and_save_8d378c8a": ") is displayed only once. Copy and save it immediately; it cannot be retrieved after closing the dialog.",
"secure_hash_storage_1ce392ff": "Secure hash storage:",
"only_a_sha_256_hash_of_the_dbf434b1": "Only a SHA-256 hash of the token is stored in the database, preventing plaintext recovery from a leaked digest.",
"3_2_calling_apis_with_headers_fccd7b0d": "3.2 Calling APIs with headers",
"use_your_saved_plaintext_token_with_either_3af53a05": "Use your saved plaintext token with either of the following HTTP authentication headers:",
"method_1_authorization_bearer_header_2a9c2a6c": "Method 1: Authorization Bearer header",
"method_2_custom_x_access_token_header_4548169f": "Method 2: Custom X-Access-Token header",
"4_dynamic_system_configuration_b3bf8c49": "4. Dynamic system configuration",
"the_built_in_key_value_configuration_module_713f6d05": "The built-in key/value configuration module lets administrators adjust runtime behavior dynamically:",
"cached_reads_35828322": "Cached reads:",
"configuration_is_read_from_the_database_through_3e9f6a34": "Configuration is read from the database through GORM and accelerated with Redis hash caching to reduce query latency.",
"core_system_configuration_keys_6dc02be8": "Core system configuration keys:",
"platform_display_name_116219b1": ": platform display name",
"password_login_switch_153eaa45": ": password login switch",
"user_registration_switch_827b5b21": ": user registration switch",
"maximum_tokens_per_regular_user_default_5_5dd6d9e7": ": maximum tokens per regular user (default: 5)",
"5_background_tasks_and_scheduling_7142ce96": "5. Background tasks and scheduling",
"cobra_provides_separate_commands_so_worker_services_1bbae2df": "Cobra provides separate commands so worker services can handle expensive computation and slow I/O independently:",
"scheduled_dispatch_scheduler_command_e79062ad": "Scheduled dispatch (scheduler command):",
"enqueues_tasks_in_redis_according_to_their_694e5985": "Enqueues tasks in Redis according to their Cron expressions.",
"workers_with_queue_priorities_worker_command_faa970b1": "Workers with queue priorities (worker command):",
"asynq_consumes_tasks_by_priority_and_executes_69d82251": "Asynq consumes tasks by priority and executes them concurrently, such as temporary upload cleanup and external log synchronization.",
"6_distributed_tracing_and_structured_logs_e8971cad": "6. Distributed tracing and structured logs",
"the_platform_integrates_monitoring_components_for_observability_2b1da50f": "The platform integrates monitoring components for observability across distributed services:",
"tracing_context_is_propagated_automatically_gin_requests_0f549cce": "Tracing context is propagated automatically. Gin requests, outgoing requests, and GORM database operations carry spans for diagnosing latency and errors.",
"zap_structured_logs_1c9725e8": "Zap structured logs:",
"standardizes_backend_console_and_log_output_as_16970757": "Standardizes backend console and log output as JSON for integration with log collectors such as ELK and Loki.",
"last_updated_value0_87a896df": "Last updated: {value0}",
"back_to_home_d66f4359": "Back to home",
"sections_fcb2696e": " sections",
"last_updated_a83cd480": "Last updated:",
"copied_8f6f8d97": "Copied",
"copy_markdown_f9c71ee4": "Copy Markdown",
"table_of_contents_52daa71e": "Table of contents",
"questions_about_this_content_feb7d44a": "Questions about this content?",
"contact_support_4cac90c8": "Contact support",
"1_information_we_collect_af0db091": "1. Information we collect",
"we_collect_only_the_information_necessary_to_72f6e528": "We collect only the information necessary to provide this service, following the principles of lawfulness, fairness, and necessity. Collection is limited to the following:",
"1_1_authentication_information_60199ee9": "1.1 Authentication information:",
"when_you_register_locally_or_sign_in_acdd6bd1": "When you register locally or sign in through a third-party OIDC provider, we collect your username, linked email address, password hash, and associated third-party OpenID identifier.",
"we_do_not_require_a_phone_number_3540dfca": "We do not require a phone number, identity document, or other real-world identity information.",
"1_2_service_and_api_logs_46c9a04d": "1.2 Service and API logs:",
"for_system_security_and_auditing_we_automatically_89737fdd": "For system security and auditing, we automatically collect activity logs, including IP address, access date and time, personal access token API call history, and User-Agent (browser, device, or request tool).",
"2_data_storage_and_security_7cc5cdef": "2. Data storage and security",
"we_recognize_the_importance_of_data_security_cd3bd4d9": "We recognize the importance of data security and use industry-standard technical measures to protect your data:",
"storage_security_a33cfbef": "Storage security:",
"user_data_is_stored_in_a_dedicated_132af7bb": "User data is stored in a dedicated cloud database or local container storage accessible only to authorized system applications.",
"cryptography_9a15a88b": "Cryptography:",
"sensitive_password_and_personal_access_token_hashes_9f724cd8": "Sensitive password and personal access token hashes are stored using strong cryptographic algorithms. API data transport requires SSL/TLS encryption.",
"access_control_3471eafa": "Access control:",
"we_apply_the_principle_of_least_privilege_79328c28": "We apply the principle of least privilege. Platform data is not shared externally, and internal system administration is recorded in audit logs.",
"3_how_we_use_information_41b4d6ad": "3. How we use information",
"collected_information_is_used_only_for_the_4868b538": "Collected information is used only for the following purposes:",
"identification_481b07f4": "Identification:",
"to_identify_your_registered_account_and_display_8c559094": "To identify your registered account and display your profile and settings.",
"service_functions_c5834f20": "Service functions:",
"to_identify_and_process_api_authentication_requests_d48a36a2": "To identify and process API authentication requests using your personal access tokens.",
"security_e7132437": "Security:",
"to_analyze_ip_addresses_and_activity_logs_5210836a": "To analyze IP addresses and activity logs for API abuse and brute-force attacks, protecting backend stability.",
"prohibited_uses_b13fde94": "Prohibited uses:",
"we_will_8856fb95": "We will ",
"never_c1d7d603": "never",
"sell_your_data_to_third_parties_or_7bb4d77a": " sell your data to third parties or provide user profiling or advertising services to any organization.",
"4_information_sharing_and_disclosure_c034d295": "4. Information sharing and disclosure",
"4_1_sharing_principles_b89eb890": "4.1 Sharing principles:",
"we_do_not_share_personal_information_with_ffcf1e8f": "We do not share personal information with third parties, including affiliates and business partners, except in the following circumstances:",
"with_your_prior_explicit_authorization_or_consent_0fa05878": "With your prior explicit authorization or consent;",
"when_required_by_applicable_laws_legal_proceedings_cb547dd6": "When required by applicable laws, legal proceedings, or binding administrative or judicial demands.",
"4_2_transfer_and_public_disclosure_383d35be": "4.2 Transfer and public disclosure:",
"we_do_not_transfer_your_personal_information_e3339921": "We do not transfer your personal information to any company, organization, or individual, or publicly disclose it for commercial purposes.",
"5_your_rights_and_data_management_08999326": "5. Your rights and data management",
"under_the_personal_information_protection_law_of_94ea405e": "Under the Personal Information Protection Law of the People's Republic of China, you retain control over your personal information:",
"5_1_access_and_management_854d0793": "5.1 Access and management:",
"you_may_sign_in_at_any_time_8727c5be": "You may sign in at any time to view your basic personal information and generate, rotate, or revoke access tokens (API keys).",
"5_2_deletion_and_account_closure_9d1e7aba": "5.2 Deletion and account closure:",
"if_you_stop_using_the_service_you_24c642c6": "If you stop using the service, you may request account closure. We will promptly delete sensitive information from active storage, except security logs that must be retained by law.",
"6_policy_updates_and_notices_444076f5": "6. Policy updates and notices",
"this_privacy_policy_may_change_as_the_2a270464": "This privacy policy may change as the service develops or applicable laws change.",
"we_will_prominently_announce_material_changes_for_210fbd3b": "We will prominently announce material changes, for example through platform announcements or dialogs. Continued use of the service indicates acceptance of the revised policy.",
"1_agreement_and_service_overview_511c6782": "1. Agreement and service overview",
"1_1_parties_d2bf79cd": "1.1 Parties:",
"these_terms_of_service_the_agreement_govern_1e6754fc": "These Terms of Service (the Agreement) govern use of this system between you (the User or Developer) and the operator of this general-purpose development platform (the System or Platform).",
"1_2_read_carefully_dfde346e": "1.2 Read carefully:",
"this_system_is_a_general_purpose_full_f1d395fe": "This system is a general-purpose full-stack foundation for customization, providing registration, sessions, OIDC integration, API key authentication, and administration. Please read all terms before using it.",
"1_3_agreement_contents_f05cebc0": "1.3 Agreement contents:",
"the_agreement_includes_these_terms_and_any_43e244b6": "The Agreement includes these terms and any rules, statements, or explanations we have published or may publish. Those rules form an integral part of the Agreement and have equal legal effect.",
"2_service_definition_and_nature_61db87f8": "2. Service definition and nature",
"your_responsibility_527cbdbf": "Your responsibility:",
"the_entity_deploying_and_operating_a_customized_047c6a8f": "The entity deploying and operating a customized version of this system assumes all compliance responsibility for its business activities in other production environments.",
"3_registration_and_account_use_cfab1555": "3. Registration and account use",
"3_1_accounts_2631c114": "3.1 Accounts:",
"users_may_register_through_the_frontend_or_e527ef52": "Users may register through the frontend or link a login through a third-party OIDC provider enabled by an administrator.",
"3_2_password_and_token_security_80dd80d9": "3.2 Password and token security:",
"password_security_7a29e44e": "Password security:",
"keep_your_account_password_secure_eb9adf10": "Keep your account password secure.",
"api_token_security_34af066f": "API token security:",
"a_personal_access_token_api_key_represents_6215b3b0": "A personal access token (API key) represents your account's full API permissions.",
"you_are_responsible_for_data_loss_or_0c9acc88": "You are responsible for data loss or system damage resulting from a token leak caused by inadequate safekeeping.",
"4_prohibited_user_conduct_bd5628b6": "4. Prohibited user conduct",
"when_using_this_system_you_must_comply_1e54356c": "When using this system, you must comply with applicable laws, including the Cybersecurity Law of the People's Republic of China and the Measures for the Administration of Security Protection of Computer Information Networks Connected to the Internet.",
"the_following_activities_are_strictly_prohibited_5b57de7f": "The following activities are strictly prohibited:",
"endangering_national_security_4a160c4e": "Endangering national security:",
"opposing_constitutional_principles_endangering_national_security_disclosing_bdfb8814": "Opposing constitutional principles, endangering national security, disclosing state secrets, subverting state power, or undermining national unity;",
"illegal_information_services_c97748bb": "Illegal information services:",
"hacking_tools_ddos_attack_services_server_brute_686746c4": "Hacking tools, DDoS attack services, server brute-force services, or other illegal information service platforms;",
"pornography_gambling_and_drugs_fdb44a54": "Pornography, gambling, and drugs:",
"creating_copying_publishing_or_distributing_obscene_pornographic_ec8c0fdb": "Creating, copying, publishing, or distributing obscene, pornographic, gambling-related, violent, murderous, terrorist, or crime-inciting content;",
"intellectual_property_infringement_cc10b950": "Intellectual property infringement:",
"selling_pirated_software_or_media_illegal_game_3f0f4159": "Selling pirated software or media, illegal game cheats, unauthorized game servers, stolen accounts, or leaked personal databases;",
"other_unlawful_information_4085c17c": "Other unlawful information:",
"spreading_rumors_promoting_cults_or_superstition_insulting_a062981a": "Spreading rumors, promoting cults or superstition, insulting or defaming others, or infringing their lawful rights.",
"enforcement_9c7cfd68": "Enforcement:",
"if_these_rules_are_violated_the_platform_86df3b18": "If these rules are violated, the platform operator may, without notice, ",
"permanently_suspend_your_account_block_all_access_b9f04a42": "permanently suspend your account, block all access token requests, and refer relevant information to public security or cybersecurity authorities as required by law.",
"5_disclaimer_and_force_majeure_be649f43": "5. Disclaimer and force majeure",
"5_1_general_disclaimer_30d01f0d": "5.1 General disclaimer:",
"this_development_platform_is_provided_as_is_23bc2b55": "This development platform is provided as is and as available. We do not guarantee that it meets your particular development needs or provide additional guarantees of timeliness, security, or accuracy.",
"5_2_service_interruptions_16558fa8": "5.2 Service interruptions:",
"the_platform_is_not_liable_for_interruptions_405b1c95": "The platform is not liable for interruptions, data loss, or account damage caused by the following force majeure events:",
"natural_disasters_including_typhoons_earthquakes_tsunamis_and_1bbbfb21": "Natural disasters, including typhoons, earthquakes, tsunamis, and floods;",
"government_actions_cybersecurity_law_changes_or_administrative_2b7322f5": "Government actions, cybersecurity law changes, or administrative orders;",
"telecommunication_faults_or_damage_to_data_center_259a542f": "Telecommunication faults or damage to data center or submarine cables;",
"data_corruption_or_downtime_caused_by_hacking_68f2e04f": "Data corruption or downtime caused by hacking or ransomware.",
"6_governing_law_and_disputes_b9663c86": "6. Governing law and disputes",
"6_1_governing_law_ff2afc5e": "6.1 Governing law:",
"the_formation_performance_interpretation_and_resolution_of_c1510775": "The formation, performance, interpretation, and resolution of disputes under this Agreement are governed by ",
"the_laws_of_the_people_s_republic_5d5c80d6": "the laws of the People's Republic of China",
"excluding_the_conflict_of_laws_rules_of_b235c4e3": " (excluding the conflict-of-laws rules of Hong Kong, Macao, and Taiwan).",
"6_2_dispute_resolution_44e871de": "6.2 Dispute resolution:",
"disputes_should_first_be_resolved_through_friendly_1ccf4610": "Disputes should first be resolved through friendly negotiation. If negotiation fails, they must be submitted to a competent people's court at the location of the system's deployer or operator.",
"failed_to_load_value0_7f5a06a3": "Failed to load {value0}",
"load_failed_d1d04482": "Load failed",
"no_data_497c8569": "No data",
"loading_d04fcbda": "Loading",
"saved_e05ddf99": "Saved",
"save_failed_6309a3bb": "Save failed",
"unknown_error_13a46616": "Unknown error",
"deleted_5223f91b": "Deleted",
"delete_failed_c228558c": "Delete failed",
"configuration_list_53052147": "Configuration list",
"confirm_delete_2d61cf17": "Confirm delete?",
"this_cannot_be_undone_this_will_permanently_8c896756": "This cannot be undone. This will permanently delete the configuration.",
"cancel_2cd0f3be": "Cancel",
"confirm_delete_a3ea3c17": "Confirm delete",
"configuration_info_7f69a860": "Configuration info",
"select_a_configuration_to_view_details_ec4949ab": "Select a configuration to view details",
"updating_e1d9dd03": " Updating",
"update_3055a035": "Update",
"actions_ed31fbb4": "Actions",
"enter_password_728a7b60": "Enter password",
"for_your_account_security_please_enter_the_28fc0bbd": "For your account security, please enter the 6-digit verification password",
"verifying_6c128e0a": "Verifying…",
"confirm_36f33ada": "Confirm",
"profile_b94d13a4": "Profile",
"manage_your_account_information_and_preferences_cced83b4": "Manage your account information and preferences",
"user_guide_c83b6b0a": "User guide",
"api_integration_and_everyday_operation_guides_281269a1": "API integration and everyday operation guides",
"system_settings_68ea5dd4": "System settings",
"manage_registration_login_and_authentication_provider_security_f378ed37": "Manage registration, login, and authentication provider security",
"global_system_configuration_1eb8931e": "Global system configuration",
"manage_core_platform_runtime_settings_341e4182": "Manage core platform runtime settings",
"user_permissions_8e8b1d33": "User permissions",
"view_and_manage_registered_users_and_their_db533b7c": "View and manage registered users and their account status",
"background_task_scheduling_408172d1": "Background task scheduling",
"dispatch_and_monitor_background_and_scheduled_tasks_83967fc9": "Dispatch and monitor background and scheduled tasks",
"system_logs_366ada1d": "System logs",
"view_background_task_logs_and_system_status_24fd6a7d": "View background task logs and system status",
"a_modern_extensible_administration_platform_with_ready_0d95c0c1": "A modern, extensible administration platform with ready-to-use infrastructure for building enterprise applications.",
"get_started_715ee9dc": "Get started",
"hide_tip_738f4b27": "Hide tip",
"quick_navigation_05deefcb": "Quick navigation",
"open_fee3b5a5": "Open ",
"open_df42ebc3": "Open ",
"administration_console_ceb0c289": "Administration console",
"live_origin_error_page_preview_a2a12823": "Live origin error page preview",
"html_editor_19f0d7b7": "HTML editor",
"bytes_f5d87a8b": " bytes",
"leave_empty_for_the_built_in_default_29ffce9f": " · Leave empty for the built-in default",
"leave_empty_to_use_the_built_in_e57252bd": "Leave empty to use the built-in default template…",
"drag_to_resize_b5154511": "Drag to resize",
"live_preview_a76fdaad": "Live preview",
"preview_13d61fea": "Preview",
"for_example_github_1061e2e4": "For example: github",
"for_example_github_login_1e0c113c": "For example: GitHub login",
"https_or_leave_empty_a0d86d9b": "https://... or leave empty",
"missing_configuration_value0_31b43fa6": "Missing configuration: {value0}",
"missing_configuration_file_access_whitelist_6dd80936": "Missing configuration: file_access_whitelist",
"directory_visibility_configuration_json_string_format_url_8e3c0671": "Directory visibility configuration (JSON string, format: {url: enabled})",
"missing_configuration_login_session_ttl_hours_d6f433c2": "Missing configuration: login_session_ttl_hours",
"server_address_d3716cc5": "Server address",
"platform_display_name_4b656edf": "Platform display name",
"for_example_openflare_28e07341": "For example: OpenFlare",
"for_example_https_example_com_9cf31711": "For example: https://example.com",
"allow_search_engines_to_crawl_and_index_59eff8b5": "Allow search engines to crawl and index",
"for_example_smtp_example_com_834569b4": "For example: smtp.example.com",
"for_example_587_or_465_1bd015a5": "For example: 587 or 465",
"for_example_sender_example_com_1795f7c6": "For example: sender@example.com",
"for_example_receiver_example_com_ade0ff8b": "For example: receiver@example.com",
"for_example_login_email_c7212e1f": "For example: login_email",
"for_example_login_verification_email_9d28f166": "For example: Login verification email",
"for_example_openflare_login_verification_code_0925e8d4": "For example: OpenFlare login verification code",
"for_example_your_code_is_code_valid_44cf273f": "e.g. Verification email. Available variable: {{.Code}}",
"h3_message_title_h3_p_message_content_20c91d04": "<h3>Message title</h3><p>Message content; available variable: {{.Code}}</p>",
"register_a_user_curl_x_post_https_4ae682b0": "# Register a user\ncurl -X POST https://api.example.com/api/v1/auth/register \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"username\": \"developer\",\n \"email\": \"dev@example.com\",\n \"password\": \"secure_password\"\n }'",
"quick_start_42fbb067": "# Quick start",
"developer_friendly_40c2a4ce": "Developer friendly, ",
"quick_to_integrate_18cbee8a": "quick to integrate",
"standard_restful_apis_complete_typescript_types_detailed_6369a0e2": "Standard RESTful APIs, complete TypeScript types, detailed documentation, and Swagger UI. Integrate with just a few lines of code in your preferred language.",
"restful_api_with_clear_understandable_semantics_1fa9d6f5": "RESTful API with clear, understandable semantics",
"openapi_swagger_documentation_ccbcbc84": "OpenAPI / Swagger documentation",
"developer_friendly_typescript_type_definitions_910a7909": "Developer-friendly TypeScript type definitions",
"code_samples_and_integration_guides_9e998a5a": "Code samples and integration guides",
"an_open_source_platform_for_managing_edge_317d8f34": "An open-source platform for managing edge nodes and reverse proxies. Built with Go and React to manage OpenResty nodes, website rules, and WAF configuration.",
"product_aea82737": "Product",
"dashboard_0853bf3c": "Dashboard",
"personal_c2952a5f": "Personal",
"development_9ec42862": "Development",
"source_code_606a4e58": "Source code",
"community_5bcd0ddc": "Community",
"discussions_3cef912c": "Discussions",
"privacy_policy_e464b41f": "Privacy policy",
"terms_of_service_9303687a": "Terms of service",
"built_for_customization_ff3cf147": "Built for customization",
"a_modern_administration_platform_116688ff": "A modern administration platform",
"ready_to_use_infrastructure_that_is_easy_77776634": "Ready-to-use infrastructure that is easy to extend for enterprise applications.",
"get_started_d1f9c450": "Get started",
"learn_more_ca66c2da": "Learn more",
"ready_to_use_c58cfea2": "Ready to use",
"highly_extensible_9dfa6c10": "Highly extensible",
"production_infrastructure_08c3a5e6": "Production infrastructure",
"good_fortune_b3541887": "Luck",
"retry_b8784c8d": "Retry",
"an_unknown_error_occurred_please_try_again_79a9f98a": "An unknown error occurred. Please try again later.",
"view_error_details_9e7e4e37": "View error details",
"unknown_error_e83a8ca8": "Unknown error",
"fetching_data_9ac5e428": "Fetching data...",
"type_and_press_enter_to_add_e30b7b5f": "Type and press Enter to add",
"remove_value0_30c2158a": "Remove {value0}",
"fnv_1a_32_bit_function_fnv1a_str_a1690b96": "\n// FNV-1a 32-bit\nfunction fnv1a(str) {\n let h = 2166136261 >>> 0;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 16777619) >>> 0;\n }\n return h;\n}\nfunction fnv1aResume(state, str) {\n let h = state >>> 0;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 16777619) >>> 0;\n }\n return h;\n}\n\n// xorshift32 PRNG → hex string\nfunction prngFromHash(seed, len) {\n let s = seed >>> 0, r = '';\n while (r.length < len) {\n s ^= (s << 13) >>> 0;\n s ^= (s >>> 17) >>> 0;\n s ^= (s << 5) >>> 0;\n s = s >>> 0;\n r += s.toString(16).padStart(8, '0');\n }\n return r.slice(0, len);\n}\n\n// SHA-256 via SubtleCrypto (available in workers)\nasync function sha256Hex(input) {\n const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(input));\n return Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n// Solve one puzzle\nasync function solvePuzzle(token, index, size, difficulty) {\n const tFnv = fnv1a(token);\n const saltSeed = fnv1aResume(tFnv, String(index + 1));\n const targetSeed = fnv1aResume(saltSeed, 'd');\n const salt = prngFromHash(saltSeed, size);\n const target = prngFromHash(targetSeed, difficulty);\n\n for (let nonce = 0; nonce < 10_000_000; nonce++) {\n if ((await sha256Hex(salt + nonce)).startsWith(target)) return nonce;\n }\n throw new Error('Could not solve puzzle ' + (index + 1) + ' within the allowed search range');\n}\n\n// Entry point — receive task from main thread\nself.onmessage = async ({ data }) => {\n const { token, count, size, difficulty } = data;\n try {\n const t0 = performance.now();\n const solutions = [];\n for (let i = 0; i < count; i++) {\n solutions.push(await solvePuzzle(token, i, size, difficulty));\n }\n const elapsed = ((performance.now() - t0) / 1000).toFixed(3);\n self.postMessage({ type: 'done', solutions, elapsed });\n } catch (err) {\n self.postMessage({ type: 'error', message: err.message });\n }\n};\n",
"worker_execution_failed_1877e35b": "Worker execution failed",
"failed_to_fetch_the_verification_challenge_95553133": "Failed to fetch the verification challenge",
"cap_starting_verification_pow_solver_657f3af5": "[Cap] Starting verification PoW solver",
"challenge_count_value0_ea1ffc80": " Challenge count: {value0}",
"difficulty_value0_f104cb0d": " Difficulty: {value0}",
"salt_size_value0_4f2bae5d": " Salt size: {value0}",
"cap_verification_pow_solver_completed_e1f79fd5": "[Cap] Verification PoW solver completed",
"worker_duration_value0_s_8de32777": " Worker duration: {value0}s",
"total_duration_including_communication_value0_s_004a6894": " Total duration (including communication): {value0}s",
"verification_failed_d3925ab2": "Verification failed",
"doctype_html_html_lang_en_head_meta_3e4f5ecb": "\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Offline page | OpenFlare</title>\n <style>\n *, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n background-color: #f4f3ef;\n color: #121212;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 48px 24px;\n -webkit-font-smoothing: antialiased;\n }\n\n .bauhaus-card {\n width: 100%;\n max-width: 580px;\n background: #ffffff;\n border: 3px solid #121212;\n box-shadow: 8px 8px 0px #121212;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .card-accent-bar {\n height: 12px;\n display: flex;\n }\n\n .accent-red { flex: 2; background-color: #e63946; }\n .accent-blue { flex: 3; background-color: #1d3557; }\n .accent-yellow { flex: 1; background-color: #f1faee; }\n\n .card-body {\n padding: 40px 32px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .tag {\n align-self: flex-start;\n background-color: #121212;\n color: #ffffff;\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n padding: 4px 10px;\n }\n\n .title {\n font-size: 28px;\n font-weight: 800;\n line-height: 1.2;\n letter-spacing: -0.02em;\n }\n\n .message {\n font-size: 15px;\n line-height: 1.6;\n color: #4a4a4a;\n }\n\n .contact-box {\n border: 2px solid #121212;\n background-color: #f9f8f3;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .contact-line {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n font-weight: 600;\n }\n\n .contact-line a {\n color: #e63946;\n text-decoration: none;\n font-weight: 700;\n }\n\n .contact-line a:hover {\n text-decoration: underline;\n }\n\n .card-footer {\n border-top: 2px solid #121212;\n padding: 16px 32px;\n background-color: #faf9f6;\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.05em;\n }\n\n .brand {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .brand-icon {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n </style>\n</head>\n<body>\n<div class=\"bauhaus-card\">\n <div class=\"card-accent-bar\">\n <div class=\"accent-red\"></div>\n <div class=\"accent-blue\"></div>\n <div class=\"accent-yellow\"></div>\n </div>\n <div class=\"card-body\">\n <div class=\"tag\">OFFLINE FALLBACK</div>\n <h1 class=\"title\">Offline: contact the administrator</h1>\n <p class=\"message\">\n The origin is temporarily unreachable. The offline Service Worker intercepted this request. Use the contact details below for support.\n </p>\n <div class=\"contact-box\">\n <div class=\"contact-line\">\n <span>Administrator email</span>\n <a href=\"mailto:admin@example.com\">admin@example.com</a>\n </div>\n <div class=\"contact-line\">\n <span>Service status</span>\n <a href=\"https://status.example.com\" target=\"_blank\" rel=\"noopener\">status.example.com</a>\n </div>\n </div>\n </div>\n <div class=\"card-footer\">\n <div class=\"brand\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13 2L3 14H12L11 22L21 10H12L13 2Z\" />\n </svg>\n <span>OpenFlare Service Worker</span>\n </div>\n <span>OFFLINE MODE</span>\n </div>\n</div>\n</body>\n</html>\n",
"minimal_white_5636e8a9": "Minimal white",
"line_topology_22ad450c": "Line topology",
"bauhaus_5cc69781": "Bauhaus",
"doctype_html_html_lang_en_head_meta_42a4f2da": "\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Offline page | OpenFlare</title>\n <style>\n *, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n :root {\n --color-bg: #fcfcfc;\n --color-line: #e0e0e0;\n --color-line-hover: #1a1a1a;\n --color-text-main: #1a1a1a;\n --color-text-sub: #666666;\n --color-text-muted: #999999;\n --color-accent: #d4d4d4;\n --font-geo: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n body {\n font-family: var(--font-geo);\n background-color: var(--color-bg);\n background-image: radial-gradient(circle, var(--color-accent) 0.8px, transparent 0.8px);\n background-size: 24px 24px;\n color: var(--color-text-main);\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 48px 24px;\n -webkit-font-smoothing: antialiased;\n letter-spacing: 0.01em;\n }\n\n .main-container {\n width: 100%;\n max-width: 640px;\n display: flex;\n flex-direction: column;\n gap: 32px;\n }\n\n .line-box {\n border: 1px solid var(--color-line);\n background: rgba(255, 255, 255, 0.7);\n backdrop-filter: blur(4px);\n padding: 32px;\n transition: all var(--transition-fast);\n position: relative;\n }\n\n .line-box:hover {\n border-color: var(--color-line-hover);\n box-shadow: 0 0 0 1px var(--color-line-hover);\n }\n\n .status-badge {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.15em;\n text-transform: uppercase;\n color: var(--color-text-sub);\n margin-bottom: 12px;\n }\n\n .status-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #f59e0b;\n }\n\n .title {\n font-size: 24px;\n font-weight: 700;\n letter-spacing: -0.02em;\n margin-bottom: 12px;\n }\n\n .description {\n font-size: 14px;\n line-height: 1.6;\n color: var(--color-text-sub);\n margin-bottom: 24px;\n }\n\n .contact-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n border-top: 1px dashed var(--color-line);\n padding-top: 20px;\n }\n\n .contact-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 13px;\n }\n\n .contact-label {\n color: var(--color-text-muted);\n font-size: 12px;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n }\n\n .contact-value a {\n color: var(--color-text-main);\n font-weight: 600;\n text-decoration: none;\n border-bottom: 1px solid var(--color-line);\n transition: border-color var(--transition-fast);\n }\n\n .contact-value a:hover {\n border-color: var(--color-text-main);\n }\n\n .footer-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 11px;\n color: var(--color-text-muted);\n letter-spacing: 0.05em;\n }\n\n .brand {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n color: var(--color-text-main);\n }\n\n .brand-icon {\n width: 14px;\n height: 14px;\n fill: currentColor;\n }\n </style>\n</head>\n<body>\n<div class=\"main-container\">\n <div class=\"line-box\">\n <div class=\"status-badge\">\n <span class=\"status-dot\"></span>\n SERVICE WORKER OFFLINE CACHE\n </div>\n <h1 class=\"title\">Network interrupted or origin unreachable</h1>\n <p class=\"description\">\n Service Worker fallback protection is active. Contact the administrator through the following channels:\n </p>\n <div class=\"contact-list\">\n <div class=\"contact-row\">\n <span class=\"contact-label\">Email Support</span>\n <span class=\"contact-value\"><a href=\"mailto:admin@example.com\">admin@example.com</a></span>\n </div>\n <div class=\"contact-row\">\n <span class=\"contact-label\">Status Page</span>\n <span class=\"contact-value\"><a href=\"https://status.example.com\" target=\"_blank\" rel=\"noopener\">status.example.com</a></span>\n </div>\n </div>\n </div>\n <div class=\"footer-bar\">\n <div class=\"brand\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13 2L3 14H12L11 22L21 10H12L13 2Z\" />\n </svg>\n <span>OpenFlare Edge</span>\n </div>\n <span>FALLBACK ACTIVE</span>\n </div>\n</div>\n</body>\n</html>\n",
"doctype_html_html_lang_en_head_meta_505c1308": "\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Offline page | OpenFlare</title>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n background-color: #ffffff;\n color: #333333;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n padding: 48px 24px;\n }\n .container {\n max-width: 560px;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n }\n .badge {\n display: inline-flex;\n align-items: center;\n padding: 4px 12px;\n border-radius: 9999px;\n background-color: #f3f4f6;\n color: #4b5563;\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.05em;\n }\n .title {\n font-size: 32px;\n font-weight: 700;\n color: #111827;\n line-height: 1.25;\n }\n .description {\n font-size: 15px;\n line-height: 1.6;\n color: #6b7280;\n max-width: 480px;\n }\n .contact-card {\n width: 100%;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n padding: 24px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n text-align: left;\n }\n .contact-item {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 14px;\n color: #374151;\n }\n .contact-item svg {\n width: 18px;\n height: 18px;\n color: #6b7280;\n flex-shrink: 0;\n }\n .contact-item a {\n color: #2563eb;\n text-decoration: none;\n }\n .contact-item a:hover {\n text-decoration: underline;\n }\n .footer {\n margin-top: 32px;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #9ca3af;\n font-size: 13px;\n }\n .brand-icon {\n width: 20px;\n height: 20px;\n fill: currentColor;\n }\n </style>\n</head>\n<body>\n<div class=\"container\">\n <div class=\"badge\">OFFLINE CONTACT</div>\n <h1 class=\"title\">Website unavailable: contact the administrator</h1>\n <p class=\"description\">\n The origin is currently unreachable. Service Worker offline protection is active. Contact the administrator using the details below.\n </p>\n <div class=\"contact-card\">\n <div class=\"contact-item\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"></path></svg>\n <span>Contact email: <a href=\"mailto:admin@example.com\">admin@example.com</a></span>\n </div>\n <div class=\"contact-item\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 10V3L4 14h7v7l9-11h-7z\"></path></svg>\n <span>Service status: <a href=\"https://status.example.com\" target=\"_blank\" rel=\"noopener\">status.example.com</a></span>\n </div>\n </div>\n <div class=\"footer\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13 2L3 14H12L11 22L21 10H12L13 2Z\" />\n </svg>\n <span>OpenFlare Protection</span>\n </div>\n</div>\n</body>\n</html>\n",
"status_code_tag_must_not_be_empty_21235ebf": "Status code tag must not be empty",
"invalid_status_code_range_value0_8983e96e": "Invalid status code range: {value0}",
"invalid_status_code_value0_0f206e48": "Invalid status code: {value0}",
"status_code_range_endpoints_are_reversed_value0_d92c2784": "Status code range endpoints are reversed: {value0}",
"status_code_must_be_between_value0_value1_c5b04822": "Status code must be between {value0}–{value1}: {value2}",
"invalid_status_code_tag_d16e85d7": "Invalid status code tag",
"add_at_least_one_status_code_tag_b81b2696": "Add at least one status code tag",
"the_expanded_status_code_list_is_empty_47245f34": "The expanded status code list is empty",
"request_canceled_5892f9b1": "Request canceled",
"insufficient_permissions_complete_verification_and_try_again_73719073": "Insufficient permissions; complete verification and try again",
"the_requested_resource_was_not_found_aecc0681": "The requested resource was not found",
"request_parameter_validation_failed_60ef7c51": "Request parameter validation failed",
"too_many_requests_retry_in_value0_seconds_ab5e78f1": "Too many requests; retry in {value0, plural, one {# second} other {# seconds}}",
"request_rate_limit_ad4f0f8b": "Request rate limit",
"internal_server_error_try_again_later_4f0dd7e9": "Internal server error; try again later",
"cannot_connect_to_the_server_check_that_5551f4fc": "Cannot connect to the server; check that the backend is running",
"network_request_failed_8407ceab": "Network request failed",
"request_canceled_manually_7ba622e6": "Request canceled manually",
"all_requests_canceled_72f8fa9a": "All requests canceled",
"network_connection_failed_check_your_network_cbf47b07": "Network connection failed; check your network",
"request_timed_out_try_again_later_6c3465f6": "Request timed out; try again later",
"unauthorized_sign_in_first_466879f5": "Unauthorized; sign in first",
"insufficient_permissions_5e3c8a26": "Insufficient permissions",
"value0_must_be_a_valid_number_1d79f887": "{value0} must be a valid number",
"value0_must_be_true_or_false_23cce68e": "{value0} must be true or false",
"value0_must_not_be_empty_8bf3a929": "{value0} must not be empty",
"request_canceled_282c4cfb": "Request canceled",
"base64_encoding_is_not_supported_in_this_7642d848": "Base64 encoding is not supported in this environment",
"rate_limit_retry_later": "Too many requests; try again later",
"list_separator": ", ",
"sentence_end": ".",
"task_notification_template_example": "{\"title\":\"Task completed\",\"content\":\"{{task_name}}: {{task_status}}\",\"level\":\"INFO\"}",
"ui_totalRequests": "Total Requests",
"ui_totalVisits": "Total Visits",
"ui_bandwidthServed": "Bandwidth Served",
"ui_requestsOverTime": "Requests over time",
"ui_requestsByDevice": "Requests by device type",
"ui_statusCodes": "Status Codes",
"ui_topPaths": "Top Paths",
"ui_topHosts": "Top Hosts",
"ui_topIps": "Top IPs",
"ui_topBrowsers": "Top Browsers",
"ui_topOperatingSystems": "Top Operating System",
"ui_topUserAgents": "Top User-Agents",
"ui_deviceTypes": "Device Types",
"ui_fileHash": "Hash (SHA-256)",
"ui_pathStyle": "Path Style",
"ui_requestHeaders": "Request Headers",
"ui_barkApp": "Bark App",
"ui_administrator": "Admin",
"ui_nodeLabel": "Node:",
"ui_payload": "Payload",
"ui_selectAll": "Select all",
"ui_production": "Production",
"ui_allDeployments": "All deployments",
"ui_remoteUrl": "Remote URL",
"ui_githubRelease": "GitHub Release",
"ui_releaseTag": "Release tag",
"ui_originHostHeader": "Origin Host Header",
"ui_globalRuleGroup": "Global Rule Group",
"ui_zone": "Zone",
"ui_pageNotFound": "Page Not Found",
"ui_jsonBody": "JSON Body",
"ui_openTelemetryTracing": "OpenTelemetry Tracing:",
"ui_clientId": "Client ID",
"ui_clientSecret": "Client Secret",
"ui_scopes": "Scopes",
"ui_copyright": "© 2026 Modern Platform. All rights reserved.",
"ui_technologyStack": "Stack",
"ui_readyFor": "Ready for",
"ui_development": "Develop",
"ui_features": "Features",
"ui_modern": "Modern",
"ui_versionLabel": "Version",
"ui_builtAt": "Build At",
"ui_breadcrumb": "breadcrumb",
"ui_more": "More",
"ui_previousSlide": "Previous slide",
"ui_nextSlide": "Next slide",
"ui_closeLabel": "Close",
"ui_imageCrop": "crop",
"ui_pagination": "pagination",
"ui_previousPage": "Go to previous page",
"ui_previousLabel": "Previous",
"ui_nextPage": "Go to next page",
"ui_nextLabel": "Next",
"ui_morePages": "More pages",
"ui_sidebarLabel": "Sidebar",
"ui_mobileSidebarDescription": "Displays the mobile sidebar.",
"ui_toggleSidebar": "Toggle Sidebar",
"ui_loadingLabel": "Loading",
"origin_error_page_minimalist": "\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{status}} | OpenFlare</title>\n <style>\n * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n background-color: #ffffff;\n color: #333333;\n height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n padding: 48px 24px;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .container {\n max-width: 600px;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n }\n\n .error-code {\n font-size: 48px;\n font-weight: 700;\n color: #333333;\n line-height: 1.2;\n letter-spacing: -0.02em;\n }\n\n .error-description {\n font-size: 20px;\n line-height: 1.6;\n color: #666666;\n max-width: 480px;\n }\n\n .host {\n font-size: 14px;\n color: #999999;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n word-break: break-all;\n }\n\n .footer {\n margin-top: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: #999999;\n font-size: 14px;\n font-weight: 500;\n }\n\n .brand-icon {\n width: 24px;\n height: 24px;\n fill: currentColor;\n display: block;\n }\n\n @media (max-width: 480px) {\n .error-code {\n font-size: 36px;\n }\n\n .error-description {\n font-size: 18px;\n }\n }\n </style>\n</head>\n<body>\n<div class=\"container\">\n <h1 class=\"error-code\" aria-label=\"HTTP status\">{{status}}</h1>\n <p class=\"error-description\">\n The upstream server is unreachable. Please try again later or contact the site administrator if the problem persists.\n </p>\n <p class=\"host\">{{host}}</p>\n <div class=\"footer\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M13 2L3 14H12L11 22L21 10H12L13 2Z\" />\n </svg>\n <span>OpenFlare</span>\n </div>\n</div>\n</body>\n</html>\n",
"origin_error_page_line_style": "\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{status}} | OpenFlare</title>\n <style>\n *, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n :root {\n --color-bg: #fcfcfc;\n --color-line: #e0e0e0;\n --color-line-hover: #1a1a1a;\n --color-text-main: #1a1a1a;\n --color-text-sub: #666666;\n --color-text-muted: #999999;\n --color-accent: #d4d4d4;\n --font-geo: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n body {\n font-family: var(--font-geo);\n background-color: var(--color-bg);\n background-image: radial-gradient(circle, var(--color-accent) 0.8px, transparent 0.8px);\n background-size: 24px 24px;\n color: var(--color-text-main);\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 48px 24px;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n letter-spacing: 0.01em;\n }\n\n .main-container {\n width: 100%;\n max-width: 640px;\n display: flex;\n flex-direction: column;\n gap: 48px;\n }\n\n .line-box {\n border: 1px solid var(--color-line);\n background: rgba(255, 255, 255, 0.6);\n backdrop-filter: blur(4px);\n padding: 32px;\n transition: all var(--transition-fast);\n position: relative;\n }\n\n .line-box:hover {\n border-color: var(--color-line-hover);\n box-shadow: 0 0 0 1px var(--color-line-hover);\n }\n\n .line-box:active {\n transform: scale(0.995);\n transition-duration: 100ms;\n }\n\n .error-header {\n text-align: center;\n }\n\n .error-code {\n font-size: 64px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: -0.03em;\n color: var(--color-text-main);\n margin-bottom: 12px;\n }\n\n .error-label {\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.2em;\n text-transform: uppercase;\n color: var(--color-text-sub);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n }\n\n .error-label::before,\n .error-label::after {\n content: '';\n width: 24px;\n height: 1px;\n background-color: var(--color-line);\n }\n\n .topology-wrapper {\n width: 100%;\n overflow: hidden;\n }\n\n .topology-svg {\n width: 100%;\n height: 140px;\n display: block;\n }\n\n .node-circle {\n fill: var(--color-bg);\n stroke: var(--color-text-main);\n stroke-width: 1.5;\n transition: all var(--transition-fast);\n }\n\n .node-circle.error {\n stroke: var(--color-text-muted);\n stroke-dasharray: 3 3;\n }\n\n .flow-line {\n stroke: var(--color-accent);\n stroke-width: 1.5;\n fill: none;\n transition: stroke var(--transition-fast);\n }\n\n .flow-line.error {\n stroke: var(--color-text-muted);\n stroke-dasharray: 4 4;\n }\n\n .node-text {\n font-family: var(--font-geo);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.1em;\n fill: var(--color-text-sub);\n text-anchor: middle;\n }\n\n .status-text {\n font-family: var(--font-geo);\n font-size: 9px;\n font-weight: 500;\n letter-spacing: 0.05em;\n fill: var(--color-text-muted);\n text-anchor: middle;\n }\n\n .status-text.error {\n fill: #b0b0b0;\n }\n\n .description {\n text-align: center;\n }\n\n .desc-text {\n font-size: 18px;\n line-height: 1.6;\n color: var(--color-text-sub);\n font-weight: 400;\n max-width: 480px;\n margin: 0 auto 24px;\n }\n\n .meta-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n border-top: 1px solid var(--color-line);\n padding-top: 24px;\n text-align: left;\n }\n\n .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .meta-key {\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n color: var(--color-text-muted);\n }\n\n .meta-val {\n font-size: 13px;\n font-family: 'SF Mono', 'Fira Code', monospace, var(--font-geo);\n color: var(--color-text-main);\n font-weight: 500;\n word-break: break-all;\n }\n\n .footer-brand {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: var(--color-text-muted);\n font-size: 13px;\n font-weight: 500;\n letter-spacing: 0.05em;\n transition: color var(--transition-fast);\n cursor: default;\n }\n\n .footer-brand:hover {\n color: var(--color-text-main);\n }\n\n .brand-icon {\n width: 20px;\n height: 20px;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n fill: none;\n }\n\n @media (max-width: 480px) {\n body {\n padding: 32px 16px;\n }\n .error-code {\n font-size: 48px;\n }\n .line-box {\n padding: 24px 16px;\n }\n .meta-grid {\n grid-template-columns: 1fr;\n }\n }\n </style>\n</head>\n<body>\n <div class=\"main-container\">\n <div class=\"line-box error-header\">\n <div class=\"error-code\" aria-label=\"HTTP status\">{{status}}</div>\n <div class=\"error-label\">Origin Unavailable</div>\n </div>\n\n <div class=\"line-box topology-wrapper\">\n <svg class=\"topology-svg\" viewBox=\"0 0 600 140\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto-start-reverse\">\n <path d=\"M 0 1 L 8 5 L 0 9 z\" fill=\"#d4d4d4\" />\n </marker>\n <marker id=\"arrow-error\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto-start-reverse\">\n <path d=\"M 0 1 L 8 5 L 0 9 z\" fill=\"#999999\" />\n </marker>\n </defs>\n\n <line x1=\"135\" y1=\"70\" x2=\"265\" y2=\"70\" class=\"flow-line\" marker-end=\"url(#arrow)\" />\n <line x1=\"335\" y1=\"70\" x2=\"465\" y2=\"70\" class=\"flow-line error\" marker-end=\"url(#arrow-error)\" />\n\n <circle cx=\"110\" cy=\"70\" r=\"20\" class=\"node-circle\" />\n <text x=\"110\" y=\"74\" class=\"node-text\" style=\"font-size: 8px; fill: #1a1a1a;\">CLI</text>\n <text x=\"110\" y=\"115\" class=\"node-text\">CLIENT</text>\n <text x=\"110\" y=\"130\" class=\"status-text\">REQ_SENT</text>\n\n <circle cx=\"300\" cy=\"70\" r=\"20\" class=\"node-circle\" />\n <path d=\"M296 70 L304 64 L301 70 L305 70 L296 76 L299 70 Z\" fill=\"none\" stroke=\"#1a1a1a\" stroke-width=\"1\" stroke-linejoin=\"round\"/>\n <text x=\"300\" y=\"115\" class=\"node-text\">OPENFLARE</text>\n <text x=\"300\" y=\"130\" class=\"status-text\">EDGE_PROXY</text>\n\n <circle cx=\"490\" cy=\"70\" r=\"20\" class=\"node-circle error\" />\n <line x1=\"484\" y1=\"64\" x2=\"496\" y2=\"76\" stroke=\"#999\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"496\" y1=\"64\" x2=\"484\" y2=\"76\" stroke=\"#999\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <text x=\"490\" y=\"115\" class=\"node-text\" style=\"fill: #999;\">ORIGIN</text>\n <text x=\"490\" y=\"130\" class=\"status-text error\">UNAVAILABLE</text>\n </svg>\n </div>\n\n <div class=\"footer-brand\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n <span>OpenFlare</span>\n </div>\n </div>\n\n <script>\n document.addEventListener('DOMContentLoaded', () => {\n const tsEl = document.getElementById('timestamp');\n if (tsEl) {\n const now = new Date();\n tsEl.textContent = now.toISOString().replace('T', ' ').substring(0, 19) + ' UTC';\n }\n });\n </script>\n</body>\n</html>\n",
"origin_error_page_baohaus": "\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{status}} | OpenFlare</title>\n <style>\n :root {\n --color-red: #E53935;\n --color-yellow: #FDD835;\n --color-blue: #1E88E5;\n --color-black: #212121;\n --color-white: #FAFAFA;\n --color-grey: #9E9E9E;\n --font-primary: 'Futura', 'Century Gothic', 'Tw Cen MT', sans-serif;\n }\n\n * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n body {\n background-color: var(--color-white);\n color: var(--color-black);\n font-family: var(--font-primary);\n min-height: 100vh;\n width: 100%;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow-x: hidden;\n }\n\n body::before {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-image: radial-gradient(var(--color-grey) 1px, transparent 1px);\n background-size: 20px 20px;\n opacity: 0.15;\n z-index: -1;\n pointer-events: none;\n }\n\n .layout-container {\n display: grid;\n grid-template-columns: 1fr 1.618fr;\n grid-template-rows: 1fr 1fr;\n min-height: 100vh;\n width: 100%;\n }\n\n .zone-left {\n grid-column: 1 / 2;\n grid-row: 1 / 3;\n border-right: 4px solid var(--color-black);\n border-bottom: 4px solid var(--color-black);\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: var(--color-white);\n padding: 2rem;\n z-index: 2;\n }\n\n .decor-circle {\n position: absolute;\n width: 40vh;\n height: 40vh;\n background-color: var(--color-yellow);\n border-radius: 50%;\n top: 15%;\n left: 10%;\n z-index: 1;\n }\n\n .error-number {\n font-size: clamp(6rem, 12vw, 14rem);\n font-weight: 700;\n line-height: 0.9;\n letter-spacing: -0.04em;\n color: var(--color-black);\n position: relative;\n z-index: 2;\n }\n\n .brand-footer {\n position: absolute;\n bottom: 2rem;\n left: 2rem;\n display: flex;\n align-items: center;\n gap: 10px;\n z-index: 3;\n }\n\n .brand-icon {\n width: 24px;\n height: 24px;\n fill: var(--color-black);\n }\n\n .brand-text {\n font-size: 0.85rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n }\n\n .zone-top-right {\n grid-column: 2 / 3;\n grid-row: 1 / 2;\n border-bottom: 4px solid var(--color-black);\n background-color: var(--color-white);\n padding: 4rem;\n display: flex;\n flex-direction: column;\n justify-content: center;\n z-index: 2;\n }\n\n .error-title {\n font-size: clamp(1.5rem, 3vw, 2.5rem);\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 1.5rem;\n letter-spacing: 0.05em;\n }\n\n .error-desc {\n font-size: 1.1rem;\n line-height: 1.6;\n max-width: 450px;\n color: var(--color-black);\n }\n\n .meta-data {\n margin-top: 2rem;\n font-family: monospace;\n font-size: 0.8rem;\n color: var(--color-grey);\n border-top: 1px solid var(--color-grey);\n padding-top: 1rem;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n word-break: break-all;\n }\n\n .zone-bottom-right {\n grid-column: 2 / 3;\n grid-row: 2 / 3;\n background-color: var(--color-white);\n position: relative;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2;\n }\n\n .geo-line {\n position: absolute;\n width: 100%;\n height: 3px;\n background-color: var(--color-black);\n top: 50%;\n left: 0;\n }\n\n .geo-triangle {\n position: absolute;\n right: 15%;\n bottom: 15%;\n width: 0;\n height: 0;\n border-left: 80px solid transparent;\n border-right: 80px solid transparent;\n border-bottom: 140px solid var(--color-blue);\n }\n\n .geo-rect {\n position: absolute;\n top: 40%;\n left: 20%;\n width: 150px;\n height: 30px;\n background-color: var(--color-red);\n transform: rotate(-45deg);\n }\n\n @media (max-width: 900px) {\n .layout-container {\n display: flex;\n flex-direction: column;\n }\n\n .zone-left {\n border-right: none;\n border-bottom: 4px solid var(--color-black);\n min-height: 50vh;\n padding-top: 4rem;\n }\n\n .decor-circle {\n width: 30vh;\n height: 30vh;\n top: 10%;\n }\n\n .zone-top-right {\n border-bottom: 4px solid var(--color-black);\n padding: 2rem;\n }\n\n .zone-bottom-right {\n min-height: 30vh;\n }\n\n .geo-triangle {\n border-left-width: 50px;\n border-right-width: 50px;\n border-bottom-width: 90px;\n right: 10%;\n }\n\n .geo-rect {\n width: 100px;\n height: 20px;\n left: 15%;\n }\n }\n </style>\n</head>\n<body>\n <div class=\"layout-container\">\n <div class=\"zone-left\">\n <div class=\"decor-circle\"></div>\n <div class=\"error-number\" aria-label=\"HTTP status\">{{status}}</div>\n\n <div class=\"brand-footer\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\"/>\n </svg>\n <span class=\"brand-text\">OpenFlare</span>\n </div>\n </div>\n\n <div class=\"zone-top-right\">\n <h1 class=\"error-title\">Origin Unavailable</h1>\n <p class=\"error-desc\">\n The server received an invalid response from the upstream server.\n <br><br>\n <strong>Form follows function:</strong> The connection path is broken. Please verify the origin server status.\n </p>\n <div class=\"meta-data\">\n <div>ERR_CODE: {{status}}</div>\n <div>HOST: {{host}}</div>\n <div>PROXY: OPENFLARE_EDGE</div>\n <div id=\"timestamp\">--:--:-- UTC</div>\n </div>\n </div>\n\n <div class=\"zone-bottom-right\">\n <div class=\"geo-line\"></div>\n <div class=\"geo-rect\"></div>\n <div class=\"geo-triangle\"></div>\n </div>\n </div>\n\n <script>\n document.addEventListener('DOMContentLoaded', () => {\n const tsElement = document.getElementById('timestamp');\n if (tsElement) {\n const now = new Date();\n tsElement.textContent = now.toISOString().split('T')[1].split('.')[0] + ' UTC';\n }\n });\n </script>\n</body>\n</html>\n",
"ui_accountId": "Account ID",
"ui_endpointLabel": "Endpoint",
"ui_regionLabel": "Region",
"ui_bucketLabel": "Bucket",
"ui_accessKeyId": "Access Key ID",
"ui_secretAccessKey": "Secret Access Key",
"ui_isoCode": "ISO Code",
"ui_serverUrl": "Server URL",
"ui_commandPalette": "Command palette",
"ui_commandSearch": "Search for a command to run…",
"ui_botLabel": "Bot",
"ui_unknownLabel": "Unknown",
"ui_otherLabel": "Other",
"ui_toastRegion": "Notifications",
"ui_closeToast": "Close notification",
"node_type_edge": "Edge",
"node_type_relay": "Relay",
"node_type_tunnel": "Tunnel",
"system_metric_day": "{count}d",
"system_metric_hour": "{count}h",
"system_metric_minute": "{count}m",
"system_metric_second": "{count}s",
"system_metric_unknown": "Unknown",
"system_metric_none": "None"
}
}