@bobfrankston/msger 0.1.67 ā 0.1.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.hintrc +2 -1
- package/README.md +8 -0
- package/index.js +7 -0
- package/index.js.map +1 -1
- package/index.ts +8 -0
- package/msger-native/bin/msgernative.exe +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Breadcrumbs +107 -34
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Crashpad/settings.dat +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/CrashpadMetrics-active.pma +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/BrowsingTopicsState +1 -1
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DIPS +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnGraphiteCache/data_1 +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnGraphiteCache/index +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnWebGPUCache/data_1 +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnWebGPUCache/index +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Extension State/LOG +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Extension State/LOG.old +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/data_1 +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/index +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Local Storage/leveldb/LOG +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Local Storage/leveldb/LOG.old +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Preferences +1 -1
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/000003.log +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/LOG +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/LOG.old +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Site Characteristics Database/LOG +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Site Characteristics Database/LOG.old +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/LOG +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/LOG.old +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/favorites_diagnostic.log +35 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/000003.log +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/LOG +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/LOG.old +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/000003.log +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/LOG +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/LOG.old +3 -3
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_0 +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_1 +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_3 +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/f_000001 +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/f_000002 +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/index +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GraphiteDawnCache/data_1 +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GraphiteDawnCache/index +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Local State +1 -1
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/ShaderCache/data_1 +0 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/ShaderCache/index +0 -0
- package/msger-native/build-pi.ps1 +243 -0
- package/msger-native/build.rs +1 -0
- package/msger-native/build.ts +101 -24
- package/msger-native/src/main.rs +3 -1
- package/msger-native/src/template.html +52 -1
- package/msgernative-linux-x64 +0 -0
- package/msgernative-win32-x64.exe +0 -0
- package/package.json +1 -1
- package/shower.d.ts.map +1 -1
- package/shower.js +13 -7
- package/shower.js.map +1 -1
- package/shower.ts +13 -7
- package/tests/test-input.json +6 -0
- package/tests/test-node-dot.js +14 -0
- package/msger-native/bin/msgernative.exe.WebView2/EBWebView/CrashpadMetrics.pma +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"Z0swlvRuUso="},"breadcrumbs":{"enabled":true,"enabled_time":"13405633918874559"},"default_browser":{"browser_name_enum":13},"desktop_session_duration_tracker":{"last_session_end_timestamp":"1761957411"},"domain_actions_config":"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","edge":{"manageability":{"edge_last_active_time":"13406429477856750"},"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_ci":{"metrics_bookmark":"\u003CBookmarkList>\r\n\u003C/BookmarkList>","num_healthy_browsers_since_failure":4},"hardware_acceleration_mode_previous":true,"identity_combined_status":{"aad":2,"ad":1},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"network_time":{"network_time_mapping":{"local":1.76194174839255e+12,"network":1.761941748e+12,"ticks":90497411694.0,"uncertainty":1533873.0}},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"141.0.3537.99","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAACWsZDMa44HSK7x1dmjd6ipEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAABUDgRRN7xKnFSlG748Z6Z6L7wjJeDNkNRQbADhVGx2QwAAAAAOgAAAAAIAACAAAAAeRg4a0szaeRhhR4zyWUOXoN869md2k4OjiNxVsFyndDAAAABX6PEdpHgByL3/WreTcHkR0ONVUzobTbjrxDRAxz19Xogq6pDJx9NcYvkhB9tNZn5AAAAAAarRg3ZjWGAzXfUcMXhN7NcR2b98uvYED0Xpbs4YvVdt9Zen35uTQZXwlc7O4gtOB3Ve11sZlNLFCZ2DDrwa2g=="},"performance_intervention":{"last_daily_sample":"13406423851861134"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13406423851677887"},"profile":{"info_cache":{"Default":{"active_time":1761958876.031548,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_non_signin_profile_type":1,"edge_profile_can_be_deleted":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"enterprise_label":"","force_signin_profile_locked":false,"gaia_given_name":"","gaia_id":"","gaia_name":"","hosted_domain":"","is_consented_primary_account":false,"is_ephemeral":false,"is_glic_eligible":false,"is_managed":0,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":[],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13406423851529085","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"guided_switch_pref":[],"multiple_profiles_with_same_account":false},"edge_sso_info":{"msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"141.0.3537.99","signin_last_updated_time":1761950251.846855},"sentinel_creation_time":"0","session_id_generator_last_value":"1371522808","signin":{"active_accounts_last_emitted":"13406423851514275"},"startup_boost":{"last_browser_open_time":"13406432477700245"},"subresource_filter":{"ruleset_version":{"checksum":860988201,"content":"10.34.0.81","format":37}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13406423851646032","max_tabs_per_window":1,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":1,"window_count_max":1},"telemetry_client":{"cloned_install":{"user_data_dir_id":15625462},"governance":{"last_dma_change_date":"13405633918837393","last_known_cps":0},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVdlYlZpZXdcQXBwbGljYXRpb25cMTQxLjAuMzUzNy45OVx0ZWxjbGllbnQuZGxs","sample_id":78116406},"uninstall_metrics":{"installation_date2":"1761160318"},"updateclientdata":{"apps":{"alpjnmnfbgfkmmpcfpejmmoebdndedno":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"28.0.0.1"},"eeobbhfgfagbclfofmgbdfoicabjdbkn":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.0.0.10"},"fgbafbciocncjfbbonhocjaohoknlaco":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"2025.9.29.1"},"fppmbhmldokgmleojlplaaodlkibgikh":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.15.0.1"},"hajigopbbjhghbfimgkfmpenfkclmohk":{"cohort":"","cohortname":"","installdate":-1},"jbfaflocpnkhbgcijpkiafdpbjkedane":{"cohort":"","cohortname":"","installdate":-1},"kpfehajjjbbcifeehjgfgnabifknmdad":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"120.0.6050.0"},"ldfkbgjbencjpgjfleiooeldhjdapggh":{"cohort":"","cohortname":"","installdate":-1},"mcfjlbnicoclaecapilmleaelokfnijm":{"cohort":"","cohortname":"","installdate":-1},"ndikpojcjlepofdkaaldkinkjbeeebkl":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"10.34.0.81"},"oankkpibpaokgecfckkdkgaoafllipag":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"6498.2025.9.4"},"ohckeflnhegojcjlcpbfpciadgikcohk":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"0.0.1.7"},"ojblfafjmiikbkepnnolpgbbhejhlcim":{"cohort":"","cohortname":"","installdate":-1},"pghocgajpebopihickglahgebcmkcekh":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"3.0.0.16"},"pmagihnlncbcefglppponlgakiphldeh":{"cohort":"","cohortname":"","installdate":-1}}},"updateclientlastupdatecheckerror":0,"updateclientlastupdatecheckerrorcategory":0,"updateclientlastupdatecheckerrorextracode1":0,"user_experience_metrics":{"chrome_download_action_count":0,"client_id2":"{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}C:\\Users\\Bob1s:38D38C2A-D364-45F8-BC50-333D72CBE58F","client_id_timestamp":"1761160318","diagnostics":{"last_data_collection_level_on_launch":3},"initial_logs2":[],"last_seen":{"BrowserMetrics":"13406430113362207","CrashpadMetrics":"13406432465643564"},"limited_entropy_randomization_source":"AD9091DE8790396A4D0B7389E394605A","log_finalized_record_id":148,"log_record_id":148,"low_entropy_source3":5625,"machine_id":4256001,"ongoing_logs2":[],"payload_counter":2,"pseudo_low_entropy_source":1574,"reporting_enabled":true,"reset_client_id_deterministic":true,"session_id":62,"stability":{"browser_last_live_timestamp":"13406432477875337","exited_cleanly":true,"saved_system_profile":"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","saved_system_profile_hash":"F121E6925B537C7AB456DAB5F8C77EF0CED89608","stats_buildtime":"1761167620","stats_version":"141.0.3537.99-64","system_crash_count":0},"unsent_log_metadata":{"initial_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0},"ongoing_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0}}},"variations_compressed_seed":"safe_seed_content","variations_config_ids":"{\"ECS\":\"P-R-1082570-1-11,P-D-42388-2-6\",\"EdgeConfig\":\"P-R-1315481-1-8,P-R-1695353-4-7,P-R-1671932-3-6,P-R-1541171-6-9,P-R-1528200-3-4,P-R-1113531-4-9,P-R-68474-9-12,P-R-60617-8-21,P-R-45373-8-85\",\"EdgeFirstRunConfig\":\"P-R-1075865-4-7\",\"Segmentation\":\"P-R-1473016-1-8,P-R-1159985-1-5,P-R-1113915-25-11,P-R-1098334-1-6,P-R-66078-1-3,P-R-66077-1-5,P-R-60882-1-2,P-R-43082-3-5,P-R-42744-1-2\"}","variations_country":"US","variations_crash_streak":0,"variations_failed_to_fetch_seed_streak":1,"variations_google_groups":{"Default":[]},"variations_last_fetch_time":"13406415347165014","variations_last_runtime_fetch_time":"13406415348603522","variations_permanent_consistency_country":["141.0.3537.99","US"],"variations_runtime_compressed_seed":"H4sIAAAAAAAAAG1Q0W7bMBD7leCefYCkk2TJwB6KOGk6bF3WNFjRuQ9urBnGEnmLHWBF4H8vZGXJsPaRIHlH8gjT1v9o6pu8gwyOBcymqwKyApZ4h5wZoVKGHDlPlpijFGQMCtQFJAXMqtrl7a5s/NWmb1rf/WO0JKQKRpucLmkmkSOlI04NMR1oEyFpMcLIauJaoUShR6hISEKBkZSMWUL6S5JJpcQUbWSJG2tRWJTWjpE5V0ZziQLlOfTdwffNzsXml9DaCm4YEqpTZjKpZijQjs6Vq3fO92WoejHJlBgP2WMTzpW1JjQ/HeGcLFcoVNxw3MYQhS1iAa1ZasIyZ5Se3ZoZI5CjiM2JGXGOJ0UozlEUMEDythdkR8ibrnzeukl+KLeTma8b7yZ5U9a+7fpm0wVJFSVzV/aHvesg+w67Luij/KK+8XPnqudy8xOehgRmu1/9y7tPnf//oHP7DTwNQwILV1ZuPz6etgff71+mbeUgg/UqdLgva8iggD17/LRwX66Xn8vtekFr+XB7/02pj9rc/nmk/Orhq5j539dzU7EPBcAwvAKFq0pbxwIAAA==","variations_safe_compressed_seed":"H4sIAAAAAAAAAJVVbW/iOBD+K5W/XtyNnVc43QcKtIu23bIFykm3VWWSIfjq2Mh2oKjiv5+cpLT0iu42H6LMzDPPvMZ+QcP+BHVf0PA5E1UOw2cLWjLRV3LJi1FuRvJaFahrdQUearTXqpgyXYBFXQR5AY/GsoUAtPfQMC+gATnO7YZOmMwX6tlJOTcOdgnMVhoM6v6FRkYJZqEFQT5aalaCQQ97D815blc9mX8FXqxsz4w1GJCWWa5kz1rNF5UFcyu/g7GQTzbFmO2EYvmJUL9MVyfh6pnD4s5mp2hr40yWlYWpZtmTma9Ajln2BLanNd+01QxaVy5gsjMWyl6WgTH9FWRPght7gv4jfsA1ZFbp3ciCrnO/EKphqKmapKWjmd/TXp5zh2FirJVz/8aFgHwKAkqweueCgvwYszRzWNxz2P63v4s2ybNVE/EUnWuiQ9XwH7NR3wHXzI3agnagFyRZCaiLshWTEgTy0IaJymku0d47mGGtstU7Y+A3z3uMBquZNCW39VY+Kvm45RoeLS9BVfax5EJwA5mSuXlHRR2LS/B2A1rzHIYbkNacrKm29oRQ22s3vgfvREUt9JW1Br9FveGZVkYt7fkcFhdabQ3o87FWVi2q5fns2815M/2xVksuwPM9Ev3+P5wss+b8WhUTy7T1fC/8Fae+KtcCLNR+TVMOIx+r9YQ5c/3msjjVoEulMzi4HdAeKo07P8DYmeRLpcsBN83fx5X8yo1VhWbl6X4WWlVrekjjaILv1yCHJauEvXLwz9BH4OqpPEn5sG/PgUuujb2r5Nv5NizXdve56d8tAVjqDNVsEyjK17PHgW96o54QqIuWTBgXfz4fHitMtl5WTuPX30XFdP4qbEDXnzdBHPWVhmPPvpIWpJ2A3vAMzIc4sPhzeqy64LI41rgCjzWHXZoZF7vV7z30FVhez+sFDaesQF30E212s/LH/ZUofku237NVurr6e3q/5mYdmTs5T+xo8GXSp4n4Qv0/fiIX73nN656hOeTeGaVnt5k9oz6NzqjfJbTrx2dXN9O6tkpaveur3A1rNkEecktcmVZT/9Ovt9Zo0OTlrjs0xneY+CmNEh8TTIg3xgMc0iBNMcUxOr7IGnRAojAlmODUq+W4EwVRgEOctHJCOgHFAY4bOQoJSQiOcaeVaUp9Hwc4bGRCgiggOGztcRomIe5gQhvRj0mCU0xJLYZRkAQ4xWmEPl/GtqIkSuPI5YQ+blkDCJPAJ/FbESTqdNIIExwdkuqQCNOo6Ymj7KRBEGLSlhXHfpJigoODlBy8Yz9NKSa4qSAM/NS1o7GFNAkdC0X7/T+fXvwedAgAAA==","variations_safe_seed_date":"13406337073000000","variations_safe_seed_fetch_time":"13406415347165014","variations_safe_seed_locale":"en-US","variations_safe_seed_milestone":141,"variations_safe_seed_permanent_consistency_country":"US","variations_safe_seed_session_consistency_country":"US","variations_safe_seed_signature":"","variations_seed_client_version_at_store":"141.0.3537.92","variations_seed_date":"13406415347000000","variations_seed_etag":"\"vyUmQVGlg+7wNch8hGjTVpisp5sRnW7tID/SC27l/20=\"","variations_seed_milestone":141,"variations_seed_runtime_etag":"\"r0ZLHeOGPMalUH3U4XNTW55J68NxZ3DAXQ2EnqGF8d0=\"","variations_seed_runtime_serial_number":"\"r0ZLHeOGPMalUH3U4XNTW55J68NxZ3DAXQ2EnqGF8d0=\"","variations_seed_serial_number":"\"vyUmQVGlg+7wNch8hGjTVpisp5sRnW7tID/SC27l/20=\"","variations_seed_signature":"","was":{"restarted":false}}
|
|
1
|
+
{"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"Z0swlvRuUso="},"breadcrumbs":{"enabled":true,"enabled_time":"13405633918874559"},"default_browser":{"browser_name_enum":13},"desktop_session_duration_tracker":{"last_session_end_timestamp":"1761969825"},"domain_actions_config":"H4sIAAAAAAAAAK2abW/cNhKA/4qxuA9J4ZU3TpvgfAiCwPUhBRo0SFP0gLq3GJEjabp8C0mtJDf57wV3ta42K8mi3A9+WZrPDF+Gw5mh/1wwLtd6i9YSx8XVnwswRhADT1q5xdVvbQPytdGCWLO4WvykRHNTG+3wvYDmAwJvFucLriWQWlwtnCCVJ0zLxZfzUfpX4rglhV3Y6zLx2zmkhJpriQnHOTSkbPaQt0kgcC4v4GVCfg5ZZ6TIN3MVV+BZ4bcJ0/VcEZQr8ui3idU5WjdXTCpKZKXdBkmugCphMEdMgYLqZEsctbdazR0Ns+TRklasAKVQzJWjPPgimOTc/dGVsehQeWdEOXtxt0U980gVpSjnagVjkk8lsU2BwswV8j254o1qqgJtu4q/ny92LOHeOSmQOOiSfGPCH0OT3TWFIZwQHcUtcN8S1G3ROtJqcfXsy/mCaY4s0l2+JY7vsre4ZdeBjnMdI7Ai5VFxPbowp3w7x25jzzRlWJk1KUEKY68H438q/de2kFuQEqwY81YnoCvAotGk/DxqybMYUOkwrcTpqYCg7djpPumvs4zYDOL5i+9mQ4lk4BLpJsMKuZ03L4VD11j/ykX09wjSJZKY1U5nM80hKSevAtNSahUMV9t8KlRhmlQFeBe4UXe1R3vOXTjSfp2R8GjXWq11lq1dRZ4V0w7f9V7Cf3cCjsKj46UbGNgxfjI+ZCbSGbwXQOoj1v6XDz+64HOP7hdQuS69S3Kt8zEvOCqFFeAfJ8EJYJuZbAYMU63n4hXuhj8XpppGwpxR+NOn2VpTHAkYx1lteYhpRoKZUd5X5D3amTQnx7TloyegT0B7Zd5cvw8Nux6+7XF6RoiLyDPSBi4WM6qR37y7ObqT0Gchqh2c8RTa+ZKTHln0USGydMQSkHC3i6mTP8w/IKTcPF7IoyczlCtOl4ADN8p0CZl9rARSj5YwcA9HbMZAwha1nUk6Zy0eqDeMstqgIs60Ush8uL7hrrRYYerIo9sHKAOOok/uIeE4NMqeFIIk5LiWkCvKmrXFHOtIfyF0he4omAoNyTf988cUGpJ5t3/bNEQwC5Q7Qe44IrpvHeK8vDvy1fJusCfYHI/ju13LUP80dR48HaU/h7YhxpDyFo/nQIkhFWY+aC3BIDyk4igNtejoDm2ifatyEAeyqUq/snEGrBgJTSQqsPxoQxlXyb6ZjV5WB0vYgijD59vb12Gkr55I/rkWT8/2n+padDPfvw3igLmleHJ7y795euaW4tmL1arb/cgaDsT6+WpVP1+tbm+Ts/Wzy9Wq/vdqlXSxvTHc95d817UWx50OdnDo9/9/nb2uiL8KIrsdOwZw6PofCfVbpLzwr/aDDw2/EvdF+/msK6BjDQcBF5fPX9QXZxcvw49u364NHDo/kciplJ9FGPHn2kkQ4unFWVHmeMTeG8C9ltck19Wrl5ers/bXZ99+ezS3v/f/Xtm7vbKfg5bPPwaVTy/O/rf75eLUoxhLTq6xNkLbkDU8Mlu/lFzFpGYk86VbSqeWwYXDBiTQHfIYET1edxqYksqXWJshJ9BPxGSPVRWqkeQcLtGAzRUO3th9WSRHgyqhyRUFZhE8zkt0OWaoOFoLd3okRO4DHeUK7Uy1WuVguRoLy3uokm3CV65jqIezrR7GIi7DN4ZCLJ0W5IFsVH2jzS4nG9m+v2sUbw9fjDLK9bJCmyJYTxsU09UGUqd/oHemTKMwY3VGcZqM1VJHEMp5CEXAmKUQpDbISU1XE1uRk2A+lTgc0/QUCduEbDIwt+gHxrgkusJoUFkgUUEjIap4pUufWnggPDrFDNYoxt4mTutxCJYViYJtnMdouQYKHeUzZhaRN3pLUX4m2He4jnZ3UtA22UKc1xZyjN5st2URhV3X5MPRcl/FlRWhClrunhhn3QyeNj7OVz9Y35lSdJ3GNSBlnKZGl75Mo3aoLegmAuPuOQPWhws1lnOFNkl6mc4BK6u1jAYF5sCaAkH4IsbdpCAEeu9YUQpcarSCNuGeLCbvOwlQbtPEKJWQE1uKkDQ8VJ//QXXzeXLypo2vPzYG93/vviYeVI0QvRX/0qFdQx6K/nFx+3VhtcRf3hyFHVZXbSV8cb4w4Iu1hN3TwW+LCwYW0S65RZBoL8LD9MXi996F65PtSBS6RO9xGU7coIX0sbJJquZu/AW3w7VriDzHj3qD6gMaAQwlqm76drqWFabr8ISXtSsX+1RhtTQnsb9FzmmsQN9LeRSYWzAFKU4QQ3uS6HS253bfdy0xIkzpClR5uFFihx1UKV0prKI07pIkXRqtLCiKJatCC3RaYlOORIf9LLiNABJRSxw4B1LqlEafjHpBZCVsyUUpLO8SZ0qvaLNbWFvGKFR89y86cYMUJA1YRjDyzyv9qNFbsKj0JnKY6Dxw0KNl3FNSi9rAhpwHlWiXeDb5mKDA6G3QInJ4OwuryaWgxh74TjhZ+hJEViqeACffQEpWAANDPn5HJrww9nITMq5+UKJzqPKx4OgHxbQklV+DEA8+0w+9tB2Ut/7e7D93btWvtLT9qG1ds9Dc6b4X+Ebxfm4vfw2Kr78ScXyRfPkL2ObC1xQpAAA=","edge":{"manageability":{"edge_last_active_time":"13406443173916620"},"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_ci":{"metrics_bookmark":"\u003CBookmarkList>\r\n\u003C/BookmarkList>","num_healthy_browsers_since_failure":4},"hardware_acceleration_mode_previous":true,"identity_combined_status":{"aad":2,"ad":1},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"network_time":{"network_time_mapping":{"local":1.76194174839255e+12,"network":1.761941748e+12,"ticks":90497411694.0,"uncertainty":1533873.0}},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"141.0.3537.99","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAACWsZDMa44HSK7x1dmjd6ipEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAABUDgRRN7xKnFSlG748Z6Z6L7wjJeDNkNRQbADhVGx2QwAAAAAOgAAAAAIAACAAAAAeRg4a0szaeRhhR4zyWUOXoN869md2k4OjiNxVsFyndDAAAABX6PEdpHgByL3/WreTcHkR0ONVUzobTbjrxDRAxz19Xogq6pDJx9NcYvkhB9tNZn5AAAAAAarRg3ZjWGAzXfUcMXhN7NcR2b98uvYED0Xpbs4YvVdt9Zen35uTQZXwlc7O4gtOB3Ve11sZlNLFCZ2DDrwa2g=="},"performance_intervention":{"last_daily_sample":"13406423851861134"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13406423851677887"},"profile":{"info_cache":{"Default":{"active_time":1761969812.997085,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_non_signin_profile_type":1,"edge_profile_can_be_deleted":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"enterprise_label":"","force_signin_profile_locked":false,"gaia_given_name":"","gaia_id":"","gaia_name":"","hosted_domain":"","is_consented_primary_account":false,"is_ephemeral":false,"is_glic_eligible":false,"is_managed":0,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":[],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13406423851529085","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"guided_switch_pref":[],"multiple_profiles_with_same_account":false},"edge_sso_info":{"msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"141.0.3537.99","signin_last_updated_time":1761950251.846855},"sentinel_creation_time":"0","session_id_generator_last_value":"1371524928","signin":{"active_accounts_last_emitted":"13406423851514275"},"startup_boost":{"last_browser_open_time":"13406443425737408"},"subresource_filter":{"ruleset_version":{"checksum":860988201,"content":"10.34.0.81","format":37}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13406423851646032","max_tabs_per_window":1,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":1,"window_count_max":1},"telemetry_client":{"cloned_install":{"user_data_dir_id":15625462},"governance":{"last_dma_change_date":"13405633918837393","last_known_cps":0},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVdlYlZpZXdcQXBwbGljYXRpb25cMTQxLjAuMzUzNy45OVx0ZWxjbGllbnQuZGxs","sample_id":78116406},"uninstall_metrics":{"installation_date2":"1761160318"},"updateclientdata":{"apps":{"alpjnmnfbgfkmmpcfpejmmoebdndedno":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"28.0.0.1"},"eeobbhfgfagbclfofmgbdfoicabjdbkn":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.0.0.10"},"fgbafbciocncjfbbonhocjaohoknlaco":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"2025.9.29.1"},"fppmbhmldokgmleojlplaaodlkibgikh":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.15.0.1"},"hajigopbbjhghbfimgkfmpenfkclmohk":{"cohort":"","cohortname":"","installdate":-1},"jbfaflocpnkhbgcijpkiafdpbjkedane":{"cohort":"","cohortname":"","installdate":-1},"kpfehajjjbbcifeehjgfgnabifknmdad":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"120.0.6050.0"},"ldfkbgjbencjpgjfleiooeldhjdapggh":{"cohort":"","cohortname":"","installdate":-1},"mcfjlbnicoclaecapilmleaelokfnijm":{"cohort":"","cohortname":"","installdate":-1},"ndikpojcjlepofdkaaldkinkjbeeebkl":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"10.34.0.81"},"oankkpibpaokgecfckkdkgaoafllipag":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"6498.2025.9.4"},"ohckeflnhegojcjlcpbfpciadgikcohk":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"0.0.1.7"},"ojblfafjmiikbkepnnolpgbbhejhlcim":{"cohort":"","cohortname":"","installdate":-1},"pghocgajpebopihickglahgebcmkcekh":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"3.0.0.16"},"pmagihnlncbcefglppponlgakiphldeh":{"cohort":"","cohortname":"","installdate":-1}}},"updateclientlastupdatecheckerror":0,"updateclientlastupdatecheckerrorcategory":0,"updateclientlastupdatecheckerrorextracode1":0,"user_experience_metrics":{"chrome_download_action_count":0,"client_id2":"{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}C:\\Users\\Bob1s:38D38C2A-D364-45F8-BC50-333D72CBE58F","client_id_timestamp":"1761160318","diagnostics":{"last_data_collection_level_on_launch":3},"initial_logs2":[],"last_seen":{"BrowserMetrics":"13406430113362207","CrashpadMetrics":"13406443393468067"},"limited_entropy_randomization_source":"AD9091DE8790396A4D0B7389E394605A","log_finalized_record_id":227,"log_record_id":227,"low_entropy_source3":5625,"machine_id":4256001,"ongoing_logs2":[],"payload_counter":2,"pseudo_low_entropy_source":1574,"reporting_enabled":true,"reset_client_id_deterministic":true,"session_id":102,"stability":{"browser_last_live_timestamp":"13406443425867674","exited_cleanly":true,"saved_system_profile":"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","saved_system_profile_hash":"BB786B83A8C9DE5E84AD6E18FF66EAFB7798CDF8","stats_buildtime":"1761167620","stats_version":"141.0.3537.99-64","system_crash_count":0},"unsent_log_metadata":{"initial_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0},"ongoing_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0}}},"variations_compressed_seed":"safe_seed_content","variations_config_ids":"{\"ECS\":\"P-R-1082570-1-11,P-D-42388-2-6\",\"EdgeConfig\":\"P-R-1315481-1-8,P-R-1695353-4-7,P-R-1671932-3-6,P-R-1541171-6-9,P-R-1528200-3-4,P-R-1113531-4-9,P-R-68474-9-12,P-R-60617-8-21,P-R-45373-8-85\",\"EdgeFirstRunConfig\":\"P-R-1075865-4-7\",\"Segmentation\":\"P-R-1473016-1-8,P-R-1159985-1-5,P-R-1113915-25-11,P-R-1098334-1-6,P-R-66078-1-3,P-R-66077-1-5,P-R-60882-1-2,P-R-43082-3-5,P-R-42744-1-2\"}","variations_country":"US","variations_crash_streak":0,"variations_failed_to_fetch_seed_streak":1,"variations_google_groups":{"Default":[]},"variations_last_fetch_time":"13406415347165014","variations_last_runtime_fetch_time":"13406415348603522","variations_permanent_consistency_country":["141.0.3537.99","US"],"variations_runtime_compressed_seed":"H4sIAAAAAAAAAG1Q0W7bMBD7leCefYCkk2TJwB6KOGk6bF3WNFjRuQ9urBnGEnmLHWBF4H8vZGXJsPaRIHlH8gjT1v9o6pu8gwyOBcymqwKyApZ4h5wZoVKGHDlPlpijFGQMCtQFJAXMqtrl7a5s/NWmb1rf/WO0JKQKRpucLmkmkSOlI04NMR1oEyFpMcLIauJaoUShR6hISEKBkZSMWUL6S5JJpcQUbWSJG2tRWJTWjpE5V0ZziQLlOfTdwffNzsXml9DaCm4YEqpTZjKpZijQjs6Vq3fO92WoejHJlBgP2WMTzpW1JjQ/HeGcLFcoVNxw3MYQhS1iAa1ZasIyZ5Se3ZoZI5CjiM2JGXGOJ0UozlEUMEDythdkR8ibrnzeukl+KLeTma8b7yZ5U9a+7fpm0wVJFSVzV/aHvesg+w67Luij/KK+8XPnqudy8xOehgRmu1/9y7tPnf//oHP7DTwNQwILV1ZuPz6etgff71+mbeUgg/UqdLgva8iggD17/LRwX66Xn8vtekFr+XB7/02pj9rc/nmk/Orhq5j539dzU7EPBcAwvAKFq0pbxwIAAA==","variations_safe_compressed_seed":"H4sIAAAAAAAAAJVVbW/iOBD+K5W/XtyNnVc43QcKtIu23bIFykm3VWWSIfjq2Mh2oKjiv5+cpLT0iu42H6LMzDPPvMZ+QcP+BHVf0PA5E1UOw2cLWjLRV3LJi1FuRvJaFahrdQUearTXqpgyXYBFXQR5AY/GsoUAtPfQMC+gATnO7YZOmMwX6tlJOTcOdgnMVhoM6v6FRkYJZqEFQT5aalaCQQ97D815blc9mX8FXqxsz4w1GJCWWa5kz1rNF5UFcyu/g7GQTzbFmO2EYvmJUL9MVyfh6pnD4s5mp2hr40yWlYWpZtmTma9Ajln2BLanNd+01QxaVy5gsjMWyl6WgTH9FWRPght7gv4jfsA1ZFbp3ciCrnO/EKphqKmapKWjmd/TXp5zh2FirJVz/8aFgHwKAkqweueCgvwYszRzWNxz2P63v4s2ybNVE/EUnWuiQ9XwH7NR3wHXzI3agnagFyRZCaiLshWTEgTy0IaJymku0d47mGGtstU7Y+A3z3uMBquZNCW39VY+Kvm45RoeLS9BVfax5EJwA5mSuXlHRR2LS/B2A1rzHIYbkNacrKm29oRQ22s3vgfvREUt9JW1Br9FveGZVkYt7fkcFhdabQ3o87FWVi2q5fns2815M/2xVksuwPM9Ev3+P5wss+b8WhUTy7T1fC/8Fae+KtcCLNR+TVMOIx+r9YQ5c/3msjjVoEulMzi4HdAeKo07P8DYmeRLpcsBN83fx5X8yo1VhWbl6X4WWlVrekjjaILv1yCHJauEvXLwz9BH4OqpPEn5sG/PgUuujb2r5Nv5NizXdve56d8tAVjqDNVsEyjK17PHgW96o54QqIuWTBgXfz4fHitMtl5WTuPX30XFdP4qbEDXnzdBHPWVhmPPvpIWpJ2A3vAMzIc4sPhzeqy64LI41rgCjzWHXZoZF7vV7z30FVhez+sFDaesQF30E212s/LH/ZUofku237NVurr6e3q/5mYdmTs5T+xo8GXSp4n4Qv0/fiIX73nN656hOeTeGaVnt5k9oz6NzqjfJbTrx2dXN9O6tkpaveur3A1rNkEecktcmVZT/9Ovt9Zo0OTlrjs0xneY+CmNEh8TTIg3xgMc0iBNMcUxOr7IGnRAojAlmODUq+W4EwVRgEOctHJCOgHFAY4bOQoJSQiOcaeVaUp9Hwc4bGRCgiggOGztcRomIe5gQhvRj0mCU0xJLYZRkAQ4xWmEPl/GtqIkSuPI5YQ+blkDCJPAJ/FbESTqdNIIExwdkuqQCNOo6Ymj7KRBEGLSlhXHfpJigoODlBy8Yz9NKSa4qSAM/NS1o7GFNAkdC0X7/T+fXvwedAgAAA==","variations_safe_seed_date":"13406337073000000","variations_safe_seed_fetch_time":"13406415347165014","variations_safe_seed_locale":"en-US","variations_safe_seed_milestone":141,"variations_safe_seed_permanent_consistency_country":"US","variations_safe_seed_session_consistency_country":"US","variations_safe_seed_signature":"","variations_seed_client_version_at_store":"141.0.3537.92","variations_seed_date":"13406415347000000","variations_seed_etag":"\"vyUmQVGlg+7wNch8hGjTVpisp5sRnW7tID/SC27l/20=\"","variations_seed_milestone":141,"variations_seed_runtime_etag":"\"r0ZLHeOGPMalUH3U4XNTW55J68NxZ3DAXQ2EnqGF8d0=\"","variations_seed_runtime_serial_number":"\"r0ZLHeOGPMalUH3U4XNTW55J68NxZ3DAXQ2EnqGF8d0=\"","variations_seed_serial_number":"\"vyUmQVGlg+7wNch8hGjTVpisp5sRnW7tID/SC27l/20=\"","variations_seed_signature":"","was":{"restarted":false}}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
|
+
# Build ARM64 binary on Raspberry Pi via SSH and mounted SMB share
|
|
3
|
+
# Usage: .\build-pi.ps1 [hostname]
|
|
4
|
+
# Default hostname: pi4c
|
|
5
|
+
|
|
6
|
+
param(
|
|
7
|
+
[string]$PiHost = "pi4c"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
$ErrorActionPreference = "Stop"
|
|
11
|
+
|
|
12
|
+
$ProjectRoot = "y:\dev\utils\msger"
|
|
13
|
+
$NativeDir = "$ProjectRoot\msger-native"
|
|
14
|
+
|
|
15
|
+
Write-Host ""
|
|
16
|
+
Write-Host "======================================"
|
|
17
|
+
Write-Host "Building ARM64 binary on Raspberry Pi"
|
|
18
|
+
Write-Host "======================================"
|
|
19
|
+
Write-Host "Target: $PiHost"
|
|
20
|
+
Write-Host ""
|
|
21
|
+
|
|
22
|
+
# Mount SMB share
|
|
23
|
+
Write-Host "Mounting SMB share from $PiHost..."
|
|
24
|
+
try {
|
|
25
|
+
& mountsmb.ps1 $PiHost
|
|
26
|
+
if ($LASTEXITCODE -ne 0) {
|
|
27
|
+
throw "mountsmb.ps1 failed"
|
|
28
|
+
}
|
|
29
|
+
} catch {
|
|
30
|
+
Write-Error "ERROR: Failed to mount SMB share: $_"
|
|
31
|
+
exit 1
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
$PPath = "c:\drives\smb\$PiHost\home\pi"
|
|
35
|
+
Write-Host "SMB path: $PPath"
|
|
36
|
+
Write-Host ""
|
|
37
|
+
|
|
38
|
+
# Verify mount exists
|
|
39
|
+
if (!(Test-Path $PPath)) {
|
|
40
|
+
Write-Error "ERROR: Mounted path does not exist: $PPath"
|
|
41
|
+
exit 1
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# Create project directory on Pi
|
|
45
|
+
Write-Host "Creating project directory on Pi..."
|
|
46
|
+
New-Item -ItemType Directory -Force -Path "$PPath\msger\src" | Out-Null
|
|
47
|
+
|
|
48
|
+
# Copy source files
|
|
49
|
+
Write-Host "Copying source files to Pi..."
|
|
50
|
+
try {
|
|
51
|
+
Copy-Item "$NativeDir\Cargo.toml" "$PPath\msger\" -Force
|
|
52
|
+
Copy-Item "$NativeDir\src\*" "$PPath\msger\src\" -Recurse -Force
|
|
53
|
+
Write-Host "Source files copied successfully"
|
|
54
|
+
} catch {
|
|
55
|
+
Write-Error "ERROR: Failed to copy source files: $_"
|
|
56
|
+
exit 1
|
|
57
|
+
}
|
|
58
|
+
Write-Host ""
|
|
59
|
+
|
|
60
|
+
# Check SSH connectivity
|
|
61
|
+
Write-Host "Testing SSH connection..."
|
|
62
|
+
try {
|
|
63
|
+
$null = ssh $PiHost "echo Connected" 2>&1
|
|
64
|
+
if ($LASTEXITCODE -ne 0) {
|
|
65
|
+
throw "SSH connection failed"
|
|
66
|
+
}
|
|
67
|
+
Write-Host "SSH connection successful"
|
|
68
|
+
} catch {
|
|
69
|
+
Write-Error "ERROR: Cannot connect to Pi via SSH"
|
|
70
|
+
Write-Error " Make sure you can run: ssh $PiHost"
|
|
71
|
+
Write-Error " You may need to set up SSH keys: ssh-copy-id $PiHost"
|
|
72
|
+
exit 1
|
|
73
|
+
}
|
|
74
|
+
Write-Host ""
|
|
75
|
+
|
|
76
|
+
# Check and install Rust
|
|
77
|
+
Write-Host "Checking for Rust/Cargo on Pi..."
|
|
78
|
+
ssh $PiHost "command -v cargo" 2>$null | Out-Null
|
|
79
|
+
if ($LASTEXITCODE -ne 0) {
|
|
80
|
+
Write-Host "Installing Rust on Pi (this may take a few minutes)..."
|
|
81
|
+
ssh $PiHost "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y"
|
|
82
|
+
if ($LASTEXITCODE -ne 0) {
|
|
83
|
+
Write-Error "ERROR: Failed to install Rust"
|
|
84
|
+
exit 1
|
|
85
|
+
}
|
|
86
|
+
Write-Host "Rust installed successfully"
|
|
87
|
+
} else {
|
|
88
|
+
Write-Host "Rust/Cargo found"
|
|
89
|
+
}
|
|
90
|
+
Write-Host ""
|
|
91
|
+
|
|
92
|
+
# Check and install pkg-config
|
|
93
|
+
Write-Host "Checking for pkg-config on Pi..."
|
|
94
|
+
ssh $PiHost "command -v pkg-config" 2>$null | Out-Null
|
|
95
|
+
if ($LASTEXITCODE -ne 0) {
|
|
96
|
+
Write-Host "Installing pkg-config..."
|
|
97
|
+
ssh $PiHost "sudo apt-get update && sudo apt-get install -y pkg-config"
|
|
98
|
+
if ($LASTEXITCODE -ne 0) {
|
|
99
|
+
Write-Error "ERROR: Failed to install pkg-config"
|
|
100
|
+
exit 1
|
|
101
|
+
}
|
|
102
|
+
Write-Host "pkg-config installed"
|
|
103
|
+
} else {
|
|
104
|
+
Write-Host "pkg-config found"
|
|
105
|
+
}
|
|
106
|
+
Write-Host ""
|
|
107
|
+
|
|
108
|
+
# Check and install build dependencies
|
|
109
|
+
Write-Host "Checking for build dependencies (GLib, GTK, WebKit) on Pi..."
|
|
110
|
+
$hasDeps = ssh $PiHost "pkg-config --exists glib-2.0 gobject-2.0 gio-2.0 gtk+-3.0 webkit2gtk-4.0 2>&1 && echo 'OK' || echo 'MISSING'"
|
|
111
|
+
if ($hasDeps -notcontains "OK") {
|
|
112
|
+
Write-Host "Installing build dependencies (this may take several minutes)..."
|
|
113
|
+
Write-Host " - build-essential"
|
|
114
|
+
Write-Host " - libglib2.0-dev"
|
|
115
|
+
Write-Host " - libgtk-3-dev"
|
|
116
|
+
Write-Host " - libwebkit2gtk-4.0-dev"
|
|
117
|
+
Write-Host " - libsoup2.4-dev"
|
|
118
|
+
Write-Host ""
|
|
119
|
+
Write-Host "Running: sudo apt-get update && sudo apt-get install -y ..."
|
|
120
|
+
ssh $PiHost "sudo apt-get update -qq && sudo apt-get install -y build-essential libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.0-dev libsoup2.4-dev"
|
|
121
|
+
if ($LASTEXITCODE -ne 0) {
|
|
122
|
+
Write-Error "ERROR: Failed to install build dependencies"
|
|
123
|
+
Write-Host ""
|
|
124
|
+
Write-Host "TRY MANUALLY:"
|
|
125
|
+
Write-Host " ssh $PiHost"
|
|
126
|
+
Write-Host " sudo apt-get update"
|
|
127
|
+
Write-Host " sudo apt-get install -y build-essential libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.0-dev libsoup2.4-dev"
|
|
128
|
+
exit 1
|
|
129
|
+
}
|
|
130
|
+
Write-Host "Build dependencies installed successfully"
|
|
131
|
+
|
|
132
|
+
# Verify installation
|
|
133
|
+
Write-Host "Verifying installation..."
|
|
134
|
+
$verify = ssh $PiHost "pkg-config --exists glib-2.0 gobject-2.0 gio-2.0 gtk+-3.0 webkit2gtk-4.0 2>&1 && echo 'OK' || echo 'STILL_MISSING'"
|
|
135
|
+
if ($verify -contains "STILL_MISSING") {
|
|
136
|
+
Write-Error "ERROR: Dependencies still missing after installation"
|
|
137
|
+
Write-Host "Try running manually on the Pi:"
|
|
138
|
+
Write-Host " sudo apt-get update"
|
|
139
|
+
Write-Host " sudo apt-get install -y build-essential libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.0-dev libsoup2.4-dev"
|
|
140
|
+
exit 1
|
|
141
|
+
}
|
|
142
|
+
} else {
|
|
143
|
+
Write-Host "Build dependencies found"
|
|
144
|
+
}
|
|
145
|
+
Write-Host ""
|
|
146
|
+
|
|
147
|
+
# Build on Pi
|
|
148
|
+
Write-Host "======================================"
|
|
149
|
+
Write-Host "Checking if rebuild is needed..."
|
|
150
|
+
Write-Host "======================================"
|
|
151
|
+
Write-Host ""
|
|
152
|
+
|
|
153
|
+
# Check if binary exists and is up to date
|
|
154
|
+
$destBinary = "$binDir\msgernative-arm64"
|
|
155
|
+
$needsRebuild = $false
|
|
156
|
+
|
|
157
|
+
if (!(Test-Path $destBinary)) {
|
|
158
|
+
Write-Host "Binary does not exist, build needed"
|
|
159
|
+
$needsRebuild = $true
|
|
160
|
+
} else {
|
|
161
|
+
$binaryTime = (Get-Item $destBinary).LastWriteTime
|
|
162
|
+
Write-Host "Binary timestamp: $binaryTime"
|
|
163
|
+
|
|
164
|
+
# Check source files
|
|
165
|
+
$sourceFiles = @(
|
|
166
|
+
"$NativeDir\Cargo.toml"
|
|
167
|
+
"$NativeDir\build.rs"
|
|
168
|
+
)
|
|
169
|
+
$sourceFiles += Get-ChildItem "$NativeDir\src" -Recurse -File
|
|
170
|
+
|
|
171
|
+
foreach ($file in $sourceFiles) {
|
|
172
|
+
if ($file.LastWriteTime -gt $binaryTime) {
|
|
173
|
+
Write-Host "Source file changed: $($file.Name) ($($file.LastWriteTime))"
|
|
174
|
+
$needsRebuild = $true
|
|
175
|
+
break
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (!$needsRebuild) {
|
|
181
|
+
Write-Host ""
|
|
182
|
+
Write-Host "======================================"
|
|
183
|
+
Write-Host "Binary is up to date, skipping build"
|
|
184
|
+
Write-Host "======================================"
|
|
185
|
+
$fileSize = (Get-Item $destBinary).Length
|
|
186
|
+
$sizeMB = [math]::Round($fileSize / 1MB, 2)
|
|
187
|
+
Write-Host "Binary: $destBinary"
|
|
188
|
+
Write-Host "Size: $sizeMB MB"
|
|
189
|
+
Write-Host ""
|
|
190
|
+
exit 0
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
Write-Host ""
|
|
194
|
+
Write-Host "======================================"
|
|
195
|
+
Write-Host "Building ARM64 binary on Pi..."
|
|
196
|
+
Write-Host "This may take several minutes..."
|
|
197
|
+
Write-Host "======================================"
|
|
198
|
+
Write-Host ""
|
|
199
|
+
ssh $PiHost "cd ~/msger && export PATH=~/.cargo/bin:`$PATH && cargo build --release"
|
|
200
|
+
if ($LASTEXITCODE -ne 0) {
|
|
201
|
+
Write-Host ""
|
|
202
|
+
Write-Error "ERROR: Build failed on Pi"
|
|
203
|
+
exit 1
|
|
204
|
+
}
|
|
205
|
+
Write-Host ""
|
|
206
|
+
Write-Host "Build completed successfully!"
|
|
207
|
+
Write-Host ""
|
|
208
|
+
|
|
209
|
+
# Copy binary back
|
|
210
|
+
Write-Host "Copying binary back from Pi..."
|
|
211
|
+
$binDir = "$NativeDir\bin"
|
|
212
|
+
if (!(Test-Path $binDir)) {
|
|
213
|
+
New-Item -ItemType Directory -Force -Path $binDir | Out-Null
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
$sourceBinary = "$PPath\msger\target\release\msgernative"
|
|
217
|
+
$destBinary = "$binDir\msgernative-arm64"
|
|
218
|
+
|
|
219
|
+
if (!(Test-Path $sourceBinary)) {
|
|
220
|
+
Write-Error "ERROR: Built binary not found at: $sourceBinary"
|
|
221
|
+
exit 1
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
Copy-Item $sourceBinary $destBinary -Force
|
|
225
|
+
|
|
226
|
+
# Get file size
|
|
227
|
+
$fileSize = (Get-Item $destBinary).Length
|
|
228
|
+
$sizeMB = [math]::Round($fileSize / 1MB, 2)
|
|
229
|
+
Write-Host "Binary copied to: $destBinary"
|
|
230
|
+
Write-Host "Binary size: $sizeMB MB"
|
|
231
|
+
Write-Host ""
|
|
232
|
+
|
|
233
|
+
# Cleanup on Pi
|
|
234
|
+
Write-Host "Cleaning up build artifacts on Pi..."
|
|
235
|
+
ssh $PiHost "rm -rf ~/msger/target" 2>$null
|
|
236
|
+
|
|
237
|
+
Write-Host ""
|
|
238
|
+
Write-Host "======================================"
|
|
239
|
+
Write-Host "ARM64 binary ready!"
|
|
240
|
+
Write-Host "======================================"
|
|
241
|
+
Write-Host "The binary is now included in the project"
|
|
242
|
+
Write-Host "and will be packaged with npm publish"
|
|
243
|
+
Write-Host ""
|
package/msger-native/build.rs
CHANGED
|
@@ -20,6 +20,7 @@ fn main() {
|
|
|
20
20
|
let version = &after_colon[quote_start+1..quote_start+1+quote_end];
|
|
21
21
|
println!("cargo:rustc-env=NPM_VERSION={}", version);
|
|
22
22
|
println!("cargo:rerun-if-changed=../package.json");
|
|
23
|
+
println!("cargo:rerun-if-changed=src/template.html");
|
|
23
24
|
return;
|
|
24
25
|
}
|
|
25
26
|
}
|
package/msger-native/build.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
import { execSync } from 'child_process';
|
|
4
4
|
import { platform, arch } from 'os';
|
|
5
|
-
import { existsSync, mkdirSync, copyFileSync, readFileSync, statSync, chmodSync } from 'fs';
|
|
5
|
+
import { existsSync, mkdirSync, copyFileSync, readFileSync, statSync, chmodSync, readdirSync } from 'fs';
|
|
6
|
+
import { join } from 'path';
|
|
6
7
|
|
|
7
8
|
function isWSL() {
|
|
8
9
|
try {
|
|
@@ -29,36 +30,102 @@ function runCommand(cmd: string, description: string) {
|
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
|
|
33
|
+
function needsRebuild(binaryPath: string, sourceDirs: string[]): boolean {
|
|
34
|
+
// If binary doesn't exist, we need to build
|
|
35
|
+
if (!existsSync(binaryPath)) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const binaryTime = statSync(binaryPath).mtime.getTime();
|
|
40
|
+
|
|
41
|
+
// Helper to recursively check directory
|
|
42
|
+
function checkDir(dirPath: string): boolean {
|
|
43
|
+
const entries = readdirSync(dirPath, { withFileTypes: true });
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
const fullPath = join(dirPath, entry.name);
|
|
46
|
+
if (entry.isFile()) {
|
|
47
|
+
const fileTime = statSync(fullPath).mtime.getTime();
|
|
48
|
+
if (fileTime > binaryTime) {
|
|
49
|
+
console.log(`š Source file changed: ${entry.name}`);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
} else if (entry.isDirectory()) {
|
|
53
|
+
if (checkDir(fullPath)) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Check if any source file is newer than the binary
|
|
62
|
+
for (const path of sourceDirs) {
|
|
63
|
+
if (!existsSync(path)) continue;
|
|
64
|
+
|
|
65
|
+
const stats = statSync(path);
|
|
66
|
+
if (stats.isFile()) {
|
|
67
|
+
// For files (like Cargo.toml, build.rs)
|
|
68
|
+
const fileTime = stats.mtime.getTime();
|
|
69
|
+
if (fileTime > binaryTime) {
|
|
70
|
+
console.log(`š Source file changed: ${path}`);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
} else if (stats.isDirectory()) {
|
|
74
|
+
// For directories (like ./src)
|
|
75
|
+
if (checkDir(path)) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
32
84
|
function main() {
|
|
33
85
|
console.log('š Building msger (Rust)...');
|
|
34
86
|
|
|
35
87
|
if (isWindows()) {
|
|
36
88
|
console.log('š Running on Windows');
|
|
37
89
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
if (existsSync(srcPath)) {
|
|
48
|
-
copyFileSync(srcPath, destPath);
|
|
49
|
-
console.log(`\nā
Binary copied to: ${destPath}`);
|
|
50
|
-
|
|
51
|
-
// Show file size
|
|
52
|
-
const stats = statSync(destPath);
|
|
53
|
-
const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
|
|
54
|
-
console.log(`š Binary size: ${sizeMB} MB`);
|
|
55
|
-
}
|
|
90
|
+
const destPath = `./bin/msgernative.exe`;
|
|
91
|
+
|
|
92
|
+
// Check if rebuild is needed
|
|
93
|
+
if (!needsRebuild(destPath, ['./src', './Cargo.toml', './build.rs'])) {
|
|
94
|
+
console.log('ā
Binary is up to date, skipping build');
|
|
95
|
+
console.log(` Binary: ${destPath}`);
|
|
96
|
+
const stats = statSync(destPath);
|
|
97
|
+
const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
|
|
98
|
+
console.log(` Size: ${sizeMB} MB`);
|
|
56
99
|
} else {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
100
|
+
// Try building with cargo directly first
|
|
101
|
+
// Cargo should find the VS linker if available
|
|
102
|
+
const success = runCommand('cargo build --release', 'Building Windows x64 binary (release)');
|
|
103
|
+
|
|
104
|
+
if (success) {
|
|
105
|
+
// Copy binary to bin directory
|
|
106
|
+
const srcPath = `./target/release/msgernative.exe`;
|
|
107
|
+
|
|
108
|
+
if (existsSync(srcPath)) {
|
|
109
|
+
// Ensure bin directory exists
|
|
110
|
+
if (!existsSync('./bin')) {
|
|
111
|
+
mkdirSync('./bin', { recursive: true });
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
copyFileSync(srcPath, destPath);
|
|
115
|
+
console.log(`\nā
Binary copied to: ${destPath}`);
|
|
116
|
+
|
|
117
|
+
// Show file size
|
|
118
|
+
const stats = statSync(destPath);
|
|
119
|
+
const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
|
|
120
|
+
console.log(`š Binary size: ${sizeMB} MB`);
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
console.log('\nā ļø Build failed. You may need to:');
|
|
124
|
+
console.log(' 1. Open "x64 Native Tools Command Prompt for VS 2022"');
|
|
125
|
+
console.log(' 2. Run: cd Y:\\dev\\utils\\msger && cargo build --release');
|
|
126
|
+
console.log(' 3. Or install Visual Studio Build Tools with C++ workload');
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
62
129
|
}
|
|
63
130
|
|
|
64
131
|
} else if (isWSL()) {
|
|
@@ -106,6 +173,16 @@ function main() {
|
|
|
106
173
|
}
|
|
107
174
|
|
|
108
175
|
console.log('\nš Build process completed!');
|
|
176
|
+
|
|
177
|
+
// Check if ARM64 binary exists
|
|
178
|
+
const arm64BinaryPath = `./bin/msgernative-arm64`;
|
|
179
|
+
if (!existsSync(arm64BinaryPath)) {
|
|
180
|
+
// Reminder about ARM64/Pi build
|
|
181
|
+
console.log('\n\x1b[30m\x1b[41m \x1b[0m');
|
|
182
|
+
console.log('\x1b[30m\x1b[41m ā ļø REMINDER: ARM64/Pi binary not built \x1b[0m');
|
|
183
|
+
console.log('\x1b[30m\x1b[41m Run: .\\build-pi.ps1 to build for Raspberry Pi \x1b[0m');
|
|
184
|
+
console.log('\x1b[30m\x1b[41m \x1b[0m\n');
|
|
185
|
+
}
|
|
109
186
|
}
|
|
110
187
|
|
|
111
188
|
main();
|
package/msger-native/src/main.rs
CHANGED
|
@@ -141,12 +141,14 @@ fn generate_html(options: &MessageBoxOptions) -> String {
|
|
|
141
141
|
// Load HTML template and replace placeholders
|
|
142
142
|
let template = include_str!("template.html");
|
|
143
143
|
let html = template
|
|
144
|
+
.replace("{TITLE}", &options.title)
|
|
144
145
|
.replace("{CONTENT}", &html_content)
|
|
145
146
|
.replace("{INPUT}", &input_html)
|
|
146
147
|
.replace("{BUTTONS}", &buttons_html)
|
|
147
148
|
.replace("{AUTO_SIZE}", if options.auto_size { "true" } else { "false" })
|
|
148
149
|
.replace("{ZOOM_PERCENT}", &options.zoom_percent.unwrap_or(100.0).to_string())
|
|
149
|
-
.replace("{DEFAULT_BUTTON}", options.buttons.first().unwrap_or(&"Cancel".to_string()))
|
|
150
|
+
.replace("{DEFAULT_BUTTON}", options.buttons.first().unwrap_or(&"Cancel".to_string()))
|
|
151
|
+
.replace("{TIMEOUT_SECONDS}", &options.timeout.map(|t| t.to_string()).unwrap_or_else(|| "0".to_string()));
|
|
150
152
|
|
|
151
153
|
html
|
|
152
154
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
<html>
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
|
+
<title>{TITLE}</title>
|
|
5
6
|
<style>
|
|
6
7
|
body {
|
|
7
8
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
@@ -61,7 +62,7 @@
|
|
|
61
62
|
}
|
|
62
63
|
</style>
|
|
63
64
|
</head>
|
|
64
|
-
<body>
|
|
65
|
+
<body tabindex="0">
|
|
65
66
|
<div id="content">
|
|
66
67
|
{CONTENT}
|
|
67
68
|
</div>
|
|
@@ -69,7 +70,39 @@
|
|
|
69
70
|
<div id="buttons">
|
|
70
71
|
{BUTTONS}
|
|
71
72
|
</div>
|
|
73
|
+
<div id="countdown" style="position: fixed; top: 5px; right: 5px; background: rgba(255, 255, 0, 0.3); padding: 5px 10px; font-size: 14px; font-weight: bold; border-radius: 4px; display: none;"></div>
|
|
72
74
|
<script>
|
|
75
|
+
// Countdown timer overlay
|
|
76
|
+
try {
|
|
77
|
+
const timeoutSeconds = {TIMEOUT_SECONDS};
|
|
78
|
+
|
|
79
|
+
if (timeoutSeconds > 0) {
|
|
80
|
+
const countdownDiv = document.getElementById('countdown');
|
|
81
|
+
let remainingSeconds = timeoutSeconds;
|
|
82
|
+
|
|
83
|
+
const updateCountdown = () => {
|
|
84
|
+
if (remainingSeconds > 0) {
|
|
85
|
+
countdownDiv.textContent = `${remainingSeconds}s`;
|
|
86
|
+
countdownDiv.style.display = 'block';
|
|
87
|
+
} else {
|
|
88
|
+
countdownDiv.style.display = 'none';
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
updateCountdown(); // Set initial countdown
|
|
93
|
+
|
|
94
|
+
const countdownInterval = setInterval(() => {
|
|
95
|
+
remainingSeconds--;
|
|
96
|
+
updateCountdown();
|
|
97
|
+
if (remainingSeconds <= 0) {
|
|
98
|
+
clearInterval(countdownInterval);
|
|
99
|
+
}
|
|
100
|
+
}, 1000);
|
|
101
|
+
}
|
|
102
|
+
} catch (e) {
|
|
103
|
+
// Silently fail if countdown doesn't work
|
|
104
|
+
}
|
|
105
|
+
|
|
73
106
|
function sendResult(button) {
|
|
74
107
|
const result = { button: button };
|
|
75
108
|
|
|
@@ -160,11 +193,29 @@
|
|
|
160
193
|
}
|
|
161
194
|
}, { passive: false });
|
|
162
195
|
|
|
196
|
+
// Ensure body has focus for keyboard events - try multiple strategies
|
|
197
|
+
window.addEventListener('load', function() {
|
|
198
|
+
document.body.focus();
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// Also focus when window gets focus
|
|
202
|
+
window.addEventListener('focus', function() {
|
|
203
|
+
document.body.focus();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// And try again after a short delay
|
|
207
|
+
setTimeout(() => {
|
|
208
|
+
document.body.focus();
|
|
209
|
+
}, 100);
|
|
210
|
+
|
|
163
211
|
document.addEventListener('keydown', function(e) {
|
|
164
212
|
if (e.key === 'Escape') {
|
|
213
|
+
e.preventDefault();
|
|
165
214
|
const result = { button: 'Cancel', dismissed: true };
|
|
166
215
|
window.ipc.postMessage(JSON.stringify(result));
|
|
167
216
|
} else if (e.key === 'Enter') {
|
|
217
|
+
// Prevent default form submission
|
|
218
|
+
e.preventDefault();
|
|
168
219
|
const buttons = document.querySelectorAll('button');
|
|
169
220
|
if (buttons.length > 0) {
|
|
170
221
|
buttons[buttons.length - 1].click();
|
package/msgernative-linux-x64
CHANGED
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
package/shower.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shower.d.ts","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAW,uDAAuD;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,8EAA8E;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,iDAAiD;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC,CAAa,0DAA0D;IAEpF,IAAI,CAAC,EAAE;QACH,KAAK,EAAE,MAAM,CAAC,CAAQ,mBAAmB;QACzC,MAAM,EAAE,MAAM,CAAC,CAAO,oBAAoB;KAC7C,CAAC;IACF,GAAG,CAAC,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,MAAM,CAAC,EAAE,MAAM,CAAC,CAAM,8EAA8E;KACvG,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC,CAAK,0EAA0E;IACpG,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAO,kEAAkE;IAC5F,WAAW,CAAC,EAAE,OAAO,CAAC,CAAI,2DAA2D;IACrF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAO,0DAA0D;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC,CAAI,4DAA4D;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,wDAAwD;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,gEAAgE;IAE1F,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,yDAAyD;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC,CAAS,0DAA0D;IACpF,KAAK,CAAC,EAAE,OAAO,CAAC,CAAU,uEAAuE;CACpG;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACrB,CAAC;CACL;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"shower.d.ts","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAW,uDAAuD;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,8EAA8E;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,iDAAiD;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC,CAAa,0DAA0D;IAEpF,IAAI,CAAC,EAAE;QACH,KAAK,EAAE,MAAM,CAAC,CAAQ,mBAAmB;QACzC,MAAM,EAAE,MAAM,CAAC,CAAO,oBAAoB;KAC7C,CAAC;IACF,GAAG,CAAC,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,MAAM,CAAC,EAAE,MAAM,CAAC,CAAM,8EAA8E;KACvG,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC,CAAK,0EAA0E;IACpG,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAO,kEAAkE;IAC5F,WAAW,CAAC,EAAE,OAAO,CAAC,CAAI,2DAA2D;IACrF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAO,0DAA0D;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC,CAAI,4DAA4D;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,wDAAwD;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,gEAAgE;IAE1F,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,yDAAyD;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC,CAAS,0DAA0D;IACpF,KAAK,CAAC,EAAE,OAAO,CAAC,CAAU,uEAAuE;CACpG;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACrB,CAAC;CACL;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqJ1F"}
|