├── .angulardoc.json ├── .earthlyignore ├── .gitattributes ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── report-bug.md │ ├── report-compatibility.md │ └── suggest-feature.md ├── dependabot.yml ├── label-actions.yml └── workflows │ ├── angular.yml │ ├── go.yml │ ├── issues-first-greet.yml │ ├── issues-label-actions.yml │ ├── issues-stale.yml │ ├── kext.yml │ ├── tauri.yml │ └── windows-dll.yml ├── .gitignore ├── .golangci.yml ├── .travis.yml ├── .vscode └── settings.json ├── AUTHORS ├── CODE_OF_CONDUCT.md ├── Earthfile ├── LICENSE ├── README.md ├── TESTING.md ├── TRADEMARKS ├── assets ├── data │ ├── favicons │ │ ├── android-icon-144x144.png │ │ ├── android-icon-192x192.png │ │ ├── android-icon-36x36.png │ │ ├── android-icon-48x48.png │ │ ├── android-icon-72x72.png │ │ ├── android-icon-96x96.png │ │ ├── apple-icon-114x114.png │ │ ├── apple-icon-120x120.png │ │ ├── apple-icon-144x144.png │ │ ├── apple-icon-152x152.png │ │ ├── apple-icon-180x180.png │ │ ├── apple-icon-57x57.png │ │ ├── apple-icon-60x60.png │ │ ├── apple-icon-72x72.png │ │ ├── apple-icon-76x76.png │ │ ├── apple-icon-precomposed.png │ │ ├── apple-icon.png │ │ ├── browserconfig.xml │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── head.html │ │ ├── manifest.json │ │ ├── ms-icon-144x144.png │ │ ├── ms-icon-150x150.png │ │ ├── ms-icon-310x310.png │ │ └── ms-icon-70x70.png │ ├── fonts │ │ ├── Roboto-300 │ │ │ ├── LICENSE.txt │ │ │ ├── Roboto-300.eot │ │ │ ├── Roboto-300.svg │ │ │ ├── Roboto-300.ttf │ │ │ ├── Roboto-300.woff │ │ │ └── Roboto-300.woff2 │ │ ├── Roboto-300italic │ │ │ ├── LICENSE.txt │ │ │ ├── Roboto-300italic.eot │ │ │ ├── Roboto-300italic.svg │ │ │ ├── Roboto-300italic.ttf │ │ │ ├── Roboto-300italic.woff │ │ │ └── Roboto-300italic.woff2 │ │ ├── Roboto-500 │ │ │ ├── LICENSE.txt │ │ │ ├── Roboto-500.eot │ │ │ ├── Roboto-500.svg │ │ │ ├── Roboto-500.ttf │ │ │ ├── Roboto-500.woff │ │ │ └── Roboto-500.woff2 │ │ ├── Roboto-500italic │ │ │ ├── LICENSE.txt │ │ │ ├── Roboto-500italic.eot │ │ │ ├── Roboto-500italic.svg │ │ │ ├── Roboto-500italic.ttf │ │ │ ├── Roboto-500italic.woff │ │ │ └── Roboto-500italic.woff2 │ │ ├── Roboto-700 │ │ │ ├── LICENSE.txt │ │ │ ├── Roboto-700.eot │ │ │ ├── Roboto-700.svg │ │ │ ├── Roboto-700.ttf │ │ │ ├── Roboto-700.woff │ │ │ └── Roboto-700.woff2 │ │ ├── Roboto-700italic │ │ │ ├── LICENSE.txt │ │ │ ├── Roboto-700italic.eot │ │ │ ├── Roboto-700italic.svg │ │ │ ├── Roboto-700italic.ttf │ │ │ ├── Roboto-700italic.woff │ │ │ └── Roboto-700italic.woff2 │ │ ├── Roboto-italic │ │ │ ├── LICENSE.txt │ │ │ ├── Roboto-italic.eot │ │ │ ├── Roboto-italic.svg │ │ │ ├── Roboto-italic.ttf │ │ │ ├── Roboto-italic.woff │ │ │ └── Roboto-italic.woff2 │ │ ├── Roboto-regular │ │ │ ├── LICENSE.txt │ │ │ ├── Roboto-regular.eot │ │ │ ├── Roboto-regular.svg │ │ │ ├── Roboto-regular.ttf │ │ │ ├── Roboto-regular.woff │ │ │ └── Roboto-regular.woff2 │ │ ├── roboto-slimfix.css │ │ └── roboto.css │ ├── icons │ │ ├── README.md │ │ ├── generate_ico.sh │ │ ├── pm_dark.ico │ │ ├── pm_dark_128.png │ │ ├── pm_dark_256.png │ │ ├── pm_dark_512.png │ │ ├── pm_dark_blue.ico │ │ ├── pm_dark_blue.png │ │ ├── pm_dark_blue_128.png │ │ ├── pm_dark_blue_256.png │ │ ├── pm_dark_blue_512.png │ │ ├── pm_dark_blue_64.png │ │ ├── pm_dark_green.ico │ │ ├── pm_dark_green_128.png │ │ ├── pm_dark_green_256.png │ │ ├── pm_dark_green_512.png │ │ ├── pm_dark_green_64.png │ │ ├── pm_dark_red.ico │ │ ├── pm_dark_red.png │ │ ├── pm_dark_red_128.png │ │ ├── pm_dark_red_256.png │ │ ├── pm_dark_red_512.png │ │ ├── pm_dark_red_64.png │ │ ├── pm_dark_yellow.ico │ │ ├── pm_dark_yellow.png │ │ ├── pm_dark_yellow_128.png │ │ ├── pm_dark_yellow_256.png │ │ ├── pm_dark_yellow_512.png │ │ ├── pm_dark_yellow_64.png │ │ ├── pm_light.ico │ │ ├── pm_light_128.png │ │ ├── pm_light_256.png │ │ ├── pm_light_512.png │ │ ├── pm_light_blue.ico │ │ ├── pm_light_blue.png │ │ ├── pm_light_blue_128.png │ │ ├── pm_light_blue_256.png │ │ ├── pm_light_blue_512.png │ │ ├── pm_light_blue_64.png │ │ ├── pm_light_green.ico │ │ ├── pm_light_green.png │ │ ├── pm_light_green_128.png │ │ ├── pm_light_green_256.png │ │ ├── pm_light_green_512.png │ │ ├── pm_light_green_64.png │ │ ├── pm_light_red.ico │ │ ├── pm_light_red.png │ │ ├── pm_light_red_128.png │ │ ├── pm_light_red_256.png │ │ ├── pm_light_red_512.png │ │ ├── pm_light_red_64.png │ │ ├── pm_light_yellow.ico │ │ ├── pm_light_yellow.png │ │ ├── pm_light_yellow_128.png │ │ ├── pm_light_yellow_256.png │ │ ├── pm_light_yellow_512.png │ │ └── pm_light_yellow_64.png │ ├── img │ │ ├── Mobile.svg │ │ ├── flags │ │ │ ├── AD.png │ │ │ ├── AE.png │ │ │ ├── AF.png │ │ │ ├── AG.png │ │ │ ├── AI.png │ │ │ ├── AL.png │ │ │ ├── AM.png │ │ │ ├── AN.png │ │ │ ├── AO.png │ │ │ ├── AQ.png │ │ │ ├── AR.png │ │ │ ├── AS.png │ │ │ ├── AT.png │ │ │ ├── AU.png │ │ │ ├── AW.png │ │ │ ├── AX.png │ │ │ ├── AZ.png │ │ │ ├── BA.png │ │ │ ├── BB.png │ │ │ ├── BD.png │ │ │ ├── BE.png │ │ │ ├── BF.png │ │ │ ├── BG.png │ │ │ ├── BH.png │ │ │ ├── BI.png │ │ │ ├── BJ.png │ │ │ ├── BL.png │ │ │ ├── BM.png │ │ │ ├── BN.png │ │ │ ├── BO.png │ │ │ ├── BR.png │ │ │ ├── BS.png │ │ │ ├── BT.png │ │ │ ├── BW.png │ │ │ ├── BY.png │ │ │ ├── BZ.png │ │ │ ├── CA.png │ │ │ ├── CC.png │ │ │ ├── CD.png │ │ │ ├── CF.png │ │ │ ├── CG.png │ │ │ ├── CH.png │ │ │ ├── CI.png │ │ │ ├── CK.png │ │ │ ├── CL.png │ │ │ ├── CM.png │ │ │ ├── CN.png │ │ │ ├── CO.png │ │ │ ├── CR.png │ │ │ ├── CT.png │ │ │ ├── CU.png │ │ │ ├── CV.png │ │ │ ├── CW.png │ │ │ ├── CX.png │ │ │ ├── CY.png │ │ │ ├── CZ.png │ │ │ ├── DE.png │ │ │ ├── DJ.png │ │ │ ├── DK.png │ │ │ ├── DM.png │ │ │ ├── DO.png │ │ │ ├── DZ.png │ │ │ ├── EC.png │ │ │ ├── EE.png │ │ │ ├── EG.png │ │ │ ├── EH.png │ │ │ ├── ER.png │ │ │ ├── ES.png │ │ │ ├── ET.png │ │ │ ├── EU.png │ │ │ ├── FI.png │ │ │ ├── FJ.png │ │ │ ├── FK.png │ │ │ ├── FM.png │ │ │ ├── FO.png │ │ │ ├── FR.png │ │ │ ├── GA.png │ │ │ ├── GB.png │ │ │ ├── GD.png │ │ │ ├── GE.png │ │ │ ├── GG.png │ │ │ ├── GH.png │ │ │ ├── GI.png │ │ │ ├── GL.png │ │ │ ├── GM.png │ │ │ ├── GN.png │ │ │ ├── GQ.png │ │ │ ├── GR.png │ │ │ ├── GS.png │ │ │ ├── GT.png │ │ │ ├── GU.png │ │ │ ├── GW.png │ │ │ ├── GY.png │ │ │ ├── HK.png │ │ │ ├── HN.png │ │ │ ├── HR.png │ │ │ ├── HT.png │ │ │ ├── HU.png │ │ │ ├── IC.png │ │ │ ├── ID.png │ │ │ ├── IE.png │ │ │ ├── IL.png │ │ │ ├── IM.png │ │ │ ├── IN.png │ │ │ ├── IQ.png │ │ │ ├── IR.png │ │ │ ├── IS.png │ │ │ ├── IT.png │ │ │ ├── JE.png │ │ │ ├── JM.png │ │ │ ├── JO.png │ │ │ ├── JP.png │ │ │ ├── KE.png │ │ │ ├── KG.png │ │ │ ├── KH.png │ │ │ ├── KI.png │ │ │ ├── KM.png │ │ │ ├── KN.png │ │ │ ├── KP.png │ │ │ ├── KR.png │ │ │ ├── KW.png │ │ │ ├── KY.png │ │ │ ├── KZ.png │ │ │ ├── LA.png │ │ │ ├── LB.png │ │ │ ├── LC.png │ │ │ ├── LI.png │ │ │ ├── LICENSE.txt │ │ │ ├── LK.png │ │ │ ├── LR.png │ │ │ ├── LS.png │ │ │ ├── LT.png │ │ │ ├── LU.png │ │ │ ├── LV.png │ │ │ ├── LY.png │ │ │ ├── MA.png │ │ │ ├── MC.png │ │ │ ├── MD.png │ │ │ ├── ME.png │ │ │ ├── MF.png │ │ │ ├── MG.png │ │ │ ├── MH.png │ │ │ ├── MK.png │ │ │ ├── ML.png │ │ │ ├── MM.png │ │ │ ├── MN.png │ │ │ ├── MO.png │ │ │ ├── MP.png │ │ │ ├── MQ.png │ │ │ ├── MR.png │ │ │ ├── MS.png │ │ │ ├── MT.png │ │ │ ├── MU.png │ │ │ ├── MV.png │ │ │ ├── MW.png │ │ │ ├── MX.png │ │ │ ├── MY.png │ │ │ ├── MZ.png │ │ │ ├── NA.png │ │ │ ├── NC.png │ │ │ ├── NE.png │ │ │ ├── NF.png │ │ │ ├── NG.png │ │ │ ├── NI.png │ │ │ ├── NL.png │ │ │ ├── NO.png │ │ │ ├── NP.png │ │ │ ├── NR.png │ │ │ ├── NU.png │ │ │ ├── NZ.png │ │ │ ├── OM.png │ │ │ ├── PA.png │ │ │ ├── PE.png │ │ │ ├── PF.png │ │ │ ├── PG.png │ │ │ ├── PH.png │ │ │ ├── PK.png │ │ │ ├── PL.png │ │ │ ├── PN.png │ │ │ ├── PR.png │ │ │ ├── PS.png │ │ │ ├── PT.png │ │ │ ├── PW.png │ │ │ ├── PY.png │ │ │ ├── QA.png │ │ │ ├── RE.png │ │ │ ├── RO.png │ │ │ ├── RS.png │ │ │ ├── RU.png │ │ │ ├── RW.png │ │ │ ├── SA.png │ │ │ ├── SB.png │ │ │ ├── SC.png │ │ │ ├── SD.png │ │ │ ├── SE.png │ │ │ ├── SG.png │ │ │ ├── SH.png │ │ │ ├── SI.png │ │ │ ├── SK.png │ │ │ ├── SL.png │ │ │ ├── SM.png │ │ │ ├── SN.png │ │ │ ├── SO.png │ │ │ ├── SR.png │ │ │ ├── SS.png │ │ │ ├── ST.png │ │ │ ├── SV.png │ │ │ ├── SX.png │ │ │ ├── SY.png │ │ │ ├── SZ.png │ │ │ ├── TC.png │ │ │ ├── TD.png │ │ │ ├── TF.png │ │ │ ├── TG.png │ │ │ ├── TH.png │ │ │ ├── TJ.png │ │ │ ├── TK.png │ │ │ ├── TL.png │ │ │ ├── TM.png │ │ │ ├── TN.png │ │ │ ├── TO.png │ │ │ ├── TR.png │ │ │ ├── TT.png │ │ │ ├── TV.png │ │ │ ├── TW.png │ │ │ ├── TZ.png │ │ │ ├── UA.png │ │ │ ├── UG.png │ │ │ ├── US.png │ │ │ ├── UY.png │ │ │ ├── UZ.png │ │ │ ├── VA.png │ │ │ ├── VC.png │ │ │ ├── VE.png │ │ │ ├── VG.png │ │ │ ├── VI.png │ │ │ ├── VN.png │ │ │ ├── VU.png │ │ │ ├── WF.png │ │ │ ├── WS.png │ │ │ ├── YE.png │ │ │ ├── YT.png │ │ │ ├── ZA.png │ │ │ ├── ZM.png │ │ │ ├── ZW.png │ │ │ ├── __.png │ │ │ ├── _abkhazia.png │ │ │ ├── _basque-country.png │ │ │ ├── _british-antarctic-territory.png │ │ │ ├── _commonwealth.png │ │ │ ├── _england.png │ │ │ ├── _gosquared.png │ │ │ ├── _kosovo.png │ │ │ ├── _mars.png │ │ │ ├── _nagorno-karabakh.png │ │ │ ├── _nato.png │ │ │ ├── _northern-cyprus.png │ │ │ ├── _olympics.png │ │ │ ├── _red-cross.png │ │ │ ├── _scotland.png │ │ │ ├── _somaliland.png │ │ │ ├── _south-ossetia.png │ │ │ ├── _united-nations.png │ │ │ ├── _unknown.png │ │ │ └── _wales.png │ │ ├── linux.svg │ │ ├── mac.svg │ │ ├── plants1-br.png │ │ ├── plants1.png │ │ ├── spn-feature-carousel │ │ │ ├── access-regional-content-easily.png │ │ │ ├── built-from-the-ground-up.png │ │ │ ├── bye-bye-vpns.png │ │ │ ├── easily-control-your-privacy.png │ │ │ └── multiple-identities-for-each-app.png │ │ ├── spn-login.png │ │ └── windows.svg │ └── world-50m.json ├── icons.go ├── icons_default.go └── icons_windows.go ├── base ├── .gitignore ├── README.md ├── api │ ├── api_bridge.go │ ├── auth_wrapper.go │ ├── authentication.go │ ├── authentication_test.go │ ├── client │ │ ├── api.go │ │ ├── client.go │ │ ├── const.go │ │ ├── message.go │ │ └── websocket.go │ ├── config.go │ ├── database.go │ ├── doc.go │ ├── endpoints.go │ ├── endpoints_config.go │ ├── endpoints_debug.go │ ├── endpoints_meta.go │ ├── endpoints_test.go │ ├── enriched-response.go │ ├── init_test.go │ ├── main.go │ ├── module.go │ ├── request.go │ ├── router.go │ └── testclient │ │ ├── root │ │ └── index.html │ │ └── serve.go ├── apprise │ └── notify.go ├── config │ ├── basic_config.go │ ├── database.go │ ├── doc.go │ ├── expertise.go │ ├── get-safe.go │ ├── get.go │ ├── get_test.go │ ├── init_test.go │ ├── main.go │ ├── module.go │ ├── option.go │ ├── persistence.go │ ├── persistence_test.go │ ├── perspective.go │ ├── registry.go │ ├── registry_test.go │ ├── release.go │ ├── set.go │ ├── set_test.go │ ├── validate.go │ └── validity.go ├── container │ ├── container.go │ ├── container_test.go │ ├── doc.go │ └── serialization.go ├── database │ ├── accessor │ │ ├── accessor-json-bytes.go │ │ ├── accessor-json-string.go │ │ ├── accessor-struct.go │ │ ├── accessor.go │ │ └── accessor_test.go │ ├── boilerplate_test.go │ ├── controller.go │ ├── controllers.go │ ├── database.go │ ├── database_test.go │ ├── dbmodule │ │ ├── db.go │ │ └── maintenance.go │ ├── doc.go │ ├── errors.go │ ├── hook.go │ ├── hookbase.go │ ├── interface.go │ ├── interface_cache.go │ ├── interface_cache_test.go │ ├── iterator │ │ └── iterator.go │ ├── main.go │ ├── maintenance.go │ ├── migration │ │ ├── error.go │ │ └── migration.go │ ├── query │ │ ├── README.md │ │ ├── condition-and.go │ │ ├── condition-bool.go │ │ ├── condition-error.go │ │ ├── condition-exists.go │ │ ├── condition-float.go │ │ ├── condition-int.go │ │ ├── condition-not.go │ │ ├── condition-or.go │ │ ├── condition-regex.go │ │ ├── condition-string.go │ │ ├── condition-stringslice.go │ │ ├── condition.go │ │ ├── condition_test.go │ │ ├── operators.go │ │ ├── operators_test.go │ │ ├── parser.go │ │ ├── parser_test.go │ │ ├── query.go │ │ └── query_test.go │ ├── record │ │ ├── base.go │ │ ├── base_test.go │ │ ├── key.go │ │ ├── meta-bench_test.go │ │ ├── meta-gencode.go │ │ ├── meta-gencode_test.go │ │ ├── meta.colf │ │ ├── meta.gencode │ │ ├── meta.go │ │ ├── record.go │ │ ├── record_test.go │ │ ├── wrapper.go │ │ └── wrapper_test.go │ ├── registry.go │ ├── storage │ │ ├── badger │ │ │ ├── badger.go │ │ │ └── badger_test.go │ │ ├── bbolt │ │ │ ├── bbolt.go │ │ │ └── bbolt_test.go │ │ ├── errors.go │ │ ├── fstree │ │ │ ├── fstree.go │ │ │ └── fstree_test.go │ │ ├── hashmap │ │ │ ├── map.go │ │ │ └── map_test.go │ │ ├── injectbase.go │ │ ├── interface.go │ │ ├── sinkhole │ │ │ └── sinkhole.go │ │ ├── sqlite │ │ │ ├── bobgen.yaml │ │ │ ├── migrations │ │ │ │ ├── 0_settings.sql │ │ │ │ └── 1_initial.sql │ │ │ ├── migrations_config.yml │ │ │ ├── models │ │ │ │ ├── bob_main.bob.go │ │ │ │ ├── bob_main_test.bob.go │ │ │ │ └── records.bob.go │ │ │ ├── prepared.go │ │ │ ├── prepared_test.go │ │ │ ├── schema.go │ │ │ ├── sqlite.go │ │ │ ├── sqlite_test.go │ │ │ └── testdata │ │ │ │ └── .gitkeep │ │ └── storages.go │ └── subscription.go ├── dataroot │ └── root.go ├── info │ └── version.go ├── log │ ├── flags.go │ ├── formatting.go │ ├── formatting_unix.go │ ├── formatting_windows.go │ ├── input.go │ ├── logging.go │ ├── logging_test.go │ ├── output.go │ ├── slog.go │ ├── trace.go │ └── trace_test.go ├── metrics │ ├── api.go │ ├── config.go │ ├── metric.go │ ├── metric_counter.go │ ├── metric_counter_fetching.go │ ├── metric_export.go │ ├── metric_gauge.go │ ├── metric_histogram.go │ ├── metrics_host.go │ ├── metrics_info.go │ ├── metrics_logs.go │ ├── metrics_runtime.go │ ├── module.go │ ├── persistence.go │ └── testdata │ │ ├── .gitignore │ │ ├── README.md │ │ ├── docker-compose.yml │ │ └── grafana │ │ ├── config.ini │ │ ├── dashboards │ │ └── portmaster.yml │ │ └── datasources │ │ └── datasource.yml ├── notifications │ ├── cleaner.go │ ├── config.go │ ├── database.go │ ├── doc.go │ ├── module-mirror.go │ ├── module.go │ └── notification.go ├── rng │ ├── doc.go │ ├── entropy.go │ ├── entropy_test.go │ ├── fullfeed.go │ ├── fullfeed_test.go │ ├── get.go │ ├── get_test.go │ ├── osfeeder.go │ ├── rng.go │ ├── rng_test.go │ ├── test │ │ ├── .gitignore │ │ ├── README.md │ │ └── main.go │ └── tickfeeder.go ├── runtime │ ├── module.go │ ├── provider.go │ ├── registry.go │ ├── registry_test.go │ ├── singe_record_provider.go │ ├── storage.go │ └── trace_provider.go ├── template │ └── module.go ├── updater │ ├── doc.go │ ├── export.go │ ├── fetch.go │ ├── file.go │ ├── filename.go │ ├── filename_test.go │ ├── get.go │ ├── indexes.go │ ├── indexes_test.go │ ├── notifier.go │ ├── registry.go │ ├── registry_test.go │ ├── resource.go │ ├── resource_test.go │ ├── signing.go │ ├── state.go │ ├── storage.go │ ├── storage_test.go │ ├── unpacking.go │ └── updating.go └── utils │ ├── atomic.go │ ├── broadcastflag.go │ ├── call_limiter.go │ ├── call_limiter_test.go │ ├── debug │ ├── debug.go │ ├── debug_android.go │ └── debug_default.go │ ├── fs.go │ ├── mimetypes.go │ ├── onceagain.go │ ├── onceagain_test.go │ ├── osdetail │ ├── colors_windows.go │ ├── command.go │ ├── dnscache_windows.go │ ├── errors.go │ ├── service_windows.go │ ├── shell_windows.go │ ├── svchost_windows.go │ ├── version_windows.go │ └── version_windows_test.go │ ├── permissions.go │ ├── permissions_windows.go │ ├── renameio │ ├── LICENSE │ ├── README.md │ ├── doc.go │ ├── example_test.go │ ├── symlink_test.go │ ├── tempfile.go │ ├── tempfile_linux_test.go │ ├── writefile.go │ └── writefile_test.go │ ├── safe.go │ ├── safe_test.go │ ├── slices.go │ ├── slices_test.go │ ├── stablepool.go │ ├── stablepool_test.go │ ├── structure.go │ ├── structure_test.go │ ├── uuid.go │ └── uuid_test.go ├── cmds ├── hub │ ├── .gitignore │ ├── build │ ├── main.go │ └── pack ├── integrationtest │ ├── main.go │ └── netstate.go ├── notifier │ ├── .gitignore │ ├── README.md │ ├── http_api.go │ ├── icons.go │ ├── main.go │ ├── notification.go │ ├── notify.go │ ├── notify_linux.go │ ├── notify_windows.go │ ├── shutdown.go │ ├── snoretoast-guid.patch │ ├── spn.go │ ├── subsystems.go │ ├── tray.go │ └── wintoast │ │ ├── notification_builder.go │ │ └── wintoast.go ├── observation-hub │ ├── .gitignore │ ├── Dockerfile │ ├── apprise.go │ ├── apprise_test.go │ ├── build │ ├── main.go │ ├── notifications.tmpl │ └── observe.go ├── portmaster-core │ ├── .gitignore │ ├── build │ └── main.go ├── portmaster-start │ ├── .gitignore │ ├── build │ ├── console_default.go │ ├── console_windows.go │ ├── dirs.go │ ├── install_windows.go │ ├── lock.go │ ├── logs.go │ ├── main.go │ ├── pack │ ├── recover_linux.go │ ├── run.go │ ├── service_windows.go │ ├── show.go │ ├── shutdown.go │ ├── update.go │ ├── verify.go │ └── version.go ├── testsuite │ ├── .gitignore │ ├── db.go │ ├── login.go │ ├── main.go │ └── report_healthcheck.go ├── trafficgen │ ├── main.go │ └── pack ├── updatemgr │ ├── .gitignore │ ├── confirm.go │ ├── main.go │ ├── purge.go │ ├── release.go │ ├── scan.go │ └── sign.go └── winkext-test │ ├── main.go │ ├── main_linux.go │ └── pack ├── desktop ├── angular │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── assets │ ├── browser-extension-dev.config.ts │ ├── browser-extension.config.ts │ ├── docker.sh │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ ├── karma.conf.js │ ├── package-lock.json │ ├── package.json │ ├── projects │ │ ├── portmaster-chrome-extension │ │ │ ├── karma.conf.js │ │ │ ├── src │ │ │ │ ├── app │ │ │ │ │ ├── app-routing.module.ts │ │ │ │ │ ├── app.component.html │ │ │ │ │ ├── app.component.scss │ │ │ │ │ ├── app.component.ts │ │ │ │ │ ├── app.module.ts │ │ │ │ │ ├── domain-list │ │ │ │ │ │ ├── domain-list.component.html │ │ │ │ │ │ ├── domain-list.component.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── header │ │ │ │ │ │ ├── header.component.html │ │ │ │ │ │ ├── header.component.scss │ │ │ │ │ │ ├── header.component.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── interceptor.ts │ │ │ │ │ ├── request-interceptor.service.ts │ │ │ │ │ └── welcome │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── intro.component.html │ │ │ │ │ │ ├── intro.component.ts │ │ │ │ │ │ └── welcome.module.ts │ │ │ │ ├── assets │ │ │ │ │ ├── .gitkeep │ │ │ │ │ └── icon_128.png │ │ │ │ ├── background.ts │ │ │ │ ├── background │ │ │ │ │ ├── commands.ts │ │ │ │ │ ├── tab-tracker.ts │ │ │ │ │ └── tab-utils.ts │ │ │ │ ├── environments │ │ │ │ │ ├── environment.prod.ts │ │ │ │ │ └── environment.ts │ │ │ │ ├── favicon.ico │ │ │ │ ├── index.html │ │ │ │ ├── main.ts │ │ │ │ ├── manifest.json │ │ │ │ ├── polyfills.ts │ │ │ │ ├── styles.scss │ │ │ │ └── test.ts │ │ │ ├── tsconfig.app.json │ │ │ └── tsconfig.spec.json │ │ ├── safing │ │ │ ├── portmaster-api │ │ │ │ ├── README.md │ │ │ │ ├── karma.conf.js │ │ │ │ ├── ng-package.json │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ ├── src │ │ │ │ │ ├── lib │ │ │ │ │ │ ├── app-profile.service.ts │ │ │ │ │ │ ├── app-profile.types.ts │ │ │ │ │ │ ├── config.service.ts │ │ │ │ │ │ ├── config.types.ts │ │ │ │ │ │ ├── core.types.ts │ │ │ │ │ │ ├── debug-api.service.ts │ │ │ │ │ │ ├── features.ts │ │ │ │ │ │ ├── meta-api.service.ts │ │ │ │ │ │ ├── module.ts │ │ │ │ │ │ ├── netquery.service.ts │ │ │ │ │ │ ├── network.types.ts │ │ │ │ │ │ ├── portapi.service.ts │ │ │ │ │ │ ├── portapi.types.ts │ │ │ │ │ │ ├── spn.service.ts │ │ │ │ │ │ ├── spn.types.ts │ │ │ │ │ │ ├── utils.ts │ │ │ │ │ │ └── websocket.service.ts │ │ │ │ │ ├── public-api.ts │ │ │ │ │ └── test.ts │ │ │ │ ├── tsconfig.lib.json │ │ │ │ ├── tsconfig.lib.prod.json │ │ │ │ └── tsconfig.spec.json │ │ │ └── ui │ │ │ │ ├── .eslintrc.json │ │ │ │ ├── README.md │ │ │ │ ├── karma.conf.js │ │ │ │ ├── ng-package.json │ │ │ │ ├── package.json │ │ │ │ ├── src │ │ │ │ ├── lib │ │ │ │ │ ├── accordion │ │ │ │ │ │ ├── accordion-group.html │ │ │ │ │ │ ├── accordion-group.ts │ │ │ │ │ │ ├── accordion.html │ │ │ │ │ │ ├── accordion.module.ts │ │ │ │ │ │ ├── accordion.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── animations │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── dialog │ │ │ │ │ │ ├── _confirm.dialog.scss │ │ │ │ │ │ ├── _dialog.scss │ │ │ │ │ │ ├── confirm.dialog.html │ │ │ │ │ │ ├── confirm.dialog.ts │ │ │ │ │ │ ├── dialog.animations.ts │ │ │ │ │ │ ├── dialog.container.ts │ │ │ │ │ │ ├── dialog.module.ts │ │ │ │ │ │ ├── dialog.ref.ts │ │ │ │ │ │ ├── dialog.service.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── dropdown │ │ │ │ │ │ ├── dropdown.html │ │ │ │ │ │ ├── dropdown.module.ts │ │ │ │ │ │ ├── dropdown.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── overlay-stepper │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── overlay-stepper-container.html │ │ │ │ │ │ ├── overlay-stepper-container.ts │ │ │ │ │ │ ├── overlay-stepper.module.ts │ │ │ │ │ │ ├── overlay-stepper.ts │ │ │ │ │ │ ├── refs.ts │ │ │ │ │ │ ├── step-outlet.ts │ │ │ │ │ │ └── step.ts │ │ │ │ │ ├── pagination │ │ │ │ │ │ ├── _pagination.scss │ │ │ │ │ │ ├── dynamic-items-paginator.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── pagination.html │ │ │ │ │ │ ├── pagination.module.ts │ │ │ │ │ │ ├── pagination.ts │ │ │ │ │ │ └── snapshot-paginator.ts │ │ │ │ │ ├── select │ │ │ │ │ │ ├── _select.scss │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── item.ts │ │ │ │ │ │ ├── select.html │ │ │ │ │ │ ├── select.module.ts │ │ │ │ │ │ └── select.ts │ │ │ │ │ ├── tabs │ │ │ │ │ │ ├── _tab-group.scss │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── tab-group.html │ │ │ │ │ │ ├── tab-group.ts │ │ │ │ │ │ ├── tab.ts │ │ │ │ │ │ └── tabs.module.ts │ │ │ │ │ ├── tipup │ │ │ │ │ │ ├── _tipup.scss │ │ │ │ │ │ ├── anchor.ts │ │ │ │ │ │ ├── clone-node.ts │ │ │ │ │ │ ├── css-utils.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── safe.pipe.ts │ │ │ │ │ │ ├── tipup-component.ts │ │ │ │ │ │ ├── tipup.html │ │ │ │ │ │ ├── tipup.module.ts │ │ │ │ │ │ ├── tipup.ts │ │ │ │ │ │ ├── translations.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── toggle-switch │ │ │ │ │ │ ├── _toggle-switch.scss │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── toggle-switch.html │ │ │ │ │ │ ├── toggle-switch.ts │ │ │ │ │ │ └── toggle.module.ts │ │ │ │ │ ├── tooltip │ │ │ │ │ │ ├── _tooltip-component.scss │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── tooltip-component.html │ │ │ │ │ │ ├── tooltip-component.ts │ │ │ │ │ │ ├── tooltip.module.ts │ │ │ │ │ │ └── tooltip.ts │ │ │ │ │ └── ui.module.ts │ │ │ │ ├── public-api.ts │ │ │ │ └── test.ts │ │ │ │ ├── theming.scss │ │ │ │ ├── tsconfig.lib.json │ │ │ │ ├── tsconfig.lib.prod.json │ │ │ │ └── tsconfig.spec.json │ │ └── tauri-builtin │ │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.html │ │ │ │ ├── app.component.ts │ │ │ │ └── app.config.ts │ │ │ ├── assets │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ │ └── tsconfig.app.json │ ├── proxy.json │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── integration │ │ │ │ ├── browser.ts │ │ │ │ ├── electron.ts │ │ │ │ ├── factory.ts │ │ │ │ ├── index.ts │ │ │ │ ├── integration.ts │ │ │ │ └── taur-app.ts │ │ │ ├── intro │ │ │ │ ├── index.ts │ │ │ │ ├── intro.module.ts │ │ │ │ ├── step-1-welcome │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── step-1-welcome.html │ │ │ │ │ └── step-1-welcome.ts │ │ │ │ ├── step-2-trackers │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── step-2-trackers.html │ │ │ │ │ └── step-2-trackers.ts │ │ │ │ ├── step-3-dns │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── step-3-dns.html │ │ │ │ │ └── step-3-dns.ts │ │ │ │ ├── step-4-tipups │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── step-4-tipups.html │ │ │ │ │ └── step-4-tipups.ts │ │ │ │ └── step.scss │ │ │ ├── layout │ │ │ │ ├── navigation │ │ │ │ │ ├── navigation.html │ │ │ │ │ ├── navigation.scss │ │ │ │ │ └── navigation.ts │ │ │ │ └── side-dash │ │ │ │ │ ├── side-dash.html │ │ │ │ │ ├── side-dash.scss │ │ │ │ │ └── side-dash.ts │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── pages │ │ │ │ ├── app-view │ │ │ │ │ ├── app-insights │ │ │ │ │ │ ├── app-insights.component.html │ │ │ │ │ │ └── app-insights.component.ts │ │ │ │ │ ├── app-view.html │ │ │ │ │ ├── app-view.scss │ │ │ │ │ ├── app-view.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── merge-profile-dialog │ │ │ │ │ │ ├── merge-profile-dialog.component.html │ │ │ │ │ │ └── merge-profile-dialog.component.ts │ │ │ │ │ ├── overview.html │ │ │ │ │ ├── overview.scss │ │ │ │ │ ├── overview.ts │ │ │ │ │ ├── qs-history │ │ │ │ │ │ ├── qs-history.component.html │ │ │ │ │ │ ├── qs-history.component.scss │ │ │ │ │ │ └── qs-history.component.ts │ │ │ │ │ ├── qs-internet │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── qs-internet.html │ │ │ │ │ │ └── qs-internet.ts │ │ │ │ │ ├── qs-select-exit │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── qs-select-exit.html │ │ │ │ │ │ ├── qs-select-exit.scss │ │ │ │ │ │ └── qs-select-exit.ts │ │ │ │ │ └── qs-use-spn │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── qs-use-spn.html │ │ │ │ │ │ └── qs-use-spn.ts │ │ │ │ ├── dashboard │ │ │ │ │ ├── dashboard-widget │ │ │ │ │ │ ├── dashboard-widget.component.html │ │ │ │ │ │ └── dashboard-widget.component.ts │ │ │ │ │ ├── dashboard.component.html │ │ │ │ │ ├── dashboard.component.scss │ │ │ │ │ ├── dashboard.component.ts │ │ │ │ │ └── feature-card │ │ │ │ │ │ ├── feature-card.component.html │ │ │ │ │ │ ├── feature-card.component.scss │ │ │ │ │ │ └── feature-card.component.ts │ │ │ │ ├── monitor │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── monitor.html │ │ │ │ │ ├── monitor.scss │ │ │ │ │ └── monitor.ts │ │ │ │ ├── page.scss │ │ │ │ ├── settings │ │ │ │ │ ├── settings.html │ │ │ │ │ ├── settings.scss │ │ │ │ │ └── settings.ts │ │ │ │ ├── spn │ │ │ │ │ ├── country-details │ │ │ │ │ │ ├── country-details.html │ │ │ │ │ │ ├── country-details.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── country-overlay │ │ │ │ │ │ ├── country-overlay.html │ │ │ │ │ │ ├── country-overlay.scss │ │ │ │ │ │ ├── country-overlay.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── map-legend │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── map-legend.html │ │ │ │ │ │ └── map-legend.ts │ │ │ │ │ ├── map-renderer │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── map-renderer.ts │ │ │ │ │ │ └── map-style.scss │ │ │ │ │ ├── map.service.ts │ │ │ │ │ ├── node-icon │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── node-icon.html │ │ │ │ │ │ ├── node-icon.scss │ │ │ │ │ │ └── node-icon.ts │ │ │ │ │ ├── pin-details │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── pin-details.html │ │ │ │ │ │ └── pin-details.ts │ │ │ │ │ ├── pin-list │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── pin-list.html │ │ │ │ │ │ └── pin-list.ts │ │ │ │ │ ├── pin-overlay │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── pin-overlay.html │ │ │ │ │ │ ├── pin-overlay.scss │ │ │ │ │ │ └── pin-overlay.ts │ │ │ │ │ ├── pin-route │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── pin-route.html │ │ │ │ │ │ ├── pin-route.scss │ │ │ │ │ │ └── pin-route.ts │ │ │ │ │ ├── spn-feature-carousel │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── spn-feature-carousel.html │ │ │ │ │ │ ├── spn-feature-carousel.scss │ │ │ │ │ │ └── spn-feature-carousel.ts │ │ │ │ │ ├── spn-page.html │ │ │ │ │ ├── spn-page.scss │ │ │ │ │ ├── spn-page.ts │ │ │ │ │ ├── spn.module.ts │ │ │ │ │ └── utils.ts │ │ │ │ └── support │ │ │ │ │ ├── form │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── support-form.html │ │ │ │ │ ├── support-form.scss │ │ │ │ │ └── support-form.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── pages.ts │ │ │ │ │ ├── progress-dialog │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── progress-dialog.html │ │ │ │ │ └── progress-dialog.ts │ │ │ │ │ ├── support.html │ │ │ │ │ ├── support.scss │ │ │ │ │ └── support.ts │ │ │ ├── prompt-entrypoint │ │ │ │ ├── prompt-entrypoint.ts │ │ │ │ └── prompt.html │ │ │ ├── services │ │ │ │ ├── index.ts │ │ │ │ ├── notifications.service.spec.ts │ │ │ │ ├── notifications.service.ts │ │ │ │ ├── notifications.types.ts │ │ │ │ ├── package.json │ │ │ │ ├── session-data.service.ts │ │ │ │ ├── status.service.spec.ts │ │ │ │ ├── status.service.ts │ │ │ │ ├── status.types.ts │ │ │ │ ├── supporthub.service.ts │ │ │ │ ├── ui-state.service.ts │ │ │ │ └── virtual-notification.ts │ │ │ └── shared │ │ │ │ ├── action-indicator │ │ │ │ ├── action-indicator.module.ts │ │ │ │ ├── action-indicator.service.ts │ │ │ │ ├── index.ts │ │ │ │ ├── indicator.html │ │ │ │ ├── indicator.scss │ │ │ │ └── indicator.ts │ │ │ │ ├── animations.ts │ │ │ │ ├── app-icon │ │ │ │ ├── app-icon-resolver.ts │ │ │ │ ├── app-icon.html │ │ │ │ ├── app-icon.module.ts │ │ │ │ ├── app-icon.scss │ │ │ │ ├── app-icon.ts │ │ │ │ └── index.ts │ │ │ │ ├── config │ │ │ │ ├── basic-setting │ │ │ │ │ ├── basic-setting.html │ │ │ │ │ ├── basic-setting.scss │ │ │ │ │ ├── basic-setting.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── config-settings.html │ │ │ │ ├── config-settings.scss │ │ │ │ ├── config-settings.ts │ │ │ │ ├── config.module.ts │ │ │ │ ├── export-dialog │ │ │ │ │ ├── export-dialog.component.html │ │ │ │ │ └── export-dialog.component.ts │ │ │ │ ├── filter-lists │ │ │ │ │ ├── filter-list.html │ │ │ │ │ ├── filter-list.scss │ │ │ │ │ ├── filter-list.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── generic-setting │ │ │ │ │ ├── generic-setting.html │ │ │ │ │ ├── generic-setting.scss │ │ │ │ │ ├── generic-setting.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── import-dialog │ │ │ │ │ ├── cursor.ts │ │ │ │ │ ├── import-dialog.component.html │ │ │ │ │ ├── import-dialog.component.ts │ │ │ │ │ └── selection.ts │ │ │ │ ├── index.ts │ │ │ │ ├── ordererd-list │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── item.html │ │ │ │ │ ├── item.scss │ │ │ │ │ ├── item.ts │ │ │ │ │ ├── ordered-list.html │ │ │ │ │ ├── ordered-list.scss │ │ │ │ │ └── ordered-list.ts │ │ │ │ ├── rule-list │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── list-item.html │ │ │ │ │ ├── list-item.scss │ │ │ │ │ ├── list-item.ts │ │ │ │ │ ├── rule-list.html │ │ │ │ │ ├── rule-list.scss │ │ │ │ │ └── rule-list.ts │ │ │ │ ├── safe.pipe.ts │ │ │ │ └── subsystems.ts │ │ │ │ ├── count-indicator │ │ │ │ ├── count-indicator.html │ │ │ │ ├── count-indicator.module.ts │ │ │ │ ├── count-indicator.scss │ │ │ │ ├── count-indicator.ts │ │ │ │ ├── count.pipe.ts │ │ │ │ └── index.ts │ │ │ │ ├── country-flag │ │ │ │ ├── country-flag.ts │ │ │ │ ├── country.module.ts │ │ │ │ └── index.ts │ │ │ │ ├── edit-profile-dialog │ │ │ │ ├── edit-profile-dialog.html │ │ │ │ ├── edit-profile-dialog.scss │ │ │ │ ├── edit-profile-dialog.ts │ │ │ │ └── index.ts │ │ │ │ ├── exit-screen │ │ │ │ ├── exit-screen.html │ │ │ │ ├── exit-screen.scss │ │ │ │ ├── exit-screen.ts │ │ │ │ ├── exit.service.ts │ │ │ │ └── index.ts │ │ │ │ ├── expertise │ │ │ │ ├── expertise-directive.ts │ │ │ │ ├── expertise-switch.html │ │ │ │ ├── expertise-switch.scss │ │ │ │ ├── expertise-switch.ts │ │ │ │ ├── expertise.module.ts │ │ │ │ ├── expertise.service.ts │ │ │ │ └── index.ts │ │ │ │ ├── external-link.directive.ts │ │ │ │ ├── feature-scout │ │ │ │ ├── feature-scout.html │ │ │ │ ├── feature-scout.scss │ │ │ │ ├── feature-scout.ts │ │ │ │ └── index.ts │ │ │ │ ├── focus │ │ │ │ ├── focus.directive.ts │ │ │ │ ├── focus.module.ts │ │ │ │ └── index.ts │ │ │ │ ├── fuzzySearch │ │ │ │ ├── fuse.service.ts │ │ │ │ ├── index.ts │ │ │ │ └── search-pipe.ts │ │ │ │ ├── loading │ │ │ │ ├── index.ts │ │ │ │ ├── loading.html │ │ │ │ ├── loading.scss │ │ │ │ └── loading.ts │ │ │ │ ├── menu │ │ │ │ ├── index.ts │ │ │ │ ├── menu-group.scss │ │ │ │ ├── menu-item.scss │ │ │ │ ├── menu-trigger.html │ │ │ │ ├── menu-trigger.scss │ │ │ │ ├── menu.html │ │ │ │ ├── menu.module.ts │ │ │ │ └── menu.ts │ │ │ │ ├── multi-switch │ │ │ │ ├── index.ts │ │ │ │ ├── multi-switch.html │ │ │ │ ├── multi-switch.module.ts │ │ │ │ ├── multi-switch.scss │ │ │ │ ├── multi-switch.ts │ │ │ │ ├── switch-item.scss │ │ │ │ └── switch-item.ts │ │ │ │ ├── netquery │ │ │ │ ├── .eslintrc.json │ │ │ │ ├── add-to-filter │ │ │ │ │ ├── add-to-filter.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── circular-bar-chart │ │ │ │ │ └── circular-bar-chart.component.ts │ │ │ │ ├── combined-menu.pipe.ts │ │ │ │ ├── connection-details │ │ │ │ │ ├── conn-details.html │ │ │ │ │ ├── conn-details.scss │ │ │ │ │ ├── conn-details.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── connection-helper.service.ts │ │ │ │ ├── connection-row │ │ │ │ │ ├── conn-row.html │ │ │ │ │ ├── conn-row.scss │ │ │ │ │ ├── conn-row.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── line-chart │ │ │ │ │ ├── index.ts │ │ │ │ │ └── line-chart.ts │ │ │ │ ├── netquery.component.html │ │ │ │ ├── netquery.component.ts │ │ │ │ ├── netquery.module.ts │ │ │ │ ├── pipes │ │ │ │ │ ├── can-show.pipe.ts │ │ │ │ │ ├── can-use-rules.pipe.ts │ │ │ │ │ ├── country-name.pipe.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── is-blocked.pipe.ts │ │ │ │ │ └── location.pipe.ts │ │ │ │ ├── scope-label │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── scope-label.html │ │ │ │ │ └── scope-label.ts │ │ │ │ ├── search-overlay │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── search-overlay.html │ │ │ │ │ └── search-overlay.ts │ │ │ │ ├── searchbar │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── searchbar.html │ │ │ │ │ └── searchbar.ts │ │ │ │ ├── tag-bar │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── tag-bar.html │ │ │ │ │ └── tag-bar.ts │ │ │ │ ├── textql │ │ │ │ │ ├── helper.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── input.ts │ │ │ │ │ ├── lexer.ts │ │ │ │ │ ├── parser.ts │ │ │ │ │ └── token.ts │ │ │ │ └── utils.ts │ │ │ │ ├── network-scout │ │ │ │ ├── index.ts │ │ │ │ ├── network-scout.html │ │ │ │ ├── network-scout.scss │ │ │ │ └── network-scout.ts │ │ │ │ ├── notification-list │ │ │ │ ├── index.ts │ │ │ │ ├── notification-list.component.html │ │ │ │ ├── notification-list.component.scss │ │ │ │ └── notification-list.component.ts │ │ │ │ ├── notification │ │ │ │ ├── notification.html │ │ │ │ ├── notification.scss │ │ │ │ └── notification.ts │ │ │ │ ├── pipes │ │ │ │ ├── bytes.pipe.ts │ │ │ │ ├── common-pipes.module.ts │ │ │ │ ├── duration.pipe.ts │ │ │ │ ├── index.ts │ │ │ │ ├── round.pipe.ts │ │ │ │ ├── time-ago.pipe.ts │ │ │ │ ├── to-profile.pipe.ts │ │ │ │ └── to-seconds.pipe.ts │ │ │ │ ├── process-details-dialog │ │ │ │ ├── index.ts │ │ │ │ ├── process-details-dialog.html │ │ │ │ ├── process-details-dialog.scss │ │ │ │ └── process-details-dialog.ts │ │ │ │ ├── prompt-list │ │ │ │ ├── index.ts │ │ │ │ ├── prompt-list.component.html │ │ │ │ ├── prompt-list.component.scss │ │ │ │ └── prompt-list.component.ts │ │ │ │ ├── security-lock │ │ │ │ ├── index.ts │ │ │ │ ├── security-lock.html │ │ │ │ ├── security-lock.scss │ │ │ │ └── security-lock.ts │ │ │ │ ├── spn-account-details │ │ │ │ ├── index.ts │ │ │ │ ├── spn-account-details.html │ │ │ │ ├── spn-account-details.scss │ │ │ │ └── spn-account-details.ts │ │ │ │ ├── spn-login │ │ │ │ ├── index.ts │ │ │ │ ├── spn-login.html │ │ │ │ ├── spn-login.scss │ │ │ │ └── spn-login.ts │ │ │ │ ├── spn-network-status │ │ │ │ ├── index.ts │ │ │ │ ├── spn-network-status.html │ │ │ │ ├── spn-network-status.scss │ │ │ │ └── spn-network-status.ts │ │ │ │ ├── spn-status │ │ │ │ ├── index.ts │ │ │ │ ├── spn-status.html │ │ │ │ └── spn-status.ts │ │ │ │ ├── text-placeholder │ │ │ │ ├── index.ts │ │ │ │ ├── placeholder.scss │ │ │ │ └── placeholder.ts │ │ │ │ └── utils.ts │ │ ├── assets │ │ ├── electron-app.d.ts │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── i18n │ │ │ ├── helptexts.yaml │ │ │ └── helptexts.yaml.d.ts │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ ├── test.ts │ │ ├── theme.less │ │ └── theme │ │ │ ├── _breadcrumbs.scss │ │ │ ├── _button.scss │ │ │ ├── _card.scss │ │ │ ├── _colors.scss │ │ │ ├── _dialog.scss │ │ │ ├── _drag-n-drop.scss │ │ │ ├── _inputs.scss │ │ │ ├── _markdown.scss │ │ │ ├── _pill.scss │ │ │ ├── _scroll.scss │ │ │ ├── _search.scss │ │ │ ├── _table.scss │ │ │ ├── _tailwind.scss │ │ │ ├── _trust-level.scss │ │ │ ├── _typography.scss │ │ │ ├── _verdict.scss │ │ │ └── mixins │ │ │ └── _pill.scss │ ├── tailwind.config.js │ ├── tsconfig.app.json │ ├── tsconfig.json │ └── tsconfig.spec.json └── tauri │ ├── .cargo │ └── config.toml │ └── src-tauri │ ├── .gitignore │ ├── Cargo.lock │ ├── Cargo.toml │ ├── Cross.toml │ ├── build.rs │ ├── capabilities │ └── default.json │ ├── gen │ └── schemas │ │ ├── acl-manifests.json │ │ ├── capabilities.json │ │ ├── desktop-schema.json │ │ ├── linux-schema.json │ │ └── windows-schema.json │ ├── src │ ├── config.rs │ ├── main.rs │ ├── portapi │ │ ├── client.rs │ │ ├── message.rs │ │ ├── mod.rs │ │ ├── models │ │ │ ├── config.rs │ │ │ ├── mod.rs │ │ │ ├── notification.rs │ │ │ ├── spn.rs │ │ │ └── subsystem.rs │ │ └── types.rs │ ├── portmaster │ │ ├── commands.rs │ │ ├── mod.rs │ │ ├── notifications.rs │ │ └── websocket.rs │ ├── service │ │ ├── manager.rs │ │ ├── mod.rs │ │ ├── status.rs │ │ ├── systemd.rs │ │ └── windows_service.rs │ ├── traymenu.rs │ ├── window.rs │ └── xdg │ │ └── mod.rs │ ├── tauri.conf.json5 │ └── templates │ ├── main.wxs │ ├── main_original.wxs │ ├── nsis_install_hooks.nsh │ └── service.wxs ├── go.mod ├── go.sum ├── packaging ├── linux │ ├── portmaster-autostart.desktop │ ├── portmaster.desktop │ ├── portmaster.service │ ├── postinst │ └── postrm └── windows │ └── .gitkeep ├── runtime └── .gitkeep ├── service ├── broadcasts │ ├── api.go │ ├── data.go │ ├── install_info.go │ ├── module.go │ ├── notify.go │ ├── state.go │ └── testdata │ │ ├── README.md │ │ └── notifications.yaml ├── compat │ ├── api.go │ ├── callbacks.go │ ├── debug_default.go │ ├── debug_linux.go │ ├── debug_windows.go │ ├── iptables.go │ ├── iptables_test.go │ ├── module.go │ ├── notify.go │ ├── selfcheck.go │ ├── wfpstate.go │ └── wfpstate_test.go ├── config.go ├── core │ ├── api.go │ ├── base │ │ ├── databases.go │ │ ├── global.go │ │ ├── logs.go │ │ ├── module.go │ │ └── profiling.go │ ├── config.go │ ├── core.go │ ├── events.go │ ├── os_default.go │ └── os_windows.go ├── debug.go ├── debug_test.go ├── detection │ └── dga │ │ ├── lms.go │ │ └── lms_test.go ├── firewall │ ├── api.go │ ├── bypassing.go │ ├── config.go │ ├── dns.go │ ├── inspection │ │ └── inspection.go │ ├── interception │ │ ├── dnsmonitor │ │ │ ├── etwlink_windows.go │ │ │ ├── eventlistener.go │ │ │ ├── eventlistener_linux.go │ │ │ ├── eventlistener_windows.go │ │ │ ├── module.go │ │ │ └── varlinktypes.go │ │ ├── ebpf │ │ │ ├── bandwidth │ │ │ │ ├── bpf_bpfeb.go │ │ │ │ ├── bpf_bpfeb.o │ │ │ │ ├── bpf_bpfel.go │ │ │ │ ├── bpf_bpfel.o │ │ │ │ └── interface.go │ │ │ ├── connection_listener │ │ │ │ ├── bpf_bpfeb.go │ │ │ │ ├── bpf_bpfeb.o │ │ │ │ ├── bpf_bpfel.go │ │ │ │ ├── bpf_bpfel.o │ │ │ │ └── worker.go │ │ │ ├── exec │ │ │ │ ├── bpf_bpfeb.go │ │ │ │ ├── bpf_bpfeb.o │ │ │ │ ├── bpf_bpfel.go │ │ │ │ ├── bpf_bpfel.o │ │ │ │ └── exec.go │ │ │ └── programs │ │ │ │ ├── bandwidth.c │ │ │ │ ├── bpf │ │ │ │ ├── bpf_core_read.h │ │ │ │ ├── bpf_helper_defs.h │ │ │ │ ├── bpf_helpers.h │ │ │ │ └── bpf_tracing.h │ │ │ │ ├── exec.c │ │ │ │ ├── monitor.c │ │ │ │ ├── update.sh │ │ │ │ └── vmlinux-x86.h │ │ ├── interception_default.go │ │ ├── interception_linux.go │ │ ├── interception_windows.go │ │ ├── introspection.go │ │ ├── module.go │ │ ├── nfq │ │ │ ├── conntrack.go │ │ │ ├── nfq.go │ │ │ └── packet.go │ │ ├── nfqueue_linux.go │ │ ├── packet_tracer.go │ │ ├── windowskext │ │ │ ├── bandwidth_stats.go │ │ │ ├── doc.go │ │ │ ├── handler.go │ │ │ ├── kext.go │ │ │ ├── packet.go │ │ │ ├── service.go │ │ │ └── syscall.go │ │ └── windowskext2 │ │ │ ├── doc.go │ │ │ ├── handler.go │ │ │ ├── kext.go │ │ │ ├── packet.go │ │ │ └── service.go │ ├── master.go │ ├── module.go │ ├── packet_handler.go │ ├── preauth.go │ ├── prompt.go │ └── tunnel.go ├── instance.go ├── integration │ ├── etw_windows.go │ ├── integration.go │ ├── integration_windows.go │ └── module.go ├── intel │ ├── block_reason.go │ ├── customlists │ │ ├── config.go │ │ ├── lists.go │ │ └── module.go │ ├── entity.go │ ├── entity_test.go │ ├── filterlists │ │ ├── bloom.go │ │ ├── cache_version.go │ │ ├── database.go │ │ ├── decoder.go │ │ ├── index.go │ │ ├── keys.go │ │ ├── lookup.go │ │ ├── module.go │ │ ├── module_test.go │ │ ├── record.go │ │ └── updater.go │ ├── geoip │ │ ├── country_info.go │ │ ├── country_info_test.go │ │ ├── database.go │ │ ├── init_test.go │ │ ├── location.go │ │ ├── location_test.go │ │ ├── lookup.go │ │ ├── lookup_test.go │ │ ├── module.go │ │ ├── regions.go │ │ └── regions_test.go │ └── resolver.go ├── mgr │ ├── doc.go │ ├── events.go │ ├── group.go │ ├── group_ext.go │ ├── manager.go │ ├── sleepyticker.go │ ├── sleepyticker_test.go │ ├── states.go │ ├── worker.go │ ├── worker_info.go │ ├── worker_test.go │ ├── workermgr.go │ └── workermgr_test.go ├── nameserver │ ├── config.go │ ├── conflict.go │ ├── failing.go │ ├── metrics.go │ ├── module.go │ ├── nameserver.go │ ├── nsutil │ │ └── nsutil.go │ └── response.go ├── netenv │ ├── addresses_test.go │ ├── adresses.go │ ├── api.go │ ├── dbus_linux.go │ ├── dbus_linux_test.go │ ├── dialing.go │ ├── environment.go │ ├── environment_default.go │ ├── environment_linux.go │ ├── environment_linux_test.go │ ├── environment_test.go │ ├── environment_windows.go │ ├── environment_windows_test.go │ ├── icmp_listener.go │ ├── init_test.go │ ├── location.go │ ├── location_default.go │ ├── location_test.go │ ├── location_windows.go │ ├── main.go │ ├── main_test.go │ ├── network-change.go │ ├── notes.md │ ├── online-status.go │ ├── online-status_test.go │ ├── os_android.go │ └── os_default.go ├── netquery │ ├── active_chart_handler.go │ ├── bandwidth_chart_handler.go │ ├── database.go │ ├── manager.go │ ├── module_api.go │ ├── orm │ │ ├── decoder.go │ │ ├── decoder_test.go │ │ ├── encoder.go │ │ ├── encoder_test.go │ │ ├── query_runner.go │ │ ├── schema_builder.go │ │ └── schema_builder_test.go │ ├── query.go │ ├── query_handler.go │ ├── query_request.go │ ├── query_test.go │ └── runtime_query_runner.go ├── network │ ├── api.go │ ├── api_test.go │ ├── clean.go │ ├── connection.go │ ├── connection_android.go │ ├── connection_handler.go │ ├── connection_store.go │ ├── database.go │ ├── dns.go │ ├── iphelper │ │ ├── get.go │ │ ├── iphelper.go │ │ ├── tables.go │ │ └── tables_test.go │ ├── metrics.go │ ├── module.go │ ├── multicast.go │ ├── netutils │ │ ├── address.go │ │ ├── dns.go │ │ ├── dns_test.go │ │ ├── ip.go │ │ ├── ip_test.go │ │ └── tcpassembly.go │ ├── packet │ │ ├── bandwidth.go │ │ ├── const.go │ │ ├── info_only.go │ │ ├── packet.go │ │ ├── packetinfo.go │ │ └── parse.go │ ├── ports.go │ ├── proc │ │ ├── findpid.go │ │ ├── pids_by_user.go │ │ ├── tables.go │ │ └── tables_test.go │ ├── reference │ │ ├── ports.go │ │ └── protocols.go │ ├── socket │ │ └── socket.go │ ├── state │ │ ├── exists.go │ │ ├── info.go │ │ ├── lookup.go │ │ ├── system_default.go │ │ ├── system_linux.go │ │ ├── system_windows.go │ │ ├── tcp.go │ │ └── udp.go │ └── status.go ├── process │ ├── api.go │ ├── config.go │ ├── database.go │ ├── doc.go │ ├── executable.go │ ├── find.go │ ├── module.go │ ├── process.go │ ├── process_default.go │ ├── process_linux.go │ ├── process_windows.go │ ├── profile.go │ ├── special.go │ ├── tags.go │ └── tags │ │ ├── appimage_unix.go │ │ ├── flatpak_unix.go │ │ ├── interpreter_unix.go │ │ ├── net.go │ │ ├── snap_unix.go │ │ ├── svchost_windows.go │ │ └── winstore_windows.go ├── profile │ ├── active.go │ ├── api.go │ ├── binmeta │ │ ├── convert.go │ │ ├── find_default.go │ │ ├── find_linux.go │ │ ├── find_linux_test.go │ │ ├── find_windows.go │ │ ├── find_windows_test.go │ │ ├── icon.go │ │ ├── icons.go │ │ ├── ignore.go │ │ ├── locations_linux.go │ │ ├── name.go │ │ └── name_test.go │ ├── config-update.go │ ├── config.go │ ├── database.go │ ├── endpoints │ │ ├── annotations.go │ │ ├── endpoint-any.go │ │ ├── endpoint-asn.go │ │ ├── endpoint-continent.go │ │ ├── endpoint-country.go │ │ ├── endpoint-domain.go │ │ ├── endpoint-ip.go │ │ ├── endpoint-iprange.go │ │ ├── endpoint-lists.go │ │ ├── endpoint-scopes.go │ │ ├── endpoint.go │ │ ├── endpoint_test.go │ │ ├── endpoints.go │ │ ├── endpoints_test.go │ │ └── reason.go │ ├── fingerprint.go │ ├── fingerprint_test.go │ ├── framework.go │ ├── framework_test.go │ ├── get.go │ ├── merge.go │ ├── meta.go │ ├── migrations.go │ ├── module.go │ ├── profile-layered-provider.go │ ├── profile-layered.go │ ├── profile.go │ └── special.go ├── resolver │ ├── api.go │ ├── block-detection.go │ ├── compat.go │ ├── config.go │ ├── doc.go │ ├── failing.go │ ├── ipinfo.go │ ├── ipinfo_test.go │ ├── main.go │ ├── main_test.go │ ├── metrics.go │ ├── namerecord.go │ ├── namerecord_test.go │ ├── resolve.go │ ├── resolver-env.go │ ├── resolver-https.go │ ├── resolver-mdns.go │ ├── resolver-plain.go │ ├── resolver-tcp.go │ ├── resolver.go │ ├── resolver_test.go │ ├── resolvers.go │ ├── resolvers_test.go │ ├── reverse.go │ ├── reverse_test.go │ ├── rr_context.go │ ├── rrcache.go │ ├── rrcache_test.go │ ├── scopes.go │ └── test │ │ └── resolving.bash ├── status │ ├── module.go │ ├── notifications.go │ ├── security_level.go │ └── status.go ├── sync │ ├── module.go │ ├── profile.go │ ├── setting_single.go │ ├── settings.go │ └── util.go ├── ui │ ├── api.go │ ├── module.go │ └── serve.go └── updates │ ├── api.go │ ├── assets │ └── portmaster.service │ ├── config.go │ ├── export.go │ ├── get.go │ ├── helper │ ├── electron.go │ ├── indexes.go │ ├── signing.go │ └── updates.go │ ├── main.go │ ├── module.go │ ├── notify.go │ ├── os_integration_default.go │ ├── os_integration_linux.go │ ├── restart.go │ ├── state.go │ └── upgrader.go ├── spn ├── TESTING.md ├── TRADEMARKS ├── access │ ├── account │ │ ├── auth.go │ │ ├── client.go │ │ ├── types.go │ │ └── view.go │ ├── api.go │ ├── client.go │ ├── client_test.go │ ├── database.go │ ├── features.go │ ├── module.go │ ├── module_test.go │ ├── notify.go │ ├── op_auth.go │ ├── storage.go │ ├── token │ │ ├── errors.go │ │ ├── module_test.go │ │ ├── pblind.go │ │ ├── pblind_gen_test.go │ │ ├── pblind_test.go │ │ ├── registry.go │ │ ├── request.go │ │ ├── request_test.go │ │ ├── scramble.go │ │ ├── scramble_gen_test.go │ │ ├── scramble_test.go │ │ ├── token.go │ │ └── token_test.go │ └── zones.go ├── cabin │ ├── config-public.go │ ├── database.go │ ├── identity.go │ ├── identity_test.go │ ├── keys.go │ ├── keys_test.go │ ├── module.go │ ├── module_test.go │ ├── verification.go │ └── verification_test.go ├── captain │ ├── api.go │ ├── bootstrap.go │ ├── client.go │ ├── config.go │ ├── establish.go │ ├── exceptions.go │ ├── gossip.go │ ├── hooks.go │ ├── intel.go │ ├── module.go │ ├── navigation.go │ ├── op_gossip.go │ ├── op_gossip_query.go │ ├── op_publish.go │ ├── piers.go │ ├── public.go │ └── status.go ├── conf │ ├── map.go │ ├── mode.go │ ├── networks.go │ └── version.go ├── crew │ ├── connect.go │ ├── metrics.go │ ├── module.go │ ├── module_test.go │ ├── op_connect.go │ ├── op_connect_test.go │ ├── op_ping.go │ ├── op_ping_test.go │ ├── policy.go │ └── sticky.go ├── debug.go ├── docks │ ├── bandwidth_test.go │ ├── controller.go │ ├── crane.go │ ├── crane_establish.go │ ├── crane_init.go │ ├── crane_netstate.go │ ├── crane_terminal.go │ ├── crane_test.go │ ├── crane_verify.go │ ├── cranehooks.go │ ├── hub_import.go │ ├── measurements.go │ ├── metrics.go │ ├── module.go │ ├── module_test.go │ ├── op_capacity.go │ ├── op_capacity_test.go │ ├── op_expand.go │ ├── op_latency.go │ ├── op_latency_test.go │ ├── op_sync_state.go │ ├── op_whoami.go │ ├── op_whoami_test.go │ ├── terminal_expansion.go │ └── terminal_expansion_test.go ├── hub │ ├── database.go │ ├── errors.go │ ├── format.go │ ├── format_test.go │ ├── hub.go │ ├── hub_test.go │ ├── intel.go │ ├── intel_override.go │ ├── measurements.go │ ├── status.go │ ├── transport.go │ ├── transport_test.go │ ├── truststores.go │ ├── update.go │ └── update_test.go ├── instance.go ├── navigator │ ├── api.go │ ├── api_route.go │ ├── costs.go │ ├── database.go │ ├── findnearest.go │ ├── findnearest_test.go │ ├── findroutes.go │ ├── findroutes_test.go │ ├── intel.go │ ├── map.go │ ├── map_stats.go │ ├── map_test.go │ ├── measurements.go │ ├── metrics.go │ ├── module.go │ ├── module_test.go │ ├── optimize.go │ ├── optimize_region.go │ ├── optimize_test.go │ ├── options.go │ ├── pin.go │ ├── pin_export.go │ ├── region.go │ ├── route.go │ ├── routing-profiles.go │ ├── sort.go │ ├── sort_test.go │ ├── state.go │ ├── state_test.go │ ├── testdata │ │ └── main-intel.yml │ └── update.go ├── patrol │ ├── domains.go │ ├── domains_test.go │ ├── http.go │ └── module.go ├── ships │ ├── connection_test.go │ ├── http.go │ ├── http_info.go │ ├── http_info_page.html.tmpl │ ├── http_info_test.go │ ├── http_shared.go │ ├── http_shared_test.go │ ├── kcp.go │ ├── launch.go │ ├── masking.go │ ├── module.go │ ├── mtu.go │ ├── pier.go │ ├── registry.go │ ├── ship.go │ ├── tcp.go │ ├── testship.go │ ├── testship_test.go │ └── virtual_network.go ├── sluice │ ├── module.go │ ├── packet_listener.go │ ├── request.go │ ├── sluice.go │ ├── sluices.go │ └── udp_listener.go ├── spn.go ├── terminal │ ├── control_flow.go │ ├── defaults.go │ ├── errors.go │ ├── fmt.go │ ├── init.go │ ├── metrics.go │ ├── module.go │ ├── module_test.go │ ├── msg.go │ ├── msgtypes.go │ ├── operation.go │ ├── operation_base.go │ ├── operation_counter.go │ ├── permission.go │ ├── rate_limit.go │ ├── session.go │ ├── session_test.go │ ├── terminal.go │ ├── terminal_test.go │ ├── testing.go │ └── upstream.go ├── test ├── testing │ ├── README.md │ └── simple │ │ ├── README.md │ │ ├── clientsim.sh │ │ ├── config-template.json │ │ ├── docker-compose.yml │ │ ├── entrypoint.sh │ │ ├── inject-intel.sh │ │ ├── intel-client.yaml │ │ ├── intel-testnet.json │ │ ├── join.sh │ │ ├── reset-databases.sh │ │ ├── run.sh │ │ └── stop.sh ├── tools │ ├── Dockerfile │ ├── container-init.sh │ ├── install.sh │ ├── start-checksum.txt │ └── sysctl.conf └── unit │ ├── doc.go │ ├── scheduler.go │ ├── scheduler_stats.go │ ├── scheduler_test.go │ ├── unit.go │ ├── unit_debug.go │ └── unit_test.go ├── windows_core_dll ├── build.ps1 ├── dllmain.cpp ├── framework.h ├── pch.cpp ├── pch.h ├── windows_core_dll.sln ├── windows_core_dll.vcxproj ├── windows_core_dll.vcxproj.filters └── windows_core_dll.vcxproj.user └── windows_kext ├── .gitignore ├── Cargo.lock ├── PacketFlow.md ├── PortmasterKext64.inf ├── README.md ├── c_helper ├── ARM64 │ └── c_helper.lib ├── c_helper.filters ├── c_helper.sln ├── c_helper.vcxproj ├── helper.c └── x64 │ └── c_helper.lib ├── driver ├── .cargo │ └── config.toml ├── Cargo.lock ├── Cargo.toml ├── Makefile.toml ├── README.md ├── rust-toolchain └── src │ ├── ale_callouts.rs │ ├── array_holder.rs │ ├── bandwidth.rs │ ├── callouts.rs │ ├── common.rs │ ├── connection.rs │ ├── connection_cache.rs │ ├── connection_map.rs │ ├── device.rs │ ├── entry.rs │ ├── id_cache.rs │ ├── lib.rs │ ├── logger.rs │ ├── packet_callouts.rs │ ├── packet_util.rs │ └── stream_callouts.rs ├── kextinterface ├── command.go ├── info.go ├── ioctl.go ├── kext.go ├── kext_file.go ├── kext_file_test.go ├── protocol_test.go ├── testdata │ └── rust_info_test.bin └── version.txt ├── link-dev.ps1 ├── protocol ├── Cargo.lock ├── Cargo.toml ├── README.md ├── src │ ├── command.rs │ ├── info.rs │ └── lib.rs └── testdata │ └── go_command_test.bin ├── release ├── Cargo.lock ├── Cargo.toml ├── README.md ├── src │ └── main.rs └── templates │ ├── PortmasterKext.ddf │ ├── PortmasterKext64.inf │ ├── build_cab.ps1 │ └── version.rc ├── test_protocol.sh └── wdk ├── .cargo └── config.toml ├── Cargo.lock ├── Cargo.toml ├── README.md ├── build.rs ├── rust-analyzer.cargo.target ├── rust-toolchain └── src ├── allocator.rs ├── attributes.rs ├── consts.rs ├── debug.rs ├── driver.rs ├── error.rs ├── fast_mutex.rs ├── ffi.rs ├── filter_engine ├── callout.rs ├── callout_data.rs ├── classify.rs ├── connect_request.rs ├── ffi.rs ├── layer.rs ├── metadata.rs ├── mod.rs ├── net_buffer.rs ├── packet.rs ├── stream_data.rs └── transaction.rs ├── interface.rs ├── ioqueue.rs ├── irp_helpers.rs ├── lib.rs ├── rw_spin_lock.rs ├── spin_lock.rs └── utils.rs /.angulardoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "repoId": "8f466ce7-4b75-4048-8b8a-cad5bf173aa0", 3 | "lastSync": 0 4 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Treat all Go files in this repo as binary, with no git magic updating 2 | # line endings. Windows users contributing to Go will need to use a 3 | # modern version of git and editors capable of LF line endings. 4 | 5 | *.go -text diff=golang 6 | 7 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: safing 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/suggest-feature.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "💡 Suggest an Improvement or Feature" 3 | about: Suggest an enhancement or a new feature for the Portmaster 4 | labels: suggestion 5 | --- 6 | 7 | **What would you like to add or change?**: 8 | 9 | 10 | 11 | **Why do you and others need this?**: 12 | 13 | 14 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | All files in this repository (unless otherwise noted) are authored, owned and copyrighted by Safing ICS Technologies GmbH (Austria). 2 | -------------------------------------------------------------------------------- /TESTING.md: -------------------------------------------------------------------------------- 1 | # Testing Portmaster 2 | 3 | This page documents ways to test if Portmaster works as intended. 4 | 5 | ⚠ Work in Progress. Currently we are just collecting helpful things we find. 6 | 7 | ## Websites for Testing: 8 | 9 | - : Check 10 | - ICMP path MTU packet delivery 11 | - IP fragmented packet delivery 12 | -------------------------------------------------------------------------------- /assets/data/favicons/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/android-icon-144x144.png -------------------------------------------------------------------------------- /assets/data/favicons/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/android-icon-192x192.png -------------------------------------------------------------------------------- /assets/data/favicons/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/android-icon-36x36.png -------------------------------------------------------------------------------- /assets/data/favicons/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/android-icon-48x48.png -------------------------------------------------------------------------------- /assets/data/favicons/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/android-icon-72x72.png -------------------------------------------------------------------------------- /assets/data/favicons/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/android-icon-96x96.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon-114x114.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon-120x120.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon-144x144.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon-152x152.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon-180x180.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon-57x57.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon-60x60.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon-72x72.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon-76x76.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon-precomposed.png -------------------------------------------------------------------------------- /assets/data/favicons/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/apple-icon.png -------------------------------------------------------------------------------- /assets/data/favicons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #121213 3 | -------------------------------------------------------------------------------- /assets/data/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /assets/data/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /assets/data/favicons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/favicon-96x96.png -------------------------------------------------------------------------------- /assets/data/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/favicon.ico -------------------------------------------------------------------------------- /assets/data/favicons/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/ms-icon-144x144.png -------------------------------------------------------------------------------- /assets/data/favicons/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/ms-icon-150x150.png -------------------------------------------------------------------------------- /assets/data/favicons/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/ms-icon-310x310.png -------------------------------------------------------------------------------- /assets/data/favicons/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/favicons/ms-icon-70x70.png -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-300/Roboto-300.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-300/Roboto-300.eot -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-300/Roboto-300.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-300/Roboto-300.ttf -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-300/Roboto-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-300/Roboto-300.woff -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-300/Roboto-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-300/Roboto-300.woff2 -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-300italic/Roboto-300italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-300italic/Roboto-300italic.eot -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-300italic/Roboto-300italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-300italic/Roboto-300italic.ttf -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-300italic/Roboto-300italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-300italic/Roboto-300italic.woff -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-300italic/Roboto-300italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-300italic/Roboto-300italic.woff2 -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-500/Roboto-500.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-500/Roboto-500.eot -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-500/Roboto-500.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-500/Roboto-500.ttf -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-500/Roboto-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-500/Roboto-500.woff -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-500/Roboto-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-500/Roboto-500.woff2 -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-500italic/Roboto-500italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-500italic/Roboto-500italic.eot -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-500italic/Roboto-500italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-500italic/Roboto-500italic.ttf -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-500italic/Roboto-500italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-500italic/Roboto-500italic.woff -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-500italic/Roboto-500italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-500italic/Roboto-500italic.woff2 -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-700/Roboto-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-700/Roboto-700.eot -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-700/Roboto-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-700/Roboto-700.ttf -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-700/Roboto-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-700/Roboto-700.woff -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-700/Roboto-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-700/Roboto-700.woff2 -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-700italic/Roboto-700italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-700italic/Roboto-700italic.eot -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-700italic/Roboto-700italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-700italic/Roboto-700italic.ttf -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-700italic/Roboto-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-700italic/Roboto-700italic.woff -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-700italic/Roboto-700italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-700italic/Roboto-700italic.woff2 -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-italic/Roboto-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-italic/Roboto-italic.eot -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-italic/Roboto-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-italic/Roboto-italic.ttf -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-italic/Roboto-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-italic/Roboto-italic.woff -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-italic/Roboto-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-italic/Roboto-italic.woff2 -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-regular/Roboto-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-regular/Roboto-regular.eot -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-regular/Roboto-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-regular/Roboto-regular.ttf -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-regular/Roboto-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-regular/Roboto-regular.woff -------------------------------------------------------------------------------- /assets/data/fonts/Roboto-regular/Roboto-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/fonts/Roboto-regular/Roboto-regular.woff2 -------------------------------------------------------------------------------- /assets/data/icons/README.md: -------------------------------------------------------------------------------- 1 | # .ICOs 2 | 3 | converted using https://www.icoconverter.com/ 4 | -------------------------------------------------------------------------------- /assets/data/icons/pm_dark.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark.ico -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_128.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_256.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_512.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_blue.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_blue.ico -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_blue.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_blue_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_blue_128.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_blue_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_blue_256.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_blue_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_blue_512.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_blue_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_blue_64.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_green.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_green.ico -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_green_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_green_128.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_green_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_green_256.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_green_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_green_512.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_green_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_green_64.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_red.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_red.ico -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_red.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_red_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_red_128.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_red_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_red_256.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_red_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_red_512.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_red_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_red_64.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_yellow.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_yellow.ico -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_yellow.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_yellow_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_yellow_128.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_yellow_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_yellow_256.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_yellow_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_yellow_512.png -------------------------------------------------------------------------------- /assets/data/icons/pm_dark_yellow_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_dark_yellow_64.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light.ico -------------------------------------------------------------------------------- /assets/data/icons/pm_light_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_128.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_256.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_512.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_blue.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_blue.ico -------------------------------------------------------------------------------- /assets/data/icons/pm_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_blue.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_blue_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_blue_128.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_blue_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_blue_256.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_blue_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_blue_512.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_blue_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_blue_64.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_green.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_green.ico -------------------------------------------------------------------------------- /assets/data/icons/pm_light_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_green.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_green_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_green_128.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_green_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_green_256.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_green_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_green_512.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_green_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_green_64.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_red.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_red.ico -------------------------------------------------------------------------------- /assets/data/icons/pm_light_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_red.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_red_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_red_128.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_red_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_red_256.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_red_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_red_512.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_red_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_red_64.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_yellow.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_yellow.ico -------------------------------------------------------------------------------- /assets/data/icons/pm_light_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_yellow.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_yellow_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_yellow_128.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_yellow_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_yellow_256.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_yellow_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_yellow_512.png -------------------------------------------------------------------------------- /assets/data/icons/pm_light_yellow_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/icons/pm_light_yellow_64.png -------------------------------------------------------------------------------- /assets/data/img/flags/AD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AD.png -------------------------------------------------------------------------------- /assets/data/img/flags/AE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AE.png -------------------------------------------------------------------------------- /assets/data/img/flags/AF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AF.png -------------------------------------------------------------------------------- /assets/data/img/flags/AG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AG.png -------------------------------------------------------------------------------- /assets/data/img/flags/AI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AI.png -------------------------------------------------------------------------------- /assets/data/img/flags/AL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AL.png -------------------------------------------------------------------------------- /assets/data/img/flags/AM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AM.png -------------------------------------------------------------------------------- /assets/data/img/flags/AN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AN.png -------------------------------------------------------------------------------- /assets/data/img/flags/AO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AO.png -------------------------------------------------------------------------------- /assets/data/img/flags/AQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AQ.png -------------------------------------------------------------------------------- /assets/data/img/flags/AR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AR.png -------------------------------------------------------------------------------- /assets/data/img/flags/AS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AS.png -------------------------------------------------------------------------------- /assets/data/img/flags/AT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AT.png -------------------------------------------------------------------------------- /assets/data/img/flags/AU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AU.png -------------------------------------------------------------------------------- /assets/data/img/flags/AW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AW.png -------------------------------------------------------------------------------- /assets/data/img/flags/AX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AX.png -------------------------------------------------------------------------------- /assets/data/img/flags/AZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/AZ.png -------------------------------------------------------------------------------- /assets/data/img/flags/BA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BA.png -------------------------------------------------------------------------------- /assets/data/img/flags/BB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BB.png -------------------------------------------------------------------------------- /assets/data/img/flags/BD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BD.png -------------------------------------------------------------------------------- /assets/data/img/flags/BE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BE.png -------------------------------------------------------------------------------- /assets/data/img/flags/BF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BF.png -------------------------------------------------------------------------------- /assets/data/img/flags/BG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BG.png -------------------------------------------------------------------------------- /assets/data/img/flags/BH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BH.png -------------------------------------------------------------------------------- /assets/data/img/flags/BI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BI.png -------------------------------------------------------------------------------- /assets/data/img/flags/BJ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BJ.png -------------------------------------------------------------------------------- /assets/data/img/flags/BL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BL.png -------------------------------------------------------------------------------- /assets/data/img/flags/BM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BM.png -------------------------------------------------------------------------------- /assets/data/img/flags/BN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BN.png -------------------------------------------------------------------------------- /assets/data/img/flags/BO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BO.png -------------------------------------------------------------------------------- /assets/data/img/flags/BR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BR.png -------------------------------------------------------------------------------- /assets/data/img/flags/BS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BS.png -------------------------------------------------------------------------------- /assets/data/img/flags/BT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BT.png -------------------------------------------------------------------------------- /assets/data/img/flags/BW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BW.png -------------------------------------------------------------------------------- /assets/data/img/flags/BY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BY.png -------------------------------------------------------------------------------- /assets/data/img/flags/BZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/BZ.png -------------------------------------------------------------------------------- /assets/data/img/flags/CA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CA.png -------------------------------------------------------------------------------- /assets/data/img/flags/CC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CC.png -------------------------------------------------------------------------------- /assets/data/img/flags/CD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CD.png -------------------------------------------------------------------------------- /assets/data/img/flags/CF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CF.png -------------------------------------------------------------------------------- /assets/data/img/flags/CG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CG.png -------------------------------------------------------------------------------- /assets/data/img/flags/CH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CH.png -------------------------------------------------------------------------------- /assets/data/img/flags/CI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CI.png -------------------------------------------------------------------------------- /assets/data/img/flags/CK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CK.png -------------------------------------------------------------------------------- /assets/data/img/flags/CL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CL.png -------------------------------------------------------------------------------- /assets/data/img/flags/CM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CM.png -------------------------------------------------------------------------------- /assets/data/img/flags/CN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CN.png -------------------------------------------------------------------------------- /assets/data/img/flags/CO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CO.png -------------------------------------------------------------------------------- /assets/data/img/flags/CR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CR.png -------------------------------------------------------------------------------- /assets/data/img/flags/CT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CT.png -------------------------------------------------------------------------------- /assets/data/img/flags/CU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CU.png -------------------------------------------------------------------------------- /assets/data/img/flags/CV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CV.png -------------------------------------------------------------------------------- /assets/data/img/flags/CW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CW.png -------------------------------------------------------------------------------- /assets/data/img/flags/CX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CX.png -------------------------------------------------------------------------------- /assets/data/img/flags/CY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CY.png -------------------------------------------------------------------------------- /assets/data/img/flags/CZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/CZ.png -------------------------------------------------------------------------------- /assets/data/img/flags/DE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/DE.png -------------------------------------------------------------------------------- /assets/data/img/flags/DJ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/DJ.png -------------------------------------------------------------------------------- /assets/data/img/flags/DK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/DK.png -------------------------------------------------------------------------------- /assets/data/img/flags/DM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/DM.png -------------------------------------------------------------------------------- /assets/data/img/flags/DO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/DO.png -------------------------------------------------------------------------------- /assets/data/img/flags/DZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/DZ.png -------------------------------------------------------------------------------- /assets/data/img/flags/EC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/EC.png -------------------------------------------------------------------------------- /assets/data/img/flags/EE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/EE.png -------------------------------------------------------------------------------- /assets/data/img/flags/EG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/EG.png -------------------------------------------------------------------------------- /assets/data/img/flags/EH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/EH.png -------------------------------------------------------------------------------- /assets/data/img/flags/ER.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/ER.png -------------------------------------------------------------------------------- /assets/data/img/flags/ES.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/ES.png -------------------------------------------------------------------------------- /assets/data/img/flags/ET.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/ET.png -------------------------------------------------------------------------------- /assets/data/img/flags/EU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/EU.png -------------------------------------------------------------------------------- /assets/data/img/flags/FI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/FI.png -------------------------------------------------------------------------------- /assets/data/img/flags/FJ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/FJ.png -------------------------------------------------------------------------------- /assets/data/img/flags/FK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/FK.png -------------------------------------------------------------------------------- /assets/data/img/flags/FM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/FM.png -------------------------------------------------------------------------------- /assets/data/img/flags/FO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/FO.png -------------------------------------------------------------------------------- /assets/data/img/flags/FR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/FR.png -------------------------------------------------------------------------------- /assets/data/img/flags/GA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GA.png -------------------------------------------------------------------------------- /assets/data/img/flags/GB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GB.png -------------------------------------------------------------------------------- /assets/data/img/flags/GD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GD.png -------------------------------------------------------------------------------- /assets/data/img/flags/GE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GE.png -------------------------------------------------------------------------------- /assets/data/img/flags/GG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GG.png -------------------------------------------------------------------------------- /assets/data/img/flags/GH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GH.png -------------------------------------------------------------------------------- /assets/data/img/flags/GI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GI.png -------------------------------------------------------------------------------- /assets/data/img/flags/GL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GL.png -------------------------------------------------------------------------------- /assets/data/img/flags/GM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GM.png -------------------------------------------------------------------------------- /assets/data/img/flags/GN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GN.png -------------------------------------------------------------------------------- /assets/data/img/flags/GQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GQ.png -------------------------------------------------------------------------------- /assets/data/img/flags/GR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GR.png -------------------------------------------------------------------------------- /assets/data/img/flags/GS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GS.png -------------------------------------------------------------------------------- /assets/data/img/flags/GT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GT.png -------------------------------------------------------------------------------- /assets/data/img/flags/GU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GU.png -------------------------------------------------------------------------------- /assets/data/img/flags/GW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GW.png -------------------------------------------------------------------------------- /assets/data/img/flags/GY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/GY.png -------------------------------------------------------------------------------- /assets/data/img/flags/HK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/HK.png -------------------------------------------------------------------------------- /assets/data/img/flags/HN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/HN.png -------------------------------------------------------------------------------- /assets/data/img/flags/HR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/HR.png -------------------------------------------------------------------------------- /assets/data/img/flags/HT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/HT.png -------------------------------------------------------------------------------- /assets/data/img/flags/HU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/HU.png -------------------------------------------------------------------------------- /assets/data/img/flags/IC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/IC.png -------------------------------------------------------------------------------- /assets/data/img/flags/ID.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/ID.png -------------------------------------------------------------------------------- /assets/data/img/flags/IE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/IE.png -------------------------------------------------------------------------------- /assets/data/img/flags/IL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/IL.png -------------------------------------------------------------------------------- /assets/data/img/flags/IM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/IM.png -------------------------------------------------------------------------------- /assets/data/img/flags/IN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/IN.png -------------------------------------------------------------------------------- /assets/data/img/flags/IQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/IQ.png -------------------------------------------------------------------------------- /assets/data/img/flags/IR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/IR.png -------------------------------------------------------------------------------- /assets/data/img/flags/IS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/IS.png -------------------------------------------------------------------------------- /assets/data/img/flags/IT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/IT.png -------------------------------------------------------------------------------- /assets/data/img/flags/JE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/JE.png -------------------------------------------------------------------------------- /assets/data/img/flags/JM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/JM.png -------------------------------------------------------------------------------- /assets/data/img/flags/JO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/JO.png -------------------------------------------------------------------------------- /assets/data/img/flags/JP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/JP.png -------------------------------------------------------------------------------- /assets/data/img/flags/KE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KE.png -------------------------------------------------------------------------------- /assets/data/img/flags/KG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KG.png -------------------------------------------------------------------------------- /assets/data/img/flags/KH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KH.png -------------------------------------------------------------------------------- /assets/data/img/flags/KI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KI.png -------------------------------------------------------------------------------- /assets/data/img/flags/KM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KM.png -------------------------------------------------------------------------------- /assets/data/img/flags/KN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KN.png -------------------------------------------------------------------------------- /assets/data/img/flags/KP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KP.png -------------------------------------------------------------------------------- /assets/data/img/flags/KR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KR.png -------------------------------------------------------------------------------- /assets/data/img/flags/KW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KW.png -------------------------------------------------------------------------------- /assets/data/img/flags/KY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KY.png -------------------------------------------------------------------------------- /assets/data/img/flags/KZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/KZ.png -------------------------------------------------------------------------------- /assets/data/img/flags/LA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LA.png -------------------------------------------------------------------------------- /assets/data/img/flags/LB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LB.png -------------------------------------------------------------------------------- /assets/data/img/flags/LC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LC.png -------------------------------------------------------------------------------- /assets/data/img/flags/LI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LI.png -------------------------------------------------------------------------------- /assets/data/img/flags/LK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LK.png -------------------------------------------------------------------------------- /assets/data/img/flags/LR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LR.png -------------------------------------------------------------------------------- /assets/data/img/flags/LS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LS.png -------------------------------------------------------------------------------- /assets/data/img/flags/LT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LT.png -------------------------------------------------------------------------------- /assets/data/img/flags/LU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LU.png -------------------------------------------------------------------------------- /assets/data/img/flags/LV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LV.png -------------------------------------------------------------------------------- /assets/data/img/flags/LY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/LY.png -------------------------------------------------------------------------------- /assets/data/img/flags/MA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MA.png -------------------------------------------------------------------------------- /assets/data/img/flags/MC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MC.png -------------------------------------------------------------------------------- /assets/data/img/flags/MD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MD.png -------------------------------------------------------------------------------- /assets/data/img/flags/ME.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/ME.png -------------------------------------------------------------------------------- /assets/data/img/flags/MF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MF.png -------------------------------------------------------------------------------- /assets/data/img/flags/MG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MG.png -------------------------------------------------------------------------------- /assets/data/img/flags/MH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MH.png -------------------------------------------------------------------------------- /assets/data/img/flags/MK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MK.png -------------------------------------------------------------------------------- /assets/data/img/flags/ML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/ML.png -------------------------------------------------------------------------------- /assets/data/img/flags/MM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MM.png -------------------------------------------------------------------------------- /assets/data/img/flags/MN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MN.png -------------------------------------------------------------------------------- /assets/data/img/flags/MO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MO.png -------------------------------------------------------------------------------- /assets/data/img/flags/MP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MP.png -------------------------------------------------------------------------------- /assets/data/img/flags/MQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MQ.png -------------------------------------------------------------------------------- /assets/data/img/flags/MR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MR.png -------------------------------------------------------------------------------- /assets/data/img/flags/MS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MS.png -------------------------------------------------------------------------------- /assets/data/img/flags/MT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MT.png -------------------------------------------------------------------------------- /assets/data/img/flags/MU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MU.png -------------------------------------------------------------------------------- /assets/data/img/flags/MV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MV.png -------------------------------------------------------------------------------- /assets/data/img/flags/MW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MW.png -------------------------------------------------------------------------------- /assets/data/img/flags/MX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MX.png -------------------------------------------------------------------------------- /assets/data/img/flags/MY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MY.png -------------------------------------------------------------------------------- /assets/data/img/flags/MZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/MZ.png -------------------------------------------------------------------------------- /assets/data/img/flags/NA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NA.png -------------------------------------------------------------------------------- /assets/data/img/flags/NC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NC.png -------------------------------------------------------------------------------- /assets/data/img/flags/NE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NE.png -------------------------------------------------------------------------------- /assets/data/img/flags/NF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NF.png -------------------------------------------------------------------------------- /assets/data/img/flags/NG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NG.png -------------------------------------------------------------------------------- /assets/data/img/flags/NI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NI.png -------------------------------------------------------------------------------- /assets/data/img/flags/NL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NL.png -------------------------------------------------------------------------------- /assets/data/img/flags/NO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NO.png -------------------------------------------------------------------------------- /assets/data/img/flags/NP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NP.png -------------------------------------------------------------------------------- /assets/data/img/flags/NR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NR.png -------------------------------------------------------------------------------- /assets/data/img/flags/NU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NU.png -------------------------------------------------------------------------------- /assets/data/img/flags/NZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/NZ.png -------------------------------------------------------------------------------- /assets/data/img/flags/OM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/OM.png -------------------------------------------------------------------------------- /assets/data/img/flags/PA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PA.png -------------------------------------------------------------------------------- /assets/data/img/flags/PE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PE.png -------------------------------------------------------------------------------- /assets/data/img/flags/PF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PF.png -------------------------------------------------------------------------------- /assets/data/img/flags/PG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PG.png -------------------------------------------------------------------------------- /assets/data/img/flags/PH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PH.png -------------------------------------------------------------------------------- /assets/data/img/flags/PK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PK.png -------------------------------------------------------------------------------- /assets/data/img/flags/PL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PL.png -------------------------------------------------------------------------------- /assets/data/img/flags/PN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PN.png -------------------------------------------------------------------------------- /assets/data/img/flags/PR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PR.png -------------------------------------------------------------------------------- /assets/data/img/flags/PS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PS.png -------------------------------------------------------------------------------- /assets/data/img/flags/PT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PT.png -------------------------------------------------------------------------------- /assets/data/img/flags/PW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PW.png -------------------------------------------------------------------------------- /assets/data/img/flags/PY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/PY.png -------------------------------------------------------------------------------- /assets/data/img/flags/QA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/QA.png -------------------------------------------------------------------------------- /assets/data/img/flags/RE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/RE.png -------------------------------------------------------------------------------- /assets/data/img/flags/RO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/RO.png -------------------------------------------------------------------------------- /assets/data/img/flags/RS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/RS.png -------------------------------------------------------------------------------- /assets/data/img/flags/RU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/RU.png -------------------------------------------------------------------------------- /assets/data/img/flags/RW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/RW.png -------------------------------------------------------------------------------- /assets/data/img/flags/SA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SA.png -------------------------------------------------------------------------------- /assets/data/img/flags/SB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SB.png -------------------------------------------------------------------------------- /assets/data/img/flags/SC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SC.png -------------------------------------------------------------------------------- /assets/data/img/flags/SD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SD.png -------------------------------------------------------------------------------- /assets/data/img/flags/SE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SE.png -------------------------------------------------------------------------------- /assets/data/img/flags/SG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SG.png -------------------------------------------------------------------------------- /assets/data/img/flags/SH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SH.png -------------------------------------------------------------------------------- /assets/data/img/flags/SI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SI.png -------------------------------------------------------------------------------- /assets/data/img/flags/SK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SK.png -------------------------------------------------------------------------------- /assets/data/img/flags/SL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SL.png -------------------------------------------------------------------------------- /assets/data/img/flags/SM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SM.png -------------------------------------------------------------------------------- /assets/data/img/flags/SN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SN.png -------------------------------------------------------------------------------- /assets/data/img/flags/SO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SO.png -------------------------------------------------------------------------------- /assets/data/img/flags/SR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SR.png -------------------------------------------------------------------------------- /assets/data/img/flags/SS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SS.png -------------------------------------------------------------------------------- /assets/data/img/flags/ST.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/ST.png -------------------------------------------------------------------------------- /assets/data/img/flags/SV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SV.png -------------------------------------------------------------------------------- /assets/data/img/flags/SX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SX.png -------------------------------------------------------------------------------- /assets/data/img/flags/SY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SY.png -------------------------------------------------------------------------------- /assets/data/img/flags/SZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/SZ.png -------------------------------------------------------------------------------- /assets/data/img/flags/TC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TC.png -------------------------------------------------------------------------------- /assets/data/img/flags/TD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TD.png -------------------------------------------------------------------------------- /assets/data/img/flags/TF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TF.png -------------------------------------------------------------------------------- /assets/data/img/flags/TG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TG.png -------------------------------------------------------------------------------- /assets/data/img/flags/TH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TH.png -------------------------------------------------------------------------------- /assets/data/img/flags/TJ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TJ.png -------------------------------------------------------------------------------- /assets/data/img/flags/TK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TK.png -------------------------------------------------------------------------------- /assets/data/img/flags/TL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TL.png -------------------------------------------------------------------------------- /assets/data/img/flags/TM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TM.png -------------------------------------------------------------------------------- /assets/data/img/flags/TN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TN.png -------------------------------------------------------------------------------- /assets/data/img/flags/TO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TO.png -------------------------------------------------------------------------------- /assets/data/img/flags/TR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TR.png -------------------------------------------------------------------------------- /assets/data/img/flags/TT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TT.png -------------------------------------------------------------------------------- /assets/data/img/flags/TV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TV.png -------------------------------------------------------------------------------- /assets/data/img/flags/TW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TW.png -------------------------------------------------------------------------------- /assets/data/img/flags/TZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/TZ.png -------------------------------------------------------------------------------- /assets/data/img/flags/UA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/UA.png -------------------------------------------------------------------------------- /assets/data/img/flags/UG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/UG.png -------------------------------------------------------------------------------- /assets/data/img/flags/US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/US.png -------------------------------------------------------------------------------- /assets/data/img/flags/UY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/UY.png -------------------------------------------------------------------------------- /assets/data/img/flags/UZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/UZ.png -------------------------------------------------------------------------------- /assets/data/img/flags/VA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/VA.png -------------------------------------------------------------------------------- /assets/data/img/flags/VC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/VC.png -------------------------------------------------------------------------------- /assets/data/img/flags/VE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/VE.png -------------------------------------------------------------------------------- /assets/data/img/flags/VG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/VG.png -------------------------------------------------------------------------------- /assets/data/img/flags/VI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/VI.png -------------------------------------------------------------------------------- /assets/data/img/flags/VN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/VN.png -------------------------------------------------------------------------------- /assets/data/img/flags/VU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/VU.png -------------------------------------------------------------------------------- /assets/data/img/flags/WF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/WF.png -------------------------------------------------------------------------------- /assets/data/img/flags/WS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/WS.png -------------------------------------------------------------------------------- /assets/data/img/flags/YE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/YE.png -------------------------------------------------------------------------------- /assets/data/img/flags/YT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/YT.png -------------------------------------------------------------------------------- /assets/data/img/flags/ZA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/ZA.png -------------------------------------------------------------------------------- /assets/data/img/flags/ZM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/ZM.png -------------------------------------------------------------------------------- /assets/data/img/flags/ZW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/ZW.png -------------------------------------------------------------------------------- /assets/data/img/flags/__.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/__.png -------------------------------------------------------------------------------- /assets/data/img/flags/_abkhazia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_abkhazia.png -------------------------------------------------------------------------------- /assets/data/img/flags/_basque-country.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_basque-country.png -------------------------------------------------------------------------------- /assets/data/img/flags/_british-antarctic-territory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_british-antarctic-territory.png -------------------------------------------------------------------------------- /assets/data/img/flags/_commonwealth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_commonwealth.png -------------------------------------------------------------------------------- /assets/data/img/flags/_england.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_england.png -------------------------------------------------------------------------------- /assets/data/img/flags/_gosquared.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_gosquared.png -------------------------------------------------------------------------------- /assets/data/img/flags/_kosovo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_kosovo.png -------------------------------------------------------------------------------- /assets/data/img/flags/_mars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_mars.png -------------------------------------------------------------------------------- /assets/data/img/flags/_nagorno-karabakh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_nagorno-karabakh.png -------------------------------------------------------------------------------- /assets/data/img/flags/_nato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_nato.png -------------------------------------------------------------------------------- /assets/data/img/flags/_northern-cyprus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_northern-cyprus.png -------------------------------------------------------------------------------- /assets/data/img/flags/_olympics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_olympics.png -------------------------------------------------------------------------------- /assets/data/img/flags/_red-cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_red-cross.png -------------------------------------------------------------------------------- /assets/data/img/flags/_scotland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_scotland.png -------------------------------------------------------------------------------- /assets/data/img/flags/_somaliland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_somaliland.png -------------------------------------------------------------------------------- /assets/data/img/flags/_south-ossetia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_south-ossetia.png -------------------------------------------------------------------------------- /assets/data/img/flags/_united-nations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_united-nations.png -------------------------------------------------------------------------------- /assets/data/img/flags/_unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_unknown.png -------------------------------------------------------------------------------- /assets/data/img/flags/_wales.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/flags/_wales.png -------------------------------------------------------------------------------- /assets/data/img/plants1-br.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/plants1-br.png -------------------------------------------------------------------------------- /assets/data/img/plants1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/plants1.png -------------------------------------------------------------------------------- /assets/data/img/spn-feature-carousel/access-regional-content-easily.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/spn-feature-carousel/access-regional-content-easily.png -------------------------------------------------------------------------------- /assets/data/img/spn-feature-carousel/built-from-the-ground-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/spn-feature-carousel/built-from-the-ground-up.png -------------------------------------------------------------------------------- /assets/data/img/spn-feature-carousel/bye-bye-vpns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/spn-feature-carousel/bye-bye-vpns.png -------------------------------------------------------------------------------- /assets/data/img/spn-feature-carousel/easily-control-your-privacy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/spn-feature-carousel/easily-control-your-privacy.png -------------------------------------------------------------------------------- /assets/data/img/spn-feature-carousel/multiple-identities-for-each-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/spn-feature-carousel/multiple-identities-for-each-app.png -------------------------------------------------------------------------------- /assets/data/img/spn-login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/assets/data/img/spn-login.png -------------------------------------------------------------------------------- /assets/data/img/windows.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/icons.go: -------------------------------------------------------------------------------- 1 | package assets 2 | 3 | import ( 4 | _ "embed" 5 | ) 6 | 7 | //go:embed data/icons/pm_light_512.png 8 | var PNG []byte 9 | -------------------------------------------------------------------------------- /base/.gitignore: -------------------------------------------------------------------------------- 1 | portbase 2 | apitest 3 | misc 4 | 5 | go.mod.* 6 | vendor 7 | go.work 8 | go.work.sum 9 | -------------------------------------------------------------------------------- /base/api/testclient/serve.go: -------------------------------------------------------------------------------- 1 | package testclient 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/safing/portmaster/base/api" 7 | ) 8 | 9 | func init() { 10 | api.RegisterHandler("/test/", http.StripPrefix("/test/", http.FileServer(http.Dir("./api/testclient/root/")))) 11 | } 12 | -------------------------------------------------------------------------------- /base/config/doc.go: -------------------------------------------------------------------------------- 1 | // Package config provides a versatile configuration management system. 2 | package config 3 | -------------------------------------------------------------------------------- /base/database/errors.go: -------------------------------------------------------------------------------- 1 | package database 2 | 3 | import ( 4 | "errors" 5 | ) 6 | 7 | // Errors. 8 | var ( 9 | ErrNotFound = errors.New("database entry not found") 10 | ErrPermissionDenied = errors.New("access to database record denied") 11 | ErrReadOnly = errors.New("database is read only") 12 | ErrShuttingDown = errors.New("database system is shutting down") 13 | ErrNotImplemented = errors.New("not implemented by this storage") 14 | ) 15 | -------------------------------------------------------------------------------- /base/database/query/operators_test.go: -------------------------------------------------------------------------------- 1 | package query 2 | 3 | import "testing" 4 | 5 | func TestGetOpName(t *testing.T) { 6 | t.Parallel() 7 | 8 | if getOpName(254) != "[unknown]" { 9 | t.Error("unexpected output") 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /base/database/record/base_test.go: -------------------------------------------------------------------------------- 1 | package record 2 | 3 | import "testing" 4 | 5 | func TestBaseRecord(t *testing.T) { 6 | t.Parallel() 7 | 8 | // check model interface compliance 9 | var m Record 10 | b := &TestRecord{} 11 | m = b 12 | _ = m 13 | } 14 | -------------------------------------------------------------------------------- /base/database/record/key.go: -------------------------------------------------------------------------------- 1 | package record 2 | 3 | import ( 4 | "strings" 5 | ) 6 | 7 | // ParseKey splits a key into it's database name and key parts. 8 | func ParseKey(key string) (dbName, dbKey string) { 9 | splitted := strings.SplitN(key, ":", 2) 10 | if len(splitted) < 2 { 11 | return splitted[0], "" 12 | } 13 | return splitted[0], strings.Join(splitted[1:], ":") 14 | } 15 | -------------------------------------------------------------------------------- /base/database/record/meta.colf: -------------------------------------------------------------------------------- 1 | package record 2 | 3 | type course struct { 4 | Created int64 5 | Modified int64 6 | Expires int64 7 | Deleted int64 8 | Secret bool 9 | Cronjewel bool 10 | } 11 | -------------------------------------------------------------------------------- /base/database/record/meta.gencode: -------------------------------------------------------------------------------- 1 | struct Meta { 2 | Created int64 3 | Modified int64 4 | Expires int64 5 | Deleted int64 6 | Secret bool 7 | Cronjewel bool 8 | } 9 | -------------------------------------------------------------------------------- /base/database/record/record_test.go: -------------------------------------------------------------------------------- 1 | package record 2 | 3 | import ( 4 | "sync" 5 | ) 6 | 7 | type TestRecord struct { 8 | Base 9 | sync.Mutex 10 | } 11 | -------------------------------------------------------------------------------- /base/database/storage/errors.go: -------------------------------------------------------------------------------- 1 | package storage 2 | 3 | import "errors" 4 | 5 | // Errors for storages. 6 | var ( 7 | ErrNotFound = errors.New("storage entry not found") 8 | ) 9 | -------------------------------------------------------------------------------- /base/database/storage/fstree/fstree_test.go: -------------------------------------------------------------------------------- 1 | package fstree 2 | 3 | import "github.com/safing/portmaster/base/database/storage" 4 | 5 | // Compile time interface checks. 6 | var _ storage.Interface = &FSTree{} 7 | -------------------------------------------------------------------------------- /base/database/storage/sqlite/bobgen.yaml: -------------------------------------------------------------------------------- 1 | sqlite: 2 | dsn: "testdata/schema.db" 3 | except: 4 | migrations: 5 | 6 | no_factory: true 7 | -------------------------------------------------------------------------------- /base/database/storage/sqlite/migrations/0_settings.sql: -------------------------------------------------------------------------------- 1 | -- +migrate Up 2 | -- SQL in section 'Up' is executed when this migration is applied 3 | PRAGMA auto_vacuum = INCREMENTAL; -- https://sqlite.org/pragma.html#pragma_auto_vacuum 4 | 5 | -- +migrate Down 6 | -- SQL section 'Down' is executed when this migration is rolled back 7 | PRAGMA auto_vacuum = NONE; -- https://sqlite.org/pragma.html#pragma_auto_vacuum 8 | -------------------------------------------------------------------------------- /base/database/storage/sqlite/migrations_config.yml: -------------------------------------------------------------------------------- 1 | development: 2 | dialect: sqlite3 3 | datasource: testdata/schema.db 4 | dir: migrations 5 | table: migrations 6 | -------------------------------------------------------------------------------- /base/database/storage/sqlite/models/bob_main_test.bob.go: -------------------------------------------------------------------------------- 1 | // Code generated by BobGen sqlite v0.30.0. DO NOT EDIT. 2 | // This file is meant to be re-generated in place and/or deleted at any time. 3 | 4 | package models 5 | 6 | import "github.com/stephenafamo/bob" 7 | 8 | // Make sure the type Record runs hooks after queries 9 | var _ bob.HookableType = &Record{} 10 | -------------------------------------------------------------------------------- /base/database/storage/sqlite/testdata/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/base/database/storage/sqlite/testdata/.gitkeep -------------------------------------------------------------------------------- /base/log/flags.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import "flag" 4 | 5 | var ( 6 | logLevelFlag string 7 | pkgLogLevelsFlag string 8 | ) 9 | 10 | func init() { 11 | flag.StringVar(&logLevelFlag, "log", "", "set log level to [trace|debug|info|warning|error|critical]") 12 | flag.StringVar(&pkgLogLevelsFlag, "plog", "", "set log level of packages: database=trace,notifications=debug") 13 | } 14 | -------------------------------------------------------------------------------- /base/metrics/testdata/.gitignore: -------------------------------------------------------------------------------- 1 | data -------------------------------------------------------------------------------- /base/metrics/testdata/README.md: -------------------------------------------------------------------------------- 1 | # Testing metrics 2 | 3 | You can spin up a test setup for pushing and viewing metrics with `docker-compose up`. 4 | Then use the flag `--push-metrics http://127.0.0.1:8428/api/v1/import/prometheus` to push metrics. 5 | -------------------------------------------------------------------------------- /base/metrics/testdata/grafana/config.ini: -------------------------------------------------------------------------------- 1 | [auth] 2 | disable_login_form = true 3 | disable_signout_menu = true 4 | 5 | [auth.basic] 6 | enabled = false 7 | 8 | [auth.anonymous] 9 | enabled = true 10 | org_role = Admin 11 | -------------------------------------------------------------------------------- /base/metrics/testdata/grafana/dashboards/portmaster.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: 'Portmaster' 5 | folder: 'Portmaster' 6 | disableDeletion: true 7 | updateIntervalSeconds: 10 8 | allowUiUpdates: true 9 | options: 10 | path: /dashboards 11 | foldersFromFilesStructure: true 12 | -------------------------------------------------------------------------------- /base/metrics/testdata/grafana/datasources/datasource.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | datasources: 4 | - name: VictoriaMetrics 5 | type: prometheus 6 | access: proxy 7 | url: http://pm-metrics-test-victoriametrics:8428 8 | isDefault: true 9 | -------------------------------------------------------------------------------- /base/rng/doc.go: -------------------------------------------------------------------------------- 1 | // Package rng provides a feedable CSPRNG. 2 | // 3 | // CSPRNG used is fortuna: github.com/seehuhn/fortuna 4 | // By default the CSPRNG is fed by two sources: 5 | // - It starts with a seed from `crypto/rand` and periodically reseeds from there 6 | // - A really simple tickfeeder which extracts entropy from the internal go scheduler using goroutines and is meant to be used under load. 7 | // 8 | // The RNG can also be easily fed with additional sources. 9 | package rng 10 | -------------------------------------------------------------------------------- /base/rng/fullfeed_test.go: -------------------------------------------------------------------------------- 1 | package rng 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | func TestFullFeeder(t *testing.T) { 8 | t.Parallel() 9 | 10 | for range 10 { 11 | go func() { 12 | rngFeeder <- []byte{0} 13 | }() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /base/rng/test/.gitignore: -------------------------------------------------------------------------------- 1 | test 2 | *.bin 3 | *.out 4 | *.txt 5 | -------------------------------------------------------------------------------- /base/updater/doc.go: -------------------------------------------------------------------------------- 1 | // Package updater is an update registry that manages updates and versions. 2 | package updater 3 | -------------------------------------------------------------------------------- /base/updater/export.go: -------------------------------------------------------------------------------- 1 | package updater 2 | 3 | // Export exports the list of resources. 4 | func (reg *ResourceRegistry) Export() map[string]*Resource { 5 | reg.RLock() 6 | defer reg.RUnlock() 7 | 8 | // copy the map 9 | copiedResources := make(map[string]*Resource) 10 | for key, val := range reg.resources { 11 | copiedResources[key] = val.Export() 12 | } 13 | 14 | return copiedResources 15 | } 16 | -------------------------------------------------------------------------------- /base/utils/renameio/doc.go: -------------------------------------------------------------------------------- 1 | // Package renameio provides a way to atomically create or replace a file or 2 | // symbolic link. 3 | // 4 | // Caveat: this package requires the file system rename(2) implementation to be 5 | // atomic. Notably, this is not the case when using NFS with multiple clients: 6 | // https://stackoverflow.com/a/41396801 7 | package renameio 8 | -------------------------------------------------------------------------------- /cmds/hub/.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled binaries 2 | hub 3 | hub.exe 4 | -------------------------------------------------------------------------------- /cmds/integrationtest/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | 6 | "github.com/spf13/cobra" 7 | ) 8 | 9 | var rootCmd = &cobra.Command{ 10 | Use: "integrationtest", 11 | Short: "A simple tool to test system integrations", 12 | } 13 | 14 | func main() { 15 | if err := rootCmd.Execute(); err != nil { 16 | os.Exit(1) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /cmds/notifier/README.md: -------------------------------------------------------------------------------- 1 | ### Development Dependencies 2 | 3 | sudo apt install libgtk-3-dev libayatana-appindicator3-dev libwebkitgtk-3.0-dev libgl1-mesa-dev libglu1-mesa-dev libnotify-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev 4 | 5 | sudo pacman -S libappindicator-gtk3 6 | -------------------------------------------------------------------------------- /cmds/observation-hub/.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled binaries 2 | observation-hub 3 | observation-hub.exe 4 | -------------------------------------------------------------------------------- /cmds/portmaster-core/.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled binaries 2 | portmaster 3 | portmaster-core 4 | portmaster.exe 5 | dnsonly 6 | dnsonly.exe 7 | main 8 | main.exe 9 | -------------------------------------------------------------------------------- /cmds/portmaster-start/.gitignore: -------------------------------------------------------------------------------- 1 | # binaries 2 | portmaster-start 3 | portmaster-start.exe 4 | 5 | # test dir 6 | test 7 | -------------------------------------------------------------------------------- /cmds/portmaster-start/console_default.go: -------------------------------------------------------------------------------- 1 | //go:build !windows 2 | 3 | package main 4 | 5 | import "os/exec" 6 | 7 | func attachToParentConsole() (attached bool, err error) { 8 | return true, nil 9 | } 10 | 11 | func hideWindow(cmd *exec.Cmd) {} 12 | -------------------------------------------------------------------------------- /cmds/testsuite/.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled binaries 2 | testsuite 3 | testsuite.exe 4 | -------------------------------------------------------------------------------- /cmds/updatemgr/.gitignore: -------------------------------------------------------------------------------- 1 | updatemgr 2 | updatemgr.exe 3 | -------------------------------------------------------------------------------- /cmds/updatemgr/confirm.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | "strings" 8 | ) 9 | 10 | func confirm(msg string) bool { 11 | fmt.Printf("%s: [y|n] ", msg) 12 | 13 | scanner := bufio.NewScanner(os.Stdin) 14 | ok := scanner.Scan() 15 | if ok && strings.TrimSpace(scanner.Text()) == "y" { 16 | return true 17 | } 18 | 19 | return false 20 | } 21 | -------------------------------------------------------------------------------- /cmds/winkext-test/main_linux.go: -------------------------------------------------------------------------------- 1 | //go:build linux 2 | // +build linux 3 | 4 | package main 5 | 6 | import "log" 7 | 8 | func main() { 9 | log.Fatalf("winkext-test not supported on linux") 10 | } 11 | -------------------------------------------------------------------------------- /desktop/angular/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | dist-extension 4 | dist-lib 5 | .angular -------------------------------------------------------------------------------- /desktop/angular/assets: -------------------------------------------------------------------------------- 1 | ../../assets/data -------------------------------------------------------------------------------- /desktop/angular/browser-extension.config.ts: -------------------------------------------------------------------------------- 1 | import type { Configuration } from 'webpack'; 2 | 3 | module.exports = { 4 | entry: { background: { import: 'projects/portmaster-chrome-extension/src/background.ts', runtime: false } }, 5 | } as Configuration; 6 | -------------------------------------------------------------------------------- /desktop/angular/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) as Promise; 6 | } 7 | 8 | getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() as Promise; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /desktop/angular/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "jasminewd2", 11 | "node" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | @apply bg-background text-white flex flex-col w-96 h-96; 3 | } 4 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/app/domain-list/index.ts: -------------------------------------------------------------------------------- 1 | export * from './domain-list.component'; 2 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/app/header/header.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from "@angular/core"; 2 | 3 | @Component({ 4 | selector: 'ext-header', 5 | templateUrl: './header.component.html', 6 | changeDetection: ChangeDetectionStrategy.OnPush, 7 | styleUrls: ['./header.component.scss'] 8 | }) 9 | export class ExtHeaderComponent { } 10 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/app/header/index.ts: -------------------------------------------------------------------------------- 1 | export * from './header.component'; 2 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/app/welcome/index.ts: -------------------------------------------------------------------------------- 1 | export * from './welcome.module'; 2 | 3 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/desktop/angular/projects/portmaster-chrome-extension/src/assets/.gitkeep -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/assets/icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/desktop/angular/projects/portmaster-chrome-extension/src/assets/icon_128.png -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/background/commands.ts: -------------------------------------------------------------------------------- 1 | import { Request } from "./tab-tracker"; 2 | 3 | export interface ListRequests { 4 | type: 'listRequests'; 5 | domain?: string; 6 | tabId: number | 'current'; 7 | } 8 | 9 | export interface NotifyRequests { 10 | type: 'notifyRequests', 11 | requests: Request[]; 12 | } 13 | 14 | export type CallRequest = ListRequests; 15 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/background/tab-utils.ts: -------------------------------------------------------------------------------- 1 | 2 | /** Queries and returns the currently active tab */ 3 | export function getCurrentTab(): Promise { 4 | return new Promise((resolve) => { 5 | chrome.tabs.query({ active: true, lastFocusedWindow: true }, ([tab]) => { 6 | resolve(tab); 7 | }) 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: false 3 | }; 4 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/desktop/angular/projects/portmaster-chrome-extension/src/favicon.ico -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PortmasterChromeExtension 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.error(err)); 13 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | 3 | @import 'tailwindcss/base'; 4 | @import 'tailwindcss/components'; 5 | @import 'tailwindcss/utilities'; 6 | 7 | 8 | @import '@angular/cdk/overlay-prebuilt'; 9 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../../out-tsc/app", 6 | "types": [ 7 | "chrome" 8 | ] 9 | }, 10 | "files": [ 11 | "src/main.ts", 12 | "src/polyfills.ts", 13 | "src/background.ts" 14 | ], 15 | "include": [ 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /desktop/angular/projects/portmaster-chrome-extension/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../../out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/portmaster-api/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../../dist-lib/safing/portmaster-api", 4 | "lib": { 5 | "entryFile": "src/public-api.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/portmaster-api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@safing/portmaster-api", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^14.0.0", 6 | "@angular/core": "^14.0.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.3.0" 10 | }, 11 | "devDependencies": { 12 | "@types/jasmine": "^4.0.3" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/portmaster-api/src/lib/features.ts: -------------------------------------------------------------------------------- 1 | export enum FeatureID { 2 | None = "", 3 | SPN = "spn", 4 | PrioritySupport = "support", 5 | History = "history", 6 | Bandwidth = "bw-vis", 7 | VPNCompat = "vpn-compat", 8 | } 9 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/portmaster-api/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | 2 | export function deepClone(o?: T | null): T { 3 | if (o === null || o === undefined) { 4 | return null as any as T; 5 | } 6 | 7 | let _out: T = (Array.isArray(o) ? [] : {}) as T; 8 | for (let _key in (o as T)) { 9 | let v = o[_key]; 10 | _out[_key] = (typeof v === "object") ? deepClone(v) : v; 11 | } 12 | return _out as T; 13 | } 14 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/portmaster-api/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../../../out-tsc/lib", 6 | "declaration": true, 7 | "declarationMap": true, 8 | "inlineSources": true, 9 | "types": [] 10 | }, 11 | "exclude": [ 12 | "src/test.ts", 13 | "testing/**/*", 14 | "**/*.spec.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/portmaster-api/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.lib.json", 4 | "compilerOptions": { 5 | "declarationMap": false 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/portmaster-api/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../../../out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "testing/**/*.ts" 12 | ], 13 | "include": [ 14 | "testing/**/*.ts", 15 | "**/*.spec.ts", 16 | "**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../../dist-lib/safing/ui", 4 | "lib": { 5 | "entryFile": "src/public-api.ts" 6 | }, 7 | "assets": [ 8 | "theming.scss", 9 | "**/_*.scss" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@safing/ui", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "~12.2.0", 6 | "@angular/core": "~12.2.0", 7 | "@angular/cdk": "~12.2.0" 8 | }, 9 | "dependencies": { 10 | "tslib": "^2.3.0" 11 | }, 12 | "exports": { 13 | "./theming": { 14 | "sass": "./theming.scss" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/accordion/accordion-group.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/accordion/accordion.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
7 | 8 | 9 | 10 |
11 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/accordion/index.ts: -------------------------------------------------------------------------------- 1 | export { SfngAccordionComponent } from './accordion'; 2 | export { SfngAccordionGroupComponent } from './accordion-group'; 3 | export { SfngAccordionModule } from './accordion.module'; 4 | 5 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/dialog/index.ts: -------------------------------------------------------------------------------- 1 | export { ConfirmDialogConfig } from './confirm.dialog'; 2 | export * from './dialog.module'; 3 | export * from './dialog.ref'; 4 | export * from './dialog.service'; 5 | 6 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/dropdown/index.ts: -------------------------------------------------------------------------------- 1 | export * from './dropdown'; 2 | export * from './dropdown.module'; 3 | 4 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/overlay-stepper/index.ts: -------------------------------------------------------------------------------- 1 | export * from './overlay-stepper'; 2 | export * from './overlay-stepper.module'; 3 | export * from './refs'; 4 | export * from './step'; 5 | 6 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/pagination/index.ts: -------------------------------------------------------------------------------- 1 | export * from './dynamic-items-paginator'; 2 | export * from './pagination'; 3 | export * from './pagination.module'; 4 | export * from './snapshot-paginator'; 5 | 6 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/select/index.ts: -------------------------------------------------------------------------------- 1 | export * from './item'; 2 | export * from './select'; 3 | export * from './select.module'; 4 | 5 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/tabs/_tab-group.scss: -------------------------------------------------------------------------------- 1 | sfng-tab-group { 2 | @apply flex flex-col overflow-hidden; 3 | } 4 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/tabs/index.ts: -------------------------------------------------------------------------------- 1 | export { SfngTabComponent, SfngTabContentDirective } from './tab'; 2 | export { SfngTabContentScrollEvent, SfngTabGroupComponent } from './tab-group'; 3 | export { SfngTabModule as TabModule } from './tabs.module'; 4 | 5 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/tipup/index.ts: -------------------------------------------------------------------------------- 1 | export * from './anchor'; 2 | export * from './tipup'; 3 | export * from './tipup-component'; 4 | export * from './tipup.module'; 5 | export * from './translations'; 6 | 7 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/tipup/utils.ts: -------------------------------------------------------------------------------- 1 | import { InjectionToken } from "@angular/core"; 2 | 3 | export const TIPUP_TOKEN = new InjectionToken('TipUPJSONToken'); 4 | 5 | export interface SfngTipUpPlacement { 6 | origin?: 'left' | 'right'; 7 | offset?: number; 8 | } 9 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/toggle-switch/index.ts: -------------------------------------------------------------------------------- 1 | export * from './toggle-switch'; 2 | export * from './toggle.module'; 3 | 4 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/tooltip/_tooltip-component.scss: -------------------------------------------------------------------------------- 1 | sfng-tooltip-container { 2 | @apply relative block; 3 | 4 | max-width: 16rem; 5 | } 6 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/tooltip/index.ts: -------------------------------------------------------------------------------- 1 | export * from './tooltip'; 2 | export * from './tooltip.module'; 3 | 4 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/tooltip/tooltip-component.html: -------------------------------------------------------------------------------- 1 |
4 | {{ message }} 5 | 6 |
7 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/lib/ui.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { SfngAccordionModule } from './accordion'; 3 | 4 | 5 | @NgModule({ 6 | exports: [ 7 | SfngAccordionModule 8 | ] 9 | }) 10 | export class UiModule { } 11 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/src/public-api.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Public API Surface of ui 3 | */ 4 | 5 | export * from './lib/accordion'; 6 | export * from './lib/dialog'; 7 | export * from './lib/dropdown'; 8 | export * from './lib/overlay-stepper'; 9 | export * from './lib/pagination'; 10 | export * from './lib/select'; 11 | export * from './lib/tabs'; 12 | export * from './lib/tipup'; 13 | export * from './lib/toggle-switch'; 14 | export * from './lib/tooltip'; 15 | export * from './lib/ui.module'; 16 | 17 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/theming.scss: -------------------------------------------------------------------------------- 1 | @import "./src/lib/select/select"; 2 | @import "./src/lib/dialog/dialog"; 3 | @import "./src/lib/pagination/pagination"; 4 | @import "./src/lib/tabs/tab-group"; 5 | @import "./src/lib/tipup/tipup"; 6 | @import "./src/lib/tooltip/tooltip-component"; 7 | @import "./src/lib/toggle-switch/toggle-switch"; 8 | @import "./src/lib/dialog/confirm.dialog"; 9 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../out-tsc/lib", 5 | "declaration": true, 6 | "declarationMap": true, 7 | "inlineSources": true, 8 | "types": [], 9 | "lib": [ 10 | "dom", 11 | "es2018" 12 | ] 13 | }, 14 | "exclude": [ 15 | "src/test.ts", 16 | "**/*.spec.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.lib.json", 4 | "compilerOptions": { 5 | "declarationMap": false 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /desktop/angular/projects/safing/ui/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../../../out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts" 12 | ], 13 | "include": [ 14 | "**/*.spec.ts", 15 | "**/*.d.ts" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /desktop/angular/projects/tauri-builtin/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { TauriIntegrationService } from 'src/app/integration/taur-app'; 3 | 4 | export const appConfig: ApplicationConfig = { 5 | providers: [ 6 | { 7 | provide: TauriIntegrationService, 8 | useClass: TauriIntegrationService, 9 | deps: [] 10 | }, 11 | ], 12 | }; 13 | -------------------------------------------------------------------------------- /desktop/angular/projects/tauri-builtin/src/assets: -------------------------------------------------------------------------------- 1 | ../../../assets -------------------------------------------------------------------------------- /desktop/angular/projects/tauri-builtin/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/desktop/angular/projects/tauri-builtin/src/favicon.ico -------------------------------------------------------------------------------- /desktop/angular/projects/tauri-builtin/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | TauriBuiltin 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /desktop/angular/projects/tauri-builtin/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { appConfig } from './app/app.config'; 3 | import { AppComponent } from './app/app.component'; 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch((err) => console.error(err)); 7 | -------------------------------------------------------------------------------- /desktop/angular/projects/tauri-builtin/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @import "safing/ui/theming"; 6 | 7 | /** foboar **/ 8 | -------------------------------------------------------------------------------- /desktop/angular/projects/tauri-builtin/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../../out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": ["src/main.ts"], 9 | "include": ["src/**/*.d.ts", "../../src/electron-app.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /desktop/angular/proxy.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api": { 3 | "target": "http://localhost:817/", 4 | "secure": false 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /desktop/angular/src/app/integration/index.ts: -------------------------------------------------------------------------------- 1 | export * from './integration'; 2 | export * from './factory'; 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/intro/index.ts: -------------------------------------------------------------------------------- 1 | export * from './intro.module'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/intro/step-1-welcome/index.ts: -------------------------------------------------------------------------------- 1 | export * from './step-1-welcome'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/intro/step-2-trackers/index.ts: -------------------------------------------------------------------------------- 1 | export * from './step-2-trackers' 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/intro/step-3-dns/index.ts: -------------------------------------------------------------------------------- 1 | export * from './step-3-dns' 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/intro/step-4-tipups/index.ts: -------------------------------------------------------------------------------- 1 | export * from './step-4-tipups' 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/intro/step-4-tipups/step-4-tipups.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from "@angular/core"; 2 | import { Step } from "@safing/ui"; 3 | import { of } from "rxjs"; 4 | 5 | @Component({ 6 | templateUrl: './step-4-tipups.html', 7 | styleUrls: ['../step.scss'], 8 | changeDetection: ChangeDetectionStrategy.OnPush, 9 | }) 10 | export class Step4TipupsComponent implements Step { 11 | validChange = of(true) 12 | } 13 | -------------------------------------------------------------------------------- /desktop/angular/src/app/intro/step.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | @apply flex flex-col items-center justify-center; 3 | } 4 | 5 | h1 { 6 | @apply text-primary text-2xl font-medium capitalize text-center py-5; 7 | } 8 | 9 | p { 10 | @apply text-tertiary text-sm font-medium text-center; 11 | } 12 | -------------------------------------------------------------------------------- /desktop/angular/src/app/layout/side-dash/side-dash.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /desktop/angular/src/app/layout/side-dash/side-dash.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-direction: column; 4 | align-items: center; 5 | justify-content: flex-start; 6 | overflow: hidden; 7 | overflow-y: hidden; 8 | width: 419px; 9 | 10 | @apply pt-4; 11 | } 12 | -------------------------------------------------------------------------------- /desktop/angular/src/app/layout/side-dash/side-dash.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-side-dash', 5 | templateUrl: './side-dash.html', 6 | styleUrls: ['./side-dash.scss'], 7 | changeDetection: ChangeDetectionStrategy.OnPush, 8 | }) 9 | export class SideDashComponent { 10 | /** Whether or not a SPN account login is required */ 11 | spnLoginRequired = false; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/app-view/app-view.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | @apply flex flex-col h-screen max-h-screen; 3 | } 4 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/app-view/index.ts: -------------------------------------------------------------------------------- 1 | export { AppViewComponent } from './app-view'; 2 | export { AppOverviewComponent } from './overview'; 3 | export { QuickSettingInternetButtonComponent } from './qs-internet'; 4 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/app-view/qs-history/qs-history.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/desktop/angular/src/app/pages/app-view/qs-history/qs-history.component.scss -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/app-view/qs-internet/index.ts: -------------------------------------------------------------------------------- 1 | export * from './qs-internet'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/app-view/qs-select-exit/index.ts: -------------------------------------------------------------------------------- 1 | export * from './qs-select-exit'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/app-view/qs-select-exit/qs-select-exit.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/desktop/angular/src/app/pages/app-view/qs-select-exit/qs-select-exit.scss -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/app-view/qs-use-spn/index.ts: -------------------------------------------------------------------------------- 1 | export * from './qs-use-spn'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/monitor/index.ts: -------------------------------------------------------------------------------- 1 | export { MonitorPageComponent } from './monitor'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/page.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display : flex; 3 | flex-direction: column; 4 | width : 100%; 5 | height : 100%; 6 | } 7 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/country-details/index.ts: -------------------------------------------------------------------------------- 1 | export * from './country-details'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/country-overlay/index.ts: -------------------------------------------------------------------------------- 1 | export * from './country-overlay'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/index.ts: -------------------------------------------------------------------------------- 1 | export * from './spn-page'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/map-legend/index.ts: -------------------------------------------------------------------------------- 1 | export * from './map-legend'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/map-renderer/index.ts: -------------------------------------------------------------------------------- 1 | export * from './map-renderer'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/node-icon/index.ts: -------------------------------------------------------------------------------- 1 | export * from './node-icon'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/pin-details/index.ts: -------------------------------------------------------------------------------- 1 | export * from './pin-details'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/pin-list/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/desktop/angular/src/app/pages/spn/pin-list/index.ts -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/pin-overlay/index.ts: -------------------------------------------------------------------------------- 1 | export * from './pin-overlay'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/pin-overlay/pin-overlay.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | min-width: 220px; 3 | display: block; 4 | } 5 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/pin-route/index.ts: -------------------------------------------------------------------------------- 1 | export * from './pin-route'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/spn-feature-carousel/index.ts: -------------------------------------------------------------------------------- 1 | export * from './spn-feature-carousel'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/spn/utils.ts: -------------------------------------------------------------------------------- 1 | import { OverlayRef } from '@angular/cdk/overlay'; 2 | import { InjectionToken } from '@angular/core'; 3 | 4 | export const OVERLAY_REF = new InjectionToken('OVERLAY_REF'); 5 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/support/form/index.ts: -------------------------------------------------------------------------------- 1 | export * from './support-form'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/support/index.ts: -------------------------------------------------------------------------------- 1 | export * from './support'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/pages/support/progress-dialog/index.ts: -------------------------------------------------------------------------------- 1 | export * from './progress-dialog'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/services/index.ts: -------------------------------------------------------------------------------- 1 | export { NotificationsService } from './notifications.service'; 2 | export * from './notifications.types'; 3 | export * from './session-data.service'; 4 | export { StatusService } from './status.service'; 5 | export * from './status.types'; 6 | export * from './supporthub.service'; 7 | export * from './ui-state.service'; 8 | 9 | -------------------------------------------------------------------------------- /desktop/angular/src/app/services/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "sideEffects": false 3 | } 4 | -------------------------------------------------------------------------------- /desktop/angular/src/app/services/status.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { StatusService } from './status.service'; 4 | 5 | describe('StatusService', () => { 6 | let service: StatusService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(StatusService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/action-indicator/action-indicator.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from "@angular/common"; 2 | import { NgModule } from "@angular/core"; 3 | import { IndicatorComponent } from "./indicator"; 4 | 5 | @NgModule({ 6 | imports: [ 7 | CommonModule, 8 | ], 9 | declarations: [ 10 | IndicatorComponent, 11 | ] 12 | }) 13 | export class ActionIndicatorModule { } 14 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/action-indicator/index.ts: -------------------------------------------------------------------------------- 1 | export * from './action-indicator.service'; 2 | export * from './action-indicator.module'; 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/app-icon/index.ts: -------------------------------------------------------------------------------- 1 | export { AppIconComponent } from './app-icon'; 2 | export { SfngAppIconModule } from './app-icon.module'; 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/config/basic-setting/index.ts: -------------------------------------------------------------------------------- 1 | export * from './basic-setting'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/config/filter-lists/index.ts: -------------------------------------------------------------------------------- 1 | export { FilterListComponent } from './filter-list'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/config/generic-setting/index.ts: -------------------------------------------------------------------------------- 1 | export * from './generic-setting'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/config/index.ts: -------------------------------------------------------------------------------- 1 | export * from './basic-setting'; 2 | export * from './config-settings'; 3 | export * from './config.module'; 4 | export * from './filter-lists'; 5 | export * from './generic-setting'; 6 | export * from './ordererd-list'; 7 | export * from './rule-list'; 8 | export * from './safe.pipe'; 9 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/config/ordererd-list/index.ts: -------------------------------------------------------------------------------- 1 | export { OrderedListComponent } from './ordered-list'; 2 | export { OrderedListItemComponent } from './item'; -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/config/ordererd-list/item.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{value}} 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 |
14 |
15 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/config/rule-list/index.ts: -------------------------------------------------------------------------------- 1 | export * from './list-item'; 2 | export * from './rule-list'; 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/count-indicator/count-indicator.html: -------------------------------------------------------------------------------- 1 | {{ count | prettyCount }} 2 |
3 |
4 |
5 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/count-indicator/count-indicator.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from "@angular/core"; 2 | import { CountIndicatorComponent } from "./count-indicator"; 3 | import { PrettyCountPipe } from "./count.pipe"; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | CountIndicatorComponent, 8 | PrettyCountPipe, 9 | ], 10 | exports: [ 11 | CountIndicatorComponent, 12 | PrettyCountPipe, 13 | ] 14 | }) 15 | export class CountIndicatorModule { } 16 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/count-indicator/count-indicator.scss: -------------------------------------------------------------------------------- 1 | @import '../../../theme/mixins/_pill.scss'; 2 | 3 | :host { 4 | @include pill-container; 5 | @apply pl-2; 6 | @apply bg-buttons-dark; 7 | @apply w-20; 8 | } 9 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/count-indicator/count.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from "@angular/core"; 2 | 3 | @Pipe({ 4 | name: 'prettyCount', 5 | pure: true 6 | }) 7 | export class PrettyCountPipe implements PipeTransform { 8 | transform(value: number) { 9 | if (value > 999) { 10 | const v = Math.floor(value / 1000); 11 | if (value === v * 1000) { 12 | return `${v}k`; 13 | } 14 | return `${v}k+` 15 | } 16 | return `${value}` 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/count-indicator/index.ts: -------------------------------------------------------------------------------- 1 | export * from './count-indicator'; 2 | export * from './count-indicator.module'; 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/country-flag/country.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CountryFlagDirective } from './country-flag'; 3 | 4 | @NgModule({ 5 | declarations: [ 6 | CountryFlagDirective 7 | ], 8 | exports: [ 9 | CountryFlagDirective, 10 | ] 11 | }) 12 | export class CountryFlagModule { } 13 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/country-flag/index.ts: -------------------------------------------------------------------------------- 1 | export * from './country-flag'; 2 | export * from './country.module'; 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/edit-profile-dialog/index.ts: -------------------------------------------------------------------------------- 1 | export * from './edit-profile-dialog'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/exit-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from './exit.service'; 2 | export * from './exit-screen'; 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/expertise/expertise-switch.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | @apply pl-2; 4 | user-select: none; 5 | flex-direction: row; 6 | align-items: center; 7 | justify-content: center; 8 | } 9 | 10 | sfng-tipup { 11 | margin-right: 0.5rem; 12 | } 13 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/expertise/index.ts: -------------------------------------------------------------------------------- 1 | export * from './expertise-directive'; 2 | export * from './expertise-switch'; 3 | export * from './expertise.service'; 4 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/feature-scout/feature-scout.scss: -------------------------------------------------------------------------------- 1 | .feature-icon { 2 | @apply text-primary text-opacity-80; 3 | 4 | &.feature-icon-off { 5 | opacity: 0.25; 6 | } 7 | } 8 | 9 | .status-info { 10 | @apply text-primary text-opacity-80 text-xxs text-center; 11 | 12 | &:hover { 13 | cursor: default; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/feature-scout/index.ts: -------------------------------------------------------------------------------- 1 | export * from './feature-scout'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/focus/focus.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from "@angular/common"; 2 | import { NgModule } from "@angular/core"; 3 | import { AutoFocusDirective } from "./focus.directive"; 4 | 5 | @NgModule({ 6 | imports: [ 7 | CommonModule, 8 | ], 9 | declarations: [ 10 | AutoFocusDirective, 11 | ], 12 | exports: [ 13 | AutoFocusDirective, 14 | ] 15 | }) 16 | export class SfngFocusModule { } 17 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/focus/index.ts: -------------------------------------------------------------------------------- 1 | export { AutoFocusDirective } from './focus.directive'; 2 | export * from './focus.module'; 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/fuzzySearch/index.ts: -------------------------------------------------------------------------------- 1 | import Fuse from 'fuse.js'; 2 | 3 | export { FuseSearchOpts, FuzzySearchService } from './fuse.service'; 4 | export { FuzzySearchPipe } from './search-pipe'; 5 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/loading/index.ts: -------------------------------------------------------------------------------- 1 | export { LoadingComponent } from './loading'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/loading/loading.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/loading/loading.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-loading', 5 | templateUrl: './loading.html', 6 | styleUrls: ['./loading.scss'], 7 | changeDetection: ChangeDetectionStrategy.OnPush, 8 | }) 9 | export class LoadingComponent { 10 | @HostBinding('class.animate') 11 | _animate = true; 12 | 13 | constructor(private changeDetectorRef: ChangeDetectorRef) { } 14 | } 15 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/menu/index.ts: -------------------------------------------------------------------------------- 1 | export { MenuComponent, MenuTriggerComponent, MenuItemComponent, MenuGroupComponent } from './menu'; 2 | export * from './menu.module'; 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/menu/menu-group.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | width: 100%; 4 | 5 | @apply p-1; 6 | @apply px-4; 7 | @apply text-secondary; 8 | 9 | display: block; 10 | text-transform: uppercase; 11 | font-size: 0.7rem; 12 | opacity: .7; 13 | } 14 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/menu/menu-item.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | @apply block w-full; 3 | 4 | cursor: pointer; 5 | @apply p-2; 6 | @apply px-4 text-primary text-xxs; 7 | font-weight: 500; 8 | 9 | &:hover { 10 | @apply bg-gray-300; 11 | } 12 | 13 | &.disabled { 14 | cursor: not-allowed; 15 | opacity: 0.5; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/menu/menu.html: -------------------------------------------------------------------------------- 1 | 3 |
4 | 5 |
6 |
7 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/multi-switch/index.ts: -------------------------------------------------------------------------------- 1 | export { MultiSwitchComponent } from './multi-switch'; 2 | export { SwitchItemComponent } from './switch-item'; 3 | export * from './multi-switch.module'; 4 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/multi-switch/multi-switch.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/add-to-filter/index.ts: -------------------------------------------------------------------------------- 1 | export * from './add-to-filter'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/connection-details/index.ts: -------------------------------------------------------------------------------- 1 | export * from './conn-details'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/connection-row/index.ts: -------------------------------------------------------------------------------- 1 | export * from './conn-row'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/index.ts: -------------------------------------------------------------------------------- 1 | export * from './netquery.component'; 2 | export * from './netquery.module'; 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/line-chart/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/desktop/angular/src/app/shared/netquery/line-chart/index.ts -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/pipes/index.ts: -------------------------------------------------------------------------------- 1 | export * from './location.pipe'; 2 | export * from './can-show.pipe'; 3 | export * from './can-use-rules.pipe'; 4 | export * from './is-blocked.pipe'; 5 | export * from './country-name.pipe'; 6 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/pipes/is-blocked.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | import { IsDenied, NetqueryConnection } from '@safing/portmaster-api'; 3 | 4 | @Pipe({ 5 | name: "isBlocked", 6 | pure: true 7 | }) 8 | export class IsBlockedConnectionPipe implements PipeTransform { 9 | transform(conn: NetqueryConnection): boolean { 10 | return IsDenied(conn?.verdict); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/scope-label/index.ts: -------------------------------------------------------------------------------- 1 | export * from './scope-label'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/scope-label/scope-label.html: -------------------------------------------------------------------------------- 1 | 2 | {{subdomain}}. 4 | {{domain}} 5 | 6 | 7 | {{ scopeTranslation[scope || ''] || 'N/A' }} 8 | 9 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/search-overlay/index.ts: -------------------------------------------------------------------------------- 1 | export * from './search-overlay'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/search-overlay/search-overlay.html: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/searchbar/index.ts: -------------------------------------------------------------------------------- 1 | export * from './searchbar'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/tag-bar/index.ts: -------------------------------------------------------------------------------- 1 | export * from './tag-bar'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/netquery/textql/index.ts: -------------------------------------------------------------------------------- 1 | export * from './parser'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/network-scout/index.ts: -------------------------------------------------------------------------------- 1 | export * from './network-scout'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/network-scout/network-scout.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | @apply w-full p-2 flex flex-col gap-2; 3 | } 4 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/notification-list/index.ts: -------------------------------------------------------------------------------- 1 | export { NotificationListComponent as NotificationWidgetComponent, NotificationWidgetConfig } from './notification-list.component'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/pipes/index.ts: -------------------------------------------------------------------------------- 1 | export * from './common-pipes.module'; 2 | export * from './time-ago.pipe'; 3 | export * from './to-profile.pipe'; 4 | export * from './duration.pipe'; 5 | export * from './to-seconds.pipe'; 6 | export * from './round.pipe'; 7 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/pipes/round.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'round', 5 | pure: true, 6 | }) 7 | export class RoundPipe implements PipeTransform { 8 | transform(value: number, roundBy: number) { 9 | if (isNaN(value)) { 10 | return NaN 11 | } 12 | 13 | return Math.floor(value / roundBy) * roundBy 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/process-details-dialog/index.ts: -------------------------------------------------------------------------------- 1 | export * from './process-details-dialog'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/prompt-list/index.ts: -------------------------------------------------------------------------------- 1 | export { PromptListComponent as PromptWidgetComponent } from './prompt-list.component'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/security-lock/index.ts: -------------------------------------------------------------------------------- 1 | export * from './security-lock'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/spn-account-details/index.ts: -------------------------------------------------------------------------------- 1 | export * from './spn-account-details'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/spn-account-details/spn-account-details.scss: -------------------------------------------------------------------------------- 1 | table tr { 2 | background-color: transparent !important; 3 | } 4 | 5 | table .table-section-start { 6 | border-top: 1.5rem solid transparent; 7 | } 8 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/spn-login/index.ts: -------------------------------------------------------------------------------- 1 | export * from './spn-login'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/spn-network-status/index.ts: -------------------------------------------------------------------------------- 1 | export * from './spn-network-status'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/spn-status/index.ts: -------------------------------------------------------------------------------- 1 | export * from './spn-status'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/app/shared/text-placeholder/index.ts: -------------------------------------------------------------------------------- 1 | export { PlaceholderComponent } from './placeholder'; 2 | -------------------------------------------------------------------------------- /desktop/angular/src/assets: -------------------------------------------------------------------------------- 1 | ../assets -------------------------------------------------------------------------------- /desktop/angular/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = new class { 2 | readonly supportHub = "https://support.safing.io" 3 | readonly production = true; 4 | 5 | get httpAPI() { 6 | return `http://${window.location.host}/api` 7 | } 8 | 9 | get portAPI() { 10 | const result = `ws://${window.location.host}/api/database/v1`; 11 | return result; 12 | } 13 | } -------------------------------------------------------------------------------- /desktop/angular/src/theme.less: -------------------------------------------------------------------------------- 1 | 2 | // Custom Theming for NG-ZORRO 3 | // For more information: https://ng.ant.design/docs/customize-theme/en 4 | @import "../node_modules/ng-zorro-antd/ng-zorro-antd.dark.less"; 5 | -------------------------------------------------------------------------------- /desktop/angular/src/theme/_breadcrumbs.scss: -------------------------------------------------------------------------------- 1 | h4.breadcrumbs { 2 | * { 3 | margin-left : 0.125rem; 4 | margin-right: 0.125rem; 5 | } 6 | 7 | span { 8 | outline: none; 9 | @apply text-secondary; 10 | 11 | &:hover { 12 | @apply text-primary; 13 | text-decoration: underline; 14 | } 15 | 16 | &:last-of-type { 17 | @apply text-primary; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /desktop/angular/src/theme/_dialog.scss: -------------------------------------------------------------------------------- 1 | .dialog-screen-backdrop { 2 | backdrop-filter : blur(10px); 3 | background-color: rgba(#000000, 0.7); 4 | } 5 | 6 | .dialog-screen-backdrop-light { 7 | backdrop-filter : blur(3px); 8 | background-color: rgba(#000000, 0.4); 9 | } 10 | -------------------------------------------------------------------------------- /desktop/angular/src/theme/_pill.scss: -------------------------------------------------------------------------------- 1 | @import 'mixins/_pill.scss'; 2 | 3 | .pill-container { 4 | @include pill-container; 5 | @apply pl-2; 6 | @apply bg-buttons-dark; 7 | } 8 | -------------------------------------------------------------------------------- /desktop/angular/src/theme/_search.scss: -------------------------------------------------------------------------------- 1 | em.search-result { 2 | @apply text-background; 3 | @apply bg-yellow; 4 | @apply border; 5 | @apply border-yellow; 6 | @apply rounded-sm; 7 | 8 | text-decoration: none; 9 | font-style: inherit; 10 | } 11 | -------------------------------------------------------------------------------- /desktop/angular/src/theme/_tailwind.scss: -------------------------------------------------------------------------------- 1 | /** The tailwind post-processor will inject all tailwind styles here **/ 2 | @import 'tailwindcss/base'; 3 | @import 'tailwindcss/components'; 4 | @import 'tailwindcss/utilities'; 5 | -------------------------------------------------------------------------------- /desktop/angular/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [ 7 | ] 8 | }, 9 | "files": [ 10 | "src/main.ts", 11 | "src/polyfills.ts" 12 | ], 13 | "include": [ 14 | "src/**/*.d.ts" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /desktop/angular/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts", 17 | "src/app/widgets/status-widget-factory/settings.ts" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /desktop/tauri/.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [target.aarch64-unknown-linux-gnu] 2 | linker = "aarch64-linux-gnu-gcc" 3 | rustflags = ["-C", "link-args=-L/usr/lib/aarch64-linux-gnu/"] 4 | 5 | [target.armv7-unknown-linux-gnueabihf] 6 | linker = "arm-linux-gnueabihf-gcc" 7 | rustflags = ["-C", "link-args=-L/usr/lib/arm-linux-gnueabihf/"] 8 | -------------------------------------------------------------------------------- /desktop/tauri/src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | -------------------------------------------------------------------------------- /desktop/tauri/src-tauri/Cross.toml: -------------------------------------------------------------------------------- 1 | [target.aarch64-unknown-linux-gnu] 2 | image = "ghcr.io/cross-rs/aarch64-unknown-linux-gnu:main" 3 | 4 | pre-build = [ 5 | "dpkg --add-architecture $CROSS_DEB_ARCH", 6 | "apt-get update && apt-get --assume-yes install libssl-dev:$CROSS_DEB_ARCH libjavascriptcoregtk-4.0-dev:$CROSS_DEB_ARCH librsvg2-dev libayatana-appindicator3-dev libwebkit2gtk-4.0-dev libsoup2.4-dev libgtk-3-dev" 7 | ] 8 | -------------------------------------------------------------------------------- /desktop/tauri/src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | tauri_build::build() 3 | } 4 | -------------------------------------------------------------------------------- /desktop/tauri/src-tauri/src/portapi/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod client; 2 | pub mod message; 3 | pub mod types; 4 | pub mod models; -------------------------------------------------------------------------------- /desktop/tauri/src-tauri/src/portapi/models/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod config; 2 | pub mod spn; 3 | pub mod notification; 4 | pub mod subsystem; -------------------------------------------------------------------------------- /desktop/tauri/src-tauri/src/portapi/models/spn.rs: -------------------------------------------------------------------------------- 1 | use serde::*; 2 | 3 | 4 | #[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] 5 | pub struct SPNStatus { 6 | #[serde(rename = "Status")] 7 | pub status: String, 8 | } -------------------------------------------------------------------------------- /desktop/tauri/src-tauri/src/service/manager.rs: -------------------------------------------------------------------------------- 1 | use std::process::{Command, ExitStatus, Stdio}; 2 | use std::{fs, io}; 3 | 4 | use thiserror::Error; 5 | 6 | #[cfg(target_os = "linux")] 7 | use std::os::unix::fs::PermissionsExt; 8 | 9 | use super::status::StatusResult; 10 | 11 | static SYSTEMCTL: &str = "systemctl"; 12 | // TODO(ppacher): add support for kdesudo and gksudo 13 | 14 | enum SudoCommand { 15 | Pkexec, 16 | Gksu, 17 | } 18 | -------------------------------------------------------------------------------- /desktop/tauri/src-tauri/templates/nsis_install_hooks.nsh: -------------------------------------------------------------------------------- 1 | !define NSIS_HOOK_POSTINSTALL "NSIS_HOOK_POSTINSTALL_" 2 | 3 | !macro NSIS_HOOK_POSTINSTALL_ 4 | ExecWait '"$INSTDIR\portmaster-start.exe" install core-service --data="$INSTDIR\data"' 5 | !macroend 6 | 7 | 8 | !define NSIS_HOOK_PREUNINSTALL "NSIS_HOOK_PREUNINSTALL_" 9 | 10 | !macro NSIS_HOOK_PREUNINSTALL_ 11 | ExecWait 'sc.exe stop PortmasterCore' 12 | ExecWait 'sc.exe delete PortmasterCore' 13 | !macroend 14 | 15 | -------------------------------------------------------------------------------- /packaging/linux/portmaster-autostart.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Portmaster 3 | GenericName=Application Firewall Notifier 4 | Exec=/usr/bin/portmaster --with-prompts --with-notifications --background 5 | Icon=portmaster 6 | Terminal=false 7 | Type=Application 8 | Categories=System 9 | NoDisplay=true -------------------------------------------------------------------------------- /packaging/linux/portmaster.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Portmaster 3 | GenericName=Application Firewall 4 | Exec={{exec}} --data=/opt/safing/portmaster --with-prompts --with-notifications 5 | Icon={{icon}} 6 | Terminal=false 7 | Type=Application 8 | Categories=System 9 | -------------------------------------------------------------------------------- /packaging/linux/postinst: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | systemctl daemon-reload 4 | systemctl enable portmaster.service 5 | 6 | echo "Please reboot your system" -------------------------------------------------------------------------------- /packaging/linux/postrm: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | -------------------------------------------------------------------------------- /packaging/windows/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/packaging/windows/.gitkeep -------------------------------------------------------------------------------- /runtime/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/runtime/.gitkeep -------------------------------------------------------------------------------- /service/broadcasts/testdata/README.md: -------------------------------------------------------------------------------- 1 | # Testing Broadcast Notifications 2 | 3 | ``` 4 | # View matching data 5 | curl http://127.0.0.1:817/api/v1/broadcasts/matching-data 6 | 7 | # Reset state 8 | curl -X POST http://127.0.0.1:817/api/v1/broadcasts/reset-state 9 | 10 | # Simulate notifications 11 | curl --upload-file notifications.yaml http://127.0.0.1:817/api/v1/broadcasts/simulate 12 | ``` 13 | -------------------------------------------------------------------------------- /service/compat/debug_default.go: -------------------------------------------------------------------------------- 1 | //go:build !windows && !linux 2 | 3 | package compat 4 | 5 | import "github.com/safing/portmaster/base/utils/debug" 6 | 7 | // AddToDebugInfo adds compatibility data to the given debug.Info. 8 | func AddToDebugInfo(di *debug.Info) { 9 | // Not yet implemented on this platform. 10 | } 11 | -------------------------------------------------------------------------------- /service/compat/iptables_test.go: -------------------------------------------------------------------------------- 1 | //go:build linux 2 | 3 | package compat 4 | 5 | import ( 6 | "testing" 7 | ) 8 | 9 | func TestIPTablesChains(t *testing.T) { 10 | // Skip in CI. 11 | if testing.Short() { 12 | t.Skip() 13 | } 14 | t.Parallel() 15 | 16 | chain, err := GetIPTablesChains() 17 | if err != nil { 18 | t.Fatal(err) 19 | } 20 | 21 | if len(chain) < 35 { 22 | t.Errorf("Expected at least 35 output lines, not %d", len(chain)) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /service/config.go: -------------------------------------------------------------------------------- 1 | package service 2 | 3 | type ServiceConfig struct{} 4 | -------------------------------------------------------------------------------- /service/core/os_default.go: -------------------------------------------------------------------------------- 1 | //go:build !windows 2 | 3 | package core 4 | 5 | // only return on Fatal error! 6 | func startPlatformSpecific() error { 7 | return nil 8 | } 9 | -------------------------------------------------------------------------------- /service/firewall/interception/dnsmonitor/eventlistener.go: -------------------------------------------------------------------------------- 1 | //go:build !linux && !windows 2 | // +build !linux,!windows 3 | 4 | package dnsmonitor 5 | 6 | type Listener struct{} 7 | 8 | func newListener(_ *DNSMonitor) (*Listener, error) { 9 | return &Listener{}, nil 10 | } 11 | 12 | func (l *Listener) flush() error { 13 | // Nothing to flush 14 | return nil 15 | } 16 | 17 | func (l *Listener) stop() error { 18 | return nil 19 | } 20 | -------------------------------------------------------------------------------- /service/firewall/interception/ebpf/bandwidth/bpf_bpfeb.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/service/firewall/interception/ebpf/bandwidth/bpf_bpfeb.o -------------------------------------------------------------------------------- /service/firewall/interception/ebpf/bandwidth/bpf_bpfel.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/service/firewall/interception/ebpf/bandwidth/bpf_bpfel.o -------------------------------------------------------------------------------- /service/firewall/interception/ebpf/connection_listener/bpf_bpfeb.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/service/firewall/interception/ebpf/connection_listener/bpf_bpfeb.o -------------------------------------------------------------------------------- /service/firewall/interception/ebpf/connection_listener/bpf_bpfel.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/service/firewall/interception/ebpf/connection_listener/bpf_bpfel.o -------------------------------------------------------------------------------- /service/firewall/interception/ebpf/exec/bpf_bpfeb.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/service/firewall/interception/ebpf/exec/bpf_bpfeb.o -------------------------------------------------------------------------------- /service/firewall/interception/ebpf/exec/bpf_bpfel.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/service/firewall/interception/ebpf/exec/bpf_bpfel.o -------------------------------------------------------------------------------- /service/firewall/interception/windowskext/doc.go: -------------------------------------------------------------------------------- 1 | // +build windows 2 | 3 | // Package windowskext provides network interception capabilities on windows via the Portmaster Kernel Extension. 4 | package windowskext 5 | -------------------------------------------------------------------------------- /service/firewall/interception/windowskext2/doc.go: -------------------------------------------------------------------------------- 1 | // +build windows 2 | 3 | // Package windowskext provides network interception capabilities on windows via the Portmaster Kernel Extension. 4 | package windowskext 5 | -------------------------------------------------------------------------------- /service/firewall/interception/windowskext2/service.go: -------------------------------------------------------------------------------- 1 | //go:build windows 2 | // +build windows 3 | 4 | package windowskext 5 | 6 | import "github.com/safing/portmaster/windows_kext/kextinterface" 7 | 8 | func createKextService(driverName string, driverPath string) (*kextinterface.KextService, error) { 9 | return kextinterface.CreateKextService(driverName, driverPath) 10 | } 11 | -------------------------------------------------------------------------------- /service/integration/integration.go: -------------------------------------------------------------------------------- 1 | //go:build !windows 2 | // +build !windows 3 | 4 | package integration 5 | 6 | type OSSpecific struct{} 7 | 8 | // Initialize is empty on any OS different then Windows. 9 | func (i *OSIntegration) Initialize() error { 10 | return nil 11 | } 12 | 13 | // CleanUp releases any resourses allocated during initializaion. 14 | func (i *OSIntegration) CleanUp() error { 15 | return nil 16 | } 17 | -------------------------------------------------------------------------------- /service/intel/resolver.go: -------------------------------------------------------------------------------- 1 | package intel 2 | 3 | import ( 4 | "context" 5 | ) 6 | 7 | var reverseResolver func(ctx context.Context, ip string) (domain string, err error) 8 | 9 | // SetReverseResolver allows the resolver module to register a function to allow reverse resolving IPs to domains. 10 | func SetReverseResolver(fn func(ctx context.Context, ip string) (domain string, err error)) { 11 | if reverseResolver == nil { 12 | reverseResolver = fn 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /service/mgr/doc.go: -------------------------------------------------------------------------------- 1 | // Package mgr provides simple managing of flow control and logging. 2 | package mgr 3 | -------------------------------------------------------------------------------- /service/netenv/environment_linux_test.go: -------------------------------------------------------------------------------- 1 | package netenv 2 | 3 | import "testing" 4 | 5 | func TestLinuxEnvironment(t *testing.T) { 6 | t.Parallel() 7 | 8 | nameserversTest, err := getNameserversFromResolvconf() 9 | if err != nil { 10 | t.Errorf("failed to get namerservers from resolvconf: %s", err) 11 | } 12 | t.Logf("nameservers from resolvconf: %+v", nameserversTest) 13 | } 14 | -------------------------------------------------------------------------------- /service/netenv/environment_test.go: -------------------------------------------------------------------------------- 1 | package netenv 2 | 3 | import "testing" 4 | 5 | func TestEnvironment(t *testing.T) { 6 | t.Parallel() 7 | 8 | nameserversTest := Nameservers() 9 | t.Logf("nameservers: %+v", nameserversTest) 10 | 11 | gatewaysTest := Gateways() 12 | t.Logf("gateways: %+v", gatewaysTest) 13 | } 14 | -------------------------------------------------------------------------------- /service/netenv/environment_windows_test.go: -------------------------------------------------------------------------------- 1 | package netenv 2 | 3 | import "testing" 4 | 5 | func TestWindowsEnvironment(t *testing.T) { 6 | defaultIf := getDefaultInterface() 7 | if defaultIf == nil { 8 | t.Error("failed to get default interface") 9 | } 10 | t.Logf("default interface: %+v", defaultIf) 11 | } 12 | -------------------------------------------------------------------------------- /service/netenv/location_default.go: -------------------------------------------------------------------------------- 1 | //go:build !windows 2 | 3 | package netenv 4 | 5 | import "net" 6 | 7 | func newICMPListener(_ string) (net.PacketConn, error) { //nolint:unused,deadcode // TODO: clean with Windows code later. 8 | return net.ListenPacket("ip4:icmp", "0.0.0.0") 9 | } 10 | -------------------------------------------------------------------------------- /service/netenv/main_test.go: -------------------------------------------------------------------------------- 1 | package netenv 2 | 3 | // func TestMain(m *testing.M) { 4 | // pmtesting.TestMain(m, module) 5 | // } 6 | -------------------------------------------------------------------------------- /service/netenv/online-status_test.go: -------------------------------------------------------------------------------- 1 | package netenv 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | ) 7 | 8 | func TestCheckOnlineStatus(t *testing.T) { 9 | t.Parallel() 10 | 11 | checkOnlineStatus(context.Background()) 12 | t.Logf("online status: %s", GetOnlineStatus()) 13 | t.Logf("captive portal: %+v", GetCaptivePortal()) 14 | } 15 | -------------------------------------------------------------------------------- /service/netenv/os_default.go: -------------------------------------------------------------------------------- 1 | //go:build !android 2 | 3 | package netenv 4 | 5 | import ( 6 | "net" 7 | "time" 8 | ) 9 | 10 | var ( 11 | monitorNetworkChangeOnlineTicker = time.NewTicker(15 * time.Second) 12 | monitorNetworkChangeOfflineTicker = time.NewTicker(time.Second) 13 | ) 14 | 15 | func osGetInterfaceAddrs() ([]net.Addr, error) { 16 | return net.InterfaceAddrs() 17 | } 18 | 19 | func osGetNetworkInterfaces() ([]net.Interface, error) { 20 | return net.Interfaces() 21 | } 22 | -------------------------------------------------------------------------------- /service/process/doc.go: -------------------------------------------------------------------------------- 1 | // Package process fetches process and socket information from the operating system. 2 | // It can find the process owning a network connection. 3 | package process 4 | -------------------------------------------------------------------------------- /service/profile/binmeta/find_default.go: -------------------------------------------------------------------------------- 1 | //go:build !linux && !windows 2 | 3 | package binmeta 4 | 5 | import "context" 6 | 7 | // GetIconAndName returns zero values for unsupported platforms. 8 | func GetIconAndName(ctx context.Context, binPath string, homeDir string) (icon *Icon, name string, err error) { 9 | return nil, "", nil 10 | } 11 | -------------------------------------------------------------------------------- /service/resolver/compat.go: -------------------------------------------------------------------------------- 1 | package resolver 2 | 3 | import "net" 4 | 5 | // This is a workaround for enabling the resolver to work with the compat 6 | // module without importing it. Long-term, the network module should not import 7 | // the resolver package, as this breaks the SPN hub. 8 | var ( 9 | CompatDNSCheckInternalDomainScope string 10 | CompatSelfCheckIsFailing func() bool 11 | CompatSubmitDNSCheckDomain func(subdomain string) (respondWith net.IP) 12 | ) 13 | -------------------------------------------------------------------------------- /service/updates/os_integration_default.go: -------------------------------------------------------------------------------- 1 | //go:build !linux 2 | // +build !linux 3 | 4 | package updates 5 | 6 | func upgradeSystemIntegration() error { 7 | return nil 8 | } 9 | -------------------------------------------------------------------------------- /spn/access/account/client.go: -------------------------------------------------------------------------------- 1 | package account 2 | 3 | // Customer Agent URLs. 4 | const ( 5 | CAAuthenticateURL = "/authenticate" 6 | CAProfileURL = "/user/profile" 7 | CAGetTokensURL = "/tokens" 8 | ) 9 | 10 | // Customer Hub URLs. 11 | const ( 12 | CHAuthenticateURL = "/v1/authenticate" 13 | CHUserProfileURL = "/v1/user_profile" 14 | ) 15 | -------------------------------------------------------------------------------- /spn/conf/map.go: -------------------------------------------------------------------------------- 1 | package conf 2 | 3 | import ( 4 | "flag" 5 | 6 | "github.com/safing/portmaster/spn/hub" 7 | ) 8 | 9 | // Primary Map Configuration. 10 | var ( 11 | MainMapName = "main" 12 | MainMapScope = hub.ScopePublic 13 | ) 14 | 15 | func init() { 16 | flag.StringVar(&MainMapName, "spn-map", "main", "set main SPN map - use only for testing") 17 | } 18 | -------------------------------------------------------------------------------- /spn/conf/version.go: -------------------------------------------------------------------------------- 1 | package conf 2 | 3 | const ( 4 | // VersionOne is the first protocol version. 5 | VersionOne = 1 6 | 7 | // CurrentVersion always holds the newest version in production. 8 | CurrentVersion = 1 9 | ) 10 | -------------------------------------------------------------------------------- /spn/spn.go: -------------------------------------------------------------------------------- 1 | package spn 2 | -------------------------------------------------------------------------------- /spn/testing/simple/config-template.json: -------------------------------------------------------------------------------- 1 | { 2 | "core": { 3 | "log": { 4 | "level": "trace" 5 | }, 6 | "metrics": { 7 | "instance": "test_$HUBNAME", 8 | "push": "" 9 | } 10 | }, 11 | "spn": { 12 | "publicHub": { 13 | "name": "test-$HUBNAME", 14 | "transports": ["http:80", "http:8080", "tcp:17"], 15 | "allowUnencrypted": true, 16 | "bindToAdvertised": true 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /spn/testing/simple/reset-databases.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd "$( dirname "${BASH_SOURCE[0]}" )" 4 | 5 | rm -rf testdata/me/* 6 | rm -rf testdata/shared/* 7 | rm -rf testdata/hub*/databases 8 | -------------------------------------------------------------------------------- /spn/testing/simple/stop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd "$( dirname "${BASH_SOURCE[0]}" )" 4 | 5 | docker compose -p spn-test-simple stop 6 | docker compose -p spn-test-simple rm 7 | 8 | oldnet=$(docker network ls | grep spn-test-simple | cut -d" " -f1) 9 | if [[ $oldnet != "" ]]; then 10 | docker network rm $oldnet 11 | fi 12 | 13 | if [[ -d "data/shared" ]]; then 14 | rm -r "data/shared" 15 | fi 16 | -------------------------------------------------------------------------------- /spn/tools/start-checksum.txt: -------------------------------------------------------------------------------- 1 | 3f45f0814c6db28c3899b39ae0ab01f8f20a8cc98697dbe8039162ccd9590bf8 ./portmaster-start 2 | -------------------------------------------------------------------------------- /windows_core_dll/build.ps1: -------------------------------------------------------------------------------- 1 | msbuild .\windows_core_dll.sln /p:Configuration=Release 2 | ls .\x64\Release\portmaster-core.dll -------------------------------------------------------------------------------- /windows_core_dll/framework.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 4 | // Windows Header Files 5 | #include 6 | -------------------------------------------------------------------------------- /windows_core_dll/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: source file corresponding to the pre-compiled header 2 | 3 | #include "pch.h" 4 | 5 | // When you are using pre-compiled headers, this source file is necessary for compilation to succeed. 6 | -------------------------------------------------------------------------------- /windows_core_dll/windows_core_dll.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /windows_kext/c_helper/ARM64/c_helper.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/windows_kext/c_helper/ARM64/c_helper.lib -------------------------------------------------------------------------------- /windows_kext/c_helper/x64/c_helper.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safing/portmaster/45565fa34f4299469d3fa8c55f1325c64fe4061a/windows_kext/c_helper/x64/c_helper.lib -------------------------------------------------------------------------------- /windows_kext/driver/.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | target = "x86_64-pc-windows-msvc" 3 | rustflags = ["-C", "panic=abort"] 4 | -------------------------------------------------------------------------------- /windows_kext/driver/Makefile.toml: -------------------------------------------------------------------------------- 1 | [env.development] 2 | TARGET_PATH = "target/x86_64-pc-windows-msvc/debug" 3 | 4 | [env.production] 5 | TARGET_PATH = "target/x86_64-pc-windows-msvc/release" 6 | BUILD_FLAGS = "--release" 7 | 8 | [tasks.build-driver] 9 | script = [ 10 | "cargo build $BUILD_FLAGS", 11 | ] 12 | 13 | [tasks.upload] 14 | dependencies = ["build-driver"] 15 | script = [ 16 | "scp $TARGET_PATH/driver.lib windows:'C:/Dev/'", 17 | ] 18 | 19 | -------------------------------------------------------------------------------- /windows_kext/driver/rust-toolchain: -------------------------------------------------------------------------------- 1 | stable 2 | -------------------------------------------------------------------------------- /windows_kext/kextinterface/kext_file_test.go: -------------------------------------------------------------------------------- 1 | //go:build linux 2 | // +build linux 3 | 4 | package kextinterface 5 | 6 | type KextFile struct{} 7 | 8 | func (f *KextFile) Read(buffer []byte) (int, error) { 9 | return 0, nil 10 | } 11 | 12 | // func (f *KextFile) flushBuffer() {} 13 | -------------------------------------------------------------------------------- /windows_kext/kextinterface/version.txt: -------------------------------------------------------------------------------- 1 | [2, 0, 6, 0] 2 | -------------------------------------------------------------------------------- /windows_kext/protocol/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "protocol" 3 | version = "0.0.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | num = { version = "0.4", default-features = false } 10 | num-derive = { version = "0.4", default-features = false } 11 | num-traits = { version = "0.2", default-features = false } 12 | 13 | [dev-dependencies] 14 | rand = "0.8.5" 15 | -------------------------------------------------------------------------------- /windows_kext/protocol/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr(not(test), no_std)] 2 | extern crate alloc; 3 | 4 | pub mod command; 5 | pub mod info; 6 | -------------------------------------------------------------------------------- /windows_kext/release/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "release" 3 | version = "0.0.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | handlebars = "5.1.0" 10 | serde = "1.0.197" 11 | serde_derive = "1.0.197" 12 | serde_json = "1.0.114" 13 | chrono = "0.4.35" 14 | zip = { version = "0.6.6", default-features = false } 15 | -------------------------------------------------------------------------------- /windows_kext/test_protocol.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo Running tests 3 | echo ======================== 4 | cd protocol 5 | cargo test 6 | 7 | cd ../kextinterface 8 | go test -v . 9 | -------------------------------------------------------------------------------- /windows_kext/wdk/.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | target = "x86_64-pc-windows-msvc" 3 | -------------------------------------------------------------------------------- /windows_kext/wdk/build.rs: -------------------------------------------------------------------------------- 1 | #[cfg(target_arch = "x86_64")] 2 | fn main() { 3 | // C Helper 4 | println!("cargo:rerun-if-changed=../c_helper/x64/c_helper.lib"); 5 | println!("cargo:rustc-link-search=native=../c_helper/x64"); 6 | } 7 | 8 | #[cfg(target_arch = "aarch64")] 9 | fn main() { 10 | // C Helper 11 | println!("cargo:rerun-if-changed=../c_helper/ARM64/c_helper.lib"); 12 | println!("cargo:rustc-link-search=native=../c_helper/ARM64"); 13 | } 14 | -------------------------------------------------------------------------------- /windows_kext/wdk/rust-analyzer.cargo.target: -------------------------------------------------------------------------------- 1 | x86_64-pc-windows-msvc -------------------------------------------------------------------------------- /windows_kext/wdk/rust-toolchain: -------------------------------------------------------------------------------- 1 | stable 2 | -------------------------------------------------------------------------------- /windows_kext/wdk/src/error.rs: -------------------------------------------------------------------------------- 1 | // use anyhow::anyhow; 2 | 3 | // pub fn anyhow_ntstatus(status: i32) -> anyhow::Error { 4 | // if let Some(value) = ntstatus::ntstatus::NtStatus::from_u32(status as u32) { 5 | // return anyhow!(value); 6 | // } 7 | 8 | // return anyhow!("UNKNOWN_NTSTATUS_CODE"); 9 | // } 10 | --------------------------------------------------------------------------------