diff --git a/.gitmodules b/.gitmodules index 0948533d2..24f6c439a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -35,3 +35,7 @@ [submodule "third-party/libdeflate"] path = third-party/libdeflate url = https://github.com/transmission/libdeflate +[submodule "third-party/libpsl"] + path = third-party/libpsl + url = https://github.com/transmission/libpsl.git + branch = post-3.0.0-transmission diff --git a/CMakeLists.txt b/CMakeLists.txt index 35ac9f803..56061c6c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,7 @@ tr_auto_option(USE_SYSTEM_MINIUPNPC "Use system miniupnpc library" AUTO) tr_auto_option(USE_SYSTEM_NATPMP "Use system natpmp library" AUTO) tr_auto_option(USE_SYSTEM_UTP "Use system utp library" AUTO) tr_auto_option(USE_SYSTEM_B64 "Use system b64 library" AUTO) +tr_auto_option(USE_SYSTEM_PSL "Use system psl library" AUTO) tr_auto_option(USE_QT_VERSION "Use specific Qt version" AUTO 5 6) tr_list_option(WITH_CRYPTO "Use specified crypto library" AUTO openssl cyassl polarssl ccrypto) tr_auto_option(WITH_INOTIFY "Enable inotify support (on systems that support it)" AUTO) @@ -109,6 +110,7 @@ string(SUBSTRING "${TR_VCS_REVISION}" 0 10 TR_VCS_REVISION) set_property(GLOBAL PROPERTY USE_FOLDERS ON) +set(PSL_MINIMUM 0.21.1) set(CURL_MINIMUM 7.28.0) set(CYASSL_MINIMUM 3.0) set(DEFLATE_MINIMUM 1.9) @@ -354,6 +356,8 @@ endif() tr_add_external_auto_library(DHT dht dht) +tr_add_external_auto_library(PSL libpsl psl) + if(ENABLE_UTP) tr_add_external_auto_library(UTP libutp utp) diff --git a/README.md b/README.md index a5e55da92..bb36aaeb8 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ If you're new to building programs from source code, this is typically easier th $ git clone https://github.com/transmission/transmission Transmission $ cd Transmission - $ git submodule update --init + $ git submodule update --init --recursive $ mkdir build $ cd build $ # Use -DCMAKE_BUILD_TYPE=RelWithDebInfo to build optimized binary. @@ -58,7 +58,7 @@ If you're new to building programs from source code, this is typically easier th $ cd Transmission/build $ make clean $ git pull --rebase --prune - $ git submodule update + $ git submodule update --recursive $ # Use -DCMAKE_BUILD_TYPE=RelWithDebInfo to build optimized binary. $ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. $ make diff --git a/Transmission.xcodeproj/project.pbxproj b/Transmission.xcodeproj/project.pbxproj index 6ca5c00cf..138565159 100644 --- a/Transmission.xcodeproj/project.pbxproj +++ b/Transmission.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 0A89346B736DBCF81F3A4852 /* torrent-metainfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A89346B736DBCF81F3A4853 /* torrent-metainfo.h */; }; 1BB44E07B1B52E28291B4E32 /* file-piece-map.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1BB44E07B1B52E28291B4E30 /* file-piece-map.cc */; }; 1BB44E07B1B52E28291B4E33 /* file-piece-map.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BB44E07B1B52E28291B4E31 /* file-piece-map.h */; }; + 2856E0656A49F2665D69E760 /* benc.h in Headers */ = {isa = PBXBuildFile; fileRef = 2856E0656A49F2665D69E761 /* benc.h */; }; 35F373030C2DA89000DAA8F2 /* FilePriorityCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 35F373010C2DA88F00DAA8F2 /* FilePriorityCell.mm */; }; 3C7A11970D0B2EE300B5701F /* getgateway.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C7A11910D0B2EE300B5701F /* getgateway.c */; }; 3C7A11980D0B2EE300B5701F /* getgateway.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C7A11920D0B2EE300B5701F /* getgateway.h */; }; @@ -399,8 +400,11 @@ C3CEBBFA2794A0D200683BE0 /* compiler_gcc.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CEBBF72794A0D200683BE0 /* compiler_gcc.h */; }; C3CEBBFB2794A0D200683BE0 /* compiler_msc.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CEBBF82794A0D200683BE0 /* compiler_msc.h */; }; C3CEBBFC2794A12200683BE0 /* libdeflate.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CEBBA927949CA000683BE0 /* libdeflate.a */; }; + C3D9062627B7E3E200EF2386 /* lookup_string_in_fixed_set.c in Sources */ = {isa = PBXBuildFile; fileRef = C3D9061727B7E1DE00EF2386 /* lookup_string_in_fixed_set.c */; }; + C3D9062727B7E3E800EF2386 /* psl.c in Sources */ = {isa = PBXBuildFile; fileRef = C3D9061827B7E1DE00EF2386 /* psl.c */; }; + C3D9062A27B7EAC600EF2386 /* libpsl.h in Headers */ = {isa = PBXBuildFile; fileRef = C3D9061B27B7E31100EF2386 /* libpsl.h */; }; + C3D9062F27B7F7E200EF2386 /* libpsl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D9062127B7E3C900EF2386 /* libpsl.a */; }; CAB35C64252F6F5E00552A55 /* mime-types.h in Headers */ = {isa = PBXBuildFile; fileRef = CAB35C62252F6F5E00552A55 /* mime-types.h */; }; - 2856E0656A49F2665D69E760 /* benc.h in Headers */ = {isa = PBXBuildFile; fileRef = 2856E0656A49F2665D69E761 /* benc.h */; }; E138A9780C04D88F00C5426C /* ProgressGradients.mm in Sources */ = {isa = PBXBuildFile; fileRef = E138A9760C04D88F00C5426C /* ProgressGradients.mm */; }; E23B55A5FC3B557F7746D510 /* interned-string.h in Headers */ = {isa = PBXBuildFile; fileRef = E23B55A5FC3B557F7746D511 /* interned-string.h */; settings = {ATTRIBUTES = (Project, ); }; }; E71A5565279C2DD600EBFA1E /* tr-assert.mm in Sources */ = {isa = PBXBuildFile; fileRef = E71A5564279C2DD600EBFA1E /* tr-assert.mm */; }; @@ -512,6 +516,13 @@ remoteGlobalIDString = C3CEBB9F27949CA000683BE0; remoteInfo = deflate; }; + C3D9062D27B7F7CE00EF2386 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = C3D9062027B7E3C900EF2386; + remoteInfo = psl; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -547,6 +558,7 @@ 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 1BB44E07B1B52E28291B4E30 /* file-piece-map.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = "file-piece-map.cc"; sourceTree = ""; }; 1BB44E07B1B52E28291B4E31 /* file-piece-map.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "file-piece-map.h"; sourceTree = ""; }; + 2856E0656A49F2665D69E761 /* benc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = benc.h; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -1111,8 +1123,11 @@ C3CEBBF62794A0D200683BE0 /* common_defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common_defs.h; path = common/common_defs.h; sourceTree = ""; }; C3CEBBF72794A0D200683BE0 /* compiler_gcc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = compiler_gcc.h; path = common/compiler_gcc.h; sourceTree = ""; }; C3CEBBF82794A0D200683BE0 /* compiler_msc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = compiler_msc.h; path = common/compiler_msc.h; sourceTree = ""; }; + C3D9061727B7E1DE00EF2386 /* lookup_string_in_fixed_set.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lookup_string_in_fixed_set.c; path = src/lookup_string_in_fixed_set.c; sourceTree = ""; }; + C3D9061827B7E1DE00EF2386 /* psl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = psl.c; path = src/psl.c; sourceTree = ""; }; + C3D9061B27B7E31100EF2386 /* libpsl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libpsl.h; path = include/libpsl.h; sourceTree = ""; }; + C3D9062127B7E3C900EF2386 /* libpsl.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libpsl.a; sourceTree = BUILT_PRODUCTS_DIR; }; CAB35C62252F6F5E00552A55 /* mime-types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mime-types.h"; sourceTree = ""; }; - 2856E0656A49F2665D69E761 /* benc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "benc.h"; sourceTree = ""; }; E138A9750C04D88F00C5426C /* ProgressGradients.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ProgressGradients.h; sourceTree = ""; }; E138A9760C04D88F00C5426C /* ProgressGradients.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ProgressGradients.mm; sourceTree = ""; }; E23B55A5FC3B557F7746D511 /* interned-string.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "interned-string.h"; sourceTree = SOURCE_ROOT; }; @@ -1209,6 +1224,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + C3D9062F27B7F7E200EF2386 /* libpsl.a in Frameworks */, C3CEBBFC2794A12200683BE0 /* libdeflate.a in Frameworks */, C1A7517526ED048C0038B90A /* libarc4.a in Frameworks */, C1639A741A55F4E000E42033 /* libb64.a in Frameworks */, @@ -1265,6 +1281,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C3D9061F27B7E3C900EF2386 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -1376,6 +1399,7 @@ C1639A6F1A55F4D600E42033 /* libb64.a */, C1A7516426ED03140038B90A /* libarc4.a */, C3CEBBA927949CA000683BE0 /* libdeflate.a */, + C3D9062127B7E3C900EF2386 /* libpsl.a */, ); name = Products; sourceTree = ""; @@ -1397,6 +1421,7 @@ BE75C3570C72A0D600DBEFE0 /* libevent */, BE1183410CE15DF00002D0F3 /* libminiupnp */, 3C7A11880D0B2E6700B5701F /* libnatpmp */, + C3D9061627B7E12F00EF2386 /* libpsl */, C1639A751A55F52800E42033 /* b64 */, 4DDBB71509E16B3F00284745 /* Libraries */, A2F35BBA15C5A0A100EBF632 /* Frameworks */, @@ -1931,6 +1956,17 @@ name = common; sourceTree = ""; }; + C3D9061627B7E12F00EF2386 /* libpsl */ = { + isa = PBXGroup; + children = ( + C3D9061B27B7E31100EF2386 /* libpsl.h */, + C3D9061727B7E1DE00EF2386 /* lookup_string_in_fixed_set.c */, + C3D9061827B7E1DE00EF2386 /* psl.c */, + ); + name = libpsl; + path = "third-party/libpsl"; + sourceTree = ""; + }; E1B6FBF80C0D719B0015FE4D /* Info Window */ = { isa = PBXGroup; children = ( @@ -2186,6 +2222,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C3D9061D27B7E3C900EF2386 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C3D9062A27B7EAC600EF2386 /* libpsl.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -2226,6 +2270,7 @@ A22CFCC70FC24F990009BD3E /* PBXTargetDependency */, A2E384E4130DFB51001F501B /* PBXTargetDependency */, C165AB8D1A55FAA900D37711 /* PBXTargetDependency */, + C3D9062E27B7F7CE00EF2386 /* PBXTargetDependency */, ); name = libtransmission; productName = transmission; @@ -2447,6 +2492,24 @@ productReference = C3CEBBA927949CA000683BE0 /* libdeflate.a */; productType = "com.apple.product-type.library.static"; }; + C3D9062027B7E3C900EF2386 /* psl */ = { + isa = PBXNativeTarget; + buildConfigurationList = C3D9062227B7E3C900EF2386 /* Build configuration list for PBXNativeTarget "psl" */; + buildPhases = ( + C3D9062C27B7F4FE00EF2386 /* ShellScript */, + C3D9061D27B7E3C900EF2386 /* Headers */, + C3D9061E27B7E3C900EF2386 /* Sources */, + C3D9061F27B7E3C900EF2386 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = psl; + productName = libpsl; + productReference = C3D9062127B7E3C900EF2386 /* libpsl.a */; + productType = "com.apple.product-type.library.static"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -2466,6 +2529,9 @@ C1639A6E1A55F4D600E42033 = { CreatedOnToolsVersion = 6.1.1; }; + C3D9062027B7E3C900EF2386 = { + CreatedOnToolsVersion = 13.0; + }; }; }; buildConfigurationList = 4DF0C59A089918A300DD8943 /* Build configuration list for PBXProject "Transmission" */; @@ -2503,6 +2569,7 @@ C1639A6E1A55F4D600E42033 /* b64 */, C1A7516326ED03140038B90A /* arc4 */, C3CEBB9F27949CA000683BE0 /* deflate */, + C3D9062027B7E3C900EF2386 /* psl */, ); }; /* End PBXProject section */ @@ -2571,7 +2638,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "sh update-version-h.sh"; + shellScript = "sh update-version-h.sh\n"; }; A2305097100C0293003FDB0C /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -2644,6 +2711,25 @@ shellPath = /bin/sh; shellScript = "cd third-party/dht && rm -f dht && ln -s . dht\n"; }; + C3D9062C27B7F4FE00EF2386 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "third-party/libpsl/include/libpsl.h.in", + ); + outputFileListPaths = ( + ); + outputPaths = ( + "third-party/libpsl/include/libpsl.h", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "sed 's|@LIBPSL_[A-Z_]*@|0|' < third-party/libpsl/include/libpsl.h.in > third-party/libpsl/include/libpsl.h\n"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -2944,6 +3030,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C3D9061E27B7E3C900EF2386 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C3D9062627B7E3E200EF2386 /* lookup_string_in_fixed_set.c in Sources */, + C3D9062727B7E3E800EF2386 /* psl.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -3017,6 +3112,11 @@ target = C3CEBB9F27949CA000683BE0 /* deflate */; targetProxy = C33E46A12794B3CC0090F2AA /* PBXContainerItemProxy */; }; + C3D9062E27B7F7CE00EF2386 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C3D9062027B7E3C900EF2386 /* psl */; + targetProxy = C3D9062D27B7F7CE00EF2386 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -3277,6 +3377,7 @@ "third-party/libutp", "third-party/utfcpp/source", "third-party/libdeflate", + "third-party/libpsl/include", ); OTHER_CFLAGS = ( "$(inherited)", @@ -3469,6 +3570,7 @@ "third-party/libutp", "third-party/utfcpp/source", "third-party/libdeflate", + "third-party/libpsl/include", ); OTHER_CFLAGS = ( "$(inherited)", @@ -3718,6 +3820,7 @@ "third-party/libutp", "third-party/utfcpp/source", "third-party/libdeflate", + "third-party/libpsl/include", ); OTHER_CFLAGS = ( "$(inherited)", @@ -4012,6 +4115,33 @@ }; name = Release; }; + C3D9062327B7E3C900EF2386 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = "PACKAGE_VERSION=\"\\\"0\\\"\""; + HEADER_SEARCH_PATHS = "third-party/libpsl/include"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + C3D9062427B7E3C900EF2386 /* Release - Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = "PACKAGE_VERSION=\"\\\"0\\\"\""; + HEADER_SEARCH_PATHS = "third-party/libpsl/include"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = "Release - Debug"; + }; + C3D9062527B7E3C900EF2386 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = "PACKAGE_VERSION=\"\\\"0\\\"\""; + HEADER_SEARCH_PATHS = "third-party/libpsl/include"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -4165,6 +4295,16 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + C3D9062227B7E3C900EF2386 /* Build configuration list for PBXNativeTarget "psl" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C3D9062327B7E3C900EF2386 /* Debug */, + C3D9062427B7E3C900EF2386 /* Release - Debug */, + C3D9062527B7E3C900EF2386 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; diff --git a/appveyor.yml b/appveyor.yml index 9d5cb81d1..a02743d57 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -38,6 +38,7 @@ for: git submodule update --init --recursive + choco install python3 --pre choco install ActivePerl choco install nasm choco install jom diff --git a/cmake/FindPSL.cmake b/cmake/FindPSL.cmake new file mode 100644 index 000000000..36b89ff99 --- /dev/null +++ b/cmake/FindPSL.cmake @@ -0,0 +1,34 @@ +if(PSL_PREFER_STATIC_LIB) + set(PSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +if(UNIX) + find_package(PkgConfig QUIET) + pkg_check_modules(_PSL QUIET libpsl) +endif() + +find_path(PSL_INCLUDE_DIR NAMES libpsl.h HINTS ${_PSL_INCLUDEDIR}) +find_library(PSL_LIBRARY NAMES libpsl HINTS ${_PSL_LIBDIR}) + +set(PSL_INCLUDE_DIRS ${PSL_INCLUDE_DIR}) +set(PSL_LIBRARIES ${PSL_LIBRARY}) + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(PSL + REQUIRED_VARS + PSL_LIBRARY + PSL_INCLUDE_DIR +) + +mark_as_advanced(PSL_INCLUDE_DIR PSL_LIBRARY) + +if(PSL_PREFER_STATIC_LIB) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${PSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + unset(PSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +endif() diff --git a/extras/rpc-spec.md b/extras/rpc-spec.md index 7ae938a36..0f49f0c68 100644 --- a/extras/rpc-spec.md +++ b/extras/rpc-spec.md @@ -352,41 +352,43 @@ The 'source' column here corresponds to the data structure there. | Key | Value Type | transmission.h source |:--|:--|:-- -| `announce` | string | tr_tracker_info -| `id` | number | tr_tracker_info -| `scrape` | string | tr_tracker_info -| `tier` | number | tr_tracker_info +| `announce` | string | tr_tracker_view +| `id` | number | tr_tracker_view +| `scrape` | string | tr_tracker_view +| `sitename` | string | tr_tracker_view +| `tier` | number | tr_tracker_view `trackerStats`: array of objects, each containing: | Key | Value Type | transmission.h source |:--|:--|:-- -| `announce` | string | tr_tracker_stat -| `announceState` | number | tr_tracker_stat -| `downloadCount` | number | tr_tracker_stat -| `hasAnnounced` | boolean | tr_tracker_stat -| `hasScraped` | boolean | tr_tracker_stat -| `host` | string | tr_tracker_stat -| `id` | number | tr_tracker_stat -| `isBackup` | boolean | tr_tracker_stat -| `lastAnnouncePeerCount` | number | tr_tracker_stat -| `lastAnnounceResult` | string | tr_tracker_stat -| `lastAnnounceStartTime` | number | tr_tracker_stat -| `lastAnnounceSucceeded` | boolean | tr_tracker_stat -| `lastAnnounceTime` | number | tr_tracker_stat -| `lastAnnounceTimedOut` | boolean | tr_tracker_stat -| `lastScrapeResult` | string | tr_tracker_stat -| `lastScrapeStartTime` | number | tr_tracker_stat -| `lastScrapeSucceeded` | boolean | tr_tracker_stat -| `lastScrapeTime` | number | tr_tracker_stat -| `lastScrapeTimedOut` | boolean | tr_tracker_stat -| `leecherCount` | number | tr_tracker_stat -| `nextAnnounceTime` | number | tr_tracker_stat -| `nextScrapeTime` | number | tr_tracker_stat -| `scrape` | string | tr_tracker_stat -| `scrapeState` | number | tr_tracker_stat -| `seederCount` | number | tr_tracker_stat -| `tier` | number | tr_tracker_stat +| `announceState` | number | tr_tracker_view +| `announce` | string | tr_tracker_view +| `downloadCount` | number | tr_tracker_view +| `hasAnnounced` | boolean | tr_tracker_view +| `hasScraped` | boolean | tr_tracker_view +| `host` | string | tr_tracker_view +| `id` | number | tr_tracker_view +| `isBackup` | boolean | tr_tracker_view +| `lastAnnouncePeerCount` | number | tr_tracker_view +| `lastAnnounceResult` | string | tr_tracker_view +| `lastAnnounceStartTime` | number | tr_tracker_view +| `lastAnnounceSucceeded` | boolean | tr_tracker_view +| `lastAnnounceTime` | number | tr_tracker_view +| `lastAnnounceTimedOut` | boolean | tr_tracker_view +| `lastScrapeResult` | string | tr_tracker_view +| `lastScrapeStartTime` | number | tr_tracker_view +| `lastScrapeSucceeded` | boolean | tr_tracker_view +| `lastScrapeTime` | number | tr_tracker_view +| `lastScrapeTimedOut` | boolean | tr_tracker_view +| `leecherCount` | number | tr_tracker_view +| `nextAnnounceTime` | number | tr_tracker_view +| `nextScrapeTime` | number | tr_tracker_view +| `scrapeState` | number | tr_tracker_view +| `scrape` | string | tr_tracker_view +| `seederCount` | number | tr_tracker_view +| `sitename` | string | tr_tracker_view +| `tier` | number | tr_tracker_view `wanted`: An array of `tr_torrentFileCount()` booleans true if the corresponding file is to be downloaded. (Source: `tr_file_view`) @@ -936,6 +938,8 @@ Transmission 4.0.0 (`rpc-version-semver` 5.3.0, `rpc-version`: 17) | `session-get` | new arg `script-torrent-added-filename` | `torrent-add` | new arg `labels` | `torrent-get` | new arg `file-count` +| `torrent-get` | new arg `tracker.sitename` +| `torrent-get` | new arg `trackerStats.sitename` | `torrent-get` | new arg `primary-mime-type` diff --git a/gtk/FaviconCache.cc b/gtk/FaviconCache.cc index 08a29ea18..c29794fcb 100644 --- a/gtk/FaviconCache.cc +++ b/gtk/FaviconCache.cc @@ -11,6 +11,7 @@ #include #include /* tr_webRun() */ +#include #include "FaviconCache.h" #include "Utils.h" /* gtr_get_host_from_url() */ @@ -144,5 +145,6 @@ void gtr_get_favicon_from_url( Glib::ustring const& url, std::function const&)> const& pixbuf_ready_func) { - gtr_get_favicon(session, gtr_get_host_from_url(url), pixbuf_ready_func); + auto const host = std::string{ tr_urlParse(url.c_str())->host }; + gtr_get_favicon(session, host, pixbuf_ready_func); } diff --git a/gtk/FilterBar.cc b/gtk/FilterBar.cc index b16e9f288..eb2cc7faa 100644 --- a/gtk/FilterBar.cc +++ b/gtk/FilterBar.cc @@ -19,7 +19,7 @@ #include "FilterBar.h" #include "HigWorkarea.h" /* GUI_PAD */ #include "Session.h" /* MC_TORRENT */ -#include "Utils.h" /* gtr_get_host_from_url() */ +#include "Utils.h" namespace { @@ -62,7 +62,7 @@ private: Glib::RefPtr filter_model_; int active_activity_type_ = 0; int active_tracker_type_ = 0; - Glib::ustring active_tracker_host_; + Glib::ustring active_tracker_sitename_; sigc::connection activity_model_row_changed_tag_; sigc::connection activity_model_row_inserted_tag_; @@ -96,17 +96,17 @@ class TrackerFilterModelColumns : public Gtk::TreeModelColumnRecord public: TrackerFilterModelColumns() { - add(name); + add(displayname); add(count); add(type); - add(host); + add(sitename); add(pixbuf); } - Gtk::TreeModelColumn name; /* human-readable name; ie, Legaltorrents */ + Gtk::TreeModelColumn displayname; /* human-readable name; ie, Legaltorrents */ Gtk::TreeModelColumn count; /* how many matches there are */ Gtk::TreeModelColumn type; - Gtk::TreeModelColumn host; /* pattern-matching text; ie, legaltorrents.com */ + Gtk::TreeModelColumn sitename; // pattern-matching text; see tr_parsed_url.sitename Gtk::TreeModelColumn> pixbuf; }; @@ -115,20 +115,7 @@ TrackerFilterModelColumns const tracker_filter_cols; /* human-readable name; ie, Legaltorrents */ Glib::ustring get_name_from_host(std::string const& host) { - std::string name; - - if (tr_addressIsIP(host.c_str())) - { - name = host; - } - else if (auto const dot = host.rfind('.'); dot != std::string::npos) - { - name = host.substr(0, dot); - } - else - { - name = host; - } + std::string name = host; if (!name.empty()) { @@ -164,48 +151,56 @@ bool tracker_filter_model_update(Glib::RefPtr const& tracker_mod { tracker_model->steal_data(DIRTY_KEY); + struct site_info + { + int count = 0; + std::string host; + std::string sitename; + + bool operator<(site_info const& that) const + { + return sitename < that.sitename; + } + }; + /* Walk through all the torrents, tallying how many matches there are * for the various categories. Also make a sorted list of all tracker * hosts s.t. we can merge it with the existing list */ - int num_torrents = 0; - std::vector hosts; - std::set strings; - std::unordered_map hosts_hash; + auto n_torrents = int{ 0 }; + auto site_infos = std::unordered_map{}; auto* tmodel = static_cast(tracker_model->get_data(TORRENT_MODEL_KEY)); for (auto const& row : tmodel->children()) { auto const* tor = static_cast(row.get_value(torrent_cols.torrent)); - std::set keys; - + auto torrent_sites_and_hosts = std::map{}; for (size_t i = 0, n = tr_torrentTrackerCount(tor); i < n; ++i) { - auto const* const key = &*strings.insert(gtr_get_host_from_url(tr_torrentTracker(tor, i).announce)).first; - - if (auto const count = hosts_hash.find(key); count == hosts_hash.end()) - { - hosts_hash.emplace(key, 0); - hosts.push_back(key); - } - - keys.insert(key); + auto const view = tr_torrentTracker(tor, i); + torrent_sites_and_hosts.try_emplace(view.sitename, view.host); } - for (auto const* const key : keys) + for (auto const& [sitename, host] : torrent_sites_and_hosts) { - ++hosts_hash.at(key); + auto& info = site_infos[sitename]; + info.sitename = sitename; + info.host = host; + ++info.count; } - ++num_torrents; + ++n_torrents; } - std::sort(hosts.begin(), hosts.end(), [](auto const* lhs, auto const& rhs) { return *lhs < *rhs; }); + auto const n_sites = std::size(site_infos); + auto sites_v = std::vector(n_sites); + std::transform(std::begin(site_infos), std::end(site_infos), std::begin(sites_v), [](auto const& it) { return it.second; }); + std::sort(std::begin(sites_v), std::end(sites_v)); // update the "all" count auto iter = tracker_model->children().begin(); if (iter) { - tracker_model_update_count(iter, num_torrents); + tracker_model_update_count(iter, n_torrents); } // offset past the "All" and the separator @@ -216,9 +211,9 @@ bool tracker_filter_model_update(Glib::RefPtr const& tracker_mod for (;;) { // are we done yet? - bool const new_hosts_done = i >= hosts.size(); - bool const old_hosts_done = !iter; - if (new_hosts_done && old_hosts_done) + bool const new_sites_done = i >= n_sites; + bool const old_sites_done = !iter; + if (new_sites_done && old_sites_done) { break; } @@ -226,18 +221,18 @@ bool tracker_filter_model_update(Glib::RefPtr const& tracker_mod // decide what to do bool remove_row = false; bool insert_row = false; - if (new_hosts_done) + if (new_sites_done) { remove_row = true; } - else if (old_hosts_done) + else if (old_sites_done) { insert_row = true; } else { - auto const host = iter->get_value(tracker_filter_cols.host); - int const cmp = host.compare(*hosts.at(i)); + auto const sitename = iter->get_value(tracker_filter_cols.sitename); + int const cmp = sitename.compare(sites_v.at(i).sitename); if (cmp < 0) { @@ -257,16 +252,16 @@ bool tracker_filter_model_update(Glib::RefPtr const& tracker_mod else if (insert_row) { auto* session = static_cast(tracker_model->get_data(SESSION_KEY)); - auto const* host = hosts.at(i); + auto const& site = sites_v.at(i); auto const add = tracker_model->insert(iter); - add->set_value(tracker_filter_cols.host, *host); - add->set_value(tracker_filter_cols.name, get_name_from_host(*host)); - add->set_value(tracker_filter_cols.count, hosts_hash.at(host)); + add->set_value(tracker_filter_cols.sitename, Glib::ustring{ site.sitename }); + add->set_value(tracker_filter_cols.displayname, get_name_from_host(site.sitename)); + add->set_value(tracker_filter_cols.count, site.count); add->set_value(tracker_filter_cols.type, static_cast(TRACKER_FILTER_TYPE_HOST)); auto path = tracker_model->get_path(add); gtr_get_favicon( session, - *host, + site.host, [ref = Gtk::TreeRowReference(tracker_model, path)](auto const& pixbuf) mutable { favicon_ready_cb(pixbuf, ref); }); // ++iter; @@ -274,9 +269,7 @@ bool tracker_filter_model_update(Glib::RefPtr const& tracker_mod } else // update row { - auto const* const host = hosts.at(i); - auto const count = hosts_hash.at(host); - tracker_model_update_count(iter, count); + tracker_model_update_count(iter, sites_v.at(i).count); ++iter; ++i; } @@ -290,7 +283,7 @@ Glib::RefPtr tracker_filter_model_new(Glib::RefPtrappend(); - iter->set_value(tracker_filter_cols.name, Glib::ustring(_("All"))); + iter->set_value(tracker_filter_cols.displayname, Glib::ustring(_("All"))); iter->set_value(tracker_filter_cols.type, static_cast(TRACKER_FILTER_TYPE_ALL)); iter = store->append(); @@ -360,7 +353,7 @@ Gtk::ComboBox* FilterBar::Impl::tracker_combo_box_new(Glib::RefPtr(); c->pack_start(*r, false); - c->add_attribute(r->property_text(), tracker_filter_cols.name); + c->add_attribute(r->property_text(), tracker_filter_cols.displayname); } { @@ -391,7 +384,7 @@ bool test_tracker(tr_torrent const* tor, int active_tracker_type, Glib::ustring for (size_t i = 0, n = tr_torrentTrackerCount(tor); i < n; ++i) { - if (gtr_get_host_from_url(tr_torrentTracker(tor, i).announce) == host) + if (tr_torrentTracker(tor, i).sitename == host) { return true; } @@ -653,7 +646,7 @@ bool FilterBar::Impl::is_row_visible(Gtk::TreeModel::const_iterator const& iter) { auto* tor = static_cast(iter->get_value(torrent_cols.torrent)); - return tor != nullptr && test_tracker(tor, active_tracker_type_, active_tracker_host_) && + return tor != nullptr && test_tracker(tor, active_tracker_type_, active_tracker_sitename_) && test_torrent_activity(tor, active_activity_type_) && testText(tor, filter_text_); } @@ -673,12 +666,12 @@ void FilterBar::Impl::selection_changed_cb() if (auto const iter = tracker_->get_active(); iter) { active_tracker_type_ = iter->get_value(tracker_filter_cols.type); - active_tracker_host_ = iter->get_value(tracker_filter_cols.host); + active_tracker_sitename_ = iter->get_value(tracker_filter_cols.sitename); } else { active_tracker_type_ = TRACKER_FILTER_TYPE_ALL; - active_tracker_host_.clear(); + active_tracker_sitename_.clear(); } /* refilter */ diff --git a/gtk/Utils.cc b/gtk/Utils.cc index 68ac97164..99a187961 100644 --- a/gtk/Utils.cc +++ b/gtk/Utils.cc @@ -123,37 +123,6 @@ Glib::ustring tr_strltime(time_t seconds) } } -/* pattern-matching text; ie, legaltorrents.com */ -Glib::ustring gtr_get_host_from_url(Glib::ustring const& url) -{ - Glib::ustring host; - - if (auto const pch = url.find("://"); pch != Glib::ustring::npos) - { - auto const hostend = url.find_first_of(":/", pch + 3); - host = url.substr(pch + 3, hostend == Glib::ustring::npos ? hostend : (hostend - pch - 3)); - } - - if (tr_addressIsIP(host.c_str())) - { - return url; - } - else - { - auto const first_dot = host.find('.'); - auto const last_dot = host.rfind('.'); - - if (first_dot != Glib::ustring::npos && last_dot != Glib::ustring::npos && first_dot != last_dot) - { - return host.substr(first_dot + 1); - } - else - { - return host; - } - } -} - namespace { diff --git a/gtk/Utils.h b/gtk/Utils.h index b04d7a9f4..328170950 100644 --- a/gtk/Utils.h +++ b/gtk/Utils.h @@ -61,9 +61,6 @@ Glib::ustring tr_strltime(time_t secs); **** ***/ -/* http://www.legaltorrents.com/some/announce/url --> legaltorrents.com */ -Glib::ustring gtr_get_host_from_url(Glib::ustring const& url); - bool gtr_is_magnet_link(Glib::ustring const& str); bool gtr_is_hex_hashcode(std::string const& str); diff --git a/libtransmission/CMakeLists.txt b/libtransmission/CMakeLists.txt index a3d00cd29..f02811106 100644 --- a/libtransmission/CMakeLists.txt +++ b/libtransmission/CMakeLists.txt @@ -257,6 +257,7 @@ include_directories( ${CRYPTO_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${EVENT2_INCLUDE_DIRS} + ${PSL_INCLUDE_DIRS} ${NATPMP_INCLUDE_DIRS} ${MINIUPNPC_INCLUDE_DIRS} ${DHT_INCLUDE_DIRS} @@ -280,6 +281,7 @@ foreach(UT ${EVENT2_UPSTREAM_TARGET} ${DHT_UPSTREAM_TARGET} ${DEFLATE_UPSTREAM_TARGET} ${UTP_UPSTREAM_TARGET} + ${PSL_UPSTREAM_TARGET} ${B64_UPSTREAM_TARGET}) add_dependencies(${TR_NAME} ${UT}) endforeach() @@ -290,6 +292,7 @@ target_link_libraries(${TR_NAME} ${CRYPTO_LIBRARIES} ${CURL_LIBRARIES} ${EVENT2_LIBRARIES} + ${PSL_LIBRARIES} ${NATPMP_LIBRARIES} ${MINIUPNPC_LIBRARIES} ${DHT_LIBRARIES} diff --git a/libtransmission/announcer.cc b/libtransmission/announcer.cc index 9517307dc..1e3e36e62 100644 --- a/libtransmission/announcer.cc +++ b/libtransmission/announcer.cc @@ -236,6 +236,7 @@ struct tr_tracker explicit tr_tracker(tr_announcer* announcer, tr_announce_list::tracker_info const& info) : host{ info.host } , announce_url{ info.announce_str } + , sitename{ info.announce.sitename } , scrape_info{ std::empty(info.scrape_str) ? nullptr : tr_announcerGetScrapeInfo(announcer, info.scrape_str) } , id{ info.id } { @@ -270,6 +271,7 @@ struct tr_tracker tr_interned_string const host; tr_interned_string const announce_url; + std::string_view const sitename; tr_scrape_info* const scrape_info; std::string tracker_id; @@ -1575,6 +1577,10 @@ static tr_tracker_view trackerView(tr_torrent const& tor, int tier_index, tr_tie view.host = tracker.host.c_str(); view.announce = tracker.announce_url.c_str(); view.scrape = tracker.scrape_info == nullptr ? "" : tracker.scrape_info->scrape_url.c_str(); + *std::copy_n( + std::begin(tracker.sitename), + std::min(std::size(tracker.sitename), sizeof(view.sitename) - 1), + view.sitename) = '\0'; view.id = tracker.id; view.tier = tier_index; diff --git a/libtransmission/quark.cc b/libtransmission/quark.cc index ebe97ebb4..17aac83c6 100644 --- a/libtransmission/quark.cc +++ b/libtransmission/quark.cc @@ -18,7 +18,7 @@ using namespace std::literals; namespace { -auto constexpr my_static = std::array{ ""sv, +auto constexpr my_static = std::array{ ""sv, "activeTorrentCount"sv, "activity-date"sv, "activityDate"sv, @@ -327,6 +327,7 @@ auto constexpr my_static = std::array{ ""sv, "show-statusbar"sv, "show-toolbar"sv, "show-tracker-scrapes"sv, + "sitename"sv, "size-bytes"sv, "size-units"sv, "sizeWhenDone"sv, diff --git a/libtransmission/quark.h b/libtransmission/quark.h index 4b2ec3e46..62b2b0a51 100644 --- a/libtransmission/quark.h +++ b/libtransmission/quark.h @@ -330,6 +330,7 @@ enum TR_KEY_show_statusbar, TR_KEY_show_toolbar, TR_KEY_show_tracker_scrapes, + TR_KEY_sitename, TR_KEY_size_bytes, TR_KEY_size_units, TR_KEY_sizeWhenDone, diff --git a/libtransmission/rpcimpl.cc b/libtransmission/rpcimpl.cc index 3293abef2..7ead4a74f 100644 --- a/libtransmission/rpcimpl.cc +++ b/libtransmission/rpcimpl.cc @@ -410,23 +410,25 @@ static void addTrackers(tr_torrent const* tor, tr_variant* trackers) { for (auto const& tracker : tor->announceList()) { - tr_variant* d = tr_variantListAddDict(trackers, 4); + auto* const d = tr_variantListAddDict(trackers, 5); tr_variantDictAddQuark(d, TR_KEY_announce, tracker.announce_str.quark()); tr_variantDictAddInt(d, TR_KEY_id, tracker.id); tr_variantDictAddQuark(d, TR_KEY_scrape, tracker.scrape_str.quark()); + tr_variantDictAddStrView(d, TR_KEY_sitename, tracker.announce.sitename); tr_variantDictAddInt(d, TR_KEY_tier, tracker.tier); } } static void addTrackerStats(tr_tracker_view const& tracker, tr_variant* list) { - auto* const d = tr_variantListAddDict(list, 26); + auto* const d = tr_variantListAddDict(list, 27); tr_variantDictAddStr(d, TR_KEY_announce, tracker.announce); tr_variantDictAddInt(d, TR_KEY_announceState, tracker.announceState); tr_variantDictAddInt(d, TR_KEY_downloadCount, tracker.downloadCount); tr_variantDictAddBool(d, TR_KEY_hasAnnounced, tracker.hasAnnounced); tr_variantDictAddBool(d, TR_KEY_hasScraped, tracker.hasScraped); tr_variantDictAddStr(d, TR_KEY_host, tracker.host); + tr_variantDictAddStr(d, TR_KEY_sitename, tracker.sitename); tr_variantDictAddInt(d, TR_KEY_id, tracker.id); tr_variantDictAddBool(d, TR_KEY_isBackup, tracker.isBackup); tr_variantDictAddInt(d, TR_KEY_lastAnnouncePeerCount, tracker.lastAnnouncePeerCount); diff --git a/libtransmission/transmission.h b/libtransmission/transmission.h index 70e56a505..697afa56e 100644 --- a/libtransmission/transmission.h +++ b/libtransmission/transmission.h @@ -1369,7 +1369,13 @@ struct tr_tracker_view { char const* announce; // full announce URL char const* scrape; // full scrape URL - char const* host; // human-readable tracker name. (`${host}:${port}`) + char const* host; // uniquely-identifying tracker name (`${host}:${port}`) + + // The tracker site's name. Uses the first label before the public suffix + // (https://publicsuffix.org/) in the announce URL's host. + // e.g. "https://www.example.co.uk/announce/"'s sitename is "example" + // RFC 1034 says labels must be less than 64 chars + char sitename[64]; char lastAnnounceResult[128]; // if hasAnnounced, the human-readable result of latest announce char lastScrapeResult[128]; // if hasScraped, the human-readable result of the latest scrape diff --git a/libtransmission/web-utils.cc b/libtransmission/web-utils.cc index 3e0592e57..84b0798a6 100644 --- a/libtransmission/web-utils.cc +++ b/libtransmission/web-utils.cc @@ -15,6 +15,9 @@ #include +#define PSL_STATIC +#include + #include "transmission.h" #include "net.h" @@ -292,6 +295,48 @@ bool tr_isValidTrackerScheme(std::string_view scheme) return std::find(std::begin(Schemes), std::end(Schemes), scheme) != std::end(Schemes); } +// www.example.com -> example +// www.example.co.uk -> example +// 127.0.0.1 -> 127.0.0.1 +std::string_view getSiteName(std::string_view host) +{ + // is it empty? + if (std::empty(host)) + { + return host; + } + + // is it an IP? + auto addr = tr_address{}; + auto const szhost = std::string(host); + if (tr_address_from_string(&addr, szhost.c_str())) + { + return host; + } + + // is it a registered name? + char* lower = nullptr; + if (PSL_SUCCESS == psl_str_to_utf8lower(szhost.c_str(), nullptr, nullptr, &lower)) + { + // www.example.com -> example.com + char const* const top = psl_registrable_domain(psl_builtin(), lower); + if (top != nullptr) + { + host.remove_prefix(top - lower); + } + psl_free_string(lower); + } + + // example.com -> example + auto const dot_pos = host.find('.'); + if (dot_pos != std::string_view::npos) + { + host = host.substr(0, dot_pos); + } + + return host; +} + } // namespace std::optional tr_urlParse(std::string_view url) @@ -336,6 +381,7 @@ std::optional tr_urlParse(std::string_view url) auto remain = parsed.authority; parsed.host = tr_strvSep(&remain, ':'); + parsed.sitename = getSiteName(parsed.host); parsed.portstr = !std::empty(remain) ? remain : getPortForScheme(parsed.scheme); parsed.port = parsePort(parsed.portstr); } diff --git a/libtransmission/web-utils.h b/libtransmission/web-utils.h index 9a9ef1755..4f9eca3d0 100644 --- a/libtransmission/web-utils.h +++ b/libtransmission/web-utils.h @@ -24,15 +24,18 @@ bool tr_urlIsValid(std::string_view url); struct tr_url_parsed_t { - std::string_view scheme; - std::string_view authority; - std::string_view host; - std::string_view path; - std::string_view portstr; - std::string_view query; - std::string_view fragment; - std::string_view full; - int port = -1; + // http://example.com:80/over/there?name=ferret#nose + + std::string_view scheme; // "http" + std::string_view authority; // "example.com:80" + std::string_view host; // "example.com" + std::string_view sitename; // "example" + std::string_view portstr; // "80" + std::string_view path; // /"over/there" + std::string_view query; // "name=ferret" + std::string_view fragment; // "nose" + std::string_view full; // "http://example.com:80/over/there?name=ferret#nose" + int port = -1; // 80 }; std::optional tr_urlParse(std::string_view url); diff --git a/qt/FaviconCache.cc b/qt/FaviconCache.cc index e3e7e748d..9a03eea49 100644 --- a/qt/FaviconCache.cc +++ b/qt/FaviconCache.cc @@ -11,49 +11,16 @@ #include #include +#include + +#include // tr_urlParse() + #include "FaviconCache.h" /*** **** ***/ -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) -Q_NETWORK_EXPORT bool qIsEffectiveTLD(QStringView domain); -#endif - -namespace -{ - -QString getTopLevelDomain(QUrl const& url) -{ -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - - auto const host = url.host(); - auto const dot = QChar(QLatin1Char('.')); - - for (auto dot_pos = host.indexOf(dot); dot_pos != -1; dot_pos = host.indexOf(dot, dot_pos + 1)) - { - if (qIsEffectiveTLD(QStringView(&host.data()[dot_pos + 1], host.size() - dot_pos - 1))) - { - return host.mid(dot_pos); - } - } - - return {}; - -#else - - return url.topLevelDomain(); - -#endif -} - -} // namespace - -/*** -**** -***/ - FaviconCache::FaviconCache() : nam_(new QNetworkAccessManager(this)) { @@ -84,12 +51,12 @@ QString getScrapedFile() return QDir(base).absoluteFilePath(QStringLiteral("favicons-scraped.txt")); } -void markUrlAsScraped(QString const& url_str) +void markSiteAsScraped(QString const& sitename) { auto skip_file = QFile(getScrapedFile()); if (skip_file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { - skip_file.write(url_str.toUtf8()); + skip_file.write(sitename.toUtf8()); skip_file.write("\n"); } } @@ -112,22 +79,20 @@ void FaviconCache::ensureCacheDirHasBeenScanned() { while (!skip_file.atEnd()) { - auto const url = QString::fromUtf8(skip_file.readLine()).trimmed(); - auto const key = getKey(QUrl{ url }); - keys_.insert({ url, key }); - pixmaps_.try_emplace(key); + auto const sitename = QString::fromUtf8(skip_file.readLine()).trimmed(); + pixmaps_.try_emplace(sitename); } } // load the cached favicons auto cache_dir = QDir(getCacheDir()); cache_dir.mkpath(cache_dir.absolutePath()); - for (auto const& file : cache_dir.entryList(QDir::Files | QDir::Readable)) + for (auto const& sitename : cache_dir.entryList(QDir::Files | QDir::Readable)) { - QPixmap pixmap(cache_dir.absoluteFilePath(file)); + QPixmap pixmap(cache_dir.absoluteFilePath(sitename)); if (!pixmap.isNull()) { - pixmaps_[file] = scale(pixmap); + pixmaps_[sitename] = scale(pixmap); } } } @@ -136,9 +101,9 @@ void FaviconCache::ensureCacheDirHasBeenScanned() **** ***/ -QString FaviconCache::getDisplayName(Key const& key) +QString FaviconCache::getDisplayName(QString const& sitename) { - auto name = key; + auto name = sitename; if (!name.isEmpty()) { name.front() = name.front().toTitleCase(); @@ -146,111 +111,82 @@ QString FaviconCache::getDisplayName(Key const& key) return name; } -FaviconCache::Key FaviconCache::getKey(QUrl const& url) -{ - auto host = url.host(); - - // remove tld - auto const suffix = getTopLevelDomain(url); - host.truncate(host.size() - suffix.size()); - - // remove subdomain - auto const pos = host.indexOf(QLatin1Char('.')); - return pos < 0 ? host : host.remove(0, pos + 1); -} - -FaviconCache::Key FaviconCache::getKey(QString const& displayName) -{ - return displayName.toLower(); -} - QSize FaviconCache::getIconSize() { return { 16, 16 }; } -QPixmap FaviconCache::find(Key const& key) +QPixmap FaviconCache::find(QString const& sitename) { ensureCacheDirHasBeenScanned(); - return pixmaps_[key]; + return pixmaps_[sitename]; } -FaviconCache::Key FaviconCache::add(QString const& url_str) +void FaviconCache::add(QString const& sitename, QString const& url_str) { ensureCacheDirHasBeenScanned(); - // find or add this url's key - if (auto k_it = keys_.find(url_str); k_it != keys_.end()) - { - return k_it->second; - } - - auto const url = QUrl{ url_str }; - auto const key = getKey(url); - keys_.insert({ url_str, key }); - // Try to download a favicon if we don't have one. // Add a placeholder to prevent repeat downloads. - if (pixmaps_.try_emplace(key).second) + auto const already_had_it = !pixmaps_.try_emplace(sitename).second; + if (already_had_it) { - markUrlAsScraped(url_str); - - auto const scrape = [this](auto const host) - { - auto const schemes = std::array{ - QStringLiteral("http"), - QStringLiteral("https"), - }; - auto const suffixes = std::array{ - QStringLiteral("gif"), // - QStringLiteral("ico"), // - QStringLiteral("jpg"), // - QStringLiteral("png"), // - QStringLiteral("svg"), // - }; - for (auto const& scheme : schemes) - { - for (auto const& suffix : suffixes) - { - auto const path = QStringLiteral("%1://%2/favicon.%3").arg(scheme).arg(host).arg(suffix); - nam_->get(QNetworkRequest(path)); - } - } - }; - - // tracker.domain.com - auto host = url.host(); - scrape(host); - - auto const delim = QStringLiteral("."); - auto const has_subdomain = host.count(delim) > 1; - if (has_subdomain) - { - auto const original_subdomain = host.left(host.indexOf(delim)); - host.remove(0, original_subdomain.size() + 1); - // domain.com - scrape(host); - - auto const www = QStringLiteral("www"); - if (original_subdomain != www) - { - // www.domain.com - scrape(QStringLiteral("%1.%2").arg(www).arg(host)); - } - } + return; } - return key; + markSiteAsScraped(sitename); + + auto const scrape = [this, sitename](auto const host) + { + auto const schemes = std::array{ + QStringLiteral("http"), + QStringLiteral("https"), + }; + auto const suffixes = std::array{ + QStringLiteral("gif"), // + QStringLiteral("ico"), // + QStringLiteral("jpg"), // + QStringLiteral("png"), // + QStringLiteral("svg"), // + }; + for (auto const& scheme : schemes) + { + for (auto const& suffix : suffixes) + { + auto const path = QStringLiteral("%1://%2/favicon.%3").arg(scheme).arg(host).arg(suffix); + auto request = QNetworkRequest(path); + request.setAttribute(QNetworkRequest::UserMax, sitename); + nam_->get(request); + } + } + }; + + // scrape tracker.domain.com + auto const host = QUrl(url_str).host(); + scrape(host); + + if (auto const idx = host.indexOf(sitename); idx != -1) + { + // scrape domain.com + auto const root = host.mid(idx); + if (root != host) + { + scrape(root); + } + + // scrape www.domain.com + if (auto const www = QStringLiteral("www.") + root; www != host) + { + scrape(www); + } + } } void FaviconCache::onRequestFinished(QNetworkReply* reply) { - auto const key = getKey(reply->url()); - - QPixmap pixmap; - - QByteArray const content = reply->readAll(); + auto const content = reply->readAll(); + auto pixmap = QPixmap{}; if (reply->error() == QNetworkReply::NoError) { @@ -259,19 +195,21 @@ void FaviconCache::onRequestFinished(QNetworkReply* reply) if (!pixmap.isNull()) { + auto sitename = reply->request().attribute(QNetworkRequest::UserMax).toString(); + // save it in memory... - pixmaps_[key] = scale(pixmap); + pixmaps_[sitename] = scale(pixmap); // save it on disk... QDir cache_dir(getCacheDir()); cache_dir.mkpath(cache_dir.absolutePath()); - QFile file(cache_dir.absoluteFilePath(key)); + QFile file(cache_dir.absoluteFilePath(sitename)); file.open(QIODevice::WriteOnly); file.write(content); file.close(); // notify listeners - emit pixmapReady(key); + emit pixmapReady(sitename); } reply->deleteLater(); diff --git a/qt/FaviconCache.h b/qt/FaviconCache.h index 859b27d76..89d3d2464 100644 --- a/qt/FaviconCache.h +++ b/qt/FaviconCache.h @@ -6,14 +6,11 @@ #pragma once #include -#include #include #include #include -#include - #include "Utils.h" // std::hash class QNetworkAccessManager; @@ -23,36 +20,28 @@ class QUrl; class FaviconCache : public QObject { Q_OBJECT - TR_DISABLE_COPY_MOVE(FaviconCache) public: FaviconCache(); - using Key = QString; - using Keys = std::vector; + // This will emit a signal when (if) the icon becomes ready. + void add(QString const& sitename, QString const& url); // returns a cached pixmap, or a nullptr pixmap if there's no match in the cache - QPixmap find(Key const& key); + QPixmap find(QString const& sitename); - static Key getKey(QString const& display_name); - - // This will emit a signal when (if) the icon becomes ready. - Key add(QString const& url); - - static QString getDisplayName(Key const& key); + static QString getDisplayName(QString const& sitename); static QSize getIconSize(); signals: - void pixmapReady(Key const& key); + void pixmapReady(QString const& sitename); private slots: void onRequestFinished(QNetworkReply* reply); private: - static Key getKey(QUrl const& url); void ensureCacheDirHasBeenScanned(); QNetworkAccessManager* nam_ = {}; - std::unordered_map pixmaps_; - std::unordered_map keys_; + std::unordered_map pixmaps_; }; diff --git a/qt/FilterBar.cc b/qt/FilterBar.cc index 48e55917a..168d08bff 100644 --- a/qt/FilterBar.cc +++ b/qt/FilterBar.cc @@ -114,27 +114,26 @@ void FilterBar::refreshTrackers() ROW_FIRST_TRACKER }; - auto torrents_per_tracker = std::unordered_map{}; + auto torrents_per_sitename = std::unordered_map{}; for (auto const& tor : torrents_.torrents()) { - for (auto const& key : tor->trackerKeys()) + for (auto const& sitename : tor->sitenames()) { - ++torrents_per_tracker[key]; + ++torrents_per_sitename[sitename]; } } // update the "All" row - auto const num_trackers = torrents_per_tracker.size(); + auto const num_trackers = torrents_per_sitename.size(); auto* item = tracker_model_->item(ROW_TOTALS); item->setData(int(num_trackers), FilterBarComboBox::CountRole); item->setData(getCountString(num_trackers), FilterBarComboBox::CountStringRole); auto update_tracker_item = [](QStandardItem* i, auto const& it) { - auto const& key = it->first; - auto const& display_name = FaviconCache::getDisplayName(key); - auto const& count = it->second; - auto const icon = trApp->faviconCache().find(key); + auto const& [sitename, count] = *it; + auto const display_name = FaviconCache::getDisplayName(sitename); + auto const icon = trApp->faviconCache().find(sitename); i->setData(display_name, Qt::DisplayRole); i->setData(display_name, TRACKER_ROLE); @@ -145,10 +144,10 @@ void FilterBar::refreshTrackers() return i; }; - auto new_trackers = std::map(torrents_per_tracker.begin(), torrents_per_tracker.end()); - auto old_it = tracker_counts_.cbegin(); + auto new_trackers = std::map(torrents_per_sitename.begin(), torrents_per_sitename.end()); + auto old_it = sitename_counts_.cbegin(); auto new_it = new_trackers.cbegin(); - auto const old_end = tracker_counts_.cend(); + auto const old_end = sitename_counts_.cend(); auto const new_end = new_trackers.cend(); bool any_added = false; int row = ROW_FIRST_TRACKER; @@ -181,7 +180,7 @@ void FilterBar::refreshTrackers() refreshPref(Prefs::FILTER_TRACKERS); } - tracker_counts_.swap(new_trackers); + sitename_counts_.swap(new_trackers); } FilterBarComboBox* FilterBar::createTrackerCombo(QStandardItemModel* model) diff --git a/qt/FilterBar.h b/qt/FilterBar.h index b900fa1c0..91301a111 100644 --- a/qt/FilterBar.h +++ b/qt/FilterBar.h @@ -57,7 +57,7 @@ private: TorrentModel const& torrents_; TorrentFilter const& filter_; - std::map tracker_counts_; + std::map sitename_counts_; FilterBarComboBox* activity_combo_ = {}; FilterBarComboBox* tracker_combo_ = {}; QLabel* count_label_ = {}; diff --git a/qt/Torrent.cc b/qt/Torrent.cc index 4ee9a8bc3..0bd026fb6 100644 --- a/qt/Torrent.cc +++ b/qt/Torrent.cc @@ -52,9 +52,9 @@ std::optional Torrent::getSeedRatioLimit() const return {}; } -bool Torrent::includesTracker(FaviconCache::Key const& key) const +bool Torrent::includesTracker(QString const& sitename) const { - return std::binary_search(std::begin(tracker_keys_), std::end(tracker_keys_), key); + return std::binary_search(std::begin(sitenames_), std::end(sitenames_), sitename); } int Torrent::compareSeedRatio(Torrent const& that) const @@ -269,19 +269,17 @@ Torrent::fields_t Torrent::update(tr_quark const* keys, tr_variant const* const* { files_[i].index = i; } - break; } case TR_KEY_trackers: { - std::set tmp; + auto tmp = std::set{}; for (auto const& ts : tracker_stats_) { - tmp.insert(ts.favicon_key); + tmp.insert(ts.sitename); } - - tracker_keys_ = FaviconCache::Keys(std::begin(tmp), std::end(tmp)); + sitenames_ = std::vector{ std::begin(tmp), std::end(tmp) }; break; } } @@ -357,5 +355,5 @@ QString Torrent::getError() const QPixmap TrackerStat::getFavicon() const { - return trApp->faviconCache().find(favicon_key); + return trApp->faviconCache().find(sitename); } diff --git a/qt/Torrent.h b/qt/Torrent.h index 400078f5e..b7d740d98 100644 --- a/qt/Torrent.h +++ b/qt/Torrent.h @@ -84,10 +84,10 @@ struct TrackerStat int scrape_state; int seeder_count; int tier; - FaviconCache::Key favicon_key; QString announce; QString last_announce_result; QString last_scrape_result; + QString sitename; }; using TrackerStatsList = std::vector; @@ -406,11 +406,11 @@ public: return recheck_progress_; } - bool includesTracker(FaviconCache::Key const& key) const; + bool includesTracker(QString const& sitename) const; - FaviconCache::Keys const& trackerKeys() const + std::vector const& sitenames() const { - return tracker_keys_; + return sitenames_; } Speed uploadLimit() const @@ -676,7 +676,7 @@ private: PeerList peers_; FileList files_; - FaviconCache::Keys tracker_keys_; + std::vector sitenames_; TrackerStatsList tracker_stats_; Speed upload_speed_; diff --git a/qt/TorrentFilter.cc b/qt/TorrentFilter.cc index b6bc78edd..b48ce3d28 100644 --- a/qt/TorrentFilter.cc +++ b/qt/TorrentFilter.cc @@ -244,8 +244,7 @@ bool TorrentFilter::filterAcceptsRow(int source_row, QModelIndex const& source_p if (accepts) { auto const display_name = prefs_.getString(Prefs::FILTER_TRACKERS); - auto const key = FaviconCache::getKey(display_name); - accepts = key.isEmpty() || tor.includesTracker(key); + accepts = display_name.isEmpty() || tor.includesTracker(display_name.toLower()); } if (accepts) diff --git a/qt/VariantHelpers.cc b/qt/VariantHelpers.cc index 2bff01d1a..4a7a78924 100644 --- a/qt/VariantHelpers.cc +++ b/qt/VariantHelpers.cc @@ -121,7 +121,8 @@ bool change(TorrentFile& setme, tr_variant const* value) bool change(TrackerStat& setme, tr_variant const* value) { - auto changed = bool{ false }; + bool changed = false; + bool site_changed = false; auto pos = size_t{ 0 }; auto key = tr_quark{}; @@ -159,6 +160,7 @@ bool change(TrackerStat& setme, tr_variant const* value) HANDLE_KEY(nextScrapeTime, next_scrape_time) HANDLE_KEY(scrapeState, scrape_state) HANDLE_KEY(seederCount, seeder_count) + HANDLE_KEY(sitename, sitename) HANDLE_KEY(tier, tier) #undef HANDLE_KEY @@ -168,14 +170,16 @@ bool change(TrackerStat& setme, tr_variant const* value) if (field_changed) { - if (key == TR_KEY_announce) - { - setme.announce = trApp->intern(setme.announce); - setme.favicon_key = trApp->faviconCache().add(setme.announce); - } - - changed = true; + site_changed |= key == TR_KEY_announce || key == TR_KEY_sitename; } + + changed = true; + } + + if (site_changed && !setme.sitename.isEmpty() && !setme.announce.isEmpty()) + { + setme.announce = trApp->intern(setme.announce); + trApp->faviconCache().add(setme.sitename, setme.announce); } return changed; diff --git a/tests/libtransmission/web-utils-test.cc b/tests/libtransmission/web-utils-test.cc index 5b9f86675..afb945542 100644 --- a/tests/libtransmission/web-utils-test.cc +++ b/tests/libtransmission/web-utils-test.cc @@ -29,6 +29,7 @@ TEST_F(WebUtilsTest, urlParse) EXPECT_TRUE(parsed); EXPECT_EQ("http"sv, parsed->scheme); EXPECT_EQ("1"sv, parsed->host); + EXPECT_EQ("1"sv, parsed->sitename); EXPECT_EQ(""sv, parsed->path); EXPECT_EQ("80"sv, parsed->portstr); EXPECT_EQ(""sv, parsed->query); @@ -40,6 +41,7 @@ TEST_F(WebUtilsTest, urlParse) EXPECT_TRUE(parsed); EXPECT_EQ("http"sv, parsed->scheme); EXPECT_EQ("www.some-tracker.org"sv, parsed->host); + EXPECT_EQ("some-tracker"sv, parsed->sitename); EXPECT_EQ("/some/path"sv, parsed->path); EXPECT_EQ(""sv, parsed->query); EXPECT_EQ(""sv, parsed->fragment); @@ -51,6 +53,7 @@ TEST_F(WebUtilsTest, urlParse) EXPECT_TRUE(parsed); EXPECT_EQ("http"sv, parsed->scheme); EXPECT_EQ("www.some-tracker.org"sv, parsed->host); + EXPECT_EQ("some-tracker"sv, parsed->sitename); EXPECT_EQ("/some/path"sv, parsed->path); EXPECT_EQ(""sv, parsed->query); EXPECT_EQ(""sv, parsed->fragment); @@ -62,6 +65,7 @@ TEST_F(WebUtilsTest, urlParse) EXPECT_TRUE(parsed); EXPECT_EQ("http"sv, parsed->scheme); EXPECT_EQ("www.some-tracker.org"sv, parsed->host); + EXPECT_EQ("some-tracker"sv, parsed->sitename); EXPECT_EQ("/some/path"sv, parsed->path); EXPECT_EQ("key=val&foo=bar"sv, parsed->query); EXPECT_EQ("fragment"sv, parsed->fragment); @@ -79,6 +83,7 @@ TEST_F(WebUtilsTest, urlParse) EXPECT_TRUE(parsed); EXPECT_EQ("magnet"sv, parsed->scheme); EXPECT_EQ(""sv, parsed->host); + EXPECT_EQ(""sv, parsed->sitename); EXPECT_EQ(""sv, parsed->path); EXPECT_EQ( "xt=urn:btih:14ffe5dd23188fd5cb53a1d47f1289db70abf31e" @@ -88,6 +93,39 @@ TEST_F(WebUtilsTest, urlParse) "&ws=http%3A%2F%2Ftransmissionbt.com"sv, parsed->query); EXPECT_EQ(""sv, parsed->portstr); + + // test a host whose public suffix contains >1 dot + url = "https://www.example.co.uk:8080/some/path"sv; + parsed = tr_urlParse(url); + EXPECT_TRUE(parsed); + EXPECT_EQ("https"sv, parsed->scheme); + EXPECT_EQ("example"sv, parsed->sitename); + EXPECT_EQ("www.example.co.uk"sv, parsed->host); + EXPECT_EQ("/some/path"sv, parsed->path); + EXPECT_EQ("8080"sv, parsed->portstr); + EXPECT_EQ(8080, parsed->port); + + // test a host that lacks a subdomain + url = "http://some-tracker.co.uk/some/other/path"sv; + parsed = tr_urlParse(url); + EXPECT_TRUE(parsed); + EXPECT_EQ("http"sv, parsed->scheme); + EXPECT_EQ("some-tracker"sv, parsed->sitename); + EXPECT_EQ("some-tracker.co.uk"sv, parsed->host); + EXPECT_EQ("/some/other/path"sv, parsed->path); + EXPECT_EQ("80"sv, parsed->portstr); + EXPECT_EQ(80, parsed->port); + + // test a host with an IP address + url = "https://127.0.0.1:8080/some/path"sv; + parsed = tr_urlParse(url); + EXPECT_TRUE(parsed); + EXPECT_EQ("https"sv, parsed->scheme); + EXPECT_EQ("127.0.0.1"sv, parsed->sitename); + EXPECT_EQ("127.0.0.1"sv, parsed->host); + EXPECT_EQ("/some/path"sv, parsed->path); + EXPECT_EQ("8080"sv, parsed->portstr); + EXPECT_EQ(8080, parsed->port); } TEST_F(WebUtilsTest, urlNextQueryPair) diff --git a/third-party/libpsl b/third-party/libpsl new file mode 160000 index 000000000..692c69d24 --- /dev/null +++ b/third-party/libpsl @@ -0,0 +1 @@ +Subproject commit 692c69d2415e1b20378030c08607935a54434087 diff --git a/web/public_html/transmission-app.js b/web/public_html/transmission-app.js index 0e047b466..af8761853 100644 --- a/web/public_html/transmission-app.js +++ b/web/public_html/transmission-app.js @@ -1,3 +1,3 @@ /*! For license information please see transmission-app.js.LICENSE.txt */ -(()=>{var e={592:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Ee});var r=n(15),o=n.n(r),s=n(645),i=n.n(s),a=n(667),l=n.n(a),c=n(908),d=n(466),A=n(560),p=n(289),g=n(450),u=n(577),m=n(803),h=n(820),f=n(438),b=n(319),C=n(190),v=n(54),y=n(690),E=n(350),w=n(174),x=n(785),k=n(373),M=n(173),S=n(25),I=n(557),B=n(912),D=n(842),T=n(308),L=n(749),N=n(886),j=n(199),_=n(689),z=n(520),F=n(602),O=n(371),P=n(961),U=n(93),R=n(166),G=i()(o()),Y=l()(c.Z),Q=l()(d.Z),Z=l()(A.Z),W=l()(p.Z),H=l()(g.Z),J=l()(u.Z),q=l()(m.Z),V=l()(h.Z),K=l()(f.Z),X=l()(b.Z),$=l()(C.Z),ee=l()(v.Z),te=l()(y.Z),ne=l()(E.Z),re=l()(w.Z),oe=l()(x.Z),se=l()(k.Z),ie=l()(M.Z),ae=l()(S.Z),le=l()(I.Z),ce=l()(B.Z),de=l()(D.Z),Ae=l()(T.Z),pe=l()(L.Z),ge=l()(N.Z),ue=l()(j.Z),me=l()(_.Z),he=l()(z.Z),fe=l()(F.Z),be=l()(O.Z),Ce=l()(P.Z),ve=l()(U.Z),ye=l()(R.Z);G.push([e.id,":root{--color-bg-even: #fff;--color-bg-hover: #f6f8fa;--color-bg-menu: #e1e4e8;--color-bg-odd: #f6f8fa;--color-bg-selection-1: #e6dcfd;--color-bg-selection-2: #f5f0ff;--color-border: #959da5;--color-fg-disabled: #959da5;--color-fg-error: #d73a49;--color-fg-name: #2f363d;--color-fg-on-popup: #2f363d;--color-fg-port-closed: #d73a49;--color-fg-port-open: #28a745;--color-progressbar-background-1: #f6f8fa;--color-progressbar-background-2: #959da5;--color-progressbar-verify-1: #f692ce;--color-progressbar-verify-2: #b93a86;--color-progressbar-magnet-1: #ffea7f;--color-progressbar-magnet-2: #dbab09;--color-progressbar-magnet-paused-1: #fff5b1;--color-progressbar-magnet-paused-2: #6a737d;--color-progressbar-leech-paused-1: #c8e1ff;--color-progressbar-leech-paused-2: #6a737d;--color-progressbar-leech-queued-1: #dbedff;--color-progressbar-leech-queued-2: #79b8ff;--color-progressbar-leech-1: #79b8ff;--color-progressbar-leech-2: #044289;--color-progressbar-seed-paused-1: #bef5cb;--color-progressbar-seed-paused-2: #6a737d;--color-progressbar-seed-queued-1: #dcffe4;--color-progressbar-seed-queued-2: #85e89d;--color-progressbar-seed-1: #85e89d;--color-progressbar-seed-2: #176f2c;--color-tab-deselected-1: #f6f8fa;--color-tab-deselected-2: #959da5;--color-tab-selected-1: #e6dcfd;--color-tab-selected-2: #f5f0ff;--color-toolbar-background: linear-gradient(#d1d5da, #959da5)}@media(prefers-color-scheme: dark){:root{--color-fg-primary: #f6f8fa;--color-fg-secondary: #959da5;--color-fg-tertiary: #6a737d}}@media(prefers-color-scheme: light){:root{--color-fg-primary: #2f363d;--color-fg-secondary: #6a737d;--color-fg-tertiary: #959da5}}html,body{color:var(--color-fg-primary);font-family:Verdana,Arial,Helvetica,sans-serif;height:100%;margin:0;overflow:hidden}img{border:0}a{outline:0}.hidden{display:none}.even{background-color:var(--color-bg-even)}.odd{background-color:var(--color-bg-odd)}.mainwin{display:flex;flex-direction:column;height:100%;position:relative}.mainwin>*{margin:0;padding:0}.mainwin-workarea{display:flex;flex:1;flex-direction:row;overflow:auto}#mainwin-toolbar{align-items:center;background:var(--color-toolbar-background);border-bottom:1px solid var(--color-border);display:flex;flex-direction:row;height:36px;margin:0;padding:2px;width:100%}#mainwin-toolbar button{background-color:transparent;background-position:center;background-repeat:no-repeat;border:0;border-radius:10px;cursor:pointer;height:36px;margin-right:6px;user-select:none;width:36px}#mainwin-toolbar button:hover:not(:disabled){background-color:var(--color-bg-hover)}#mainwin-toolbar button:disabled{cursor:default;opacity:.25}#mainwin-toolbar>.toolbar-separator{border-left:1px solid var(--color-border);height:25px;margin:0 6px 0 0}#mainwin-toolbar :nth-last-child(2){border:0;flex-grow:1}#toolbar-open{background-image:url("+Y+")}#toolbar-remove{background-image:url("+Q+")}#toolbar-start{background-image:url("+Z+")}#toolbar-pause{background-image:url("+W+")}#toolbar-inspector{background-image:url("+H+")}#toolbar-overflow{background-color:transparent;background-image:url("+J+");background-position:center;background-size:26px;margin-right:4px;width:36px}#toolbar-overflow.alt-speed-enabled{background-image:url("+q+"),url("+J+");background-position:bottom left,center,center;background-size:16px 9px,26px,26px}.mainwin-filterbar{align-items:center;background:var(--color-toolbar-background);border-bottom:1px solid var(--color-border);display:flex;flex-direction:row;font-size:smaller;width:100%}@media(max-width: 599px){.mainwin-filterbar>:not(select):not(input){display:none}.mainwin-filterbar>input{min-width:50px}.mainwin-filterbar>input,.mainwin-filterbar>select{height:100%}}.mainwin-filterbar>*{padding:0 5px}#torrent-search.blur{color:var(--color-fg-tertiary)}.speed-up-icon{background-image:url("+V+");background-repeat:no-repeat;background-size:12px 12px;height:12px;width:12px}.speed-dn-icon{background-image:url("+K+");background-repeat:no-repeat;background-size:12px 12px;height:12px;width:12px}.flex{flex-grow:1}#torrent-container{flex-grow:1;left:0;margin:0;overflow:auto;-webkit-overflow-scrolling:touch;padding:0;right:0}.torrent-container{background-color:#fff}.torrent-list{cursor:pointer;list-style-type:none;margin:0;padding:0;text-align:left;width:100%}.torrent-list .torrent{border-bottom:1px solid var(--color-border);color:var(--color-fg-secondary);user-select:none}.torrent-list .torrent.paused{color:var(--color-fg-disabled)}.torrent-list .torrent .icon{background-position:center,top left}.torrent-list .torrent .icon[data-icon-mime-type=audio]{background-image:url("+X+")}.torrent-list .torrent .icon[data-icon-mime-type=audio][data-icon-multifile=true]{background-image:url("+X+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=application]{background-image:url("+ee+")}.torrent-list .torrent .icon[data-icon-mime-type=application][data-icon-multifile=true]{background-image:url("+ee+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=font]{background-image:url("+te+")}.torrent-list .torrent .icon[data-icon-mime-type=font][data-icon-multifile=true]{background-image:url("+te+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=image]{background-image:url("+ne+")}.torrent-list .torrent .icon[data-icon-mime-type=image][data-icon-multifile=true]{background-image:url("+ne+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=model]{background-image:url("+re+")}.torrent-list .torrent .icon[data-icon-mime-type=model][data-icon-multifile=true]{background-image:url("+re+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=text]{background-image:url("+oe+")}.torrent-list .torrent .icon[data-icon-mime-type=text][data-icon-multifile=true]{background-image:url("+oe+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=video]{background-image:url("+se+")}.torrent-list .torrent .icon[data-icon-mime-type=video][data-icon-multifile=true]{background-image:url("+se+"),url("+$+')}.torrent-list .torrent.compact{align-items:center;display:flex;flex-direction:row-reverse}.torrent-list .torrent.compact .icon{background-size:16px,8px;flex-shrink:0;height:16px;width:16px}.torrent-list .torrent.compact>*{margin:4px 5px}.torrent-list .torrent:not(.compact){align-items:center;display:grid;grid-column-gap:12px;grid-template-areas:"icon name labels" "icon peers peers" "icon progressbar progressbar" "icon progress-text progress-text";grid-template-columns:32px auto 1fr;padding:2px 12px}.torrent-list .torrent:not(.compact) .icon{background-size:32px,16px;grid-area:icon;height:32px;width:32px}.torrent-list .torrent:not(.compact) .torrent-name{grid-area:name}.torrent-list .torrent:not(.compact) .torrent-labels{grid-area:labels}.torrent-list .torrent:not(.compact) .torrent-peer-details{grid-area:peers}.torrent-list .torrent:not(.compact) .torrent-progress{display:flex;flex-direction:row;grid-area:progressbar}.torrent-list .torrent:not(.compact) .torrent-progress-details{grid-area:progress-text}.torrent-list .torrent:not(.compact)>*{margin:1px 0}.torrent-list .torrent.selected{background-color:var(--color-bg-selection-1)}.torrent-list .torrent.selected .torrent-progress-details.error,.torrent-list .torrent.selected .torrent-peer-details.error{color:#fff}.torrent-list .icon{background-position:center;background-repeat:no-repeat}.torrent-list .torrent-pauseresume-button{background-position:center center;background-repeat:no-repeat;background-size:14px;margin-left:7px;width:14px}.torrent-list .torrent-pauseresume-button[data-action=pause]{background-image:url('+ie+")}.torrent-list .torrent-pauseresume-button[data-action=pause]:active,.torrent-list .torrent-pauseresume-button[data-action=pause]:hover{background-image:url("+ae+")}.torrent-list .torrent-pauseresume-button[data-action=resume]{background-image:url("+le+")}.torrent-list .torrent-pauseresume-button[data-action=resume]:active,.torrent-list .torrent-pauseresume-button[data-action=resume]:hover{background-image:url("+ce+")}.torrent-list .torrent-progress-details.error,.torrent-list .torrent-peer-details.error{color:var(--color-fg-error)}.torrent-list .torrent-name{font-weight:bold;margin-bottom:2px;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.torrent-list .torrent-name.compact{font-size:1em;font-weight:normal}.torrent-list .torrent-name:not(.paused){color:var(--color-fg-name)}.torrent-list .torrent-labels{font-size:x-small;font-weight:normal;margin-bottom:2px;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.torrent-list .torrent-labels.compact{flex:1;font-size:x-small}.torrent-list .torrent-progress-details,.torrent-list .torrent-peer-details{font-size:x-small}.torrent-list .torrent-progress-bar{background-repeat:no-repeat;border-radius:3px;border-style:solid;border-width:1px;height:12px}.torrent-list .torrent-progress-bar.full{flex-grow:1;margin:2px 0}.torrent-list .torrent-progress-bar.compact{min-width:50px;width:50px}.torrent-list .torrent-progress-bar.leech.paused{background:linear-gradient(to bottom, var(--color-progressbar-leech-paused-1), var(--color-progressbar-leech-paused-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.leech.queued{background:linear-gradient(to bottom, var(--color-progressbar-leech-queued-1), var(--color-progressbar-leech-queued-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.leech{background:linear-gradient(to bottom, var(--color-progressbar-leech-1), var(--color-progressbar-leech-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.magnet.paused{background:linear-gradient(to bottom, var(--color-progressbar-magnet-paused-1), var(--color-progressbar-magnet-paused-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.magnet{background:linear-gradient(to bottom, var(--color-progressbar-magnet-1), var(--color-progressbar-magnet-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.seed.paused{background:linear-gradient(to bottom, var(--color-progressbar-seed-paused-1), var(--color-progressbar-seed-paused-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.seed.queued{background:linear-gradient(to bottom, var(--color-progressbar-seed-queued-1), var(--color-progressbar-seed-queued-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.seed{background:linear-gradient(to bottom, var(--color-progressbar-seed-1), var(--color-progressbar-seed-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.verify{background:linear-gradient(to bottom, var(--color-progressbar-verify-1), var(--color-progressbar-verify-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}#inspector-tab-info{background-image:url("+de+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#inspector-tab-info:active,#inspector-tab-info:checked,#inspector-tab-info.selected{background-image:url("+de+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#inspector-tab-peers{background-image:url("+Ae+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#inspector-tab-peers:active,#inspector-tab-peers:checked,#inspector-tab-peers.selected{background-image:url("+Ae+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#inspector-tab-tiers{background-image:url("+pe+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#inspector-tab-tiers:active,#inspector-tab-tiers:checked,#inspector-tab-tiers.selected{background-image:url("+pe+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#inspector-tab-files{background-image:url("+ge+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#inspector-tab-files:active,#inspector-tab-files:checked,#inspector-tab-files.selected{background-image:url("+ge+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}@media(max-width: 599px){#inspector,#prefs-dialog{left:0}}@media(min-width: 600px){#inspector,#prefs-dialog{border-left:1px solid var(--color-fg-secondary);width:570px}}#prefs-dialog{background:#fff;bottom:0;box-shadow:0 3px 6px rgba(0,0,0,.7);position:absolute;right:0;top:61px;z-index:2}#prefs-dialog .tabs-page{grid-column-gap:8px;grid-row-gap:5px;grid-template-columns:1fr 1fr;margin:20px}#prefs-dialog .tabs-page:not(.hidden){display:grid}#prefs-dialog .tabs-page .section-label{font-weight:bold;grid-column:span 2;margin-left:-20px;padding-bottom:5px}#prefs-dialog .tabs-page .section-label:not(:first-of-type){margin-top:20px}#prefs-dialog .alt-speed-section-label{background:transparent url("+q+") no-repeat;background-position:left 4px;padding-left:22px}#prefs-dialog :disabled,#prefs-dialog .disabled{color:var(--color-fg-disabled)}#prefs-dialog #alt-times-div,#prefs-dialog #autostart-div,#prefs-dialog #port-forwarding,#prefs-dialog #randomize-port,#prefs-dialog #suffix-div,#prefs-dialog #use-dht-div,#prefs-dialog #use-lpd-div,#prefs-dialog #use-pex-div,#prefs-dialog #utp-enabled,#prefs-dialog .alt-speed-label{grid-column:span 2}#prefs-dialog .blocklist-size-label,#prefs-dialog .blocklist-update-button,#prefs-dialog .port-status{grid-column:2/3}#prefs-dialog .blocklist-size-label{font-size:smaller}#prefs-dialog .blocklist-size-number{font-weight:bolder}#prefs-dialog .port-status-label{display:inline-block;font-weight:bold;margin-left:5px}#prefs-dialog .port-status-label[data-open=true]{color:var(--color-fg-port-open)}#prefs-dialog .port-status-label[data-open=false]{color:var(--color-fg-port-closed)}#prefs-dialog .alt-speed-label{font-size:smaller;font-style:lighter;margin:-10px 0 10px -20px}#prefs-dialog.ui-tabs .ui-tabs-panel{padding:0;user-select:none}.prefs-section{text-align:left}.prefs-section>*{padding:0 8px 8px}.prefs-section .title{font-size:larger;font-weight:bold;padding-left:0}.prefs-section .row .key{float:left;padding-top:3px}.prefs-section .row .key>*{margin-left:0}.prefs-section .row .value{margin-left:150px}.prefs-section .row .value>*{width:100%}.prefs-section .checkbox-row>input{margin:0}.prefs-section .checkbox-row>label{margin-left:5px}.prefs-section #alternative-speed-limits-title{background:transparent url("+q+") no-repeat;padding-left:18px}.prefs-section #alternative-speed-limits-desc{font-size:smaller;padding-bottom:4px}.tabs-container{align-items:stretch;background:#fff;border-left:solid 1px var(--color-border);bottom:0;display:flex;flex-direction:column;position:absolute;right:0;top:61px;z-index:2}@media(max-width: 599px){.tabs-container{left:0}}@media(min-width: 600px){.tabs-container{width:550px}}.tabs-buttons{align-self:center;display:flex;padding:10px}.tabs-buttons button{border:1px solid var(--color-border);cursor:pointer;display:inline-block;padding:3px;user-select:none;appearance:none;padding:3px}.file-priority-radiobox :first-child,.tabs-buttons :first-child{border-bottom-left-radius:8px;border-top-left-radius:8px}.file-priority-radiobox :last-child,.tabs-buttons :last-child{border-bottom-right-radius:8px;border-top-right-radius:8px}.tabs-pages{box-sizing:border-box;flex:1;overflow-x:hidden;overflow-y:auto}@media(max-width: 599px){.tabs-pages{padding:0 8px 20px}}@media(min-width: 600px){.tabs-pages{padding:0 20px 20px}}.tabs-button{background-position:center;background-repeat:no-repeat}#inspector{box-shadow:0 3px 6px rgba(0,0,0,.7)}.inspector-info-page{grid-column-gap:8px;grid-row-gap:5px;grid-template-columns:auto 1fr;margin:20px;padding:12px}.inspector-info-page:not(.hidden){display:grid}.inspector-info-page .section-label{font-weight:bold;grid-column:span 2;margin-left:-20px;padding-bottom:5px}.inspector-info-page .section-label:not(:first-of-type){margin-top:20px}.inspector-info-page :not(.section-label){overflow-x:hidden;text-overflow:ellipsis}.inspector-info-magnet button{background-color:transparent;background-image:url("+ue+");background-position:top;background-repeat:no-repeat;border:0;cursor:pointer;height:1rem;vertical-align:middle;width:1rem}#inspector .tabs-button,#prefs-dialog .tabs-button{background-size:20px 20px,40px 30px;height:30px;margin:0;padding:0;width:40px}#prefs-tab-torrent{background-image:url("+me+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#prefs-tab-torrent:active,#prefs-tab-torrent:checked,#prefs-tab-torrent.selected{background-image:url("+me+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#prefs-tab-speed{background-image:url("+he+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#prefs-tab-speed:active,#prefs-tab-speed:checked,#prefs-tab-speed.selected{background-image:url("+he+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#prefs-tab-peers{background-image:url("+Ae+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#prefs-tab-peers:active,#prefs-tab-peers:checked,#prefs-tab-peers.selected{background-image:url("+Ae+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#prefs-tab-network{background-image:url("+fe+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#prefs-tab-network:active,#prefs-tab-network:checked,#prefs-tab-network.selected{background-image:url("+fe+'),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#inspector-file-list{margin:0;padding:0}#inspector-file-list .inspector-torrent-file-list-entry{display:grid;grid-column-gap:5px;grid-template-areas:"check name priority" "blank1 info blank2";grid-template-columns:20px 1fr 65px;margin-bottom:4px;padding:5px}#inspector-file-list .inspector-torrent-file-list-entry.skip{opacity:.5}#inspector-file-list .file-wanted-control{grid-area:check}#inspector-file-list .inspector-torrent-file-list-entry-name{color:var(--color-fg-name);cursor:pointer;grid-area:name;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#inspector-file-list .inspector-torrent-file-list-entry.skip>.inspector-torrent-file-list-entry-name{color:var(--color-fg-disabled)}#inspector-file-list .inspector-torrent-file-list-entry-progress{color:var(--color-fg-secondary);grid-area:info}#inspector-file-list .single-file .inspector-torrent-file-list-entry>.file-wanted-control,#inspector-file-list .inspector-torrent-file-list-entry.complete>.file-wanted-control{cursor:default}#inspector-header{margin:8px 0}#torrent-inspector-name{font-size:large;font-weight:bold}#inspector-tiers-list{color:var(--color-fg-secondary);margin:0 10px;padding:0 12px}#inspector-tiers-list .tier-list-row{display:grid;grid-column-gap:8px;grid-row-gap:4px;margin-top:8px}#inspector-tiers-list .tier-list-torrent{color:var(--color-fg-primary);font-size:larger;font-weight:bolder;margin-left:-12px;overflow-x:hidden;padding-top:20px;text-overflow:ellipsis;white-space:nowrap}#inspector-tiers-list .tier-list-tracker{font-weight:bolder;grid-column:span 2;margin-top:8px;padding-bottom:4px}#inspector-tiers-list .tier-announce,#inspector-tiers-list .tier-scrape,#inspector-tiers-list .tier-state{text-align:left}#inspector-tiers-list .tier-downloads,#inspector-tiers-list .tier-leechers,#inspector-tiers-list .tier-seeders{text-align:right}.peer-list{border:1px solid #f6f8fa;border-collapse:collapse;cursor:default;table-layout:fixed;text-align:left;width:100%}.peer-list td,.peer-list th{font-size:smaller;padding:5px}.peer-list td{border:1px solid #f6f8fa;color:var(--color-fg-secondary)}.peer-list .torrent-row td{background:#f6f8fa;color:var(--color-fg-primary);font-size:normal;font-weight:bolder;overflow-x:hidden;padding:10px;text-overflow:ellipsis;white-space:nowrap}.peer-list .encryption{width:16px}.peer-list .encryption[data-encrypted=true]{background:transparent url('+be+") center center no-repeat;height:16px;width:16px}.peer-list .peer-address,.peer-list .percent-done,.peer-list .speed-down,.peer-list .speed-up{text-align:right}.peer-list .percent-done{width:10%}.peer-list .speed-down,.peer-list .speed-up{width:15%}.peer-list .peer-address{width:25%}.peer-list .peer-app-name{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width: 599px){.peer-list .peer-app-name{display:none}}@media(min-width: 600px){.peer-list .peer-app-name{width:25%}}.peer-list .status{cursor:pointer}.file-priority-radiobox{grid-area:priority}.file-priority-radiobox>*{border:1px solid var(--color-border);cursor:pointer;display:inline-block;padding:3px;user-select:none;appearance:none;background-position:center;background-repeat:no-repeat;background-size:10px,20px;height:20px;margin:0;padding:0;width:20px}.file-priority-radiobox>.low{background-image:url("+K+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2));border-right-width:0}.file-priority-radiobox>.low:active,.file-priority-radiobox>.low:checked,.file-priority-radiobox>.low.selected{background-image:url("+K+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}.file-priority-radiobox>.normal{background-image:url("+Ce+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}.file-priority-radiobox>.normal:active,.file-priority-radiobox>.normal:checked,.file-priority-radiobox>.normal.selected{background-image:url("+Ce+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}.file-priority-radiobox>.high{background-image:url("+V+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2));border-left-width:0}.file-priority-radiobox>.high:active,.file-priority-radiobox>.high:checked,.file-priority-radiobox>.high.selected{background-image:url("+V+'),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}.context-menu{background:var(--color-bg-menu);box-shadow:0 3px 6px rgba(0,0,0,.7);color:var(--color-fg-on-popup);position:absolute;z-index:2}.context-menu .context-menuitem{list-style:none;padding:5px 10px}.context-menu .context-menuitem:hover:not(:disabled),.context-menu .context-menuitem:focus:not(:disabled){background-image:linear-gradient(#fff, var(--color-bg-menu));cursor:pointer}.context-menu .context-menuitem:disabled{color:var(--color-fg-disabled);cursor:none}.context-menu-separator{border-bottom:1px solid var(--color-fg-secondary);margin-bottom:10px;padding-bottom:10px}.overflow-menu{background:linear-gradient(160deg, #d21, 1%, var(--color-bg-hover), 40%, var(--color-bg-menu));border-radius:8px;box-shadow:0 3px 6px rgba(0,0,0,.7);color:var(--color-fg-on-popup);padding:20px;position:fixed;width:200px;z-index:2}.overflow-menu fieldset{border:0;margin-bottom:8px;padding:0}.overflow-menu>.actions,.overflow-menu>.info,.overflow-menu>.links{display:flex;flex-direction:column}.overflow-menu legend{font-weight:bolder;margin-bottom:4px}.overflow-menu legend~*{margin-left:12px}.overflow-menu a,.overflow-menu button,.overflow-menu label{font-size:1em}.overflow-menu a:disabled,.overflow-menu button:disabled,.overflow-menu label:disabled{color:var(--color-fg-disabled);cursor:default}.overflow-menu a:focus:not(:disabled),.overflow-menu a:hover:not(:disabled),.overflow-menu button:focus:not(:disabled),.overflow-menu button:hover:not(:disabled),.overflow-menu label:focus:not(:disabled),.overflow-menu label:hover:not(:disabled){background-color:var(--color-bg-hover)}.overflow-menu a,.overflow-menu button{background:transparent;border:0;cursor:pointer;display:block;padding:4px 0;text-align:left;text-decoration:none;width:150px}.overflow-menu .input-and-label{align-items:center;display:inline-flex;flex-direction:row}.overflow-menu #display-options>*{align-items:center;display:inline-flex;flex-direction:row}.overflow-menu #display-options>*>*{margin:4px}.overflow-menu #display-options>* :first-child{margin-left:0}.overflow-menu #display-options>* :last-child{margin-right:0}.overflow-menu #speed-options{display:flex;flex-direction:column}.overflow-menu #speed-options>.speed-up,.overflow-menu #speed-options>.speed-down{align-items:center;display:flex;flex-direction:row;padding:4px 0}.overflow-menu #speed-options>.speed-up>label,.overflow-menu #speed-options>.speed-down>label{overflow:hidden;width:80px}.overflow-menu #speed-options .alt-speed{display:grid;grid-column-gap:5px;grid-row-gap:5px;grid-template-areas:"check lb" "turtle values";grid-template-columns:20px 1fr;margin-bottom:4px}.overflow-menu #speed-options #alt-speed-check{grid-area:check}.overflow-menu #speed-options #alt-speed-check:checked~#alt-speed-image{background-image:url('+q+")}.overflow-menu #speed-options #alt-speed-check:not(:checked)~#alt-speed-image{background-image:url("+ve+')}.overflow-menu #speed-options #alt-speed-image{background-position:center;background-repeat:no-repeat;grid-area:turtle}.overflow-menu #speed-options #alt-speed-label{grid-area:lb}.overflow-menu #speed-options #alt-speed-values-label{font-size:small;grid-area:values}@media(min-width: 600px){#display-fullscreen-check,#display-fullscreen-label{display:none}}@media(max-width: 599px){.dialog-buttons{padding-top:13.3333333333px}.dialog-container{opacity:96%;position:absolute;top:61px;width:100%}.dialog-logo{padding-bottom:13.3333333333px}.dialog-window{align-items:center;display:flex;flex-direction:column}}@media(min-width: 600px){.dialog-container{left:50%;min-width:400px;position:absolute;top:122px;transform:translateX(-50%)}.dialog-heading{grid-area:heading}.dialog-logo{grid-area:icon;padding-right:13.3333333333px}.dialog-window{color:var(--color-fg-on-popup);display:grid;grid-column-gap:12px;grid-template-areas:"icon heading" "icon message" "icon workarea" "icon buttons";grid-template-columns:64px 1fr;padding:2px 12px}}.dialog-buttons{display:flex;float:right;grid-area:buttons;margin:10px 0 0;text-align:center}.dialog-buttons button{appearance:none;background:transparent;border:1px solid var(--color-border);border-radius:5px;color:var(--color-fg-name);margin-left:8px;padding:8px;text-decoration:none}.dialog-buttons a:hover,.dialog-buttons a:active{background:linear-gradient(#fff, var(--color-bg-menu))}.dialog-buttons-begin{flex-grow:1}.dialog-buttons-end{display:none}.dialog-container{border:0;box-shadow:0 3px 6px rgba(0,0,0,.7);color:var(--color-fg-primary);display:block;margin:0;padding:0;z-index:2}.dialog-heading{align-items:center;display:flex;font-size:1.2em;font-weight:bold}.dialog-logo{background:transparent url('+ye+") top left no-repeat;height:64px;width:64px}.dialog-message{grid-area:message;margin:10px 0 0}.dialog-window{background:linear-gradient(160deg, #d21, 1%, #f7f7f7, 40%, #ccc);height:100%;padding:20px}.dialog-workarea{display:flex;flex-direction:column;grid-area:workarea;margin:10px 0 0}.dialog-workarea>*{margin-bottom:5px}.about-dialog .dialog-workarea>*{margin-bottom:10px}.about-dialog-version-number{margin-left:4px}.about-dialog-version-checksum{font-size:small;font-style:italic;font-weight:normal;margin-left:auto;padding-left:10px}.shortcuts-dialog table{border-collapse:collapse;width:100%}.shortcuts-dialog th,.shortcuts-dialog td{border:1px solid var(--color-border);padding:5px 10px}#torrent-rename-name{min-width:400px}#move-container #torrent-path{min-width:400px}.tabs-pages .content,.inspector-info-page .content,.statistics-dialog .content{column-gap:16px;display:grid;grid-row-gap:6px;grid-template-columns:auto 1fr;margin-top:4px}@media(max-width: 599px){.tabs-pages .content,.inspector-info-page .content,.statistics-dialog .content{margin:4px 0 16px}}@media(min-width: 600px){.tabs-pages .content,.inspector-info-page .content,.statistics-dialog .content{margin:4px 16px 16px}}.tabs-pages .content div,.inspector-info-page .content div,.statistics-dialog .content div{word-break:break-word}.tabs-pages fieldset,.inspector-info-page fieldset,.statistics-dialog fieldset{border:0;margin:0;padding:0}.tabs-pages legend,.inspector-info-page legend,.statistics-dialog legend{font-weight:bolder;margin-bottom:4px}#free-space-text{display:inline-block;float:right;font-size:smaller;font-style:italic}#torrent-upload-frame{border:0;display:block;height:0;left:-1000px;margin:0;padding:0;position:absolute;top:-1000px;width:0}.ui-menu{width:200px}","",{version:3,sources:["webpack://./style/transmission-app.scss"],names:[],mappings:"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",sourcesContent:["@use 'sass:color';\n@use 'sass:math';\n\n// Color palette recycled from GitHub Primer.\n// Please use those values if you need to add colors.\n// https://primer.style/css/support/color-system\n$blue-100: #dbedff;\n$blue-200: #c8e1ff;\n$blue-300: #79b8ff;\n$blue-700: #044289;\n$green-100: #dcffe4;\n$green-200: #bef5cb;\n$green-300: #85e89d;\n$green-500: #28a745;\n$green-700: #176f2c;\n$grey-100: #f6f8fa;\n$grey-200: #e1e4e8;\n$grey-300: #d1d5da;\n$grey-400: #959da5;\n$grey-500: #6a737d;\n$grey-800: #2f363d;\n$pink-300: #f692ce;\n$pink-700: #b93a86;\n$purple-000: #f5f0ff;\n$purple-100: #e6dcfd;\n$red-500: #d73a49;\n$white: #fff;\n$yellow-200: #fff5b1;\n$yellow-300: #ffea7f;\n$yellow-700: #dbab09;\n\n// Z-INDEX ENUM\n// $z-index-progressbar: 1;\n$z-index-popup: 2;\n\n// SVG ICONS -- see images/README.md for sources and license details\n// Are you a designer? New icon PRs welcomed!\n$image-analytics: 'images/analytics.svg';\n$image-baseline: 'images/horizontal-rule.svg';\n$image-files: 'images/files.svg';\n$image-chevron-dn: 'images/chevron-down.svg';\n$image-chevron-up: 'images/chevron-up.svg';\n$image-lock-fill: 'images/lock-fill.svg';\n$image-network: 'images/router.svg';\n$image-magnet: 'images/magnet.svg';\n$image-overflow: 'images/three-dots-vertical.svg';\n$image-pause-circle-active: 'images/pause-circle-active.svg';\n$image-pause-circle-idle: 'images/pause-circle-idle.svg';\n$image-peers: 'images/team.svg';\n$image-play-circle-active: 'images/play-circle-active.svg';\n$image-play-circle-idle: 'images/play-circle-idle.svg';\n$image-speed: 'images/checkered-flag.svg';\n$image-tiers: 'images/diagram-3-fill.svg';\n$image-upload-download: 'images/up-and-down-arrows.svg';\n\n@mixin for-phone-only {\n @media (max-width: 599px) {\n @content;\n }\n}\n@mixin for-tablet-portrait-up {\n @media (min-width: 600px) {\n @content;\n }\n}\n// @mixin for-tablet-landscape-up {media (min-width: 900px) { @content; }}\n// @mixin for-desktop-up {@media (min-width: 1200px) { @content; }}\n// @mixin for-big-desktop-up {@media (min-width: 1800px) { @content; }}\n\n/// MIXINS\n\n@mixin image-on-vertical-gradient($src, $topColor, $bottomColor) {\n background-image: url($src), linear-gradient($topColor, $bottomColor);\n}\n\n@mixin button {\n border: 1px solid var(--color-border);\n cursor: pointer;\n display: inline-block;\n padding: 3px;\n user-select: none;\n}\n\n@mixin rounded-box($radius) {\n border-radius: $radius;\n}\n\n@mixin rounded-button($radius) {\n @include button;\n border-radius: $radius;\n}\n\n/// GLOBAL\n\n:root {\n --color-bg-even: #{$white};\n --color-bg-hover: #{$grey-100};\n --color-bg-menu: #{$grey-200};\n --color-bg-odd: #{$grey-100};\n --color-bg-selection-1: #{$purple-100};\n --color-bg-selection-2: #{$purple-000};\n --color-border: #{$grey-400};\n --color-fg-disabled: #{$grey-400};\n --color-fg-error: #{$red-500};\n --color-fg-name: #{$grey-800};\n --color-fg-on-popup: #{$grey-800};\n --color-fg-port-closed: #{$red-500};\n --color-fg-port-open: #{$green-500};\n @media (prefers-color-scheme: dark) {\n --color-fg-primary: #{$grey-100};\n --color-fg-secondary: #{$grey-400};\n --color-fg-tertiary: #{$grey-500};\n }\n @media (prefers-color-scheme: light) {\n --color-fg-primary: #{$grey-800};\n --color-fg-secondary: #{$grey-500};\n --color-fg-tertiary: #{$grey-400};\n }\n --color-progressbar-background-1: #{$grey-100};\n --color-progressbar-background-2: #{$grey-400};\n --color-progressbar-verify-1: #{$pink-300};\n --color-progressbar-verify-2: #{$pink-700};\n --color-progressbar-magnet-1: #{$yellow-300};\n --color-progressbar-magnet-2: #{$yellow-700};\n --color-progressbar-magnet-paused-1: #{$yellow-200};\n --color-progressbar-magnet-paused-2: #{$grey-500};\n --color-progressbar-leech-paused-1: #{$blue-200};\n --color-progressbar-leech-paused-2: #{$grey-500};\n --color-progressbar-leech-queued-1: #{$blue-100};\n --color-progressbar-leech-queued-2: #{$blue-300};\n --color-progressbar-leech-1: #{$blue-300};\n --color-progressbar-leech-2: #{$blue-700};\n --color-progressbar-seed-paused-1: #{$green-200};\n --color-progressbar-seed-paused-2: #{$grey-500};\n --color-progressbar-seed-queued-1: #{$green-100};\n --color-progressbar-seed-queued-2: #{$green-300};\n --color-progressbar-seed-1: #{$green-300};\n --color-progressbar-seed-2: #{$green-700};\n --color-tab-deselected-1: #{$grey-100};\n --color-tab-deselected-2: #{$grey-400};\n --color-tab-selected-1: #{$purple-100};\n --color-tab-selected-2: #{$purple-000};\n --color-toolbar-background: linear-gradient(#{$grey-300}, #{$grey-400});\n}\n\nhtml,\nbody {\n color: var(--color-fg-primary);\n font-family: Verdana, Arial, Helvetica, sans-serif;\n height: 100%;\n margin: 0;\n overflow: hidden;\n}\n\nimg {\n border: 0;\n}\n\na {\n outline: 0;\n}\n\n.hidden {\n display: none;\n}\n\n.even {\n background-color: var(--color-bg-even);\n}\n.odd {\n background-color: var(--color-bg-odd);\n}\n\n.mainwin {\n display: flex;\n flex-direction: column;\n height: 100%;\n position: relative;\n\n > * {\n margin: 0;\n padding: 0;\n }\n}\n\n.mainwin-workarea {\n display: flex;\n flex: 1;\n flex-direction: row;\n overflow: auto;\n}\n\n/// TOOLBAR\n\n$toolbar-height-number: 36;\n$toolbar-height: $toolbar-height-number * 1px;\n\n#mainwin-toolbar {\n align-items: center;\n background: var(--color-toolbar-background);\n border-bottom: 1px solid var(--color-border);\n display: flex;\n flex-direction: row;\n height: $toolbar-height;\n margin: 0;\n padding: 2px;\n width: 100%;\n\n button {\n background-color: transparent;\n background-position: center;\n background-repeat: no-repeat;\n border: 0;\n border-radius: 10px;\n cursor: pointer;\n height: $toolbar-height;\n margin-right: 6px;\n user-select: none;\n width: $toolbar-height;\n\n &:hover:not(:disabled) {\n background-color: var(--color-bg-hover);\n }\n\n &:disabled {\n cursor: default;\n opacity: 0.25;\n }\n }\n\n > .toolbar-separator {\n border-left: 1px solid var(--color-border);\n height: 25px;\n margin: 0 6px 0 0;\n }\n\n :nth-last-child(2) {\n border: 0;\n flex-grow: 1;\n }\n}\n\n#toolbar-open {\n background-image: url('images/toolbar-folder.png');\n}\n\n#toolbar-remove {\n background-image: url('images/toolbar-close.png');\n}\n\n#toolbar-start {\n background-image: url('images/toolbar-start.png');\n}\n\n#toolbar-pause {\n background-image: url('images/toolbar-pause.png');\n}\n\n#toolbar-inspector {\n background-image: url('images/toolbar-info.png');\n}\n\n#toolbar-overflow {\n background-color: transparent;\n background-image: url($image-overflow);\n background-position: center;\n background-size: 26px;\n margin-right: 4px;\n width: 36px;\n\n &.alt-speed-enabled {\n background-image: url('images/blue-turtle.png'), url($image-overflow);\n background-position: bottom left, center, center;\n background-size: 16px 9px, 26px, 26px;\n }\n}\n\n/// FILTERBAR\n\n// $filterbar-height-number: 30;\n// $filterbar-height: $filterbar-height-number * 1px;\n\n.mainwin-filterbar {\n align-items: center;\n background: var(--color-toolbar-background);\n border-bottom: 1px solid var(--color-border);\n display: flex;\n flex-direction: row;\n font-size: smaller;\n // height: $filterbar-height;\n width: 100%;\n\n @include for-phone-only {\n > :not(select):not(input) {\n display: none;\n }\n > input {\n min-width: 50px;\n }\n > input,\n > select {\n height: 100%;\n }\n }\n\n > * {\n padding: 0 5px;\n }\n}\n\n#torrent-search {\n &.blur {\n color: var(--color-fg-tertiary);\n }\n}\n\n$speed-icon-size: 12px;\n\n.speed-up-icon {\n background-image: url($image-chevron-up);\n background-repeat: no-repeat;\n background-size: $speed-icon-size $speed-icon-size;\n height: $speed-icon-size;\n width: $speed-icon-size;\n}\n\n.speed-dn-icon {\n background-image: url($image-chevron-dn);\n background-repeat: no-repeat;\n background-size: $speed-icon-size $speed-icon-size;\n height: $speed-icon-size;\n width: $speed-icon-size;\n}\n\n/// TORRENT CONTAINER\n\n$pauseresume-size-number: 14;\n$pauseresume-size: $pauseresume-size-number * 1px;\n$progressbar-border-number: 1;\n$progressbar-height-number: 14;\n$popup-top: 61px; // TODO: ugly that this is hardcoded\n\n.flex {\n flex-grow: 1;\n}\n\n#torrent-container {\n flex-grow: 1;\n left: 0;\n margin: 0;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n padding: 0;\n right: 0;\n}\n\n.torrent-container {\n background-color: $white;\n}\n\n.torrent-list {\n $app-image: 'images/application-x-executable.png';\n $audio-image: 'images/audio-x-generic.png';\n $folder-image: 'images/folder.png';\n $font-image: 'images/font-x-generic.png';\n $image-image: 'images/image-x-generic.png';\n $package-image: 'images/package-x-generic.png';\n $text-image: 'images/folder.png';\n $text-image: 'images/text-x-generic.png';\n $video-image: 'images/video-x-generic.png';\n\n cursor: pointer;\n list-style-type: none;\n margin: 0;\n padding: 0;\n text-align: left;\n width: 100%;\n\n .torrent {\n border-bottom: 1px solid var(--color-border);\n color: var(--color-fg-secondary);\n user-select: none;\n\n &.paused {\n color: var(--color-fg-disabled);\n }\n\n .icon {\n background-position: center, top left;\n\n @mixin mime-icon-compact($mime-icon) {\n background-image: url($mime-icon);\n\n &[data-icon-multifile='true'] {\n background-image: url($mime-icon), url($folder-image);\n }\n }\n\n &[data-icon-mime-type='audio'] {\n @include mime-icon-compact($audio-image);\n }\n\n &[data-icon-mime-type='application'] {\n @include mime-icon-compact($app-image);\n }\n\n &[data-icon-mime-type='font'] {\n @include mime-icon-compact($font-image);\n }\n\n &[data-icon-mime-type='image'] {\n @include mime-icon-compact($image-image);\n }\n\n &[data-icon-mime-type='model'] {\n @include mime-icon-compact($package-image);\n }\n\n &[data-icon-mime-type='text'] {\n @include mime-icon-compact($text-image);\n }\n\n &[data-icon-mime-type='video'] {\n @include mime-icon-compact($video-image);\n }\n }\n\n &.compact {\n $icon-size-num: 16;\n $icon-size: $icon-size-num * 1px;\n\n align-items: center;\n display: flex;\n flex-direction: row-reverse;\n\n .icon {\n background-size: $icon-size, $icon-size-num * 0.5px;\n flex-shrink: 0;\n height: $icon-size;\n width: $icon-size;\n }\n\n > * {\n margin: 4px 5px;\n }\n }\n\n &:not(.compact) {\n $icon-size-num: 32;\n $icon-size: $icon-size-num * 1px;\n align-items: center;\n display: grid;\n grid-column-gap: 12px;\n grid-template-areas:\n 'icon name labels'\n 'icon peers peers'\n 'icon progressbar progressbar'\n 'icon progress-text progress-text';\n grid-template-columns: $icon-size auto 1fr;\n padding: 2px 12px;\n\n .icon {\n background-size: $icon-size, $icon-size-num * 0.5px;\n grid-area: icon;\n height: $icon-size;\n width: $icon-size;\n }\n\n .torrent-name {\n grid-area: name;\n }\n\n .torrent-labels {\n grid-area: labels;\n }\n\n .torrent-peer-details {\n grid-area: peers;\n }\n\n .torrent-progress {\n display: flex;\n flex-direction: row;\n grid-area: progressbar;\n }\n\n .torrent-progress-details {\n grid-area: progress-text;\n }\n\n > * {\n margin: 1px 0;\n }\n }\n\n &.selected {\n background-color: var(--color-bg-selection-1);\n }\n\n &.selected .torrent-progress-details.error,\n &.selected .torrent-peer-details.error {\n color: $white;\n }\n }\n\n .icon {\n background-position: center;\n background-repeat: no-repeat;\n }\n\n .torrent-pauseresume-button {\n background-position: center center;\n background-repeat: no-repeat;\n background-size: $pauseresume-size;\n margin-left: math.floor(math.div($pauseresume-size-number, 2)) * 1px;\n width: $pauseresume-size;\n\n &[data-action='pause'] {\n background-image: url($image-pause-circle-idle);\n &:active,\n &:hover {\n background-image: url($image-pause-circle-active);\n }\n }\n &[data-action='resume'] {\n background-image: url($image-play-circle-idle);\n &:active,\n &:hover {\n background-image: url($image-play-circle-active);\n }\n }\n }\n\n .torrent-progress-details.error,\n .torrent-peer-details.error {\n color: var(--color-fg-error);\n }\n\n .torrent-name {\n font-weight: bold;\n margin-bottom: 2px;\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &.compact {\n font-size: 1em;\n font-weight: normal;\n }\n\n &:not(.paused) {\n color: var(--color-fg-name);\n }\n }\n\n .torrent-labels {\n font-size: x-small;\n font-weight: normal;\n margin-bottom: 2px;\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &.compact {\n flex: 1;\n font-size: x-small;\n }\n }\n\n .torrent-progress-details,\n .torrent-peer-details {\n font-size: x-small;\n }\n\n .torrent-progress-bar {\n background-repeat: no-repeat;\n border-radius: 3px;\n border-style: solid;\n border-width: 1px;\n height: ($progressbar-height-number - ($progressbar-border-number * 2)) *\n 1px;\n\n &.full {\n flex-grow: 1;\n margin: 2px 0;\n }\n &.compact {\n min-width: 50px;\n width: 50px;\n }\n\n @function progressbar-gradient($color1, $color2) {\n @return linear-gradient(to bottom, $color1, $color2 80%);\n }\n\n @mixin progressbar-background($color1, $color2) {\n background: progressbar-gradient($color1, $color2),\n progressbar-gradient(\n var(--color-progressbar-background-1),\n var(--color-progressbar-background-2)\n );\n background-repeat: no-repeat;\n }\n\n &.leech.paused {\n @include progressbar-background(\n var(--color-progressbar-leech-paused-1),\n var(--color-progressbar-leech-paused-2)\n );\n }\n &.leech.queued {\n @include progressbar-background(\n var(--color-progressbar-leech-queued-1),\n var(--color-progressbar-leech-queued-2)\n );\n }\n &.leech {\n @include progressbar-background(\n var(--color-progressbar-leech-1),\n var(--color-progressbar-leech-2)\n );\n }\n &.magnet.paused {\n @include progressbar-background(\n var(--color-progressbar-magnet-paused-1),\n var(--color-progressbar-magnet-paused-2)\n );\n }\n &.magnet {\n @include progressbar-background(\n var(--color-progressbar-magnet-1),\n var(--color-progressbar-magnet-2)\n );\n }\n &.seed.paused {\n @include progressbar-background(\n var(--color-progressbar-seed-paused-1),\n var(--color-progressbar-seed-paused-2)\n );\n }\n &.seed.queued {\n @include progressbar-background(\n var(--color-progressbar-seed-queued-1),\n var(--color-progressbar-seed-queued-2)\n );\n }\n &.seed {\n @include progressbar-background(\n var(--color-progressbar-seed-1),\n var(--color-progressbar-seed-2)\n );\n }\n &.verify {\n @include progressbar-background(\n var(--color-progressbar-verify-1),\n var(--color-progressbar-verify-2)\n );\n }\n }\n}\n\n/// PREFERENCES DIALOG\n\n@mixin tab-image($image-url) {\n background-image: url($image-url),\n linear-gradient(\n var(--color-tab-deselected-1),\n var(--color-tab-deselected-2)\n );\n\n &:active,\n &:checked,\n &.selected {\n background-image: url($image-url),\n linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2));\n }\n}\n\n#inspector-tab-info {\n @include tab-image($image-analytics);\n}\n\n#inspector-tab-peers {\n @include tab-image($image-peers);\n}\n\n#inspector-tab-tiers {\n @include tab-image($image-tiers);\n}\n\n#inspector-tab-files {\n @include tab-image($image-files);\n}\n\n#inspector,\n#prefs-dialog {\n @include for-phone-only {\n left: 0;\n }\n @include for-tablet-portrait-up {\n border-left: 1px solid var(--color-fg-secondary);\n width: 570px;\n }\n}\n\n#prefs-dialog {\n $background-color: $white;\n\n background: $background-color;\n bottom: 0;\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);\n position: absolute;\n right: 0;\n top: $popup-top;\n z-index: $z-index-popup;\n\n .tabs-page {\n grid-column-gap: 8px;\n grid-row-gap: 5px;\n grid-template-columns: 1fr 1fr;\n margin: 20px;\n\n &:not(.hidden) {\n display: grid;\n }\n\n .section-label {\n font-weight: bold;\n grid-column: span 2;\n margin-left: -20px;\n padding-bottom: 5px;\n\n &:not(:first-of-type) {\n margin-top: 20px;\n }\n }\n }\n\n .alt-speed-section-label {\n background: transparent url('images/blue-turtle.png') no-repeat;\n background-position: left 4px;\n padding-left: 22px;\n }\n\n :disabled,\n .disabled {\n color: var(--color-fg-disabled);\n }\n\n #alt-times-div,\n #autostart-div,\n #port-forwarding,\n #randomize-port,\n #suffix-div,\n #use-dht-div,\n #use-lpd-div,\n #use-pex-div,\n #utp-enabled,\n .alt-speed-label {\n grid-column: span 2;\n }\n\n .blocklist-size-label,\n .blocklist-update-button,\n .port-status {\n grid-column: 2 / 3;\n }\n\n .blocklist-size-label {\n font-size: smaller;\n }\n .blocklist-size-number {\n font-weight: bolder;\n }\n\n .port-status-label {\n display: inline-block;\n font-weight: bold;\n margin-left: 5px;\n &[data-open='true'] {\n color: var(--color-fg-port-open);\n }\n &[data-open='false'] {\n color: var(--color-fg-port-closed);\n }\n }\n\n .alt-speed-label {\n font-size: smaller;\n font-style: lighter;\n // nudge it up next to the section label\n margin: -10px 0 10px -20px;\n }\n}\n\n#prefs-dialog.ui-tabs .ui-tabs-panel {\n padding: 0;\n user-select: none;\n}\n\n.prefs-section {\n text-align: left;\n\n > * {\n padding: 0 8px 8px;\n }\n\n .title {\n font-size: larger;\n font-weight: bold;\n padding-left: 0;\n }\n\n .row {\n .key {\n float: left;\n padding-top: 3px;\n\n > * {\n margin-left: 0;\n }\n }\n\n .value {\n margin-left: 150px;\n\n > * {\n width: 100%;\n }\n }\n }\n\n .checkbox-row {\n > input {\n margin: 0;\n }\n\n > label {\n margin-left: 5px;\n }\n }\n\n #alternative-speed-limits-title {\n background: transparent url('images/blue-turtle.png') no-repeat;\n padding-left: 18px;\n }\n\n #alternative-speed-limits-desc {\n font-size: smaller;\n padding-bottom: 4px;\n }\n}\n\n/// TABS\n\n.tabs-container {\n align-items: stretch;\n background: $white;\n border-left: solid 1px var(--color-border);\n bottom: 0;\n display: flex;\n flex-direction: column;\n position: absolute;\n right: 0;\n top: $popup-top;\n z-index: $z-index-popup;\n @include for-phone-only {\n left: 0;\n }\n @include for-tablet-portrait-up {\n width: 550px;\n }\n}\n\n.tabs-buttons {\n align-self: center;\n display: flex;\n padding: 10px;\n\n button {\n @include button;\n appearance: none;\n padding: 3px;\n }\n}\n\n.file-priority-radiobox,\n.tabs-buttons {\n $radius: 8px;\n :first-child {\n border-bottom-left-radius: $radius;\n border-top-left-radius: $radius;\n }\n :last-child {\n border-bottom-right-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n.tabs-pages {\n box-sizing: border-box;\n flex: 1;\n overflow-x: hidden;\n overflow-y: auto;\n @include for-phone-only {\n padding: 0 8px 20px;\n }\n @include for-tablet-portrait-up {\n padding: 0 20px 20px;\n }\n}\n\n.tabs-button {\n background-position: center;\n background-repeat: no-repeat;\n}\n\n/// INSPECTOR\n\n#inspector {\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);\n}\n\n.inspector-info-page {\n // TODO: this is (mostly) copied from prefs-dialog.\n // can it be folded into a single set of rules?\n\n grid-column-gap: 8px;\n grid-row-gap: 5px;\n grid-template-columns: auto 1fr;\n margin: 20px;\n padding: 12px;\n\n &:not(.hidden) {\n display: grid;\n }\n\n .section-label {\n font-weight: bold;\n grid-column: span 2;\n margin-left: -20px;\n padding-bottom: 5px;\n\n &:not(:first-of-type) {\n margin-top: 20px;\n }\n }\n\n :not(.section-label) {\n // this section is not copied\n overflow-x: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.inspector-info-magnet {\n button {\n background-color: transparent;\n background-image: url($image-magnet);\n background-position: top;\n background-repeat: no-repeat;\n border: 0;\n cursor: pointer;\n height: 1rem;\n vertical-align: middle;\n width: 1rem;\n }\n}\n\n#inspector .tabs-button,\n#prefs-dialog .tabs-button {\n background-size: 20px 20px, 40px 30px;\n height: 30px;\n margin: 0;\n padding: 0;\n width: 40px;\n}\n\n#prefs-tab-torrent {\n @include tab-image($image-upload-download);\n}\n\n#prefs-tab-speed {\n @include tab-image($image-speed);\n}\n\n#prefs-tab-peers {\n @include tab-image($image-peers);\n}\n\n#prefs-tab-network {\n @include tab-image($image-network);\n}\n\n#inspector-file-list {\n margin: 0;\n padding: 0;\n\n .inspector-torrent-file-list-entry {\n display: grid;\n grid-column-gap: 5px;\n grid-template-areas:\n 'check name priority'\n 'blank1 info blank2';\n grid-template-columns: 20px 1fr 65px;\n margin-bottom: 4px;\n padding: 5px;\n\n &.skip {\n opacity: 0.5;\n }\n }\n\n .file-wanted-control {\n grid-area: check;\n }\n\n .inspector-torrent-file-list-entry-name {\n color: var(--color-fg-name);\n cursor: pointer;\n grid-area: name;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .inspector-torrent-file-list-entry.skip\n > .inspector-torrent-file-list-entry-name {\n color: var(--color-fg-disabled);\n }\n\n .inspector-torrent-file-list-entry-progress {\n color: var(--color-fg-secondary);\n grid-area: info;\n }\n\n .single-file .inspector-torrent-file-list-entry > .file-wanted-control,\n .inspector-torrent-file-list-entry.complete > .file-wanted-control {\n cursor: default;\n }\n}\n\n#inspector-header {\n margin: 8px 0;\n}\n\n#torrent-inspector-name {\n font-size: large;\n font-weight: bold;\n}\n\n#inspector-tiers-list {\n color: var(--color-fg-secondary);\n margin: 0 10px;\n padding: 0 12px;\n\n .tier-list-row {\n display: grid;\n grid-column-gap: 8px;\n grid-row-gap: 4px;\n margin-top: 8px;\n }\n\n .tier-list-torrent {\n color: var(--color-fg-primary);\n font-size: larger;\n font-weight: bolder;\n margin-left: -12px;\n overflow-x: hidden;\n padding-top: 20px;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tier-list-tracker {\n font-weight: bolder;\n grid-column: span 2;\n margin-top: 8px;\n padding-bottom: 4px;\n }\n\n .tier-announce,\n .tier-scrape,\n .tier-state {\n text-align: left;\n }\n\n .tier-downloads,\n .tier-leechers,\n .tier-seeders {\n text-align: right;\n }\n}\n\n// Peers Tab\n\n.peer-list {\n $table-border-color: $grey-100;\n $table-border: 1px solid $table-border-color;\n\n border: $table-border;\n border-collapse: collapse;\n cursor: default;\n table-layout: fixed;\n text-align: left;\n width: 100%;\n\n td,\n th {\n font-size: smaller;\n padding: 5px;\n }\n\n td {\n border: $table-border;\n color: var(--color-fg-secondary);\n // padding: 5px 10px;\n }\n\n .torrent-row td {\n background: $table-border-color;\n color: var(--color-fg-primary);\n font-size: normal;\n font-weight: bolder;\n overflow-x: hidden;\n padding: 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .encryption {\n width: 16px;\n &[data-encrypted='true'] {\n background: transparent url($image-lock-fill) center center no-repeat;\n height: 16px;\n width: 16px;\n }\n }\n\n .peer-address,\n .percent-done,\n .speed-down,\n .speed-up {\n text-align: right;\n }\n\n .percent-done {\n width: 10%;\n }\n .speed-down,\n .speed-up {\n width: 15%;\n }\n .peer-address {\n width: 25%;\n }\n\n .peer-app-name {\n overflow-x: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include for-phone-only {\n display: none;\n }\n @include for-tablet-portrait-up {\n width: 25%;\n }\n }\n\n .status {\n cursor: pointer;\n }\n}\n\n/// FILE PRIORITY BUTTONS\n\n.file-priority-radiobox {\n $size-number: 20;\n $size: $size-number * 1px;\n $halfsize: math.floor(math.div($size-number, 2)) * 1px;\n\n grid-area: priority;\n\n > * {\n @include button;\n appearance: none;\n background-position: center;\n background-repeat: no-repeat;\n background-size: $halfsize, $size;\n height: $size;\n margin: 0;\n padding: 0;\n width: $size;\n }\n\n > .low {\n @include tab-image($image-chevron-dn);\n border-right-width: 0;\n }\n\n > .normal {\n @include tab-image($image-baseline);\n }\n\n > .high {\n @include tab-image($image-chevron-up);\n border-left-width: 0;\n }\n}\n\n/// CONTEXT MENU\n\n.context-menu {\n $background-color: var(--color-bg-menu);\n $disabled-color: var(--color-fg-disabled);\n\n background: $background-color;\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);\n color: var(--color-fg-on-popup);\n position: absolute;\n z-index: $z-index-popup;\n\n .context-menuitem {\n list-style: none;\n padding: 5px 10px;\n\n &:hover:not(:disabled),\n &:focus:not(:disabled) {\n background-image: linear-gradient($white, var(--color-bg-menu));\n cursor: pointer;\n }\n\n &:disabled {\n color: $disabled-color;\n cursor: none;\n }\n }\n}\n\n.context-menu-separator {\n border-bottom: 1px solid var(--color-fg-secondary);\n margin-bottom: 10px;\n padding-bottom: 10px;\n}\n\n/// OVERFLOW MENU\n\n.overflow-menu {\n background: linear-gradient(\n 160deg,\n #d21,\n 1%,\n var(--color-bg-hover),\n 40%,\n var(--color-bg-menu)\n );\n border-radius: 8px;\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);\n color: var(--color-fg-on-popup);\n padding: 20px;\n position: fixed;\n width: 200px;\n z-index: $z-index-popup;\n\n fieldset {\n border: 0;\n margin-bottom: 8px;\n padding: 0;\n }\n\n > .actions,\n > .info,\n > .links {\n display: flex;\n flex-direction: column;\n }\n\n legend {\n font-weight: bolder;\n margin-bottom: 4px;\n }\n\n legend ~ * {\n margin-left: 12px;\n }\n\n a,\n button,\n label {\n font-size: 1em;\n\n &:disabled {\n color: var(--color-fg-disabled);\n cursor: default;\n }\n\n &:focus:not(:disabled),\n &:hover:not(:disabled) {\n background-color: var(--color-bg-hover);\n }\n }\n\n a,\n button {\n background: transparent;\n border: 0;\n cursor: pointer;\n display: block;\n padding: 4px 0;\n text-align: left;\n text-decoration: none;\n width: 150px;\n }\n\n .input-and-label {\n align-items: center;\n display: inline-flex;\n flex-direction: row;\n }\n\n #display-options {\n > * {\n align-items: center;\n display: inline-flex;\n flex-direction: row;\n\n > * {\n margin: 4px;\n }\n\n :first-child {\n margin-left: 0;\n }\n\n :last-child {\n margin-right: 0;\n }\n }\n }\n\n #speed-options {\n display: flex;\n flex-direction: column;\n\n > .speed-up,\n > .speed-down {\n align-items: center;\n display: flex;\n flex-direction: row;\n padding: 4px 0;\n\n > label {\n overflow: hidden;\n width: 80px;\n }\n }\n\n .alt-speed {\n display: grid;\n grid-column-gap: 5px;\n grid-row-gap: 5px;\n grid-template-areas:\n 'check lb'\n 'turtle values';\n grid-template-columns: 20px 1fr;\n margin-bottom: 4px;\n }\n\n #alt-speed-check {\n grid-area: check;\n\n &:checked ~ #alt-speed-image {\n background-image: url('images/blue-turtle.png');\n }\n\n &:not(:checked) ~ #alt-speed-image {\n background-image: url('images/turtle.png');\n }\n }\n\n #alt-speed-image {\n background-position: center;\n background-repeat: no-repeat;\n grid-area: turtle;\n }\n\n #alt-speed-label {\n grid-area: lb;\n }\n\n #alt-speed-values-label {\n font-size: small;\n grid-area: values;\n }\n }\n}\n\n// hide the fullscreen button unless we're on mobile\n@include for-tablet-portrait-up {\n #display-fullscreen-check,\n #display-fullscreen-label {\n display: none;\n }\n}\n\n/// DIALOGS\n\n$dialog-padding-number: 20;\n$dialog-logo-padding-number: math.div($dialog-padding-number * 2, 3);\n$logo-size: 64px;\n\n@include for-phone-only {\n .dialog-buttons {\n padding-top: $dialog-logo-padding-number * 1px;\n }\n\n .dialog-container {\n opacity: 96%;\n position: absolute;\n top: $popup-top;\n width: 100%;\n }\n\n .dialog-logo {\n padding-bottom: $dialog-logo-padding-number * 1px;\n }\n\n .dialog-window {\n align-items: center;\n display: flex;\n flex-direction: column;\n }\n}\n@include for-tablet-portrait-up {\n .dialog-container {\n left: 50%;\n min-width: 400px;\n position: absolute;\n top: $popup-top * 2;\n transform: translateX(-50%);\n }\n\n .dialog-heading {\n grid-area: heading;\n }\n\n .dialog-logo {\n grid-area: icon;\n padding-right: $dialog-logo-padding-number * 1px;\n }\n\n .dialog-window {\n color: var(--color-fg-on-popup);\n display: grid;\n grid-column-gap: 12px;\n grid-template-areas:\n 'icon heading'\n 'icon message'\n 'icon workarea'\n 'icon buttons';\n grid-template-columns: $logo-size 1fr;\n padding: 2px 12px;\n }\n}\n\n.dialog-buttons {\n display: flex;\n float: right;\n grid-area: buttons;\n margin: 10px 0 0;\n text-align: center;\n\n button {\n appearance: none;\n background: transparent;\n border: 1px solid var(--color-border);\n border-radius: 5px;\n color: var(--color-fg-name);\n margin-left: 8px;\n padding: 8px;\n text-decoration: none;\n }\n\n a:hover,\n a:active {\n background: linear-gradient($white, var(--color-bg-menu));\n }\n}\n\n.dialog-buttons-begin {\n flex-grow: 1;\n}\n\n.dialog-buttons-end {\n display: none;\n}\n\n.dialog-container {\n border: 0;\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);\n color: var(--color-fg-primary);\n display: block;\n margin: 0;\n padding: 0;\n z-index: $z-index-popup;\n}\n\n.dialog-heading {\n align-items: center;\n display: flex;\n font-size: 1.2em;\n font-weight: bold;\n}\n\n.dialog-logo {\n background: transparent url('images/logo.png') top left no-repeat;\n height: $logo-size;\n width: $logo-size;\n}\n\n.dialog-message {\n grid-area: message;\n margin: 10px 0 0;\n}\n\n.dialog-window {\n background: linear-gradient(160deg, #d21, 1%, #f7f7f7, 40%, #ccc);\n height: 100%;\n padding: $dialog-padding-number * 1px;\n}\n\n.dialog-workarea {\n display: flex;\n flex-direction: column;\n grid-area: workarea;\n margin: 10px 0 0;\n\n > * {\n margin-bottom: 5px;\n }\n}\n\n/// ABOUT DIALOG\n\n.about-dialog .dialog-workarea > * {\n margin-bottom: 10px;\n}\n\n.about-dialog-version-number {\n margin-left: 4px;\n}\n\n.about-dialog-version-checksum {\n font-size: small;\n font-style: italic;\n font-weight: normal;\n margin-left: auto;\n padding-left: 10px;\n}\n\n/// HOTKEYS DIALOG\n\n.shortcuts-dialog {\n table {\n border-collapse: collapse;\n width: 100%;\n }\n\n th,\n td {\n border: 1px solid var(--color-border);\n padding: 5px 10px;\n }\n}\n\n/// RENAME DIALOG\n\n#torrent-rename-name {\n min-width: 400px;\n}\n\n/// SET-LOCATION DIALOG\n\n#move-container #torrent-path {\n min-width: 400px;\n}\n\n/// STATISTICS DIALOG\n\n.tabs-pages,\n.inspector-info-page,\n.statistics-dialog {\n .content {\n column-gap: 16px;\n display: grid;\n grid-row-gap: 6px;\n grid-template-columns: auto 1fr;\n margin-top: 4px;\n\n @include for-phone-only {\n margin: 4px 0 16px;\n }\n @include for-tablet-portrait-up {\n margin: 4px 16px 16px;\n }\n\n div {\n word-break: break-word;\n }\n }\n\n fieldset {\n border: 0;\n margin: 0;\n padding: 0;\n }\n\n legend {\n font-weight: bolder;\n margin-bottom: 4px;\n }\n}\n\n/// UPLOAD DIALOG\n\n#free-space-text {\n display: inline-block;\n float: right;\n font-size: smaller;\n font-style: italic;\n}\n\n#torrent-upload-frame {\n border: 0;\n display: block; /* Don't change this : safari forms won't target hidden frames (they open a new window) */\n height: 0;\n left: -1000px;\n margin: 0;\n padding: 0;\n position: absolute;\n top: -1000px;\n width: 0;\n}\n\n.ui-menu {\n width: 200px;\n}\n"],sourceRoot:""}]);const Ee=G},645:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,r){"string"==typeof e&&(e=[[null,e,""]]);var o={};if(r)for(var s=0;s{"use strict";function t(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=e&&("undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"]);if(null==n)return;var r,o,s=[],i=!0,a=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(s.push(r.value),!t||s.length!==t);i=!0);}catch(e){a=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(a)throw o}}return s}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return n(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return n(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n{"use strict";e.exports=function(e,t){return t||(t={}),"string"!=typeof(e=e&&e.__esModule?e.default:e)?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]/.test(e)||t.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e)}},307:(e,t,n)=>{e=n.nmd(e);var r="__lodash_hash_undefined__",o=9007199254740991,s="[object Arguments]",i="[object Array]",a="[object Boolean]",l="[object Date]",c="[object Error]",d="[object Function]",A="[object Map]",p="[object Number]",g="[object Object]",u="[object Promise]",m="[object RegExp]",h="[object Set]",f="[object String]",b="[object Symbol]",C="[object WeakMap]",v="[object ArrayBuffer]",y="[object DataView]",E=/^\[object .+?Constructor\]$/,w=/^(?:0|[1-9]\d*)$/,x={};x["[object Float32Array]"]=x["[object Float64Array]"]=x["[object Int8Array]"]=x["[object Int16Array]"]=x["[object Int32Array]"]=x["[object Uint8Array]"]=x["[object Uint8ClampedArray]"]=x["[object Uint16Array]"]=x["[object Uint32Array]"]=!0,x[s]=x[i]=x[v]=x[a]=x[y]=x[l]=x[c]=x[d]=x[A]=x[p]=x[g]=x[m]=x[h]=x[f]=x[C]=!1;var k="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,M="object"==typeof self&&self&&self.Object===Object&&self,S=k||M||Function("return this")(),I=t&&!t.nodeType&&t,B=I&&e&&!e.nodeType&&e,D=B&&B.exports===I,T=D&&k.process,L=function(){try{return T&&T.binding&&T.binding("util")}catch(e){}}(),N=L&&L.isTypedArray;function j(e,t){for(var n=-1,r=null==e?0:e.length;++na))return!1;var c=s.get(e);if(c&&s.get(t))return c==t;var d=-1,A=!0,p=2&n?new ve:void 0;for(s.set(e,t),s.set(t,e);++d-1},be.prototype.set=function(e,t){var n=this.__data__,r=we(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this},Ce.prototype.clear=function(){this.size=0,this.__data__={hash:new fe,map:new(se||be),string:new fe}},Ce.prototype.delete=function(e){var t=Te(this,e).delete(e);return this.size-=t?1:0,t},Ce.prototype.get=function(e){return Te(this,e).get(e)},Ce.prototype.has=function(e){return Te(this,e).has(e)},Ce.prototype.set=function(e,t){var n=Te(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this},ve.prototype.add=ve.prototype.push=function(e){return this.__data__.set(e,r),this},ve.prototype.has=function(e){return this.__data__.has(e)},ye.prototype.clear=function(){this.__data__=new be,this.size=0},ye.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},ye.prototype.get=function(e){return this.__data__.get(e)},ye.prototype.has=function(e){return this.__data__.has(e)},ye.prototype.set=function(e,t){var n=this.__data__;if(n instanceof be){var r=n.__data__;if(!se||r.length<199)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new Ce(r)}return n.set(e,t),this.size=n.size,this};var Ne=te?function(e){return null==e?[]:(e=Object(e),function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n-1&&e%1==0&&e-1&&e%1==0&&e<=o}function Ye(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Qe(e){return null!=e&&"object"==typeof e}var Ze=N?function(e){return function(t){return e(t)}}(N):function(e){return Qe(e)&&Ge(e.length)&&!!x[xe(e)]};function We(e){return null!=(t=e)&&Ge(t.length)&&!Re(t)?Ee(e):Ie(e);var t}e.exports=function(e,t){return Me(e,t)}},379:(e,t,n)=>{"use strict";var r,o=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},s=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),i=[];function a(e){for(var t=-1,n=0;n{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di01aDJ2NXptNCAwaC0ydi0zaDJ2M3ptMC01aC0ydi0yaDJ2MnptNCA1aC0yVjdoMnYxMHoiLz48L3N2Zz4="},520:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NTMuNDA1IiBoZWlnaHQ9IjQ1My40MDUiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ1My40MDUgNDUzLjQwNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTM4Mi4wOCA2MC4zOTRjLTI2LjMyNC00LjUzNC01My40NDQtLjg0NS03OS43NjQgMS43NTEtMjYuMjIzIDIuNTg3LTUzLjYwNCA1Ljc1My03OS41ODUtLjM5Ny0zMC41OTItNy4yNDEtNDkuOTQ1LTI3LjI5NC02NC4yMTYtNTQuNDY0bC0xMS44MDMgMzEuOTM4TDY5LjQ5NCAyNDguMTYgMCA0MzYuMjAzbDI2LjgzOCA5LjkxOSA2Mi41NDEtMTY5LjIyN2MxMS42MDcgMTIuMzgzIDI1LjkzNyAyMS4zNzUgNDQuMzMzIDI1LjcyOSAyNS45NzkgNi4xNDYgNTMuMzYzIDIuOTg2IDc5LjU4NC4zOTggMjYuMzE4LTIuNjAxIDUzLjQ0MS02LjI4NyA3OS43NjUtMS43NTIgMzMuODI2IDUuODI2IDU1LjY4MiAyNi4wODYgNzEuMzIzIDU1Ljg3MSAyOS42NzctODAuMjkxIDU5LjM0OC0xNjAuNTgzIDg5LjAyMS0yNDAuODc2LTE1LjY0NC0yOS43ODYtMzcuNDk0LTUwLjA0My03MS4zMjUtNTUuODcxem0zLjI5OSAxNDIuOTU1Yy0xMy4yMzQtMTEuMTY5LTI3LjQ0MS0xOC42MzgtNDQuNTctMjEuOTMxLTUuNzE1IDE1LjQ1OC0xMS40MjggMzAuOTE2LTE3LjE0MSA0Ni4zNzQgMTcuMTMxIDMuMjk1IDMxLjMzNSAxMC43NjQgNDQuNTcyIDIxLjkzMmwtMTUuNzE3IDQyLjUyNmMtMTMuMjM0LTExLjE2OC0yNy40NDMtMTguNjQyLTQ0LjU3My0yMS45M2wxNS43MTgtNDIuNTI4Yy0xNy40NDItMi44MTMtMzQuNDczLTIuNzk3LTUyLjA3Mi0xLjcyTDI1NS44NzkgMjY4LjZjLTE4LjIxIDEuNDcxLTM2LjM1OCAzLjU2LTU0LjU2NyA1LjAyOCA1LjIzOC0xNC4xNzggMTAuNDc4LTI4LjM1MyAxNS43MTYtNDIuNTI2LTE3LjU5OSAxLjA3OC0zNC42MzEgMS4wOTYtNTIuMDczLTEuNzE5bC0xNS43MTcgNDIuNTI2Yy0xNy4xMjgtMy4yOS0zMS4zNDEtMTAuNzYzLTQ0LjU3Mi0yMS45MzNsMTUuNzE2LTQyLjUyNWMxMy4yMzYgMTEuMTcgMjcuNDQyIDE4LjY0IDQ0LjU3MyAyMS45MzJsMTcuMTM5LTQ2LjM3NmMtMTcuMTMtMy4yODUtMzEuMzM4LTEwLjc2Ni00NC41NzMtMjEuOTNsMTcuMTQtNDYuMzc4YzEzLjIzNiAxMS4xNzMgMjcuNDQyIDE4LjYzNSA0NC41NzIgMjEuOTMzbDE1LjcxNy00Mi41MjVjMTcuNDQyIDIuODEzIDM0LjQ3NiAyLjc5NyA1Mi4wNzMgMS43MTdsLTE1LjcxNyA0Mi41MjZjMTguMjA5LTEuNDcxIDM2LjM1Ny0zLjU1OCA1NC41NjctNS4wMjggNS4yMzgtMTQuMTc1IDEwLjQ3OS0yOC4zNTEgMTUuNzE3LTQyLjUyNyAxNy42MDEtMS4wNzggMzQuNjI5LTEuMDk1IDUyLjA3MiAxLjcxOWwtMTUuNzE3IDQyLjUyOGMxNy4xMzEgMy4yOTQgMzEuMzM1IDEwLjc2MSA0NC41NzMgMjEuOTMtNS43MTIgMTUuNDU5LTExLjQyMyAzMC45MTktMTcuMTM5IDQ2LjM3N3oiLz48cGF0aCBkPSJtMjM0LjE2NyAxODQuNzI2LTE3LjE0IDQ2LjM3NmMxOC4yMS0xLjQ3MiAzNi4zNTktMy41NiA1NC41NjgtNS4wM2wxNy4xMzktNDYuMzc0Yy0xOC4yMTEgMS40NzEtMzYuMzU4IDMuNTU5LTU0LjU2NyA1LjAyOHoiLz48cGF0aCBkPSJtMjM0LjE2NyAxODQuNzI2IDE3LjE0LTQ2LjM3NWMtMTcuNjA0IDEuMDc1LTM0LjYyOSAxLjA5My01Mi4wNzUtMS43MThsLTE3LjEzOSA0Ni4zNzVjMTcuNDQzIDIuODE2IDM0LjQ3MyAyLjc5OSA1Mi4wNzQgMS43MTh6TTMwNS44NzMgMTMzLjMyM2wtMTcuMTM5IDQ2LjM3NWMxNy42MDEtMS4wNzUgMzQuNjI5LTEuMDkzIDUyLjA3MyAxLjcybDE3LjEzOC00Ni4zNzVjLTE3LjQ0Mi0yLjgxNC0zNC40NzEtMi44LTUyLjA3Mi0xLjcyeiIvPjwvc3ZnPg=="},438:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktY2hldnJvbi1kb3duIiBmaWxsPSJjdXJyZW50Q29sb3IiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMS42NDYgNC42NDZhLjUuNSAwIDAgMSAuNzA4IDBMOCAxMC4yOTNsNS42NDYtNS42NDdhLjUuNSAwIDAgMSAuNzA4LjcwOGwtNiA2YS41LjUgMCAwIDEtLjcwOCAwbC02LTZhLjUuNSAwIDAgMSAwLS43MDh6Ii8+PC9zdmc+"},820:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktY2hldnJvbi11cCIgZmlsbD0iY3VycmVudENvbG9yIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTcuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwbDYgNmEuNS41IDAgMCAxLS43MDguNzA4TDggNS43MDdsLTUuNjQ2IDUuNjQ3YS41LjUgMCAwIDEtLjcwOC0uNzA4bDYtNnoiLz48L3N2Zz4="},749:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktZGlhZ3JhbS0zLWZpbGwiIGZpbGw9ImN1cnJlbnRDb2xvciIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02IDMuNUExLjUgMS41IDAgMCAxIDcuNSAyaDFBMS41IDEuNSAwIDAgMSAxMCAzLjV2MUExLjUgMS41IDAgMCAxIDguNSA2djFIMTRhLjUuNSAwIDAgMSAuNS41djFhLjUuNSAwIDAgMS0xIDBWOGgtNXYuNWEuNS41IDAgMCAxLTEgMFY4aC01di41YS41LjUgMCAwIDEtMSAwdi0xQS41LjUgMCAwIDEgMiA3aDUuNVY2QTEuNSAxLjUgMCAwIDEgNiA0LjV2LTF6bS02IDhBMS41IDEuNSAwIDAgMSAxLjUgMTBoMUExLjUgMS41IDAgMCAxIDQgMTEuNXYxQTEuNSAxLjUgMCAwIDEgMi41IDE0aC0xQTEuNSAxLjUgMCAwIDEgMCAxMi41di0xem02IDBBMS41IDEuNSAwIDAgMSA3LjUgMTBoMWExLjUgMS41IDAgMCAxIDEuNSAxLjV2MUExLjUgMS41IDAgMCAxIDguNSAxNGgtMUExLjUgMS41IDAgMCAxIDYgMTIuNXYtMXptNiAwYTEuNSAxLjUgMCAwIDEgMS41LTEuNWgxYTEuNSAxLjUgMCAwIDEgMS41IDEuNXYxYTEuNSAxLjUgMCAwIDEtMS41IDEuNWgtMWExLjUgMS41IDAgMCAxLTEuNS0xLjV2LTF6Ii8+PC9zdmc+"},886:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktZmlsZXMiIGZpbGw9ImN1cnJlbnRDb2xvciIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00IDJoN2EyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMnptMCAxYTEgMSAwIDAgMC0xIDF2MTBhMSAxIDAgMCAwIDEgMWg3YTEgMSAwIDAgMCAxLTFWNGExIDEgMCAwIDAtMS0xSDR6Ii8+PHBhdGggZD0iTTYgMGg3YTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMnYtMWExIDEgMCAwIDAgMS0xVjJhMSAxIDAgMCAwLTEtMUg2YTEgMSAwIDAgMC0xIDFINGEyIDIgMCAwIDEgMi0yeiIvPjwvc3ZnPg=="},961:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTQgMTFoMTZ2Mkg0eiIvPjwvc3ZnPg=="},371:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktbG9jay1maWxsIiBmaWxsPSJjdXJyZW50Q29sb3IiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSA5YTIgMiAwIDAgMSAyLTJoN2EyIDIgMCAwIDEgMiAydjVhMiAyIDAgMCAxLTIgMmgtN2EyIDIgMCAwIDEtMi0yVjl6Ii8+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNC41IDRhMy41IDMuNSAwIDEgMSA3IDB2M2gtMVY0YTIuNSAyLjUgMCAwIDAtNSAwdjNoLTFWNHoiLz48L3N2Zz4="},199:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktbWFnbmV0Ij48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04IDFhNyA3IDAgMCAwLTcgN3YzaDRWOGEzIDMgMCAwIDEgNiAwdjNoNFY4YTcgNyAwIDAgMC03LTdabTcgMTFoLTR2M2g0di0zWk01IDEySDF2M2g0di0zWk0wIDhhOCA4IDAgMSAxIDE2IDB2OGgtNlY4YTIgMiAwIDEgMC00IDB2OEgwVjhaIi8+PC9zdmc+"},25:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM4MDAiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMSAxNEg5VjhoMnY4em00IDBoLTJWOGgydjh6Ii8+PC9zdmc+"},173:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM5OTkiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMSAxNEg5VjhoMnY4em00IDBoLTJWOGgydjh6Ii8+PC9zdmc+"},912:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwODAiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNC41di05bDYgNC41LTYgNC41eiIvPjwvc3ZnPg=="},557:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM5OTkiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNC41di05bDYgNC41LTYgNC41eiIvPjwvc3ZnPg=="},602:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Im0yMC4yIDUuOS44LS44QzE5LjYgMy43IDE3LjggMyAxNiAzcy0zLjYuNy01IDIuMWwuOC44QzEzIDQuOCAxNC41IDQuMiAxNiA0LjJzMyAuNiA0LjIgMS43em0tLjkuOGMtLjktLjktMi4xLTEuNC0zLjMtMS40cy0yLjQuNS0zLjMgMS40bC44LjhjLjctLjcgMS42LTEgMi41LTEgLjkgMCAxLjguMyAyLjUgMWwuOC0uOHpNMTkgMTNoLTJWOWgtMnY0SDVjLTEuMSAwLTIgLjktMiAydjRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtNGMwLTEuMS0uOS0yLTItMnpNOCAxOEg2di0yaDJ2MnptMy41IDBoLTJ2LTJoMnYyem0zLjUgMGgtMnYtMmgydjJ6Ii8+PC9zdmc+"},308:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjIuNjk5IiBoZWlnaHQ9IjEyMi42OTkiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDEyMi42OTkgMTIyLjY5OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGNpcmNsZSBjeD0iMTkuNSIgY3k9IjEyLjIiIHI9IjEyLjEiLz48cGF0aCBkPSJNNiA2Ni42OTloMS4ydjI0YzAgMy4zMDEgMi43IDYgNiA2aDEyLjZjMy4zIDAgNi0yLjY5OSA2LTZWODkuM2MtMS4xLTIuMTAxLTEuOC00LjUtMS44LTdWNTAuOWMwLTYuMSAzLjctMTEuNCA5LTEzLjd2LTIuNGMwLTMuMy0yLjctNi02LTZINmMtMy4zIDAtNiAyLjctNiA2djI1LjljMCAzLjMgMi42IDUuOTk5IDYgNS45OTl6Ii8+PGNpcmNsZSBjeD0iMTAzLjMiIGN5PSIxMi4yIiByPSIxMi4xIi8+PHBhdGggZD0iTTgzLjY5OSAzNC43djIuNGM1LjMwMSAyLjMgOSA3LjYgOSAxMy43djMxLjNjMCAyLjUtLjYgNC45LTEuNzk5IDd2MS40YzAgMy4zIDIuNjk5IDYgNiA2aDEyLjZjMy4zIDAgNi0yLjcgNi02di0yNGgxLjE5OWMzLjMwMSAwIDYtMi43IDYtNlYzNC43YzAtMy4zLTIuNjk5LTYtNi02aC0yN2MtMy4yOTkgMC02IDIuNjk5LTYgNnpNMzkuMSA1MC44OTlWODIuMjk5YzAgMy4zIDIuNyA2IDYgNmgyLjN2MjguM2MwIDMuMyAyLjcgNiA2IDZoMTYuMWMzLjMgMCA2LTIuNyA2LTZ2LTI4LjRoMi4zYzMuMyAwIDYtMi42OTkgNi02VjUwLjljMC0zLjMtMi43LTYtNi02SDQ1LjFjLTMuNC0uMDAxLTYgMi43LTYgNS45OTl6Ii8+PGNpcmNsZSBjeD0iNjEuNCIgY3k9IjI2IiByPSIxMy45Ii8+PC9zdmc+"},577:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktdGhyZWUtZG90cy12ZXJ0aWNhbCIgZmlsbD0iY3VycmVudENvbG9yIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSAxM2ExLjUgMS41IDAgMSAxLTMgMCAxLjUgMS41IDAgMCAxIDMgMHptMC01YTEuNSAxLjUgMCAxIDEtMyAwIDEuNSAxLjUgMCAwIDEgMyAwem0wLTVhMS41IDEuNSAwIDEgMS0zIDAgMS41IDEuNSAwIDAgMSAzIDB6Ii8+PC9zdmc+"},689:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3MS43NTMiIGhlaWdodD0iNzEuNzUzIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3MS43NTMgNzEuNzUzIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNMzkuNzk4IDIwLjczNkgyOC4xNzJ2MjAuNzM4bC0xNi41NDctLjAwNFYyMC43MzZIMEwxOS44OTkuODM5bDE5Ljg5OSAxOS44OTd6bTEyLjA1NyA1MC4xNzggMTkuODk3LTE5Ljg5Nkg2MC4xMjlWMzAuMjgybC0xNi41NDctLjAwNHYyMC43NEgzMS45NTdsMTkuODk4IDE5Ljg5NnoiLz48L3N2Zz4="},54:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,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"},319:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEmUlEQVRYw+1Vz29UVRT+7r3vx7zp74rSECO0KbGRhWsF3Klhq4lEYWEkMVEWxPgH0ETjQlATCSZGE11oogtIDPHXrkajxlRxQ40JG1IoBVqYvum8ee/ee85xMdP50SJ0wJ2c1X0z73vnu9855zvAvfi/h9rsi4/9/FqS0cAJAfZD0H+3iUP4bb8/8dblYLOAjAbeg5EXwjIlm6d983BpkEEaZ71ZkECeM8ndJ18fmyfg+b9LTiRZ8xj0AuqB7+0uA3jVIwEnAASAQnGFCohwj3mDeGsQQgFCDKDojYBwO6E4ERWEDytHq5vFM3ix40GQ9VgCIQLENAaXSPIb9ZXzB0+km8U/8tXrspZOnIcuhdJbExJL6wLUq/qAeOpQkwW1nqeA1jVkjwQ6MI0eqPVIwHUkddR763vGmvmI83fkA1hzbnEMM5D0pIKwtBVg3EEJRATNb4hAsLTUowIdJeD2+aZTsOOTF4dDMrsh6gERtSBkzjYUaNfzVqa46+NDo5b14wC2iFELUO6scLuJ4QW1LNtIYNfJV/ttVLwNhwN6MGITm1Bysr5mDTziznIoszHx5PsHBlEuH7fg/cFgyDrUITmylIoR4bC7CdcpMPHhy0MFZz+GI32TyfhA0h/HKIchNNBXFA7L8yut5S1MAtOtwYPvHhpFKD9FW+LxrZP3l5LAgCEoiPvSvI76/GrLSTunqEVAeftROJbsLE8OlYaCCFtKZfQFIbRSqIcOyWSEZZvDMjVusNItQRT7T+Nt/RPbp8bi4TBGYkIwgIwcIq2xPGEgaz3kCco1jCgAgB3Hn5+CyJPliZGShsJwXMJIFGMkLCFQGiumgEAhZ4K11JyINoHxdw4+qoC9I+Oj8WAQYzRKMBTFYBFctzk8E+rsUfOuWQJZ5wOsno7GkgQaMBowUDDQiEyAJAgQKgMNBa3UmhV2jaAi2hePlfuM0dBKwSiNkg4Qa4NANb6lO3a5SNsJAwBQCpO6FMQAQALUyaPqLVShYBRQ8x519rDkmxIKgK4x3KmTILRMTWwBFoFA2ljusGLHqqsHuLApmmPGIrhhCzAENfIwCiiYsOocqt5BPEOcl8DGRWs3eErFMSwzbtgcJIJUWwiAnDyqzqJYI8ACKZypuYYGAQCQ5dniaq1SGh8eBoCcPYqcEOkCSgGOGdRsILecQ5T589z0F7ZFwNIvxZXaS6UdQ4NVb1HzDpExEAgsETrr5ZbqgNJz16a/XG31AGv3vV2q13ylaMsEQcGEnKiVHCxYnbtagbXHuiYA2Xfuai2jatFa9zl5FOuSN/DXKt76Y127YGH6TCaOD6e/XaxQ5v51F6Szi6uUuTMXjp7+uvO/89PfptrzkZVfFyqU+VvgF2pU899cPHrq1NrvrVlKZ+b+Ht4ztVifT/dCJFKR0UorcN3DXqpKOnu5QlX7+YDD4WszcxvWYWXmr3NDe6aW8/mV3YCKdGS00gBlHsWlVNLZxQpV3Wf9Tl7pxG+w9PE3n9nOSh+BUvsANQpBFYIf4P3JC9On/7jdznlo+tkJHagjMOYpYbkPGitgzCCnDy68ceos7sW6+AdV27uHYGOTWgAAAABJRU5ErkJggg=="},803:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAAqklEQVR4AWPABSzqX1oBsQYueXwaVwDxfzQ8lVjNe4D4H1gTJl4BVSMIxMuBeDEQe8M1QwX/E8B/gfgnkiWfYJrDQQLEYvO6FzD2EZDmZGI0QW39Y1b1INOi4ZW5ed1LYbDtNtU3Zcxrn9QR0gy2uf5l4KbVi5hRAu7MmTNMCiUfGS3qXvyAKk4HYgsk7AzEH6ByO3GFPhcQtwOxOQ55ZiD2BOJEIBZAlgMAXRnkb/um+ZoAAAAASUVORK5CYII="},190:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAe1BMVEUAAACii3Sfj4CikIGjkYOikYKjkIOkk4ShkYCikIGikYKhkIGhkYGhkYKunYyunY21ppihj3+ij4Cgj3+hkIKikYGikYKjkYKjkoOjk4Okk4SxoJCyoZG2p5i2p5m/rp3FtKPGtaTJuKfOw7fXzcLYzcLZz8TazsTe1MroLOxCAAAAE3RSTlMAC0CcnJ2mpvPz8/X19ff39/n73gWagwAAAHlJREFUeNrtzjUCwkAQQFHcfQhOfOX+F8TWtdqO/PqN9FLUH8/g137gB5NtWf8qVn6xrOo6KqCWFQfQWk76OnCrNsM4qMu5A4oMVJc7OD/cGqrCzxMDjyvwsobqtQycc0QDsRNHQuMA6D+ADrSLOCC7EQOh1tN+L0Fvq3hkPC72zVoAAAAASUVORK5CYII="},690:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC40lEQVR42mIYdABAbD2DS3OFcQCP+jJl6qSM08RWE9u2bX62bdtr294drm1d7/vNmWKeZ3mub/Efz3l/Bwuapq9jGVLJpcqlOZXQVGiMYYjVMwKEw7Qmm0lN1GtVaNRrUwqHgDBDjTI0uW7aANQT1Bi3mXLCLAkMTcwMwTUwNkOAgKBpYuO8AliGEgA8gsUj5hSAwuIRsz8FeMQcAaJRthdAWBNc1s4poFIuQTTC9EWwNNFSKBTXzBkAv0bIiXkDaF3xhQNsOOOF6985BSuPu6cOoMggFlAqVyEYLYKHyUMoVoRarfv52z4733WNpkJ4ABHy9wQ0uEjsKfh6dwCeXOSEx/5zCHlmmQvWX2ShUKoNBJBEAA8IBrw9AdlCBZ5exhfum+/3BKExABDwe1sAR64eCPD7XH2nYLskAi+ucvN7NBoyZxqWnqLbEFpvpi/A53XhAV6PkwNUewLQEBfL3fd+OUAIgA2X2L4Ar8fROnIEA3C77H0BKE4qB8d1cdgiCsOKMwyfj7b6BcD/x6m+ALfLhge4nNaxRq0bUKnW4LdDJCoyMP8eI/sCXA4LHuC0m8fqPQCnjQmhyFsbvHDRlgRjMIsirAMcwGEz4QF2q7EXAA21UOSAOtZ2b/lpZlIAm8XQAoCrBgKsZl1PwD5VVCjyzkYvv9rRetgqjsDj/09uCiwmLR5gNmp6AjKFCry21tNz3t9c750UwGRQ4wFGvaoNcNPHZ4Xc8ukFuOcnDTz4pxke+dsGD3H7u35QwR1fieHBP8x87v5RzT97w7un0b4NYNAp8QC9VtEGaNSnFTQCaN8G0GkUHOCPwQCtWiYAppuVx9z8r+Gig8626xqVDA/QqCQzBqCoXbGuayqVpAV/4AGNUjE3q/+E0G9LsZAHlUI8CgBXDgSoVeJL6Bcxl01DPp+ZlaC2iKBnXKOUyLF/SkUi0bVqpUiilF0cUcguwmxEJb80olaIpYrL279VgmGwAQCiLNWHPaj+YwAAAABJRU5ErkJggg=="},350:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEHUlEQVRYw+2VvY5cRRCFv6quvjO2ZWkdGKRFIkBEzrAWWzyESXkE3oAUeAregMASkRMCNicg4g3MGu9ik2B7f+beriqCvjO7y64xCCwh4ZJaM+puzTl9zqkaeFNv6v9eArC3t/eOCveBO5lprw1MxAX5AR0/2d5+7yGAASh8vVgu7l5ZXiki8tpem5nlZHXy4fFR3gfuztgQGXeWrxl8VoDlYqmZcTszZaNARLM1tH//EVgiFWQQZBAQWOmSY1lwokuOZeBIFhzK0BcDL6TyPCvPpfKMyrM0fstCCGyJc53G5299RtEB91bo9ne/W4tTmUYQTzrB7MwXgqZTJCg4haAQGIllUCWoBFWSAWFIWCJMoTSRWefcYLif4lnf8FMCqwTL+f6siyZlaJRslDRMnIpjOAPGCYqFMWSlYiyj0qQgFFYulBT0jL1n8WYLzhAYEwIkk5SZgwqqiVWnZMPSUAmKC4JRKBQxShiDGJMbV9XQECoKWTARchbhLN7lCnhCCiI5E4AsUMyp4rQEcUMwMitKRbNSqFgaNYxwBYxpFlJFNoJeosD5DBC5jm33r/Sl5kgVggJSiOjgUCENTaOkUTEilaRQEFxBM9b45/C6AhGQCSJdgZhDM79+xsNLJdRIqURWwMgsSBYkDcmC0klYKj2yoAIihXWbX1TAnVz3xZgbMmh2cINmRmsDMVXCjEyD7J8RlcxuR98vQM8AooQkotkzIK8IIWOSmZvwSYGoSpsGWlkw6UCIElFoaUQWPI2ITiajE+m+dQIkiJ5iXBLCP8yBPB8+H41WK1NbMNpAawuCQobRZmAPI2Y1wq2fp4KCIEjRzSi4MAfOteE0z4DZ+6hK80prA5NVpmlgpOJaaa5EVjwM98oU1u+m4Wk4kChokh4g+RfacMwewKmfRjPcjakZrRlNK00rIwPhBQ9l8kLzyhSV0Y0pKhOld4L0dtbZgsyYFfjyZYNo/qKACe6GzySaFyY3Jh+YpDLFAvcynxljq4wzkfdvTnywfQvTq5vffvrkV1bj2CB3Rb6Il2QgQRIxCBfcdQPis7+tFRxjjJmMF8ap0JoxtoFVGre3b1F0ydk6WZ20p7882b12feseZ955zgKmhJZkg/TSVyjuSrjSsuBRGL3Qoo/dqc3qNGM1GdNkF8CPT47bweOD3WvXt+7t7OxMfxLCefDUJFI2KhCCz0RcCimFyDITWlswk/DhPPjxUdvf39/dunHzHPilCuRaAaevFEjpgUrIECKkk6PvexY8dVZGWbmegh8dtr1Hj3a3bvx0AXyjQGa2yDQFbnz1I/9GHRw85ujwRdvbe/Tdzbf3P97Z+XS67J4CiOoPP+899Mz8eygvqYjg6PBoehU4zH+QDx48eNdKfuPut9ek/mkVLd++CvxN/Sfqd29fwFSAwYBpAAAAAElFTkSuQmCC"},166:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,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"},174:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACKUlEQVRYw93XXU/aUBgH8Dr9DMuu/AIklO4TGL0wc0t8G3LvN9gVvmTtSebSEoigICrewa681tQoirHV3c6SJdOIbJqQOEckJCJO9PGcBghGeS0txif5h8Npc87vFAo9FPXcyiSjTovEbtMSm8avmXpDS9yMJsBbmZN6ol9uh38L8PFPfRmKC/B+34ERyNcwAK88Y8WD2U4dDcWVCsIHRbhqGEHvsDfWE0fDAHfqG7gugtCnCBlG5uZbAtCEaBaggHi3XydCK8CVCj1AOC9C9SG0Aj6d+Z9ABKH3B3/FyMirO6BcyG1qltjbrgjqaAmA5GUAJsIeWAjMQWDR/yCkb2LToz+gdHK3ywnT087i+8Ulv/6A0lV7Z91qSvsMA6yJq+DzetSI4kptgB32zrpsbW8KIJfLFa8AaRsOIDVmH8cZU9stAShKFKI4LQOUlmGAOd9sWQA5pjvA/pUDgXc8ApA+O89VBVCAXmkCjOxxMBqafAQgfbbvBgBsJ/gB9HBKnXQpMK+GFOkjx/QH5EPqOHYIiURCbdf0Z9RMwL/zv8XLf47bhgPC62Lxpzi8ITYRINUGiB0dwMGvn5BMJtWPoSoAj0nXAmD2uMvBePWNSTabhXQ6rX4PSCqdO3IqwGCcB7PM/qeAaqsM2EVr3crUTX+Mh4Hj8ilMXEilc0nwmDmLjLaqPpSad9FrRv68gbdW13ijCeXC5GPJp9K5tMxe44WFTRH0hnpudQ/yep8TiQS3zAAAAABJRU5ErkJggg=="},785:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABq0lEQVR42mIYdODu3btygOrqKrmNIAjAcOgKgeP6COHcQc9mWpIsXmY2M5NwO7NhblEn8VT9ehx9W0NJHPCsC9bNMEWh141j/8VYgDSNpIP93f7V5QVcX10OFUNAGoedOApejwzIvySfjP0MXZoEEEf+eAg2QXdcwGdEFPnv/iogicPPgDwGQhDUgLwERSAAy1AG6YclQBBUgI2N5JeAz3uC9Yp0Cc7PTmFjPf4tIon8jOO4R2QAfI8E/SEB2BLg3T1AGLhkSxCFHg7wPZsMEPgODnAdk2wJHNvMAAoP/wiwLY0MYJkaDjANlQEuSJbANJSsUEAAuiaTAXStiQM0tdG9vrwgWQJNqeMAVa51r4gASrOKA+RG5TNg4jXr5QwAHvwR0KiVyAD1ahEH1CoS2RJUyyIOqKwJZIByiccBa0WObAlKEscAU38GFMUVMoAkrOAASVgiAwjCUgZTOOD69ORwon+cvy0nx0cgcIsdALj/R4AoLM7nL+LhwR4cHe1PpHwu3zV6Er+0eg8bCwsLT0R+YYlfmWtzK3MwiYTV+bbILS5z3Myze//beA8SaCTphKrdFQAAAABJRU5ErkJggg=="},466:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,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"},908:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,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"},450:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,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"},289:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACbElEQVR4Xu2Xz24TMRCHvWnaQ0BC/Cmo8Aao4kFAao9t+gY5wztwQuLUK+IFoBx4C54FJBCgXXs8zMSjZPSTs15xCQesfpJT+5v9rS3vJoGZ98os7Lf9gwHevv90LfAI16D8rVsP0HWz1dXVeahxuTwPlHnlBXSXy7NQ4+LyLHQH89Wbdzd3vDPHIkOikDKHH+QGWP5MoMxgoBvC98ROtWauMhogygSdQ1RUxnEogC4xr28AZbX0/7EVIOWsKa2IyRtHC2QwKi6hWxBXaawAsRXJgS06jmNDN4qLHpsrjJ+CgXIpkgzysI6DAS6pB866Vha30A5gF4pK2jIIrQCJ2M9XrA5PC6BCylBEcZ+xoYvzh+jrNAL0dhdDKmAIHYdWcZ0TvVtoPAe0SBH8+bdeewWIwTXMjc0VsCKavIc76RUMgC7lUbdvBsglQO9kVxCWsO324ArtFYjkLyxAEGjgMoQu4Aq0twAubJ+nbQGGHvHnO06BSvBCYe20ToG5vLVgPE7eAjxKUnSYtAJsHoPf2AJ4muE5NhhWoOb6+Wy4LZjyJKRsEj7RJj4JI7j2Pqj68/pdFFEavhEb7wILD29Ddm6kSQGCBGATPTzxZVQxmccC4BZsJzLcBhSobl8yF/04JUA3KwcjUWUFGL6S1VxmdUHTVlz0Zxu5624LD6UXvv5M6yJkJDJy6cu8Y2EhHCjWP1b326+0+fKZDFKsxu8vn++Jc8vvjaLdJ8Kzw+cvb44uXvMuDl+8+iDaqfBAOFKsf6pjDfejOE+FR5vrugCa6r7wWMPUsLETm7cQ5sbC3JOGr+5ddSHA/vj/4/QPGiED+KnBG4UAAAAASUVORK5CYII="},560:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAYAAAAFQMh/AAAEDElEQVR42u2U/U9TdxSHmyxb4l7idHFxm5o53VwXCkIDGBBJU0TItMCGwiAN4628DFcEnIyGuo6X2pZCobSlUAUqDoSIiDhoGZVt4lBgosKAATLBuTiyhP/gs9ObbBkbYKnAsmQneXLvPZ/zPc+9v1zWf7okVUnr1l5aKRLknk6G/bqm4hxjQvvlYR1OnkkG3cevmTjbGD/X9UAH22QtpNXJoGfRmohPVMSidVqK3tmzsIwbSC4C9dJWVPKJIWY7kUE0E/3EKIEvZwpg+VmJ7l90sE7oIK0RgfrHn1iYpReGE10ycwrMNgWsQ2Zcn2rGjelm9M3Wo2OmEE330tHyUzauPixD56Rdngg6k+2UMFMXzSH0ysZ0fDVSg+Hf2nF79iJuPqpDz8Mq2B5o0DYlxfnxVNSOCGEejUHzZBZsM8Uk15I8HnResizpsfJIbqb+A3zRU4CBR/W4TiLrfTlaJo7j/FgK6kZiUftDNKqHI3B66DARbr8yvQvjYnRNq9A5UUryONAuqUNSsfbIM4Sp9loOvp7Ron1KhobRJFQPRaDqThgRugRhzFzT2EewTOWjbSwPkmohaN/j5UfLwpVFrYnomJTh0o9ZMN+NQtWgAJW3DjrIIWbeNBjCPOtvHIJYFw7a+/yi0jRN2MZ03XtouJuECyOpMN+OQOX3wTAOHHCKiv4DyDkrAO1d+otTSwRpssZQ1A1GofbWYRj7AmG4yXcKXS8fJ2reBe3UsB5XycUHrSpLAKoHQlDVFwR97z6nKO/xR6YpGLRPzXKkROrgXzXdvjD2BsDwnT8t8Fk2pd/4Ir0yELRL6ZA0oSjwqUR1ILTfeqL8mjcD3c+jxOaN3EY/HDPxkKbng85A0+31Z6656oWjBqYvZzlacaqA9YnFfJR1uy/IyaY9SFDzQXNKIojgEHMlXR5Mru7kIrWcZ8/zWcutDxU8aGycfyBvc0eskgfKuX+bn1N3ukLV4Yak0n32XMpypmJO+d9XXHFBSSd7HhkmL1AmWmD+jryVg8SSvfZcwnK2hHK/c7n1HBRb3pxHitYblPkvMJ8SV+QL+5X1JBVd6CNI1XlA3b79r5CYC8r2L3JmM2slKqpgT7+saQdUV7YxlFldkHXGA9TPZq1mReZ7xQsVXBRe3ALl5VcZtO0+iCr0BmW7V1Uekecpiy3ajc8bSX5pM0Negx+o30zsX1X5kTyuOLLAA2LjTnqBV6Bo2QTpOTaECk9QJiG2rbTzBWIj8ZJb0Ja3QrJdT4V/5n4vRulCL/EG/fi34uOKHYiWu8Lr/dfd7HNLsIF4lnjaEfFrxC6CTbz9Bx6CraHBGe8YBJ9yOoLEbM2uvS/zmGxx2MROYhPxnANeZuhFYsMKsJ5Yx3zx//Vv1O+hjkmdTDrAVAAAAABJRU5ErkJggg=="},93:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAQAAABaf7ccAAAAfklEQVR4Xm3LMQ4BcRhE8R8aG6VGJdFtsokItVK5p9DqKETPRSRbuIY7bKmQcAmJT0H+WeK9ajIzEj1rlaOVv0w8xMeLDHQNAPrCUyRvCgsh7IBrs26OHRiq0z/pbq80Qju3df79t7JovYO6U1MJS1NjhbmbkGviZKbJRgnwArtVQeM0F/R2AAAAAElFTkSuQmCC"},373:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC5ElEQVRYw+1Xv08UQRT+3iwcwuKRSAQvyKGWhhjjDyoLGwpJjAlUxtqKBGMhVMaLhbGQGPkDbA0xNpoQYqmVAU2M1Gq8E06ChlP3EG5nn8Xt7u3Mzu2exVXyksne7Px433zvvW/ngH37342CH8Vi8ZogzBJRjpmpLc6ImJk34PH9oXz+SQhgvVi8DkEP7V7bFiTaemLP8+A4jsPSmxnK5x8TAJSKX0rZbHaow7LAtV2dnHifEsZS+tQp4Lo1VCo/S8P5kWECgM+fPnoDAwMkt9ZReTQNUAYQXWDKACLj9+tPFhmAupT3yjx/rNna/qkRdGQtbG5ueseOn7AEAEgpGxBZApAAu1qTkZYwhvo7QnyMWAJgRH2Kelxk4F3ZmCBjgIhNG6cDajyDXKj7FEFiKAw0O6kOCBGwhnVGsD4Dgc8gBEYGWt5YB4SEkPkW+IwzECyGRqHmlAwMxcDCB6sASmGg6cY+IOoUOHp3AYemrsI6aLeenAGQRAYYhoVSo90FhEDP6fPI3ZhD3/g4qFM0sj8tZKYcUKtARkrINQMKRSWD7IWLyE3PoGf0ZJOs10JmqgJTEpIhD0grpcCsvj70T04hc+RwxJkWlnAtpyRhS2Kjmqxs4/uzReytl1L0QirfBDMDrdR2MLu2h1+vXqK8cA/V96sx2s1a0ioDBrEJxzyJ6rvXKD+YRWX5KXjXMYOFQcBSGWhW2z4grlXxdW4SPxYXICtbrZdg2FIZcJNLUBeiSNYridtUNZFchmQqpX8RG9bkGJpqhjqglKEqRBSr+6ikGmo75duhAgqUUGWAo0KUfEppPGXrIWMwM5i9xl1peelF+ey5sUG7uwve9kbjGkUUuU5Ro5HWN8zncK663urtgbNTxerqSvnSxOUcAcDS0vO57gPdt0dHT9m2bbf1Uuo4v7G29sHZ+VO9MzFxZZ4AoFAoiLGxM7cEcNOVcrCdADos6xszzb9ZeTtfKBS8/X9G+/YXSQG4bXLPijQAAAAASUVORK5CYII="}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var s=t[r]={id:r,loaded:!1,exports:{}};return e[r](s,s.exports,n),s.loaded=!0,s.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{"use strict";class e extends EventTarget{constructor(){super(),this.actions=Object.seal({"deselect-all":{enabled:!1,shortcut:"Control+A",text:"Deselect all"},"move-bottom":{enabled:!1,text:"Move to the back of the queue"},"move-down":{enabled:!1,text:"Move down in the queue"},"move-top":{enabled:!1,text:"Move to the front of the queue"},"move-up":{enabled:!1,text:"Move up in the queue"},"open-torrent":{enabled:!0,shortcut:"Alt+O",text:"Open torrent…"},"pause-all-torrents":{enabled:!1,text:"Pause all"},"pause-selected-torrents":{enabled:!1,shortcut:"Alt+U",text:"Pause"},"reannounce-selected-torrents":{enabled:!1,text:"Ask tracker for more peers"},"remove-selected-torrents":{enabled:!1,text:"Remove from list…"},"resume-selected-torrents":{enabled:!1,shortcut:"Alt+R",text:"Resume"},"resume-selected-torrents-now":{enabled:!1,text:"Resume now"},"select-all":{enabled:!1,shortcut:"Alt+A",text:"Select all"},"show-about-dialog":{enabled:!0,text:"About"},"show-inspector":{enabled:!0,shortcut:"Alt+I",text:"Torrent Inspector"},"show-labels-dialog":{enabled:!1,text:"Edit Labels…"},"show-move-dialog":{enabled:!1,shortcut:"Alt+L",text:"Set location…"},"show-overflow-menu":{enabled:!0,text:"More options…"},"show-preferences-dialog":{enabled:!0,shortcut:"Alt+P",text:"Edit preferences"},"show-rename-dialog":{enabled:!1,shortcut:"Alt+N",text:"Rename…"},"show-shortcuts-dialog":{enabled:!0,text:"Keyboard shortcuts"},"show-statistics-dialog":{enabled:!0,shortcut:"Alt+S",text:"Statistics"},"start-all-torrents":{enabled:!1,text:"Start all"},"toggle-compact-rows":{enabled:!0,text:"Compact rows"},"trash-selected-torrents":{enabled:!1,text:"Trash data and remove from list…"},"verify-selected-torrents":{enabled:!1,shortcut:"Alt+V",text:"Verify local data"}})}click(e){if(this.isEnabled(e)){const t=new Event("click");t.action=e,this.dispatchEvent(t)}}getActionForShortcut(e){for(const[t,n]of Object.entries(this.actions))if(e===n.shortcut)return t;return null}allShortcuts(){return new Map(Object.entries(this.actions).filter((([,e])=>e.shortcut)).map((([e,t])=>[t.shortcut,e])))}isEnabled(e){return this._getAction(e).enabled}text(e){return this._getAction(e).text}keyshortcuts(e){return this._getAction(e).shortcut}update(t){const n=e._recount(t.selected,t.nonselected);this._updateStates(n)}_getAction(e){const t=this.actions[e];if(!t)throw new Error(`no such action: ${e}`);return t}static _recount(e,t){const n=e.length+t.length,r=e.filter((e=>e.isStopped())).length,o=e.length-r,s=t.filter((e=>e.isStopped())).length,i=t.length-s,a=r+s,l=o+i,c=e.filter((e=>e.isQueued())).length;return{active:l,nonselected_active:i,nonselected_paused:s,paused:a,selected:e.length,selected_active:o,selected_paused:r,selected_queued:c,total:n}}_updateStates(e){const t=(e,t)=>{for(const n of t)this._updateActionState(n,e)};t(e.selected_paused>0,["resume-selected-torrents"]),t(e.paused>0,["start-all-torrents"]),t(e.active>0,["pause-all-torrents"]),t(e.selected_paused>0||e.selected_queued>0,["resume-selected-torrents-now"]),t(e.selected_active>0,["pause-selected-torrents","reannounce-selected-torrents"]),t(e.selected>0,["deselect-all","move-bottom","move-down","move-top","move-up","remove-selected-torrents","show-inspector","show-labels-dialog","show-move-dialog","trash-selected-torrents","verify-selected-torrents"]),t(1===e.selected,["show-rename-dialog"]),t(e.selected{for(const e of o.children)e.classList.toggle("selected",e===t);for(const e of s.children)e.classList.toggle("hidden",e!==r);n&&n(r)}))}return i[0].classList.add("selected"),s.children[0].classList.remove("hidden"),{buttons:i,root:r}}function i(e){const t=document.createElement("dialog");t.classList.add("dialog-container","popup",e),t.open=!0,t.setAttribute("role","dialog");const n=document.createElement("div");n.classList.add("dialog-window"),t.append(n);const r=document.createElement("div");r.classList.add("dialog-logo"),n.append(r);const o=document.createElement("div");o.classList.add("dialog-heading"),n.append(o);const s=document.createElement("div");s.classList.add("dialog-message"),n.append(s);const i=document.createElement("div");i.classList.add("dialog-workarea"),n.append(i);const a=document.createElement("div");a.classList.add("dialog-buttons"),n.append(a);const l=document.createElement("span");l.classList.add("dialog-buttons-begin"),a.append(l);const c=document.createElement("button");c.classList.add("dialog-dismiss-button"),c.textContent="Cancel",a.append(c);const d=document.createElement("button");d.textContent="OK",a.append(d);const A=document.createElement("span");return A.classList.add("dialog-buttons-end"),a.append(A),{confirm:d,dismiss:c,heading:o,message:s,root:t,workarea:i}}function a(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function l(e,t){const n=[],{root:r,content:o}=function(e){const t=document.createElement("fieldset");t.classList.add("section");const n=document.createElement("legend");n.classList.add("title"),n.textContent=e,t.append(n);const r=document.createElement("div");return r.classList.add("content"),t.append(r),{content:r,root:t}}(e);for(const e of t){const t=document.createElement("label");t.textContent=e,o.append(t);const r=document.createElement("div");r.id=a(),o.append(r),t.setAttribute("for",r.id),n.push(r)}return{children:n,root:r}}function c(e,t=100){let n=null;return(...r)=>{n||(n=setTimeout((()=>{n=null,e(r)}),t))}}function d(e,t){return r()(e,t)}function A(e,t,n){n?e.setAttribute(t,!0):e.removeAttribute(t)}function p(e,t){A(e,"disabled",!t)}function g(e,t){A(e,"checked",t)}function u(e,t,n,r){const o=function(e,t){let{x:n,y:r}=e;const{width:o,height:s}=e;return n>t.x+t.width-o&&n-o>=t.x?n-=o:n=Math.min(n,t.x+t.width-o),r>t.y+t.height-s&&r-s>=t.y?r-=s:r=Math.min(r,t.y+t.height-s),new DOMRect(n,r,o,s)}(new DOMRect(t,n,e.clientWidth,e.clientHeight),r.getBoundingClientRect());e.style.left=`${o.left}px`,e.style.top=`${o.top}px`}class m extends EventTarget{constructor(e){super(),this.listener=t=>{e.contains(t.target)||(this.dispatchEvent(new MouseEvent(t.type,t)),t.preventDefault())},Object.seal(this),this.start()}start(){setTimeout((()=>document.addEventListener("click",this.listener)),0)}stop(){document.removeEventListener("click",this.listener)}}function h(e,t){e.textContent!==t&&(e.textContent=t)}class f{constructor(e){this._prefs=e,this._elements={toggle:document.querySelector("#toggle-notifications")}}_setEnabled(e){this.prefs.notifications_enabled=e,h(this._toggle,(e?"Disable":"Enable")+" Notifications")}_requestPermission(){Notification.requestPermission().then((e=>this._setEnabled("granted"===e)))}toggle(){this._enabled?this._setEnabled(!1):"granted"===Notification.permission?this._setEnabled(!0):"denied"!==Notification.permission&&this._requestPermission()}}class b extends EventTarget{constructor(){super(),this._cache={},this.dispatchPrefsChange=c(((e,t,n)=>{const r=new Event("change");Object.assign(r,{key:e,old_value:t,value:n}),this.dispatchEvent(r)}));for(const[e,t]of Object.entries(b._Defaults))this._set(e,b._getCookie(e,t)),Object.defineProperty(this,e.replaceAll("-","_"),{get:()=>this._get(e),set:t=>{this._set(e,t)}});Object.seal(this)}entries(){return Object.entries(this._cache)}keys(){return Object.keys(this._cache)}_get(e){const{_cache:t}=this;if(!Object.prototype.hasOwnProperty.call(t,e))throw new Error(e);return t[e]}_set(e,t){const{_cache:n}=this,r=n[e];r!==t&&(n[e]=t,b._setCookie(e,t),this.dispatchPrefsChange(e,r,t))}static _setCookie(e,t){const n=new Date;n.setFullYear(n.getFullYear()+1),document.cookie=`${e}=${t}; SameSite=Strict; expires=${n.toGMTString()}`}static _getCookie(e,t){const n=b._readCookie(e);return null===n?t:"true"===n||"false"!==n&&(/^\d+$/.test(n)?Number.parseInt(n,10):n)}static _readCookie(e){const t=`; ${document.cookie}`.split(`; ${e}=`);return 2===t.length?t.pop().split(";").shift():null}}b.AltSpeedEnabled="alt-speed-enabled",b.DisplayCompact="compact",b.DisplayFull="full",b.DisplayMode="display-mode",b.FilterActive="active",b.FilterAll="all",b.FilterDownloading="downloading",b.FilterFinished="finished",b.FilterMode="filter-mode",b.FilterPaused="paused",b.FilterSeeding="seeding",b.NotificationsEnabled="notifications-enabled",b.RefreshRate="refresh-rate-sec",b.SortAscending="ascending",b.SortByActivity="activity",b.SortByAge="age",b.SortByName="name",b.SortByProgress="progress",b.SortByQueue="queue",b.SortByRatio="ratio",b.SortBySize="size",b.SortByState="state",b.SortDescending="descending",b.SortDirection="sort-direction",b.SortMode="sort-mode",b._Defaults={[b.AltSpeedEnabled]:!1,[b.DisplayMode]:b.DisplayFull,[b.FilterMode]:b.FilterAll,[b.NotificationsEnabled]:!1,[b.RefreshRate]:5,[b.SortDirection]:b.SortAscending,[b.SortMode]:b.SortByName};class C extends EventTarget{constructor(e){super(),this.elements=C._create(e),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onDismiss(){this.close()}static _create(e){const t=i("about-dialog");t.root.setAttribute("aria-label","About transmission"),t.heading.textContent="Transmission",t.dismiss.textContent="Close";let n=document.createElement("div");return n.classList.add("about-dialog-version-number"),n.textContent=e.version,t.heading.append(n),n=document.createElement("div"),n.classList.add("about-dialog-version-checksum"),n.textContent=e.checksum,t.heading.append(n),n=document.createElement("div"),n.textContent="A fast and easy bitTorrent client",t.workarea.append(n),n=document.createElement("div"),n.textContent="Copyright © The Transmission Project",t.workarea.append(n),t.confirm.remove(),delete t.confirm,t}}class v extends EventTarget{constructor(e){super(),this.action_listener=this._update.bind(this),this.action_manager=e,this.action_manager.addEventListener("change",this.action_listener),Object.assign(this,this._create()),this.show()}show(){for(const[e,t]of Object.entries(this.actions))p(t,this.action_manager.isEnabled(e));document.body.append(this.root)}close(){if(!this.closed){this.action_manager.removeEventListener("change",this.action_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))delete this[e];this.closed=!0}}_update(e){const t=this.actions[e.action];t&&p(t,e.enabled)}_create(){const e=document.createElement("div");e.role="menu",e.classList.add("context-menu","popup");const t={},n=n=>{const r=document.createElement("div"),o=this.action_manager.text(n);r.role="menuitem",r.classList.add("context-menuitem"),r.dataset.action=n,r.textContent=o;const s=this.action_manager.keyshortcuts(n);s&&r.setAttribute("aria-keyshortcuts",s),r.addEventListener("click",(()=>{this.action_manager.click(n),this.close()})),t[n]=r,e.append(r)},r=()=>{const t=document.createElement("div");t.classList.add("context-menu-separator"),e.append(t)};return n("resume-selected-torrents"),n("resume-selected-torrents-now"),n("pause-selected-torrents"),r(),n("move-top"),n("move-up"),n("move-down"),n("move-bottom"),r(),n("remove-selected-torrents"),n("trash-selected-torrents"),r(),n("verify-selected-torrents"),n("show-move-dialog"),n("show-rename-dialog"),n("show-labels-dialog"),r(),n("reannounce-selected-torrents"),r(),n("select-all"),n("deselect-all"),{actions:t,root:e}}}const y=new Intl.PluralRules,E=y.resolvedOptions().locale,w=new Intl.NumberFormat(E),x=1e3,k=[new Intl.NumberFormat(E,{style:"unit",unit:"byte"}),new Intl.NumberFormat(E,{style:"unit",unit:"kilobyte"}),new Intl.NumberFormat(E,{style:"unit",unit:"megabyte"}),new Intl.NumberFormat(E,{style:"unit",unit:"gigabyte"}),new Intl.NumberFormat(E,{style:"unit",unit:"terabyte"}),new Intl.NumberFormat(E,{style:"unit",unit:"petabyte"})],M=new Intl.NumberFormat(E,{style:"unit",unit:"kilobyte-per-second"}),S=new Intl.NumberFormat(E,{style:"unit",unit:"megabyte-per-second"}),I={_toTruncFixed:(e,t)=>(Math.floor(e*10**t)/10**t).toFixed(t),countString(e,t,n){return`${this.number(n)} ${this.ngettext(e,t,n)}`},mem(e){if(e<0)return"Unknown";if(0===e)return"None";let t=e;for(const e of k){if(t"one"===y.select(n)?e:t,number:e=>w.format(e),percentString(e){const t=e<100?1:0;return this._toTruncFixed(e,t)},ratioString(e){return-1===e?"None":-2===e?"∞":this.percentString(e)},size(e){return this.mem(e)},speed:e=>e<999.95?M.format(e):S.format(e/1e3),speedBps(e){return this.speed(this.toKBps(e))},timeInterval(e){const t=Math.floor(e/86400);if(t)return this.countString("day","days",t);const n=Math.floor(e%86400/3600);if(n)return this.countString("hour","hours",n);const r=Math.floor(e%3600/60);return r?this.countString("minute","minutes",r):(e=Math.floor(e%60),this.countString("second","seconds",e))},timestamp(e){if(!e)return"N/A";const t=new Date(1e3*e),n=new Date;let r="",o="";const s=n.getFullYear()===t.getFullYear(),i=n.getMonth()===t.getMonth(),a=n.getDate()-t.getDate();r=s&&i&&Math.abs(a)<=1?0===a?"Today":1===a?"Yesterday":"Tomorrow":t.toDateString();let l=t.getHours(),c="AM";l>12&&(l-=12,c="PM"),0===l&&(l=12),l<10&&(l=`0${l}`);let d=t.getMinutes();return d<10&&(d=`0${d}`),(e=t.getSeconds())<10&&(e=`0${e}`),o=[l,d,e].join(":"),[r,o,c].join(" ")},toKBps:e=>Math.floor(e/x)};class B extends EventTarget{isDone(){return this.fields.have>=this.fields.size}isEditable(){return this.fields.torrent.getFileCount()>1&&!this.isDone()}refreshWantedHTML(){const e=this.elements.root;e.classList.toggle("skip",!this.fields.isWanted),e.classList.toggle("complete",this.isDone()),p(e.checkbox,this.isEditable()),e.checkbox.checked=this.fields.isWanted}refreshProgressHTML(){const{size:e,have:t}=this.fields,n=100*(e?t/e:1),r=I,o=`${r.size(t)} of ${r.size(e)} (${r.percentString(n)}%)`;h(this.elements.progress,o)}refresh(){let e=0,t=!1,n=!1,r=!1,o=0,s=!1;const i=this.fields.torrent.getFiles();for(const a of this.fields.indices){const l=i[a];switch(e+=l.bytesCompleted,o+=l.length,s|=l.wanted,l.priority){case-1:n=!0;break;case 1:t=!0;break;default:r=!0}}g(this.elements.priority_low_button,n),g(this.elements.priority_normal_button,r),g(this.elements.priority_high_button,t),this.fields.have===e&&this.fields.size===o||(this.fields.have=e,this.fields.size=o,this.refreshProgressHTML()),this.fields.isWanted!==s&&(this.fields.isWanted=s,this.refreshWantedHTML())}fireWantedChanged(e){const t=new Event("wantedToggled");t.indices=[...this.fields.indices],t.wanted=e,this.dispatchEvent(t)}firePriorityChanged(e){const t=new Event("priorityToggled");t.indices=[...this.fields.indices],t.priority=e,this.dispatchEvent(t)}createRow(e,t,n,r){const o=document.createElement("li");o.classList.add("inspector-torrent-file-list-entry",r?"even":"odd"),this.elements.root=o;let s=document.createElement("input");const i=a();s.type="checkbox",s.className="file-wanted-control",s.title="Download file",s.id=i,s.addEventListener("change",(e=>this.fireWantedChanged(e.target.checked))),o.checkbox=s,o.append(s),s=document.createElement("label"),s.className="inspector-torrent-file-list-entry-name",s.setAttribute("for",i),h(s,n),o.append(s),s=document.createElement("div"),s.className="inspector-torrent-file-list-entry-progress",o.append(s),this.elements.progress=s,s=document.createElement("div"),s.className="file-priority-radiobox";const l=s,c=e=>this.firePriorityChanged(e.target.value);s=document.createElement("input"),s.type="radio",s.value=-1,s.className="low",s.title="Low Priority",s.addEventListener("click",c),this.elements.priority_low_button=s,l.append(s),s=document.createElement("input"),s.type="radio",s.value=0,s.className="normal",s.title="Normal Priority",s.addEventListener("click",c),this.elements.priority_normal_button=s,l.append(s),s=document.createElement("input"),s.type="radio",s.value=1,s.title="High Priority",s.className="high",s.addEventListener("click",c),this.elements.priority_high_button=s,l.append(s),o.append(l),o.style.paddingLeft=20*t+"px",this.refresh()}getElement(){return this.elements.root}constructor(e,t,n,r,o){super(),this.fields={have:0,indices:r,isWanted:!0,size:0,torrent:e},this.elements={priority_high_button:null,priority_low_button:null,priority_normal_button:null,progress:null,root:null},this.createRow(e,t,n,o)}}const D={};function T(e){if(D[e])return D[e];const t=new URL(e),n=function(e){const t=e.indexOf(".");return t!==e.lastIndexOf(".")&&(e=e.slice(t+1)),e}(t.host),r={domain:n,name:function(e){e.length>0&&(e=e.charAt(0).toUpperCase()+e.slice(1));const t=e.indexOf(".");return-1!==t&&(e=e.slice(0,t)),e}(n),url:t};return D[e]=r,r}class L extends EventTarget{constructor(e){super(),this.fieldObservers={},this.fields={},this.refresh(e)}notifyOnFieldChange(e,t){this.fieldObservers[e]=this.fieldObservers[e]||[],this.fieldObservers[e].push(t)}setField(e,t,n){const r=e[t];if(d(r,n))return!1;const o=this.fieldObservers[t];if(e===this.fields&&o&&o.length>0)for(const e of o)e.call(this,n,r,t);return e[t]=n,!0}updateFiles(e){let t=!1;const n=this.fields.files||[],r=["length","name","bytesCompleted","wanted","priority"];for(const[o,s]of e.entries()){const e=n[o]||{};for(const n of r)n in s&&(t|=this.setField(e,n,s[n]));n[o]=e}return this.fields.files=n,t}static collateTrackers(e){return e.map((e=>e.announce.toLowerCase())).join("\t")}refreshFields(e){let t=!1;for(const[n,r]of Object.entries(e))switch(n){case"files":case"fileStats":t|=this.updateFiles(r);break;case"trackerStats":t|=this.setField(this.fields,"trackers",r);break;case"trackers":n in this.fields||(t|=this.setField(this.fields,n,r));break;case"name":this.setField(this.fields,n,e[n])&&(this.fields.collatedName="",t=!0);break;default:t|=this.setField(this.fields,n,r)}return t}refresh(e){this.refreshFields(e)&&this.dispatchEvent(new Event("dataChanged"))}getComment(){return this.fields.comment}getCreator(){return this.fields.creator}getDateAdded(){return this.fields.addedDate}getDateCreated(){return this.fields.dateCreated}getDesiredAvailable(){return this.fields.desiredAvailable}getDownloadDir(){return this.fields.downloadDir}getDownloadSpeed(){return this.fields.rateDownload}getDownloadedEver(){return this.fields.downloadedEver}getError(){return this.fields.error}getErrorString(){return this.fields.errorString}getETA(){return this.fields.eta}getFailedEver(){return this.fields.corruptEver}getFiles(){return this.fields.files||[]}getFile(e){return this.fields.files[e]}getFileCount(){return this.fields["file-count"]}getHashString(){return this.fields.hashString}getHave(){return this.getHaveValid()+this.getHaveUnchecked()}getHaveUnchecked(){return this.fields.haveUnchecked}getHaveValid(){return this.fields.haveValid}getId(){return this.fields.id}getLabels(){return this.fields.labels.sort()}getLastActivity(){return this.fields.activityDate}getLeftUntilDone(){return this.fields.leftUntilDone}getMagnetLink(){return this.fields.magnetLink}getMetadataPercentComplete(){return this.fields.metadataPercentComplete}getName(){return this.fields.name||"Unknown"}getPeers(){return this.fields.peers||[]}getPeersConnected(){return this.fields.peersConnected}getPeersGettingFromUs(){return this.fields.peersGettingFromUs}getPeersSendingToUs(){return this.fields.peersSendingToUs}getPieceCount(){return this.fields.pieceCount}getPieceSize(){return this.fields.pieceSize}getPrimaryMimeType(){return this.fields["primary-mime-type"]}getPrivateFlag(){return this.fields.isPrivate}getQueuePosition(){return this.fields.queuePosition}getRecheckProgress(){return this.fields.recheckProgress}getSeedRatioLimit(){return this.fields.seedRatioLimit}getSeedRatioMode(){return this.fields.seedRatioMode}getSizeWhenDone(){return this.fields.sizeWhenDone}getStartDate(){return this.fields.startDate}getStatus(){return this.fields.status}getTotalSize(){return this.fields.totalSize}getTrackers(){const e=this.fields.trackers||[];for(const t of e)t.announce&&!t.domain&&Object.assign(t,T(t.announce));return this.fields.trackers}getUploadSpeed(){return this.fields.rateUpload}getUploadRatio(){return this.fields.uploadRatio}getUploadedEver(){return this.fields.uploadedEver}getWebseedsSendingToUs(){return this.fields.webseedsSendingToUs}isFinished(){return this.fields.isFinished}hasExtraInfo(){return"hashString"in this.fields}isSeeding(){return this.getStatus()===L._StatusSeed}isStopped(){return this.getStatus()===L._StatusStopped}isChecking(){return this.getStatus()===L._StatusCheck}isDownloading(){return this.getStatus()===L._StatusDownload}isQueued(){return this.getStatus()===L._StatusDownloadWait||this.getStatus()===L._StatusSeedWait}isDone(){return this.getLeftUntilDone()<1}needsMetaData(){return this.getMetadataPercentComplete()<1}getActivity(){return this.getDownloadSpeed()+this.getUploadSpeed()}getPercentDoneStr(){return I.percentString(100*this.getPercentDone())}getPercentDone(){return this.fields.percentDone}getStateString(){switch(this.getStatus()){case L._StatusStopped:return this.isFinished()?"Seeding complete":"Paused";case L._StatusCheckWait:return"Queued for verification";case L._StatusCheck:return"Verifying local data";case L._StatusDownloadWait:return"Queued for download";case L._StatusDownload:return"Downloading";case L._StatusSeedWait:return"Queued for seeding";case L._StatusSeed:return"Seeding";case null:return"Unknown";default:return"Error"}}seedRatioLimit(e){switch(this.getSeedRatioMode()){case L._RatioUseGlobal:return e.seedRatioLimit();case L._RatioUseLocal:return this.getSeedRatioLimit();default:return-1}}getErrorMessage(){const e=this.getErrorString();switch(this.getError()){case L._ErrTrackerWarning:return`Tracker returned a warning: ${e}`;case L._ErrTrackerError:return`Tracker returned an error: ${e}`;case L._ErrLocalError:return`Error: ${e}`;default:return null}}getCollatedName(){const e=this.fields;return!e.collatedName&&e.name&&(e.collatedName=e.name.toLowerCase()),e.collatedName||""}getCollatedTrackers(){const e=this.fields;return!e.collatedTrackers&&e.trackers&&(e.collatedTrackers=L.collateTrackers(e.trackers)),e.collatedTrackers||""}testState(e){const t=this.getStatus();switch(e){case b.FilterActive:return this.getPeersGettingFromUs()>0||this.getPeersSendingToUs()>0||this.getWebseedsSendingToUs()>0||this.isChecking();case b.FilterSeeding:return t===L._StatusSeed||t===L._StatusSeedWait;case b.FilterDownloading:return t===L._StatusDownload||t===L._StatusDownloadWait;case b.FilterPaused:return this.isStopped();case b.FilterFinished:return this.isFinished();default:return!0}}test(e,t,n,r){let o=this.testState(e);if(o&&n&&(o=this.getCollatedName().includes(n.toLowerCase())),o)for(const e of r){let t=!1;for(let n=0;n0&&(o=this.getCollatedTrackers().includes(t)),o}static compareById(e,t){return e.getId()-t.getId()}static compareByName(e,t){return e.getCollatedName().localeCompare(t.getCollatedName())||L.compareById(e,t)}static compareByQueue(e,t){return e.getQueuePosition()-t.getQueuePosition()}static compareByAge(e,t){const n=e.getDateAdded();return t.getDateAdded()-n||L.compareByQueue(e,t)}static compareByState(e,t){const n=e.getStatus();return t.getStatus()-n||L.compareByQueue(e,t)}static compareByActivity(e,t){const n=e.getActivity();return t.getActivity()-n||L.compareByState(e,t)}static compareByRatio(e,t){const n=e.getUploadRatio(),r=t.getUploadRatio();return nr?-1:L.compareByState(e,t)}static compareByProgress(e,t){return e.getPercentDone()-t.getPercentDone()||L.compareByRatio(e,t)}static compareBySize(e,t){return e.getTotalSize()-t.getTotalSize()||L.compareByName(e,t)}static compareTorrents(e,t,n,r){let o=0;switch(n){case b.SortByActivity:o=L.compareByActivity(e,t);break;case b.SortByAge:o=L.compareByAge(e,t);break;case b.SortByQueue:o=L.compareByQueue(e,t);break;case b.SortByProgress:o=L.compareByProgress(e,t);break;case b.SortBySize:o=L.compareBySize(e,t);break;case b.SortByState:o=L.compareByState(e,t);break;case b.SortByRatio:o=L.compareByRatio(e,t);break;case b.SortByName:o=L.compareByName(e,t);break;default:console.log(`Unrecognized sort mode: ${n}`),o=L.compareByName(e,t)}return r===b.SortDescending&&(o=-o),o}static sortTorrents(e,t,n){switch(t){case b.SortByActivity:e.sort(this.compareByActivity);break;case b.SortByAge:e.sort(this.compareByAge);break;case b.SortByName:e.sort(this.compareByName);break;case b.SortByProgress:e.sort(this.compareByProgress);break;case b.SortByQueue:e.sort(this.compareByQueue);break;case b.SortByRatio:e.sort(this.compareByRatio);break;case b.SortBySize:e.sort(this.compareBySize);break;case b.SortByState:e.sort(this.compareByState);break;default:console.log(`Unrecognized sort mode: ${t}`),e.sort(this.compareByName)}return n===b.SortDescending&&e.reverse(),e}}L._StatusStopped=0,L._StatusCheckWait=1,L._StatusCheck=2,L._StatusDownloadWait=3,L._StatusDownload=4,L._StatusSeedWait=5,L._StatusSeed=6,L._RatioUseGlobal=0,L._RatioUseLocal=1,L._RatioUnlimited=2,L._ErrNone=0,L._ErrTrackerWarning=1,L._ErrTrackerError=2,L._ErrLocalError=3,L._TrackerInactive=0,L._TrackerWaiting=1,L._TrackerQueued=2,L._TrackerActive=3,L.Fields={},L.Fields.Metadata=["addedDate","file-count","name","primary-mime-type","totalSize"],L.Fields.Stats=["error","errorString","eta","isFinished","isStalled","labels","leftUntilDone","metadataPercentComplete","peersConnected","peersGettingFromUs","peersSendingToUs","percentDone","queuePosition","rateDownload","rateUpload","recheckProgress","seedRatioMode","seedRatioLimit","sizeWhenDone","status","trackers","downloadDir","uploadedEver","uploadRatio","webseedsSendingToUs"],L.Fields.InfoExtra=["comment","creator","dateCreated","files","hashString","isPrivate","magnetLink","pieceCount","pieceSize"],L.Fields.StatsExtra=["activityDate","corruptEver","desiredAvailable","downloadedEver","fileStats","haveUnchecked","haveValid","peers","startDate","trackerStats"];const N=["encryption","speed-up","speed-down","percent-done","status","peer-address","peer-app-name"];class j extends EventTarget{constructor(e){super(),this.closed=!1,this.controller=e,this.elements=this._create(),this.current_page=this.elements.info.root,this.interval=setInterval(this._refreshTorrents.bind(this),3e3),this.name="inspector",this.selection_listener=e=>this._setTorrents(e.selected),this.torrent_listener=()=>this._updateCurrentPage(),this.torrents=[],this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null,this.outside=new m(this.elements.root),this.outside.addEventListener("click",(()=>this.close())),Object.seal(this),e.addEventListener("torrent-selection-changed",this.selection_listener),this._setTorrents(this.controller.getSelectedTorrents()),document.body.append(this.elements.root)}close(){if(!this.closed){this.outside.stop(),clearInterval(this.interval),this._setTorrents([]),this.elements.root.remove(),this.controller.removeEventListener("torrent-selection-changed",this.selection_listener),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))this[e]=null;this.closed=!0}}static _createInfoPage(){const e=document.createElement("div");e.classList.add("inspector-info-page");const t={root:e},n=t=>{const n=document.createElement("div");n.textContent=t,n.classList.add("section-label"),e.append(n)},r=t=>{const n=document.createElement("label");h(n,t),e.append(n);const r=document.createElement("label");return e.append(r),r};n("Activity");let o=[["have","Have:"],["availability","Availability:"],["uploaded","Uploaded:"],["downloaded","Downloaded:"],["state","State:"],["running_time","Running time:"],["remaining_time","Remaining:"],["last_activity","Last activity:"],["error","Error:"]];for(const[e,n]of o)t[e]=r(n);n("Details"),o=[["size","Size:"],["location","Location:"],["hash","Hash:"],["privacy","Privacy:"],["origin","Origin:"],["magnetLink","Magnet:"],["comment","Comment:"],["labels","Labels:"]];for(const[e,n]of o)t[e]=r(n);return t}static _createListPage(e,t){const n=document.createElement("div"),r=document.createElement(e);return r.id=t,n.append(r),{list:r,root:n}}static _createTiersPage(){return j._createListPage("div","inspector-tiers-list")}static _createFilesPage(){return j._createListPage("ul","inspector-file-list")}static _createPeersPage(){const e=document.createElement("table");e.classList.add("peer-list");const t=document.createElement("thead"),n=document.createElement("tr"),r=["","Up","Down","Done","Status","Address","Client"];for(const[e,t]of r.entries()){const r=document.createElement("th"),o=N[e];"encryption"===o&&(r.dataset.encrypted=!0),r.classList.add(o),h(r,t),n.append(r)}const o=document.createElement("tbody");return t.append(n),e.append(t),e.append(o),{root:e,tbody:o}}_create(){const e={files:j._createFilesPage(),info:j._createInfoPage(),peers:j._createPeersPage(),tiers:j._createTiersPage()};return{...s("inspector",[["inspector-tab-info",e.info.root],["inspector-tab-peers",e.peers.root],["inspector-tab-tiers",e.tiers.root],["inspector-tab-files",e.files.root]],(e=>{this.current_page=e,this._updateCurrentPage()}).bind(this)),...e}}_setTorrents(e){const t="dataChanged",n=this.torrent_listener;for(const e of this.torrents)e.removeEventListener(t,n);this.torrents=[...e];for(const e of this.torrents)e.addEventListener(t,n);this._refreshTorrents(),this._updateCurrentPage()}static _needsExtraInfo(e){return e.some((e=>!e.hasExtraInfo()))}_refreshTorrents(){const{controller:e,torrents:t}=this,n=t.map((e=>e.getId()));if(n&&n.length>0){const r=["id",...L.Fields.StatsExtra];j._needsExtraInfo(t)&&r.push(...L.Fields.InfoExtra),e.updateTorrents(n,r)}}_updateCurrentPage(){const{current_page:e,elements:t}=this;switch(e){case t.files.root:this._updateFiles();break;case t.info.root:this._updateInfo();break;case t.peers.root:this._updatePeers();break;case t.tiers.root:this._updateTiers();break;default:console.warn("unexpected page"),console.log(e)}}_updateInfo(){const e="None",t="Mixed",n="Unknown",r=I,s=Date.now(),{elements:i,torrents:a}=this,l=a.reduce(((e,t)=>e+t.getSizeWhenDone()),0);let c=null;if(0===a.length)c=e;else if(a.every((e=>e.isFinished())))c="Finished";else if(a.every((e=>e.isStopped())))c="Paused";else{const e=e=>e.getStateString(),n=e(a[0]);c=a.every((t=>e(t)===n))?n:t}h(i.info.state,c);const d=c;if(0===a.length)c=e;else{const e=a.reduce(((e,t)=>e+t.getHaveValid()),0),t=a.reduce(((e,t)=>e+t.getHaveUnchecked()),0),n=a.reduce(((e,t)=>e+t.getLeftUntilDone()),0),o=100*(l?(l-n)/l:1);c=r.percentString(o),c=t||n?t?`${r.size(e)} of ${r.size(l)} (${c}%), ${r.size(t)} Unverified`:`${r.size(e)} of ${r.size(l)} (${c}%)`:`${r.size(e)} (100%)`}if(h(i.info.have,c),0===a.length)c=e;else if(0===l)c=e;else{const e=a.reduce(((e,t)=>t.getHave()+t.getDesiredAvailable()),0);c=`${r.percentString(100*e/l)}%`}if(h(i.info.availability,c),0===a.length)c=e;else{const e=a.reduce(((e,t)=>e+t.getDownloadedEver()),0),t=a.reduce(((e,t)=>e+t.getFailedEver()),0);c=t?`${r.size(e)} (+${r.size(t)} discarded after failed checksum)`:r.size(e)}if(h(i.info.downloaded,c),0===a.length)c=e;else{const e=a.reduce(((e,t)=>e+t.getUploadedEver()),0),t=a.reduce(((e,t)=>e+t.getDownloadedEver()),0)||a.reduce(((e,t)=>e+t.getHaveValid()),0);c=`${r.size(e)} (Ratio: ${r.ratioString(o.ratio(e,t))})`}if(h(i.info.uploaded,c),0===a.length)c=e;else if(a.every((e=>e.isStopped())))c=d;else{const e=e=>e.getStartDate(),n=e(a[0]);c=a.every((t=>e(t)===n))?r.timeInterval(s/1e3-n):t}if(h(i.info.running_time,c),0===a.length)c=e;else{const e=e=>e.getETA(),o=e(a[0]);c=a.every((t=>e(t)===o))?o<0?n:r.timeInterval(o):t}if(h(i.info.remaining_time,c),0===a.length)c=e;else{const t=a.reduce(((e,t)=>Math.max(e,t.getLastActivity())),-1),n=Math.floor(s/1e3);if(0e.getErrorString(),n=e(a[0]);c=a.every((t=>e(t)===n))?n:t}if(h(i.info.error,c||e),0===a.length)c=e;else{const e=a.reduce(((e,t)=>e+t.getTotalSize()),0);if(e){const t=e=>e.getPieceSize(),n=a.reduce(((e,t)=>e+t.getPieceCount()),0),o=r.number(n),s=t(a[0]);c=a.every((e=>t(e)===s))?`${r.size(e)} (${o} pieces @ ${r.mem(s)})`:`${r.size(e)} (${o} pieces)`}else c="None"}if(h(i.info.size,c),0===a.length)c=e;else{const e=e=>e.getHashString(),n=e(a[0]);c=a.every((t=>e(t)===n))?n:t}if(h(i.info.hash,c),0===a.length)c=e;else{const e=e=>e.getPrivateFlag(),n=e(a[0]);c=a.every((t=>e(t)===n))?n?"Private to this tracker -- DHT and PEX disabled":"Public torrent":t}if(h(i.info.privacy,c),0===a.length)c=e;else{const e=e=>e.getComment(),n=e(a[0]);c=a.every((t=>e(t)===n))?n:t}if(c=c||e,c.startsWith("https://")||c.startsWith("http://")?(c=encodeURI(c),o.setInnerHTML(i.info.comment,`${c}`)):h(i.info.comment,c),c=0===a.length?e:a[0].getLabels().join(", "),h(i.info.labels,c),0===a.length)c=e;else{let e=e=>e.getCreator();const r=e(a[0]),o=!a.every((t=>e(t)===r));e=e=>e.getDateCreated();const s=e(a[0]),i=!a.every((t=>e(t)===s)),l=!r||0===r.length,d=!s;c=o||i?t:l&&d?n:d&&!l?`Created by ${r}`:l&&!d?`Created on ${new Date(1e3*s).toDateString()}`:`Created by ${r} on ${new Date(1e3*s).toDateString()}`}if(h(i.info.origin,c),0===a.length)c=e;else{const e=e=>e.getDownloadDir(),n=e(a[0]);c=a.every((t=>e(t)===n))?n:t}if(h(i.info.location,c),0===a.length)h(i.info.magnetLink,e);else if(a.length>1)h(i.info.magnetLink,t);else{const e=a[0].getMagnetLink();o.setInnerHTML(i.info.magnetLink,``)}}static _peerStatusTitle(e){const t=Object.seal({"?":"We unchoked this peer, but they're not interested",D:"Downloading from this peer",E:"Encrypted Connection",H:"Peer was discovered through Distributed Hash Table (DHT)",I:"Peer is an incoming connection",K:"Peer has unchoked us, but we're not interested",O:"Optimistic unchoke",T:"Peer is connected via uTP",U:"Uploading to peer",X:"Peer was discovered through Peer Exchange (PEX)",d:"We would download from this peer if they'd let us",u:"We would upload to this peer if they'd ask"});return[...e].filter((e=>t[e])).map((e=>`${e}: ${t[e]}`)).join("\n")}_updatePeers(){const e=I,{elements:t,torrents:n}=this,{tbody:r}=t.peers,o=[(e,t)=>{t.dataset.encrypted=e.isEncrypted},(t,n)=>h(n,t.rateToPeer?e.speedBps(t.rateToPeer):""),(t,n)=>h(n,t.rateToClient?e.speedBps(t.rateToClient):""),(e,t)=>h(t,`${Math.floor(100*e.progress)}%`),(e,t)=>{h(t,e.flagStr),t.setAttribute("title",j._peerStatusTitle(e.flagStr))},(e,t)=>h(t,e.address),(e,t)=>h(t,e.clientName)],s=[];for(const e of n){const t=document.createElement("tr");t.classList.add("torrent-row");const n=document.createElement("td");n.setAttribute("colspan",o.length),h(n,e.getName()),t.append(n),s.push(t);for(const t of e.getPeers()){const e=document.createElement("tr");e.classList.add("peer-row");for(const[n,r]of o.entries()){const o=document.createElement("td");o.classList.add(N[n]),r(t,o),e.append(o)}s.push(e)}for(;r.firstChild;)r.firstChild.remove();r.append(...s)}}static getAnnounceState(e){switch(e.announceState){case L._TrackerActive:return"Announce in progress";case L._TrackerWaiting:{const t=Math.max(0,e.nextAnnounceTime-Date.now()/1e3);return`Next announce in ${I.timeInterval(t)}`}case L._TrackerQueued:return"Announce is queued";case L._TrackerInactive:return e.isBackup?"Tracker will be used as a backup":"Announce not scheduled";default:return`unknown announce state: ${e.announceState}`}}static lastAnnounceStatus(e){let t="Last Announce",n=["N/A"];if(e.hasAnnounced){const r=I.timestamp(e.lastAnnounceTime);e.lastAnnounceSucceeded?n=[r," (got ",I.countString("peer","peers",e.lastAnnouncePeerCount),")"]:(t="Announce error",n=[e.lastAnnounceResult?`${e.lastAnnounceResult} - `:"",r])}return{label:t,value:n.join("")}}static lastScrapeStatus(e){let t="Last Scrape",n="N/A";if(e.hasScraped){const r=I.timestamp(e.lastScrapeTime);e.lastScrapeSucceeded?n=r:(t="Scrape error",n=(e.lastScrapeResult?`${e.lastScrapeResult} - `:"")+r)}return{label:t,value:n}}_updateTiers(){const e="N/A",{list:t}=this.elements.tiers,{torrents:n}=this,r=[];for(const t of n){const o=document.createElement("div");if(o.classList.add("inspector-group"),r.push(o),n.length>1){const e=document.createElement("div");e.classList.add("tier-list-torrent"),h(e,t.getName()),r.push(e)}for(const[n,o]of t.getTrackers().entries()){const t=j.getAnnounceState(o),s=j.lastAnnounceStatus(o),i=j.lastScrapeStatus(o),a=document.createElement("div");a.classList.add("tier-list-row",n%2?"odd":"even");let l=document.createElement("div");l.classList.add("tier-list-tracker"),h(l,`${o.domain||o.host||o.announce} - tier ${o.tier+1}`),l.setAttribute("title",o.announce),a.append(l),l=document.createElement("div"),l.classList.add("tier-announce"),h(l,`${s.label}: ${s.value}`),a.append(l),l=document.createElement("div"),l.classList.add("tier-seeders"),h(l,`Seeders: ${o.seederCount>-1?o.seederCount:e}`),a.append(l),l=document.createElement("div"),l.classList.add("tier-state"),h(l,t),a.append(l),l=document.createElement("div"),l.classList.add("tier-leechers"),h(l,`Leechers: ${o.leecherCount>-1?o.leecherCount:e}`),a.append(l),l=document.createElement("div"),l.classList.add("tier-scrape"),h(l,`${i.label}: ${i.value}`),a.append(l),l=document.createElement("div"),l.classList.add("tier-downloads"),h(l,`Downloads: ${o.downloadCount>-1?o.downloadCount:e}`),a.append(l),r.push(a)}}for(;t.firstChild;)t.firstChild.remove();t.append(...r)}_changeFileCommand(e,t){const{controller:n,file_torrent:r}=this,o=r.getId();n.changeFileCommand(o,e,t)}_onFileWantedToggled(e){const{indices:t,wanted:n}=e;this._changeFileCommand(t,n?"files-wanted":"files-unwanted")}_onFilePriorityToggled(e){const{indices:t,priority:n}=e;let r=null;switch(n){case-1:r="priority-low";break;case 1:r="priority-high";break;default:r="priority-normal"}this._changeFileCommand(t,r)}_clearFileList(){const{list:e}=this.elements.files;for(;e.firstChild;)e.firstChild.remove();this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null}static createFileTreeModel(e){const t=[],n={children:{},file_indices:[]};for(const[r,o]of e.getFiles().entries()){const{name:e}=o,s=e.split("/");let i=n;for(const[e,t]of s.entries()){let n=i.children[t];n||(i.children[t]=n={children:{},depth:e,file_indices:[],name:t,parent:i}),i=n}i.file_index=r,delete i.children,t.push(i)}for(const e of t){const{file_index:t}=e;let n=e;do{n.file_indices.push(t),n=n.parent}while(n)}return n}addNodeToView(e,t,n,r){const o=new B(e,n.depth,n.name,n.file_indices,r%2);o.addEventListener("wantedToggled",this._onFileWantedToggled.bind(this)),o.addEventListener("priorityToggled",this._onFilePriorityToggled.bind(this)),this.file_rows.push(o),t.append(o.getElement())}addSubtreeToView(e,t,n,r){if(n.parent&&this.addNodeToView(e,t,n,r++),n.children)for(const o of Object.values(n.children))r=this.addSubtreeToView(e,t,o,r);return r}_updateFiles(){const{list:e}=this.elements.files,{file_rows:t,file_torrent:n,file_torrent_n:r,torrents:o}=this;if(1!==o.length)return void this._clearFileList();const[s]=o,i=s.getFiles().length;if(s!==n||i!==r){this._clearFileList(),this.file_torrent=s,this.file_torrent_n=i,this.file_rows=[];const t=document.createDocumentFragment(),n=j.createFileTreeModel(s);this.addSubtreeToView(s,t,n,0),e.append(t)}else for(const e of t)e.refresh()}}let _="";class z extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){const e=this.controller.getSelectedTorrents();0!==e.length&&(_=_||e[0].getDownloadDir(),this.torrents=e,this.elements=z._create(),this.elements.confirm.addEventListener("click",(()=>this._onConfirm())),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.elements.entry.value=_,document.body.append(this.elements.root),this.elements.entry.focus())}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){const e=this.torrents.map((e=>e.getId())),t=this.elements.entry.value.trim();_=t,this.remote.moveTorrents(e,t),this.close()}static _create(){const e=i("move-dialog");e.root.setAttribute("aria-label","Move Torrent"),e.heading.textContent="Set Torrent Location",confirm.textContent="Apply";const t=document.createElement("label");t.setAttribute("for","torrent-path"),t.textContent="Location:",e.workarea.append(t);const n=document.createElement("input");return n.setAttribute("type","text"),n.id="torrent-path",e.entry=n,e.workarea.append(n),e}}class F extends EventTarget{constructor(e){super(),this.elements=F._create(e),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.options=e,document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}static _create(e){const{heading:t,message:n}=e,r=i("confirm-dialog");return r.confirm.remove(),delete r.confirm,r.heading.textContent=t,r.workarea.textContent=n,r}}class O extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements=this._create(),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.elements.confirm.addEventListener("click",(()=>this._onConfirm())),this._updateFreeSpaceInAddDialog(),document.body.append(this.elements.root),this.elements.url_input.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_updateFreeSpaceInAddDialog(){const e=this.elements.folder_input.value;this.remote.getFreeSpace(e,((e,t)=>{const n=t>0?`${I.size(t)} Free`:"";this.elements.freespace.textContent=n}))}_onConfirm(){const{controller:e,elements:t,remote:n}=this,{file_input:r,folder_input:o,start_input:s,url_input:i}=t,a=!s.checked,l=o.value.trim();for(const t of r.files){const r=new FileReader;r.addEventListener("load",(r=>{const o=r.target.result,s="base64,",i=o.indexOf(s);if(-1===i)return;const c={arguments:{"download-dir":l,metainfo:o.slice(Math.max(0,i+s.length)),paused:a},method:"torrent-add"};n.sendRequest(c,(n=>{"success"!==n.result&&(alert(`Error adding "${t.name}": ${n.result}`),e.setCurrentPopup(new F({heading:`Error adding "${t.name}"`,message:n.result})))}))})),r.readAsDataURL(t)}let c=i.value.trim();if(c.length>0){/^[\da-f]{40}$/i.test(c)&&(c=`magnet:?xt=urn:btih:${c}`);const t={arguments:{"download-dir":l,filename:c,paused:a},method:"torrent-add"};n.sendRequest(t,(t=>{"success"!==t.result&&e.setCurrentPopup(new F({heading:`Error adding "${c}"`,message:t.result}))}))}this._onDismiss()}_create(){const e=i(),{confirm:t,root:n,heading:r,workarea:o}=e;n.classList.add("open-torrent"),r.textContent="Add Torrents",t.textContent="Add";let s=a(),l=document.createElement("label");l.setAttribute("for",s),l.textContent="Please select torrent files to add:",o.append(l);let c=document.createElement("input");c.type="file",c.name="torrent-files[]",c.id=s,c.multiple="multiple",o.append(c),e.file_input=c,s=a(),l=document.createElement("label"),l.setAttribute("for",s),l.textContent="Or enter a URL:",o.append(l),c=document.createElement("input"),c.type="url",c.id=s,o.append(c),e.url_input=c,c.addEventListener("keyup",(({key:e})=>{"Enter"===e&&t.click()})),s=a(),l=document.createElement("label"),l.id="add-dialog-folder-label",l.for=s,l.textContent="Destination folder:",o.append(l);const d=document.createElement("span");d.id="free-space-text",l.append(d),o.append(l),e.freespace=d,c=document.createElement("input"),c.type="text",c.id="add-dialog-folder-input",c.addEventListener("change",(()=>this._updateFreeSpaceInAddDialog())),c.value=this.controller.session_properties["download-dir"],o.append(c),e.folder_input=c;const A=document.createElement("div");o.append(A);const p=document.createElement("input");return p.type="checkbox",p.id="auto-start-check",p.checked=this.controller.shouldAddedTorrentsStart(),A.append(p),e.start_input=p,l=document.createElement("label"),l.id="auto-start-label",l.setAttribute("for",p.id),l.textContent="Start when added",A.append(l),e}}const P="speed-limit-down",U="speed-limit-down-enabled",R="queue-move-bottom",G="queue-move-down",Y="queue-move-top",Q="queue-move-up",Z="../rpc",W="alt-speed-down",H="alt-speed-enabled",J="alt-speed-up",q="speed-limit-up",V="speed-limit-up-enabled";class K{constructor(e){this._controller=e,this._error="",this._session_id=""}sendRequest(e,t,n){const r=new Headers;r.append("cache-control","no-cache"),r.append("content-type","application/json"),r.append("pragma","no-cache"),this._session_id&&r.append(K._SessionHeader,this._session_id);let o=null;fetch(Z,{body:JSON.stringify(e),headers:r,method:"POST"}).then((e=>{if(o=e,409===e.status){const t=new Error(K._SessionHeader);throw t.header=e.headers.get(K._SessionHeader),t}return e.json()})).then((e=>{t&&t.call(n,e,o)})).catch((r=>{if(r.message===K._SessionHeader)return this._session_id=r.header,void this.sendRequest(e,t,n);console.trace(r),this._controller.togglePeriodicSessionRefresh(!1),this._controller.setCurrentPopup(new F({heading:"Connection failed",message:"Could not connect to the server. You may need to reload the page to reconnect."}))}))}loadDaemonPrefs(e,t){this.sendRequest({method:"session-get"},e,t)}checkPort(e,t){this.sendRequest({method:"port-test"},e,t)}renameTorrent(e,t,n,r,o){const s={arguments:{ids:e,name:n,path:t},method:"torrent-rename-path"};this.sendRequest(s,r,o)}setLabels(e,t,n){const r={ids:e,labels:t};this.sendRequest({arguments:r,method:"torrent-set"},n)}loadDaemonStats(e,t){this.sendRequest({method:"session-stats"},e,t)}updateTorrents(e,t,n,r){const o={arguments:{fields:t,format:"table"},method:"torrent-get"};e&&(o.arguments.ids=e),this.sendRequest(o,(e=>{const t=e.arguments;n.call(r,t.torrents,t.removed)}))}getFreeSpace(e,t,n){const r={arguments:{path:e},method:"free-space"};this.sendRequest(r,(e=>{const r=e.arguments;t.call(n,r.path,r["size-bytes"])}))}changeFileCommand(e,t,n){const r={ids:[e]};r[n]=t,this.sendRequest({arguments:r,method:"torrent-set"},(()=>{this._controller.refreshTorrents([e])}))}sendTorrentSetRequests(e,t,n,r,o){n||(n={}),n.ids=t;const s={arguments:n,method:e};this.sendRequest(s,r,o)}sendTorrentActionRequests(e,t,n,r){this.sendTorrentSetRequests(e,t,null,n,r)}startTorrents(e,t,n,r){const o=t?"torrent-start-now":"torrent-start";this.sendTorrentActionRequests(o,e,n,r)}stopTorrents(e,t,n){this.sendTorrentActionRequests("torrent-stop",e,t,n)}moveTorrents(e,t,n,r){this.sendTorrentSetRequests("torrent-set-location",e,{location:t,move:!0},n,r)}removeTorrents(e,t){const n={arguments:{"delete-local-data":t,ids:[]},method:"torrent-remove"};if(e)for(let t=0,r=e.length;t{this._controller.refreshTorrents()}))}verifyTorrents(e,t,n){this.sendTorrentActionRequests("torrent-verify",e,t,n)}reannounceTorrents(e,t,n){this.sendTorrentActionRequests("torrent-reannounce",e,t,n)}addTorrentByUrl(e,t){/^[\da-f]{40}$/i.test(e)&&(e=`magnet:?xt=urn:btih:${e}`);const n={arguments:{filename:e,paused:t.paused},method:"torrent-add"};this.sendRequest(n,(()=>{this._controller.refreshTorrents()}))}savePrefs(e){const t={arguments:e,method:"session-set"};this.sendRequest(t,(()=>{this._controller.loadDaemonPrefs()}))}updateBlocklist(){this.sendRequest({method:"blocklist-update"},(()=>{this._controller.loadDaemonPrefs()}))}moveTorrentsToTop(e,t,n){this.sendTorrentActionRequests(Y,e,t,n)}moveTorrentsToBottom(e,t,n){this.sendTorrentActionRequests(R,e,t,n)}moveTorrentsUp(e,t,n){this.sendTorrentActionRequests(Q,e,t,n)}moveTorrentsDown(e,t,n){this.sendTorrentActionRequests(G,e,t,n)}}function X(e,t){const n=document.createElement("fieldset");n.classList.add("section",e);const r=document.createElement("legend");return r.classList.add("title"),r.textContent=t,n.append(r),n}function $(e,t,n,r){const o=document.createElement("button");return o.textContent=t,o.addEventListener("click",r),e.append(o),o.dataset.action=n,o}K._SessionHeader="X-Transmission-Session-Id";class ee extends EventTarget{constructor(e,t,n,r){super(),this.action_listener=this._onActionChange.bind(this),this.action_manager=r,this.action_manager.addEventListener("change",this.action_listener),this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=t,this.prefs.addEventListener("change",this.prefs_listener),this.closed=!1,this.remote=n,this.name="overflow-menu",this.session_listener=this._onSessionChange.bind(this),this.session_manager=e,this.session_manager.addEventListener("session-change",this.session_listener);const{session_properties:o}=e;Object.assign(this,this._create(o)),this.outside=new m(this.root),this.outside.addEventListener("click",(()=>this.close())),Object.seal(this),this.show()}show(){document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.session_listener),this.action_manager.removeEventListener("change",this.action_listener),this.prefs.removeEventListener("change",this.prefs_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))this[e]=null;this.closed=!0}}_onSessionChange(e){const{alt_speed_check:t}=this.elements,{session_properties:n}=e;t.checked=n[H]}_onPrefsChange(e){switch(e.key){case b.SortDirection:case b.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value}}_onActionChange(e){const t=this.actions[e.action];t&&this._updateElement(t)}_updateElement(e){if(e.dataset.action){const{action:t}=e.dataset,n=this.action_manager.keyshortcuts(t);n&&e.setAttribute("aria-keyshortcuts",n),p(e,this.action_manager.isEnabled(t))}}_onClick(e){const{action:t,pref:n}=e.target.dataset;t?this.action_manager.click(t):n?this.prefs[n]=e.target.value:(console.log("unhandled"),console.log(e),console.trace())}_create(e){const t={},n={},r=this._onClick.bind(this),o=document.createElement("div");o.classList.add("overflow-menu","popup");let s=X("display","Display");o.append(s);let i=document.createElement("div");i.id="display-options",s.append(i);let a=document.createElement("div");i.append(a);let l=document.createElement("label");l.id="display-sort-mode-label",l.textContent="Sort by",a.append(l);let c=document.createElement("select");c.id="display-sort-mode-select",c.dataset.pref=b.SortMode,a.append(c);const d=[[b.SortByActivity,"Activity"],[b.SortByAge,"Age"],[b.SortByName,"Name"],[b.SortByProgress,"Progress"],[b.SortByQueue,"Queue order"],[b.SortByRatio,"Ratio"],[b.SortBySize,"Size"],[b.SortByState,"State"]];for(const[e,t]of d){const n=document.createElement("option");n.value=e,n.textContent=t,c.append(n)}l.setAttribute("for",c.id),c.value=this.prefs.sort_mode,c.addEventListener("change",(e=>{this.prefs.sort_mode=e.target.value})),a=document.createElement("div"),i.append(a);let A=document.createElement("input");A.id="display-sort-reverse-check",A.dataset.pref=b.SortDirection,A.type="checkbox",a.append(A),l=document.createElement("label"),l.id="display-sort-reverse-label",l.setAttribute("for",A.id),l.textContent="Reverse sort",a.append(l),A.checked=this.prefs.sort_direction!==b.SortAscending,A.addEventListener("input",(e=>{this.prefs.sort_direction=e.target.checked?b.SortDescending:b.SortAscending})),a=document.createElement("div"),i.append(a);const p="toggle-compact-rows";A=document.createElement("input"),A.id="display-compact-check",A.dataset.action=p,A.type="checkbox",a.append(A),l=document.createElement("label"),l.id="display-compact-label",l.for=A.id,l.setAttribute("for",A.id),l.textContent=this.action_manager.text(p),a.append(l),A.checked=this.prefs.display_mode===b.DisplayCompact,A.addEventListener("input",(e=>{const{checked:t}=e.target;this.prefs.display_mode=t?b.DisplayCompact:b.DisplayFull})),a=document.createElement("div"),i.append(a),A=document.createElement("input"),A.id="display-fullscreen-check",A.type="checkbox";const g=()=>null!==document.fullscreenElement;A.checked=g(),A.addEventListener("input",(()=>{g()?document.exitFullscreen():document.body.requestFullscreen()})),document.addEventListener("fullscreenchange",(()=>{A.checked=g()})),a.append(A),l=document.createElement("label"),l.id="display-fullscreen-label",l.for=A.id,l.setAttribute("for",A.id),l.textContent="Fullscreen",a.append(l),s=X("speed","Speed Limit"),o.append(s),i=document.createElement("div"),i.id="speed-options",s.append(i),a=document.createElement("div"),a.classList.add("speed-up"),i.append(a),l=document.createElement("label"),l.id="speed-up-label",l.textContent="Upload:",a.append(l);const u="Unlimited";c=document.createElement("select"),c.id="speed-up-select",a.append(c);const m=["10","100","200","500","750",u];for(const t of[...new Set(m).add(`${e[q]}`).values()].sort()){const e=document.createElement("option");e.value=t,e.textContent=t===u?u:I.speed(t),c.append(e)}l.setAttribute("for",c.id),c.value=e[V]?`${e[q]}`:u,c.addEventListener("change",(e=>{const{value:t}=e.target;console.log(e),t===u?this.remote.savePrefs({[V]:!1}):this.remote.savePrefs({[V]:!0,[q]:Number.parseInt(t,10)})})),a=document.createElement("div"),a.classList.add("speed-down"),i.append(a),l=document.createElement("label"),l.id="speed-down-label",l.textContent="Download:",a.append(l),c=document.createElement("select"),c.id="speed-down-select",a.append(c);for(const t of[...new Set(m).add(`${e[P]}`).values()].sort()){const e=document.createElement("option");e.value=t,e.textContent=t,c.append(e)}l.setAttribute("for",c.id),c.value=e[U]?`${e[P]}`:u,c.addEventListener("change",(e=>{const{value:t}=e.target;console.log(e),t===u?this.remote.savePrefs({[U]:!1}):this.remote.savePrefs({[U]:!0,[P]:Number.parseInt(t,10)})})),a=document.createElement("div"),a.classList.add("alt-speed"),i.append(a),A=document.createElement("input"),A.id="alt-speed-check",A.type="checkbox",A.checked=e[H],A.addEventListener("change",(e=>{this.remote.savePrefs({[H]:e.target.checked})})),a.append(A),n.alt_speed_check=A,l=document.createElement("label"),l.id="alt-speed-image",l.setAttribute("for",A.id),a.append(l),l=document.createElement("label"),l.id="alt-speed-label",l.setAttribute("for",A.id),l.textContent="Use Temp limits",a.append(l),l=document.createElement("label"),l.id="alt-speed-values-label",l.setAttribute("for",A.id);const h=I.speed(e[J]),f=I.speed(e[W]);l.textContent=`(${h} up, ${f} down)`,a.append(l),s=X("actions","Actions"),o.append(s);for(const e of["show-preferences-dialog","pause-all-torrents","start-all-torrents"]){const n=this.action_manager.text(e);t[e]=$(s,n,e,r)}s=X("info","Info"),o.append(s),i=document.createElement("div"),s.append(i);for(const e of["show-about-dialog","show-shortcuts-dialog","show-statistics-dialog"]){const n=this.action_manager.text(e);t[e]=$(i,n,e,r)}s=X("links","Links"),o.append(s),i=document.createElement("div"),s.append(i);let C=document.createElement("a");return C.href="https://transmissionbt.com/",C.tabindex="0",C.textContent="Homepage",i.append(C),C=document.createElement("a"),C.href="https://transmissionbt.com/donate/",C.tabindex="0",C.textContent="Tip Jar",i.append(C),C=document.createElement("a"),C.href="https://github.com/transmission/transmission/",C.tabindex="0",C.textContent="Source Code",i.append(C),this._updateElement=this._updateElement.bind(this),{actions:t,elements:n,root:o}}}class te extends EventTarget{static _initTimeDropDown(e){for(let t=0;t<96;++t){const n=15*t,r=`${Number.parseInt(t/4,10)}:${t%4*15||"00"}`;e.options[t]=new Option(r,n)}}static _initDayDropDown(e){const t=[["Everyday","127"],["Weekdays","62"],["Weekends","65"],["Sunday","1"],["Monday","2"],["Tuesday","4"],["Wednesday","8"],["Thursday","16"],["Friday","32"],["Saturday","64"]];for(let n=0;t[n];++n){const[r,o]=t[n];e.options[n]=new Option(r,o)}}_checkPort(){const e=this.elements.network.port_status_label;e.removeAttribute("data-open"),h(e,"Checking..."),this.remote.checkPort(this._onPortChecked,this)}_onPortChecked(e){const t=this.elements.network.port_status_label,n=e.arguments["port-is-open"];t.dataset.open=n,h(t,n?"Open":"Closed")}_setBlocklistButtonEnabled(e){const t=this.elements.peers.blocklist_update_button;p(t,e),t.value=e?"Update":"Updating..."}static _getValue(e){switch(e.type){case"checkbox":case"radio":return e.checked;case"number":case"text":case"url":{const t=e.value;return Number.parseInt(t,10).toString()===t?Number.parseInt(t,10):Number.parseFloat(t).toString()===t?Number.parseFloat(t):t}default:return null}}_onControlChanged(e){const{key:t}=e.target.dataset;this.remote.savePrefs({[t]:te._getValue(e.target)}),"peer-port"!==t&&"port-forwarding-enabled"!==t||this._checkPort()}_onDialogClosed(){this.dispatchEvent(new Event("closed"))}_update(e){if(e){this._setBlocklistButtonEnabled(!0);for(const[t,n]of Object.entries(e))for(const e of this.elements.root.querySelectorAll(`[data-key="${t}"]`))if("blocklist-size"===t){const t=I.number(n);e.innerHTML=`Blocklist has ${t} rules`,h(this.elements.peers.blocklist_update_button,"Update")}else switch(e.type){case"checkbox":case"radio":e.checked!==n&&(e.checked=n,e.dispatchEvent(new Event("change")));break;case"text":case"url":case"email":case"number":case"search":e.value!=n&&e!==document.activeElement&&(e.value=n,e.dispatchEvent(new Event("change")));break;case"select-one":e.value!==n&&(e.value=n,e.dispatchEvent(new Event("change")))}}}shouldAddedTorrentsStart(){return this.data.elements.root.find("#start-added-torrents")[0].checked}static _createCheckAndLabel(e,t){const n=document.createElement("div");n.id=e;const r=document.createElement("input");r.id=a(),r.type="checkbox",n.append(r);const o=document.createElement("label");return o.textContent=t,o.setAttribute("for",r.id),n.append(o),{check:r,label:o,root:n}}static _enableIfChecked(e,t){const n=()=>{"INPUT"===e.tagName?p(e,t.checked):e.classList.toggle("disabled",!t.checked)};t.addEventListener("change",n),n()}static _createTorrentsPage(){const e=document.createElement("div");e.classList.add("prefs-torrents-page");let t=document.createElement("div");t.textContent="Downloading",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Download to:",e.append(t);let n=document.createElement("input");n.type="text",n.id=a(),n.dataset.key="download-dir",t.setAttribute("for",n.id),e.append(n);const r=n;let o=te._createCheckAndLabel("incomplete-dir-div","Use temporary folder:");o.check.title="Separate folder to temporarily store downloads until they are complete.",o.check.dataset.key="incomplete-dir-enabled",o.label.title=o.check.title,e.append(o.root);const s=o.check;n=document.createElement("input"),n.type="text",n.dataset.key="incomplete-dir",e.append(n),te._enableIfChecked(n,o.check);const i=n;o=te._createCheckAndLabel("autostart-div","Start when added"),o.check.dataset.key="start-added-torrents",e.append(o.root);const l=o.check;o=te._createCheckAndLabel("suffix-div",'Append "part" to incomplete files\' names'),o.check.dataset.key="rename-partial-files",e.append(o.root);const c=o.check;o=te._createCheckAndLabel("download-queue-div","Download queue size:"),o.check.dataset.key="download-queue-enabled",e.append(o.root);const d=o.check;n=document.createElement("input"),n.type="number",n.dataset.key="download-queue-size",e.append(n),te._enableIfChecked(n,o.check);const A=n;t=document.createElement("div"),t.textContent="Seeding",t.classList.add("section-label"),e.append(t),o=te._createCheckAndLabel("stop-ratio-div","Stop seeding at ratio:"),o.check.dataset.key="seedRatioLimited",e.append(o.root);const p=o.check;n=document.createElement("input"),n.type="number",n.dataset.key="seedRatioLimit",e.append(n),te._enableIfChecked(n,o.check);const g=n;o=te._createCheckAndLabel("stop-idle-div","Stop seeding if idle for N mins:"),o.check.dataset.key="idle-seeding-limit-enabled",e.append(o.root);const u=o.check;n=document.createElement("input"),n.type="number",n.dataset.key="idle-seeding-limit",e.append(n),te._enableIfChecked(n,o.check);return{autostart_check:l,download_dir:r,download_queue_check:d,download_queue_input:A,incomplete_dir_check:s,incomplete_dir_input:i,root:e,stop_idle_check:u,stop_idle_input:n,stop_ratio_check:p,stop_ratio_input:g,suffix_check:c}}static _createSpeedPage(){const e=document.createElement("div");e.classList.add("prefs-speed-page");let t=document.createElement("div");t.textContent="Speed Limits",t.classList.add("section-label"),e.append(t);let n=te._createCheckAndLabel("upload-speed-div","Upload (kB/s):");n.check.dataset.key="speed-limit-up-enabled",e.append(n.root);const r=n.check;let o=document.createElement("input");o.type="number",o.dataset.key="speed-limit-up",e.append(o),te._enableIfChecked(o,n.check);const s=o;n=te._createCheckAndLabel("download-speed-div","Download (kB/s):"),n.check.dataset.key="speed-limit-down-enabled",e.append(n.root);const i=n.check;o=document.createElement("input"),o.type="number",o.dataset.key="speed-limit-down",e.append(o),te._enableIfChecked(o,n.check);const l=o;t=document.createElement("div"),t.textContent="Alternative Speed Limits",t.classList.add("section-label","alt-speed-section-label"),e.append(t),t=document.createElement("div"),t.textContent="Override normal speed limits manually or at scheduled times",t.classList.add("alt-speed-label"),e.append(t),t=document.createElement("label"),t.textContent="Upload (kB/s):",e.append(t),o=document.createElement("input"),o.type="number",o.dataset.key="alt-speed-up",o.id=a(),t.setAttribute("for",o.id),e.append(o);const c=o;t=document.createElement("label"),t.textContent="Download (kB/s):",e.append(t),o=document.createElement("input"),o.type="number",o.dataset.key="alt-speed-down",o.id=a(),t.setAttribute("for",o.id),e.append(o);const d=o;n=te._createCheckAndLabel("alt-times-div","Scheduled times"),n.check.dataset.key="alt-speed-time-enabled",e.append(n.root);const A=n.check;t=document.createElement("label"),t.textContent="From:",te._enableIfChecked(t,n.check),e.append(t);let p=document.createElement("select");p.id=a(),p.dataset.key="alt-speed-time-begin",te._initTimeDropDown(p),t.setAttribute("for",p.id),e.append(p),te._enableIfChecked(p,n.check);const g=p;t=document.createElement("label"),t.textContent="To:",te._enableIfChecked(t,n.check),e.append(t),p=document.createElement("select"),p.id=a(),p.dataset.key="alt-speed-time-end",te._initTimeDropDown(p),t.setAttribute("for",p.id),e.append(p),te._enableIfChecked(p,n.check);const u=p;t=document.createElement("label"),t.textContent="On days:",te._enableIfChecked(t,n.check),e.append(t),p=document.createElement("select"),p.id=a(),p.dataset.key="alt-speed-time-day",te._initDayDropDown(p),t.setAttribute("for",p.id),e.append(p),te._enableIfChecked(p,n.check);return{alt_days_select:p,alt_download_speed_input:d,alt_from_select:g,alt_times_check:A,alt_to_select:u,alt_upload_speed_input:c,download_speed_check:i,download_speed_input:l,root:e,upload_speed_check:r,upload_speed_input:s}}static _createPeersPage(){const e=document.createElement("div");e.classList.add("prefs-peers-page");let t=document.createElement("div");t.textContent="Connections",t.classList.add("section-label"),e.append(t);let n=te._createCheckAndLabel("max-peers-per-torrent-div","Max peers per torrent:");e.append(n.root);const r=n.check;let o=document.createElement("input");o.type="number",o.dataset.key="peer-limit-per-torrent",e.append(o),te._enableIfChecked(o,n.check);const s=o;n=te._createCheckAndLabel("max-peers-overall-div","Max peers overall:"),e.append(n.root);const i=n.check;o=document.createElement("input"),o.type="number",o.dataset.key="peer-limit-global",e.append(o),te._enableIfChecked(o,n.check);const l=o;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Encryption mode:",e.append(t);const c=document.createElement("select");c.id=a(),c.dataset.key="encryption",c.options[0]=new Option("Prefer encryption","preferred"),c.options[1]=new Option("Allow encryption","tolerated"),c.options[2]=new Option("Require encryption","required"),e.append(c);const d=c;n=te._createCheckAndLabel("use-pex-div","Use PEX to find more peers"),n.check.title="PEX is a tool for exchanging peer lists with the peers you're connected to.",n.check.dataset.key="pex-enabled",n.label.title=n.check.title,e.append(n.root);const A=n.check;n=te._createCheckAndLabel("use-dht-div","Use DHT to find more peers"),n.check.title="DHT is a tool for finding peers without a tracker.",n.check.dataset.key="dht-enabled",n.label.title=n.check.title,e.append(n.root);const p=n.check;n=te._createCheckAndLabel("use-lpd-div","Use LPD to find more peers"),n.check.title="LPD is a tool for finding peers on your local network.",n.check.dataset.key="lpd-enabled",n.label.title=n.check.title,e.append(n.root);const g=n.check;t=document.createElement("div"),t.textContent="Blocklist",t.classList.add("section-label"),e.append(t),n=te._createCheckAndLabel("blocklist-enabled-div","Enable blocklist:"),n.check.dataset.key="blocklist-enabled",e.append(n.root);const u=n.check;o=document.createElement("input"),o.type="url",o.value="http://www.example.com/blocklist",o.dataset.key="blocklist-url",e.append(o),te._enableIfChecked(o,n.check);const m=o;t=document.createElement("label"),t.textContent="Blocklist has {n} rules",t.dataset.key="blocklist-size",t.classList.add("blocklist-size-label"),te._enableIfChecked(t,n.check),e.append(t);const h=document.createElement("button");h.classList.add("blocklist-update-button"),h.textContent="Update",e.append(h),te._enableIfChecked(h,n.check);return{blocklist_enabled_check:u,blocklist_update_button:h,blocklist_url_input:m,dht_check:p,encryption_select:d,lpd_check:g,max_peers_overall_check:i,max_peers_overall_input:l,max_peers_per_torrent_check:r,max_peers_per_torrent_input:s,pex_check:A,root:e}}static _createNetworkPage(){const e=document.createElement("div");e.classList.add("prefs-network-page");let t=document.createElement("div");t.textContent="Listening Port",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Peer listening port:",e.append(t);const n=document.createElement("input");n.type="number",n.dataset.key="peer-port",n.id=a(),t.setAttribute("for",n.id),e.append(n);const r=n,o=document.createElement("div");o.classList.add("port-status"),t=document.createElement("label"),t.textContent="Port is",o.append(t);const s=document.createElement("label");s.textContent="?",s.classList.add("port-status-label"),o.append(s),e.append(o);let i=te._createCheckAndLabel("randomize-port","Randomize port on launch");i.check.dataset.key="peer-port-random-on-start",e.append(i.root);const l=i.check;i=te._createCheckAndLabel("port-forwarding","Use port forwarding from my router"),i.check.dataset.key="port-forwarding-enabled",e.append(i.root);const c=i.check;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),i=te._createCheckAndLabel("utp-enabled","Enable uTP for peer communication"),i.check.dataset.key="utp-enabled",e.append(i.root);return{port_forwarding_check:c,port_input:r,port_status_label:s,random_port_check:l,root:e,utp_check:i.check}}static _create(){const e={network:te._createNetworkPage(),peers:te._createPeersPage(),speed:te._createSpeedPage(),torrents:te._createTorrentsPage()};return{...s("prefs-dialog",[["prefs-tab-torrent",e.torrents.root],["prefs-tab-speed",e.speed.root],["prefs-tab-peers",e.peers.root],["prefs-tab-network",e.network.root]]),...e}}constructor(e,t){super(),this.closed=!1,this.session_manager=e,this.remote=t,this.update_soon=()=>this._update(this.session_manager.session_properties),this.elements=te._create(),this.elements.peers.blocklist_update_button.addEventListener("click",(e=>{h(e.target,"Updating blocklist..."),this.remote.updateBlocklist(),this._setBlocklistButtonEnabled(!1)})),this.outside=new m(this.elements.root),this.outside.addEventListener("click",(()=>this.close())),Object.seal(this);const n=this._onControlChanged.bind(this),r=e=>{for(const t of Object.values(e))if("INPUT"===t.tagName)switch(t.type){case"checkbox":case"radio":case"number":case"text":case"url":t.addEventListener("change",n);break;default:console.trace(`unhandled input: ${t.type}`)}};r(this.elements.network),r(this.elements.peers),r(this.elements.speed),r(this.elements.torrents),this.session_manager.addEventListener("session-change",this.update_soon),this.update_soon(),document.body.append(this.elements.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.update_soon),this.elements.root.remove(),dispatchEvent(new Event("close"));for(const e of Object.keys(this))this[e]=null;this.closed=!0}}}class ne extends EventTarget{constructor(e){super(),this.options=e,this.elements=ne._create(e),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.elements.confirm.addEventListener("click",(()=>this._onConfirm())),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_onConfirm(){const{remote:e,torrents:t,trash:n}=this.options;t.length>0&&e.removeTorrents(t,n),this.close()}static _create(e){const{trash:t}=e,{heading:n,message:r}=ne._createMessage(e),o=i("remove-dialog");return o.heading.textContent=n,o.message.textContent=r,o.confirm.textContent=t?"Trash":"Remove",o}static _createMessage(e){let t=null,n=null;const{torrents:r,trash:o}=e,[s]=r;return o&&1===r.length?(t=`Remove ${s.getName()} and delete data?`,n="All data downloaded for this torrent will be deleted. Are you sure you want to remove it?"):o?(t=`Remove ${r.length} transfers and delete data?`,n="All data downloaded for these torrents will be deleted. Are you sure you want to remove them?"):1===r.length?(t=`Remove ${s.getName()}?`,n="Once removed, continuing the transfer will require the torrent file. Are you sure you want to remove it?"):(t=`Remove ${r.length} transfers?`,n="Once removed, continuing the transfers will require the torrent files. Are you sure you want to remove them?"),{heading:t,message:n}}}class re extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){const e=this.controller.getSelectedTorrents();1===e.length?(this.torrents=e,this.elements=re._create(),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.elements.confirm.addEventListener("click",(()=>this._onConfirm())),this.elements.entry.value=e[0].getName(),document.body.append(this.elements.root),this.elements.entry.focus()):console.trace()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){const[e]=this.torrents,t=e.getName(),n=this.elements.entry.value;this.remote.renameTorrent([e.getId()],t,n,(t=>{"success"===t.result&&e.refresh(t.arguments)})),this.close()}static _create(){const e=i("rename-dialog");e.root.setAttribute("aria-label","Rename Torrent"),e.heading.textContent="Enter new name:",e.confirm.textContent="Rename";const t=document.createElement("label");t.setAttribute("for","torrent-rename-name"),t.textContent="Enter new name:",e.workarea.append(t);const n=document.createElement("input");return n.setAttribute("type","text"),n.id="torrent-rename-name",e.entry=n,e.workarea.append(n),e}}class oe extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){const e=this.controller.getSelectedTorrents();if(0===e.length)return void console.error("At least one selected torrent expected.");const[t]=e;this.torrents=e,this.elements=oe._create(),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.elements.confirm.addEventListener("click",(()=>this._onConfirm())),this.elements.entry.value=t.getLabels().join(", "),document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){const{torrents:e}=this,{remote:t}=this,n=e.map((e=>e.getId())),{elements:r}=this,{entry:o}=r,{value:s}=o,i=s.split(/ *, */).filter((e=>e.length>0));t.setLabels(n,i,(t=>{if("success"===t.result)for(const t of e)t.refresh({labels:i})})),this.close()}static _create(){const e=i("labels-dialog");e.root.setAttribute("aria-label","Edit Labels"),e.heading.textContent="Edit Labels:",e.confirm.textContent="Save";const t=document.createElement("label");t.setAttribute("for","torrent-labels"),t.textContent="Labels:",e.workarea.append(t);const n=document.createElement("input");return n.setAttribute("type","text"),n.id="torrent-labels",e.entry=n,e.workarea.append(n),e}}class se extends EventTarget{constructor(e){super(),this.elements=se._create(e),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onDismiss(){this.close()}static _create(e){const t=i("shortcuts-dialog");t.root.setAttribute("aria-label","Keyboard Shortcuts");const n=document.createElement("table"),r=document.createElement("thead");n.append(r);let o=document.createElement("tr");r.append(o);let s=document.createElement("th");s.textContent="Key",o.append(s),s=document.createElement("th"),s.textContent="Action",o.append(s);const a=document.createElement("tbody");n.append(a);const l={};for(const[t,n]of e.allShortcuts().entries()){const e=t.split("+");l[[e.pop(),...e].join("+")]={name:n,shortcut:t}}for(const[,t]of Object.entries(l).sort()){const{name:n,shortcut:r}=t;o=document.createElement("tr"),a.append(o);let s=document.createElement("td");s.textContent=r.replaceAll("+"," + "),o.append(s),s=document.createElement("td"),s.textContent=e.text(n),o.append(s)}return t.heading.textContent="Transmission",t.dismiss.textContent="Close",t.heading.textContent="Keyboard shortcuts",t.message.append(n),t.confirm.remove(),delete t.confirm,t}}class ie extends EventTarget{constructor(e){super(),this.remote=e;const t=()=>this.remote.loadDaemonStats((e=>this._update(e.arguments)));this.interval=setInterval(t,5e3),t(),this.elements=ie._create(),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove();for(const e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_update(e){console.log(e);const t=I;let n=e["current-stats"],r=o.ratio(n.uploadedBytes,n.downloadedBytes);h(this.elements.session.up,t.size(n.uploadedBytes)),h(this.elements.session.down,t.size(n.downloadedBytes)),h(this.elements.session.ratio,t.ratioString(r)),h(this.elements.session.time,t.timeInterval(n.secondsActive)),n=e["cumulative-stats"],r=o.ratio(n.uploadedBytes,n.downloadedBytes),h(this.elements.total.up,t.size(n.uploadedBytes)),h(this.elements.total.down,t.size(n.downloadedBytes)),h(this.elements.total.ratio,t.ratioString(r)),h(this.elements.total.time,t.timeInterval(n.secondsActive))}static _create(){const e=i("statistics-dialog"),{confirm:t,dismiss:n,heading:r,root:o,workarea:s}=e;t.remove(),n.textContent="Close",delete e.confirm;const a="Statistics";o.setAttribute("aria-label",a),r.textContent=a;const c=["Uploaded:","Downloaded:","Ratio:","Running time:"];let d=l("Current session",c);const[A,p,g,u]=d.children,m=e.session={};m.up=A,m.down=p,m.ratio=g,m.time=u,s.append(d.root),d=l("Total",c);const[h,f,b,C]=d.children,v=e.total={};return v.up=h,v.down=f,v.ratio=b,v.time=C,s.append(d.root),e}}const ae={formatDL:e=>`▼${I.speedBps(e.getDownloadSpeed())}`,formatETA:e=>{const t=e.getETA();return t<0||t>=3596400?"":`ETA: ${I.timeInterval(t)}`},formatLabels:e=>e.getLabels().length>0?`🏷 ${e.getLabels().join(", ")}`:"",formatUL:e=>`▲${I.speedBps(e.getUploadSpeed())}`,getProgressInfo:(e,t)=>{const n=t.getStatus(),r=["torrent-progress-bar"];let o=null;if(n===L._StatusStopped&&r.push("paused"),t.needsMetaData())r.push("magnet"),o=Math.round(100*t.getMetadataPercentComplete());else if(n===L._StatusCheck)r.push("verify"),o=Math.round(100*t.getRecheckProgress());else if(t.getLeftUntilDone()>0)r.push("leech"),o=Math.round(100*t.getPercentDone());else{r.push("seed");const n=t.seedRatioLimit(e);o=n>0?100*t.getUploadRatio()/n:100}return t.isQueued()&&r.push("queued"),{classList:r,percent:o}},renderProgressbar:(e,t,n)=>{const r=ae.getProgressInfo(e,t);n.className=r.classList.join(" "),n.style["background-size"]=`${r.percent}% 100%, 100% 100%`}};class le{static getPeerDetails(e){const t=I,n=e.getErrorMessage();if(n)return n;if(e.isDownloading()){const n=e.getPeersConnected(),r=e.getWebseedsSendingToUs();return r&&n?["Downloading from",e.getPeersSendingToUs(),"of",t.countString("peer","peers",n),"and",t.countString("web seed","web seeds",r),"–",ae.formatDL(e),ae.formatUL(e)].join(" "):r?["Downloading from",t.countString("web seed","web seeds",r),"–",ae.formatDL(e),ae.formatUL(e)].join(" "):["Downloading from",e.getPeersSendingToUs(),"of",t.countString("peer","peers",n),"–",ae.formatDL(e),ae.formatUL(e)].join(" ")}return e.isSeeding()?["Seeding to",e.getPeersGettingFromUs(),"of",t.countString("peer","peers",e.getPeersConnected()),"-",ae.formatUL(e)].join(" "):e.isChecking()?["Verifying local data (",I.percentString(100*e.getRecheckProgress()),"% tested)"].join(""):e.getStateString()}static getProgressDetails(e,t){if(t.needsMetaData()){let e="retrieving";t.isStopped()&&(e="needs");const n=100*t.getMetadataPercentComplete();return[`Magnetized transfer - ${e} metadata (`,I.percentString(n),"%)"].join("")}const n=t.getSizeWhenDone(),r=t.getTotalSize(),o=t.isDone()||t.isSeeding(),s=[];if(o?(r===n?s.push(I.size(r)):s.push(I.size(n)," of ",I.size(t.getTotalSize())," (",t.getPercentDoneStr(),"%)"),s.push(", uploaded ",I.size(t.getUploadedEver())," (Ratio ",I.ratioString(t.getUploadRatio()),")")):s.push(I.size(n-t.getLeftUntilDone())," of ",I.size(n)," (",t.getPercentDoneStr(),"%)"),!t.isStopped()&&(!o||t.seedRatioLimit(e)>0)){s.push(" - ");const e=t.getETA();e<0||e>=3596400?s.push("remaining time unknown"):s.push(I.timeInterval(t.getETA())," remaining")}return s.join("")}render(e,t,n){const r=t.isStopped();let o=n._name_container;h(o,t.getName()),o.classList.toggle("paused",r),o=n._labels_container,h(o,ae.formatLabels(t)),ae.renderProgressbar(e,t,n._progressbar),n._progressbar.classList.add("full");const s=t.getError()!==L._ErrNone;o=n._peer_details_container,o.classList.toggle("error",s),h(o,le.getPeerDetails(t)),o=n._progress_details_container,h(o,le.getProgressDetails(e,t)),o=n._toggle_running_button,o.alt=r?"Resume":"Pause",o.dataset.action=r?"resume":"pause"}createRow(e){const t=document.createElement("li");t.className="torrent";const n=document.createElement("div");n.classList.add("icon"),n.dataset.iconMimeType=e.getPrimaryMimeType().split("/",1).pop(),n.dataset.iconMultifile=e.getFileCount()>1?"true":"false";const r=document.createElement("div");r.className="torrent-name";const o=document.createElement("div");o.className="torrent-labels";const s=document.createElement("div");s.className="torrent-peer-details";const i=document.createElement("div");i.classList.add("torrent-progress");const a=document.createElement("div");a.classList.add("torrent-progress-bar","full"),i.append(a);const l=document.createElement("a");l.className="torrent-pauseresume-button",i.append(l);const c=document.createElement("div");return c.className="torrent-progress-details",t.append(n),t.append(r),t.append(o),t.append(s),t.append(i),t.append(c),t._icon=n,t._name_container=r,t._labels_container=o,t._peer_details_container=s,t._progress_details_container=c,t._progressbar=a,t._toggle_running_button=l,t}}class ce{static getPeerDetails(e){const t=e.getErrorMessage();if(t)return t;if(e.isDownloading()){const t=e.getDownloadSpeed()>0,n=e.getUploadSpeed()>0;if(!n&&!t)return"Idle";const r=[`${ae.formatETA(e)} `];return t&&r.push(ae.formatDL(e)),n&&r.push(ae.formatUL(e)),r.join(" ")}return e.isSeeding()?`Ratio: ${I.ratioString(e.getUploadRatio())}, ${ae.formatUL(e)}`:e.getStateString()}render(e,t,n){let r=n._name_container;r.classList.toggle("paused",t.isStopped()),h(r,t.getName()),r=n._labels_container,h(r,ae.formatLabels(t));const o=t.getError()!==L._ErrNone;r=n._details_container,r.classList.toggle("error",o),h(r,ce.getPeerDetails(t)),ae.renderProgressbar(e,t,n._progressbar),n._progressbar.classList.add("compact")}createRow(e){const t=document.createElement("div");t.classList.add("torrent-progress-bar","compact");const n=document.createElement("div");n.classList.add("icon"),n.dataset.iconMimeType=e.getPrimaryMimeType().split("/",1).pop(),n.dataset.iconMultifile=e.getFileCount()>1?"true":"false";const r=document.createElement("div");r.className="torrent-peer-details compact";const o=document.createElement("div");o.className="torrent-labels compact";const s=document.createElement("div");s.className="torrent-name compact";const i=document.createElement("li");return i.append(t),i.append(r),i.append(o),i.append(s),i.append(n),i.className="torrent compact",i._progressbar=t,i._details_container=r,i._labels_container=o,i._name_container=s,i}}class de{constructor(e,t,n){this._view=e,this._torrent=n,this._element=e.createRow(n);const r=()=>this.render(t);this._torrent.addEventListener("dataChanged",r),r()}getElement(){return this._element}render(e){const t=this.getTorrent();t&&this._view.render(e,t,this.getElement())}isSelected(){return this.getElement().classList.contains("selected")}getTorrent(){return this._torrent}getTorrentId(){return this.getTorrent().getId()}}class Ae extends EventTarget{constructor(e,t,n){super(),this.action_manager=e,this.notifications=t,this.prefs=n,this.remote=new K(this),this.addEventListener("torrent-selection-changed",(e=>this.action_manager.update(e))),this.filterText="",this._torrents={},this._rows=[],this.dirtyTorrents=new Set,this.refilterSoon=c((()=>this._refilter(!1))),this.refilterAllSoon=c((()=>this._refilter(!0))),this.boundPopupCloseListener=this.popupCloseListener.bind(this),this.dispatchSelectionChangedSoon=c((()=>this._dispatchSelectionChanged()),200);for(const e of document.querySelectorAll("button[data-action]")){const{action:t}=e.dataset;p(e,this.action_manager.isEnabled(t)),e.addEventListener("click",(()=>{this.action_manager.click(t)}))}document.querySelector("#filter-tracker").addEventListener("change",(e=>{this.setFilterTracker("all"===e.target.value?null:e.target.value)})),this.action_manager.addEventListener("change",(e=>{for(const t of document.querySelectorAll(`[data-action="${e.action}"]`))p(t,e.enabled)})),this.action_manager.addEventListener("click",(e=>{switch(e.action){case"deselect-all":this._deselectAll();break;case"move-bottom":this._moveBottom();break;case"move-down":this._moveDown();break;case"move-top":this._moveTop();break;case"move-up":this._moveUp();break;case"open-torrent":this.setCurrentPopup(new O(this,this.remote));break;case"pause-all-torrents":this._stopTorrents(this._getAllTorrents());break;case"pause-selected-torrents":this._stopTorrents(this.getSelectedTorrents());break;case"reannounce-selected-torrents":this._reannounceTorrents(this.getSelectedTorrents());break;case"remove-selected-torrents":this._removeSelectedTorrents(!1);break;case"resume-selected-torrents":this._startSelectedTorrents(!1);break;case"resume-selected-torrents-now":this._startSelectedTorrents(!0);break;case"select-all":this._selectAll();break;case"show-about-dialog":this.setCurrentPopup(new C(this.version_info));break;case"show-inspector":this.setCurrentPopup(new j(this));break;case"show-move-dialog":this.setCurrentPopup(new z(this,this.remote));break;case"show-overflow-menu":if(this.popup instanceof ee)this.setCurrentPopup(null);else{this.setCurrentPopup(new ee(this,this.prefs,this.remote,this.action_manager));const e=document.querySelector("#toolbar-overflow").getBoundingClientRect();u(this.popup.root,e.left+e.width,e.top+e.height,document.body)}break;case"show-preferences-dialog":this.setCurrentPopup(new te(this,this.remote));break;case"show-shortcuts-dialog":this.setCurrentPopup(new se(this.action_manager));break;case"show-statistics-dialog":this.setCurrentPopup(new ie(this.remote));break;case"show-rename-dialog":this.setCurrentPopup(new re(this,this.remote));break;case"show-labels-dialog":this.setCurrentPopup(new oe(this,this.remote));break;case"start-all-torrents":this._startTorrents(this._getAllTorrents());break;case"toggle-compact-rows":this.prefs.display_mode=this.prefs.display_mode!==b.DisplayCompact?b.DisplayCompact:b.DisplayFull;break;case"trash-selected-torrents":this._removeSelectedTorrents(!0);break;case"verify-selected-torrents":this._verifyTorrents(this.getSelectedTorrents());break;default:console.warn(`unhandled action: ${e.action}`)}}));let r=document.querySelector("#filter-mode");r.value=this.prefs.filter_mode,r.addEventListener("change",(e=>{this.prefs.filter_mode=e.target.value})),document.addEventListener("keydown",this._keyDown.bind(this)),document.addEventListener("keyup",this._keyUp.bind(this)),r=document.querySelector("#torrent-container"),r.addEventListener("click",(()=>{this.popup&&"inspector"!==this.popup.name?this.setCurrentPopup(null):this._deselectAll()})),r.addEventListener("dragenter",Ae._dragenter),r.addEventListener("dragover",Ae._dragenter),r.addEventListener("drop",this._drop.bind(this)),this._setupSearchBox(),this.elements={torrent_list:document.querySelector("#torrent-list")},this.elements.torrent_list.addEventListener("contextmenu",(e=>{let t=event.target;for(;t&&!t.classList.contains("torrent");)t=t.parentNode;const n=this._rows.find((e=>e.getElement()===t));n&&!n.isSelected()&&this._setSelectedRow(n);const r=new v(this.action_manager);this.setCurrentPopup(r),u(r.root,e.x,e.y,document.querySelector("#torrent-container")),e.preventDefault()})),this.loadDaemonPrefs(),this._initializeTorrents(),this.refreshTorrents(),this.togglePeriodicSessionRefresh(!0),this.prefs.addEventListener("change",(({key:e,value:t})=>this._onPrefChanged(e,t)));for(const[e,t]of this.prefs.entries())this._onPrefChanged(e,t)}loadDaemonPrefs(){this.remote.loadDaemonPrefs((e=>{this.session_properties=e.arguments}))}get session_properties(){return this._session_properties}set session_properties(e){if(d(this._session_properties,e))return;this._session_properties=Object.seal(e);const t=new Event("session-change");t.session_properties=e,this.dispatchEvent(t),this._updateGuiFromSession(e)}_setupSearchBox(){const e=document.querySelector("#torrent-search"),t="blur";e.classList.add(t),e.addEventListener("blur",(()=>e.classList.add(t))),e.addEventListener("focus",(()=>e.classList.remove(t))),e.addEventListener("keyup",(()=>this._setFilterText(e.value)))}_onPrefChanged(e,t){switch(e){case b.DisplayMode:this.torrentRenderer="compact"===t?new ce:new le,this.refilterAllSoon();break;case b.FilterMode:case b.SortDirection:case b.SortMode:this.refilterAllSoon();break;case b.RefreshRate:{clearInterval(this.refreshTorrentsInterval);const e=this.refreshTorrents.bind(this),t=1e3*Math.max(2,this.prefs.refresh_rate_sec);this.refreshTorrentsInterval=setInterval(e,t);break}case b.AltSpeedEnabled:case b.NotificationsEnabled:}}_getAllTorrents(){return Object.values(this._torrents)}static _getTorrentIds(e){return e.map((e=>e.getId()))}seedRatioLimit(){const e=this.session_properties;return e&&e.seedRatioLimited?e.seedRatioLimit:-1}_getSelectedRows(){return this._rows.filter((e=>e.isSelected()))}getSelectedTorrents(){return this._getSelectedRows().map((e=>e.getTorrent()))}_getSelectedTorrentIds(){return Ae._getTorrentIds(this.getSelectedTorrents())}_setSelectedRow(e){const t=e?e.getElement():null;for(const e of this.elements.torrent_list.children)e.classList.toggle("selected",e===t);this.dispatchSelectionChangedSoon()}_selectRow(e){e.getElement().classList.add("selected"),this.dispatchSelectionChangedSoon()}_deselectRow(e){e.getElement().classList.remove("selected"),this.dispatchSelectionChangedSoon()}_selectAll(){for(const e of this.elements.torrent_list.children)e.classList.add("selected");this.dispatchSelectionChangedSoon()}_deselectAll(){for(const e of this.elements.torrent_list.children)e.classList.remove("selected");this.dispatchSelectionChangedSoon(),delete this._last_torrent_clicked}_indexOfLastTorrent(){return this._rows.findIndex((e=>e.getTorrentId()===this._last_torrent_clicked))}_selectRange(e){const t=this._indexOfLastTorrent();if(-1===t)this._selectRow(e);else{const n=this._rows.indexOf(e),r=Math.min(t,n),o=Math.max(t,n);for(let e=r;e<=o;++e)this._selectRow(this._rows[e])}this.dispatchSelectionChangedSoon()}_dispatchSelectionChanged(){const e=[],t=[];for(const n of this._rows)(n.isSelected()?t:e).push(n.getTorrent());const n=new Event("torrent-selection-changed");n.nonselected=e,n.selected=t,this.dispatchEvent(n)}static _createKeyShortcutFromKeyboardEvent(e){const t=[];return e.ctrlKey&&t.push("Control"),e.altKey&&t.push("Alt"),e.metaKey&&t.push("Meta"),e.shitKey&&t.push("Shift"),t.push(1===e.key.length?e.key.toUpperCase():e.key),t.join("+")}_keyDown(e){const{ctrlKey:t,keyCode:n,metaKey:r,shiftKey:o,target:s}=e,i=Ae._createKeyShortcutFromKeyboardEvent(e),a=this.action_manager.getActionForShortcut(i);if(a)return e.preventDefault(),void this.action_manager.click(a);if(27===n&&this.popup)return this.setCurrentPopup(null),void e.preventDefault();const l=document.querySelector(".popup:not(.hidden)"),c=s.matches("input"),d=this._rows;if(!(c||l||r||t)){const t=16===n,r=38===n,s=40===n;if((r||s)&&d.length>0){const t=this._indexOfLastTorrent(),n=this._shift_index,i=0,a=d.length-1;let l=t;s&&l+1<=a?++l:r&&l-1>=i&&--l;const c=d[l];n>=0?n<=t&&t=t&&t>l?this._selectRow(c):(n>=t&&l>t||n<=t&&t>l)&&this._deselectRow(d[t]):o?this._selectRange(c):this._setSelectedRow(c),c&&(this._last_torrent_clicked=c.getTorrentId(),c.getElement().scrollIntoView(),e.preventDefault())}else t&&(this._shift_index=this._indexOfLastTorrent())}}_keyUp(e){16===e.keyCode&&delete this._shift_index}static _dragenter(e){if(e.dataTransfer&&e.dataTransfer.types){const t=new Set(["text/uri-list","text/plain"]);if(e.dataTransfer.types.some((e=>t.has(e))))return e.stopPropagation(),e.preventDefault(),e.dataTransfer.dropEffect="copy",!1}else e.dataTransfer&&(e.dataTransfer.dropEffect="none");return!0}static _isValidURL(e){try{return!!new URL(e)}catch{return!1}}shouldAddedTorrentsStart(){return this.session_properties["start-added-torrents"]}_drop(e){const t=!this.shouldAddedTorrentsStart();if(!e.dataTransfer||!e.dataTransfer.types)return!0;const n=e.data.Transfer.types.filter((e=>["text/uri-list","text/plain"].contains(e))).pop();for(const r of e.dataTransfer.getData(n).split("\n").map((e=>e.trim())).filter((e=>Ae._isValidURL(e))))this.remote.addTorrentByUrl(r,t);return e.preventDefault(),!1}togglePeriodicSessionRefresh(e){if(!e&&this.sessionInterval&&(clearInterval(this.sessionInterval),delete this.sessionInterval),e&&(this.loadDaemonPrefs(),!this.sessionInterval)){const e=8e3;this.sessionInterval=setInterval(this.loadDaemonPrefs.bind(this),e)}}_setFilterText(e){this.filterText=e?e.trim():null,this.refilterAllSoon()}_onTorrentChanged(e){const t=e.currentTarget;this.dirtyTorrents.add(t.getId()),this.refilterSoon()}updateTorrents(e,t){this.remote.updateTorrents(e,t,((e,t)=>{const n=[],r=e.shift(),o={};for(const t of e){for(const[e,n]of r.entries())o[n]=t[e];const{id:e}=o;let s=this._torrents[e];if(s){const t=s.needsMetaData();s.refresh(o),t&&!s.needsMetaData()&&n.push(e)}else s=this._torrents[e]=new L(o),s.addEventListener("dataChanged",this._onTorrentChanged.bind(this)),this.dirtyTorrents.add(e),"name"in s.fields&&"status"in s.fields||n.push(e)}if(n.length>0){const e=["id",...L.Fields.Metadata,...L.Fields.Stats];this.updateTorrents(n,e),this.refilterSoon()}t&&(this._deleteTorrents(t),this.refilterSoon())}))}refreshTorrents(){const e=["id",...L.Fields.Stats];this.updateTorrents("recently-active",e)}_initializeTorrents(){const e=["id",...L.Fields.Metadata,...L.Fields.Stats];this.updateTorrents(null,e)}_onRowClicked(e){const t=e.metaKey||e.ctrlKey,{row:n}=e.currentTarget;if(this.popup&&"inspector"!==this.popup.name)this.setCurrentPopup(null);else{if(e.target.classList.contains("torrent-pauseresume-button"))switch(e.target.dataset.action){case"pause":this._stopTorrents([n.getTorrent()]);break;case"resume":this._startTorrents([n.getTorrent()])}e.stopPropagation(),e.shiftKey?(this._selectRange(n),window.focus()):!n.isSelected()&&t?this._selectRow(n):n.isSelected()?n.isSelected()&&t?this._deselectRow(n):n.isSelected()&&this._setSelectedRow(n):this._setSelectedRow(n),this._last_torrent_clicked=n.getTorrentId()}}_deleteTorrents(e){if(e&&e.length>0){for(const t of e)this.dirtyTorrents.add(t),delete this._torrents[t];this.refilterSoon()}}_removeSelectedTorrents(e){const t=this.getSelectedTorrents();t.length>0&&this.setCurrentPopup(new ne({remote:this.remote,torrents:t,trash:e}))}_startSelectedTorrents(e){this._startTorrents(this.getSelectedTorrents(),e)}_startTorrents(e,t){this.remote.startTorrents(Ae._getTorrentIds(e),t,this.refreshTorrents,this)}_verifyTorrents(e){this.remote.verifyTorrents(Ae._getTorrentIds(e),this.refreshTorrents,this)}_reannounceTorrents(e){this.remote.reannounceTorrents(Ae._getTorrentIds(e),this.refreshTorrents,this)}_stopTorrents(e){this.remote.stopTorrents(Ae._getTorrentIds(e),this.refreshTorrents,this)}changeFileCommand(e,t,n){this.remote.changeFileCommand(e,t,n)}_moveTop(){this.remote.moveTorrentsToTop(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveUp(){this.remote.moveTorrentsUp(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveDown(){this.remote.moveTorrentsDown(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveBottom(){this.remote.moveTorrentsToBottom(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_updateGuiFromSession(e){const[,t,n]=e.version.match(/(.*)\s\(([\da-f]+)\)/);this.version_info={checksum:n,version:t};document.querySelector("#toolbar-overflow").classList.toggle("alt-speed-enabled",e[H])}_updateStatusbar(){const e=I,t=this._getAllTorrents(),n=t.reduce(((e,t)=>e+t.getUploadSpeed()),0),r=t.reduce(((e,t)=>e+t.getDownloadSpeed()),0),o=e.countString("Transfer","Transfers",this._rows.length);h(document.querySelector("#speed-up-label"),e.speedBps(n)),h(document.querySelector("#speed-dn-label"),e.speedBps(r)),h(document.querySelector("#filter-count"),o)}_updateFilterSelect(){const e=this._getTrackers(),t=Object.keys(e).sort();let n="";n+=this.filterTracker?'':'';for(const r of t){n+=``}this.filterTrackersStr&&this.filterTrackersStr===n||(this.filterTrackersStr=n,document.querySelector("#filter-tracker").innerHTML=n)}sortRows(e){const t=e.map((e=>e.getTorrent())),n=e.reduce(((e,t)=>(e[t.getTorrent().getId()]=t,e)),{});L.sortTorrents(t,this.prefs.sort_mode,this.prefs.sort_direction);for(const[r,o]of t.entries())e[r]=n[o.getId()]}_refilter(e){const{sort_mode:t,sort_direction:n,filter_mode:r}=this.prefs,o=this.filterTracker,s=this.torrentRenderer,i=this.elements.torrent_list;let a=null,l=null;const c=/^labels:([\w,]*)(.*)$/.exec(this.filterText);c?(a=c[2].trim(),l=c[1].split(",")):(a=this.filterText,l=[]);const d=()=>[...i.children].length,A=()=>[...i.children].reduce(((e,t)=>e+t.classList.contains("selected")?1:0),0),p=d(),g=A();if(this._updateFilterSelect(),clearTimeout(this.refilterTimer),delete this.refilterTimer,e){for(;i.firstChild;)i.firstChild.remove();this._rows=[],this.dirtyTorrents=new Set(Object.keys(this._torrents))}const u=[];let m=[];for(const e of this._rows)this.dirtyTorrents.has(e.getTorrentId())?m.push(e):u.push(e);for(const e of m)e.getElement().remove();const h=[];for(const e of m){const t=e.getTorrentId(),n=this._torrents[t];n&&n.test(r,o,a,l)&&h.push(e),this.dirtyTorrents.delete(t)}m=h;for(const e of this.dirtyTorrents.values()){const t=this._torrents[e];if(t&&t.test(r,o,a,l)){const e=new de(s,this,t),n=e.getElement();n.row=e,m.push(e),n.addEventListener("click",this._onRowClicked.bind(this)),n.addEventListener("dblclick",(()=>this.action_manager.click("show-inspector")))}}this.sortRows(m);const f=[],b=u.length,C=m.length,v=document.createDocumentFragment();let y=0,E=0;for(;y!==b||E!==C;){let e=null;if(y===b)e=!1;else if(E===C)e=!0;else{e=L.compareTorrents(u[y].getTorrent(),m[E].getTorrent(),t,n)<0}if(e)f.push(u[y++]);else{const e=m[E++],t=e.getElement();y!==b?i.insertBefore(t,u[y].getElement()):v.append(t),f.push(e)}}i.append(v),this._rows=f,this.dirtyTorrents.clear();for(const[e,t]of f.map((e=>e.getElement())).entries()){const n=e%2==0;t.classList.toggle("even",n),t.classList.toggle("odd",!n)}this._updateStatusbar(),g===A()&&p===d()||this.dispatchSelectionChangedSoon()}setFilterTracker(e){document.querySelector("#filter-tracker").value=e?Ae._getReadableDomain(e):"all",this.filterTracker=e,this.refilterAllSoon()}_getTrackers(){const e={};for(const t of this._getAllTorrents()){const n=new Set;for(const r of t.getTrackers()){const{domain:t,name:o}=r;e[o]||(e[o]={count:0,domain:t}),n.add(o)}for(const t of n.values())++e[t].count}return e}popupCloseListener(e){if(e.target!==this.popup)throw new Error(e);this.popup.removeEventListener("close",this.boundPopupCloseListener),delete this.popup}setCurrentPopup(e){this.popup&&this.popup.close(),this.popup=e,this.popup&&this.popup.addEventListener("close",this.boundPopupCloseListener)}}var pe=n(379),ge=n.n(pe),ue=n(592),me={insert:"head",singleton:!1};ge()(ue.Z,me);ue.Z.locals;document.addEventListener("DOMContentLoaded",(function(){const t=new e,n=new b,r=new f(n),o=new Ae(t,r,n),s=c((()=>o.elements.torrent_list.scrollTo(0,1)));window.addEventListener("load",s),window.onorientationchange=s}))})()})(); +(()=>{var e={592:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Ee});var r=n(15),o=n.n(r),s=n(645),i=n.n(s),a=n(667),l=n.n(a),c=n(908),d=n(466),A=n(560),p=n(289),g=n(450),u=n(577),m=n(803),h=n(820),b=n(438),f=n(319),C=n(190),v=n(54),y=n(690),E=n(350),w=n(174),x=n(785),k=n(373),M=n(173),S=n(25),I=n(557),B=n(912),D=n(842),T=n(308),L=n(749),N=n(886),_=n(199),j=n(689),z=n(520),F=n(602),P=n(371),O=n(961),U=n(93),R=n(166),G=i()(o()),Y=l()(c.Z),Q=l()(d.Z),Z=l()(A.Z),W=l()(p.Z),H=l()(g.Z),J=l()(u.Z),q=l()(m.Z),V=l()(h.Z),K=l()(b.Z),X=l()(f.Z),$=l()(C.Z),ee=l()(v.Z),te=l()(y.Z),ne=l()(E.Z),re=l()(w.Z),oe=l()(x.Z),se=l()(k.Z),ie=l()(M.Z),ae=l()(S.Z),le=l()(I.Z),ce=l()(B.Z),de=l()(D.Z),Ae=l()(T.Z),pe=l()(L.Z),ge=l()(N.Z),ue=l()(_.Z),me=l()(j.Z),he=l()(z.Z),be=l()(F.Z),fe=l()(P.Z),Ce=l()(O.Z),ve=l()(U.Z),ye=l()(R.Z);G.push([e.id,":root{--color-bg-even: #fff;--color-bg-hover: #f6f8fa;--color-bg-menu: #e1e4e8;--color-bg-odd: #f6f8fa;--color-bg-selection-1: #e6dcfd;--color-bg-selection-2: #f5f0ff;--color-border: #959da5;--color-fg-disabled: #959da5;--color-fg-error: #d73a49;--color-fg-name: #2f363d;--color-fg-on-popup: #2f363d;--color-fg-port-closed: #d73a49;--color-fg-port-open: #28a745;--color-progressbar-background-1: #f6f8fa;--color-progressbar-background-2: #959da5;--color-progressbar-verify-1: #f692ce;--color-progressbar-verify-2: #b93a86;--color-progressbar-magnet-1: #ffea7f;--color-progressbar-magnet-2: #dbab09;--color-progressbar-magnet-paused-1: #fff5b1;--color-progressbar-magnet-paused-2: #6a737d;--color-progressbar-leech-paused-1: #c8e1ff;--color-progressbar-leech-paused-2: #6a737d;--color-progressbar-leech-queued-1: #dbedff;--color-progressbar-leech-queued-2: #79b8ff;--color-progressbar-leech-1: #79b8ff;--color-progressbar-leech-2: #044289;--color-progressbar-seed-paused-1: #bef5cb;--color-progressbar-seed-paused-2: #6a737d;--color-progressbar-seed-queued-1: #dcffe4;--color-progressbar-seed-queued-2: #85e89d;--color-progressbar-seed-1: #85e89d;--color-progressbar-seed-2: #176f2c;--color-tab-deselected-1: #f6f8fa;--color-tab-deselected-2: #959da5;--color-tab-selected-1: #e6dcfd;--color-tab-selected-2: #f5f0ff;--color-toolbar-background: linear-gradient(#d1d5da, #959da5)}@media(prefers-color-scheme: dark){:root{--color-fg-primary: #f6f8fa;--color-fg-secondary: #959da5;--color-fg-tertiary: #6a737d}}@media(prefers-color-scheme: light){:root{--color-fg-primary: #2f363d;--color-fg-secondary: #6a737d;--color-fg-tertiary: #959da5}}html,body{color:var(--color-fg-primary);font-family:Verdana,Arial,Helvetica,sans-serif;height:100%;margin:0;overflow:hidden}img{border:0}a{outline:0}.hidden{display:none}.even{background-color:var(--color-bg-even)}.odd{background-color:var(--color-bg-odd)}.mainwin{display:flex;flex-direction:column;height:100%;position:relative}.mainwin>*{margin:0;padding:0}.mainwin-workarea{display:flex;flex:1;flex-direction:row;overflow:auto}#mainwin-toolbar{align-items:center;background:var(--color-toolbar-background);border-bottom:1px solid var(--color-border);display:flex;flex-direction:row;height:36px;margin:0;padding:2px;width:100%}#mainwin-toolbar button{background-color:transparent;background-position:center;background-repeat:no-repeat;border:0;border-radius:10px;cursor:pointer;height:36px;margin-right:6px;user-select:none;width:36px}#mainwin-toolbar button:hover:not(:disabled){background-color:var(--color-bg-hover)}#mainwin-toolbar button:disabled{cursor:default;opacity:.25}#mainwin-toolbar>.toolbar-separator{border-left:1px solid var(--color-border);height:25px;margin:0 6px 0 0}#mainwin-toolbar :nth-last-child(2){border:0;flex-grow:1}#toolbar-open{background-image:url("+Y+")}#toolbar-remove{background-image:url("+Q+")}#toolbar-start{background-image:url("+Z+")}#toolbar-pause{background-image:url("+W+")}#toolbar-inspector{background-image:url("+H+")}#toolbar-overflow{background-color:transparent;background-image:url("+J+");background-position:center;background-size:26px;margin-right:4px;width:36px}#toolbar-overflow.alt-speed-enabled{background-image:url("+q+"),url("+J+");background-position:bottom left,center,center;background-size:16px 9px,26px,26px}.mainwin-filterbar{align-items:center;background:var(--color-toolbar-background);border-bottom:1px solid var(--color-border);display:flex;flex-direction:row;font-size:smaller;width:100%}@media(max-width: 599px){.mainwin-filterbar>:not(select):not(input){display:none}.mainwin-filterbar>input{min-width:50px}.mainwin-filterbar>input,.mainwin-filterbar>select{height:100%}}.mainwin-filterbar>*{padding:0 5px}#torrent-search.blur{color:var(--color-fg-tertiary)}.speed-up-icon{background-image:url("+V+");background-repeat:no-repeat;background-size:12px 12px;height:12px;width:12px}.speed-dn-icon{background-image:url("+K+");background-repeat:no-repeat;background-size:12px 12px;height:12px;width:12px}.flex{flex-grow:1}#torrent-container{flex-grow:1;left:0;margin:0;overflow:auto;-webkit-overflow-scrolling:touch;padding:0;right:0}.torrent-container{background-color:#fff}.torrent-list{cursor:pointer;list-style-type:none;margin:0;padding:0;text-align:left;width:100%}.torrent-list .torrent{border-bottom:1px solid var(--color-border);color:var(--color-fg-secondary);user-select:none}.torrent-list .torrent.paused{color:var(--color-fg-disabled)}.torrent-list .torrent .icon{background-position:center,top left}.torrent-list .torrent .icon[data-icon-mime-type=audio]{background-image:url("+X+")}.torrent-list .torrent .icon[data-icon-mime-type=audio][data-icon-multifile=true]{background-image:url("+X+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=application]{background-image:url("+ee+")}.torrent-list .torrent .icon[data-icon-mime-type=application][data-icon-multifile=true]{background-image:url("+ee+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=font]{background-image:url("+te+")}.torrent-list .torrent .icon[data-icon-mime-type=font][data-icon-multifile=true]{background-image:url("+te+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=image]{background-image:url("+ne+")}.torrent-list .torrent .icon[data-icon-mime-type=image][data-icon-multifile=true]{background-image:url("+ne+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=model]{background-image:url("+re+")}.torrent-list .torrent .icon[data-icon-mime-type=model][data-icon-multifile=true]{background-image:url("+re+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=text]{background-image:url("+oe+")}.torrent-list .torrent .icon[data-icon-mime-type=text][data-icon-multifile=true]{background-image:url("+oe+"),url("+$+")}.torrent-list .torrent .icon[data-icon-mime-type=video]{background-image:url("+se+")}.torrent-list .torrent .icon[data-icon-mime-type=video][data-icon-multifile=true]{background-image:url("+se+"),url("+$+')}.torrent-list .torrent.compact{align-items:center;display:flex;flex-direction:row-reverse}.torrent-list .torrent.compact .icon{background-size:16px,8px;flex-shrink:0;height:16px;width:16px}.torrent-list .torrent.compact>*{margin:4px 5px}.torrent-list .torrent:not(.compact){align-items:center;display:grid;grid-column-gap:12px;grid-template-areas:"icon name labels" "icon peers peers" "icon progressbar progressbar" "icon progress-text progress-text";grid-template-columns:32px auto 1fr;padding:2px 12px}.torrent-list .torrent:not(.compact) .icon{background-size:32px,16px;grid-area:icon;height:32px;width:32px}.torrent-list .torrent:not(.compact) .torrent-name{grid-area:name}.torrent-list .torrent:not(.compact) .torrent-labels{grid-area:labels}.torrent-list .torrent:not(.compact) .torrent-peer-details{grid-area:peers}.torrent-list .torrent:not(.compact) .torrent-progress{display:flex;flex-direction:row;grid-area:progressbar}.torrent-list .torrent:not(.compact) .torrent-progress-details{grid-area:progress-text}.torrent-list .torrent:not(.compact)>*{margin:1px 0}.torrent-list .torrent.selected{background-color:var(--color-bg-selection-1)}.torrent-list .torrent.selected .torrent-progress-details.error,.torrent-list .torrent.selected .torrent-peer-details.error{color:#fff}.torrent-list .icon{background-position:center;background-repeat:no-repeat}.torrent-list .torrent-pauseresume-button{background-position:center center;background-repeat:no-repeat;background-size:14px;margin-left:7px;width:14px}.torrent-list .torrent-pauseresume-button[data-action=pause]{background-image:url('+ie+")}.torrent-list .torrent-pauseresume-button[data-action=pause]:active,.torrent-list .torrent-pauseresume-button[data-action=pause]:hover{background-image:url("+ae+")}.torrent-list .torrent-pauseresume-button[data-action=resume]{background-image:url("+le+")}.torrent-list .torrent-pauseresume-button[data-action=resume]:active,.torrent-list .torrent-pauseresume-button[data-action=resume]:hover{background-image:url("+ce+")}.torrent-list .torrent-progress-details.error,.torrent-list .torrent-peer-details.error{color:var(--color-fg-error)}.torrent-list .torrent-name{font-weight:bold;margin-bottom:2px;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.torrent-list .torrent-name.compact{font-size:1em;font-weight:normal}.torrent-list .torrent-name:not(.paused){color:var(--color-fg-name)}.torrent-list .torrent-labels{font-size:x-small;font-weight:normal;margin-bottom:2px;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.torrent-list .torrent-labels.compact{flex:1;font-size:x-small}.torrent-list .torrent-progress-details,.torrent-list .torrent-peer-details{font-size:x-small}.torrent-list .torrent-progress-bar{background-repeat:no-repeat;border-radius:3px;border-style:solid;border-width:1px;height:12px}.torrent-list .torrent-progress-bar.full{flex-grow:1;margin:2px 0}.torrent-list .torrent-progress-bar.compact{min-width:50px;width:50px}.torrent-list .torrent-progress-bar.leech.paused{background:linear-gradient(to bottom, var(--color-progressbar-leech-paused-1), var(--color-progressbar-leech-paused-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.leech.queued{background:linear-gradient(to bottom, var(--color-progressbar-leech-queued-1), var(--color-progressbar-leech-queued-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.leech{background:linear-gradient(to bottom, var(--color-progressbar-leech-1), var(--color-progressbar-leech-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.magnet.paused{background:linear-gradient(to bottom, var(--color-progressbar-magnet-paused-1), var(--color-progressbar-magnet-paused-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.magnet{background:linear-gradient(to bottom, var(--color-progressbar-magnet-1), var(--color-progressbar-magnet-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.seed.paused{background:linear-gradient(to bottom, var(--color-progressbar-seed-paused-1), var(--color-progressbar-seed-paused-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.seed.queued{background:linear-gradient(to bottom, var(--color-progressbar-seed-queued-1), var(--color-progressbar-seed-queued-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.seed{background:linear-gradient(to bottom, var(--color-progressbar-seed-1), var(--color-progressbar-seed-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}.torrent-list .torrent-progress-bar.verify{background:linear-gradient(to bottom, var(--color-progressbar-verify-1), var(--color-progressbar-verify-2) 80%),linear-gradient(to bottom, var(--color-progressbar-background-1), var(--color-progressbar-background-2) 80%);background-repeat:no-repeat}#inspector-tab-info{background-image:url("+de+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#inspector-tab-info:active,#inspector-tab-info:checked,#inspector-tab-info.selected{background-image:url("+de+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#inspector-tab-peers{background-image:url("+Ae+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#inspector-tab-peers:active,#inspector-tab-peers:checked,#inspector-tab-peers.selected{background-image:url("+Ae+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#inspector-tab-tiers{background-image:url("+pe+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#inspector-tab-tiers:active,#inspector-tab-tiers:checked,#inspector-tab-tiers.selected{background-image:url("+pe+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#inspector-tab-files{background-image:url("+ge+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#inspector-tab-files:active,#inspector-tab-files:checked,#inspector-tab-files.selected{background-image:url("+ge+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}@media(max-width: 599px){#inspector,#prefs-dialog{left:0}}@media(min-width: 600px){#inspector,#prefs-dialog{border-left:1px solid var(--color-fg-secondary);width:570px}}#prefs-dialog{background:#fff;bottom:0;box-shadow:0 3px 6px rgba(0,0,0,.7);position:absolute;right:0;top:61px;z-index:2}#prefs-dialog .tabs-page{grid-column-gap:8px;grid-row-gap:5px;grid-template-columns:1fr 1fr;margin:20px}#prefs-dialog .tabs-page:not(.hidden){display:grid}#prefs-dialog .tabs-page .section-label{font-weight:bold;grid-column:span 2;margin-left:-20px;padding-bottom:5px}#prefs-dialog .tabs-page .section-label:not(:first-of-type){margin-top:20px}#prefs-dialog .alt-speed-section-label{background:transparent url("+q+") no-repeat;background-position:left 4px;padding-left:22px}#prefs-dialog :disabled,#prefs-dialog .disabled{color:var(--color-fg-disabled)}#prefs-dialog #alt-times-div,#prefs-dialog #autostart-div,#prefs-dialog #port-forwarding,#prefs-dialog #randomize-port,#prefs-dialog #suffix-div,#prefs-dialog #use-dht-div,#prefs-dialog #use-lpd-div,#prefs-dialog #use-pex-div,#prefs-dialog #utp-enabled,#prefs-dialog .alt-speed-label{grid-column:span 2}#prefs-dialog .blocklist-size-label,#prefs-dialog .blocklist-update-button,#prefs-dialog .port-status{grid-column:2/3}#prefs-dialog .blocklist-size-label{font-size:smaller}#prefs-dialog .blocklist-size-number{font-weight:bolder}#prefs-dialog .port-status-label{display:inline-block;font-weight:bold;margin-left:5px}#prefs-dialog .port-status-label[data-open=true]{color:var(--color-fg-port-open)}#prefs-dialog .port-status-label[data-open=false]{color:var(--color-fg-port-closed)}#prefs-dialog .alt-speed-label{font-size:smaller;font-style:lighter;margin:-10px 0 10px -20px}#prefs-dialog.ui-tabs .ui-tabs-panel{padding:0;user-select:none}.prefs-section{text-align:left}.prefs-section>*{padding:0 8px 8px}.prefs-section .title{font-size:larger;font-weight:bold;padding-left:0}.prefs-section .row .key{float:left;padding-top:3px}.prefs-section .row .key>*{margin-left:0}.prefs-section .row .value{margin-left:150px}.prefs-section .row .value>*{width:100%}.prefs-section .checkbox-row>input{margin:0}.prefs-section .checkbox-row>label{margin-left:5px}.prefs-section #alternative-speed-limits-title{background:transparent url("+q+") no-repeat;padding-left:18px}.prefs-section #alternative-speed-limits-desc{font-size:smaller;padding-bottom:4px}.tabs-container{align-items:stretch;background:#fff;border-left:solid 1px var(--color-border);bottom:0;display:flex;flex-direction:column;position:absolute;right:0;top:61px;z-index:2}@media(max-width: 599px){.tabs-container{left:0}}@media(min-width: 600px){.tabs-container{width:550px}}.tabs-buttons{align-self:center;display:flex;padding:10px}.tabs-buttons button{border:1px solid var(--color-border);cursor:pointer;display:inline-block;padding:3px;user-select:none;appearance:none;padding:3px}.file-priority-radiobox :first-child,.tabs-buttons :first-child{border-bottom-left-radius:8px;border-top-left-radius:8px}.file-priority-radiobox :last-child,.tabs-buttons :last-child{border-bottom-right-radius:8px;border-top-right-radius:8px}.tabs-pages{box-sizing:border-box;flex:1;overflow-x:hidden;overflow-y:auto}@media(max-width: 599px){.tabs-pages{padding:0 8px 20px}}@media(min-width: 600px){.tabs-pages{padding:0 20px 20px}}.tabs-button{background-position:center;background-repeat:no-repeat}#inspector{box-shadow:0 3px 6px rgba(0,0,0,.7)}.inspector-info-page{grid-column-gap:8px;grid-row-gap:5px;grid-template-columns:auto 1fr;margin:20px;padding:12px}.inspector-info-page:not(.hidden){display:grid}.inspector-info-page .section-label{font-weight:bold;grid-column:span 2;margin-left:-20px;padding-bottom:5px}.inspector-info-page .section-label:not(:first-of-type){margin-top:20px}.inspector-info-page :not(.section-label){overflow-x:hidden;text-overflow:ellipsis}.inspector-info-magnet button{background-color:transparent;background-image:url("+ue+");background-position:top;background-repeat:no-repeat;border:0;cursor:pointer;height:1rem;vertical-align:middle;width:1rem}#inspector .tabs-button,#prefs-dialog .tabs-button{background-size:20px 20px,40px 30px;height:30px;margin:0;padding:0;width:40px}#prefs-tab-torrent{background-image:url("+me+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#prefs-tab-torrent:active,#prefs-tab-torrent:checked,#prefs-tab-torrent.selected{background-image:url("+me+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#prefs-tab-speed{background-image:url("+he+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#prefs-tab-speed:active,#prefs-tab-speed:checked,#prefs-tab-speed.selected{background-image:url("+he+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#prefs-tab-peers{background-image:url("+Ae+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#prefs-tab-peers:active,#prefs-tab-peers:checked,#prefs-tab-peers.selected{background-image:url("+Ae+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#prefs-tab-network{background-image:url("+be+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}#prefs-tab-network:active,#prefs-tab-network:checked,#prefs-tab-network.selected{background-image:url("+be+'),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}#inspector-file-list{margin:0;padding:0}#inspector-file-list .inspector-torrent-file-list-entry{display:grid;grid-column-gap:5px;grid-template-areas:"check name priority" "blank1 info blank2";grid-template-columns:20px 1fr 65px;margin-bottom:4px;padding:5px}#inspector-file-list .inspector-torrent-file-list-entry.skip{opacity:.5}#inspector-file-list .file-wanted-control{grid-area:check}#inspector-file-list .inspector-torrent-file-list-entry-name{color:var(--color-fg-name);cursor:pointer;grid-area:name;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#inspector-file-list .inspector-torrent-file-list-entry.skip>.inspector-torrent-file-list-entry-name{color:var(--color-fg-disabled)}#inspector-file-list .inspector-torrent-file-list-entry-progress{color:var(--color-fg-secondary);grid-area:info}#inspector-file-list .single-file .inspector-torrent-file-list-entry>.file-wanted-control,#inspector-file-list .inspector-torrent-file-list-entry.complete>.file-wanted-control{cursor:default}#inspector-header{margin:8px 0}#torrent-inspector-name{font-size:large;font-weight:bold}#inspector-tiers-list{color:var(--color-fg-secondary);margin:0 10px;padding:0 12px}#inspector-tiers-list .tier-list-row{display:grid;grid-column-gap:8px;grid-row-gap:4px;margin-top:8px}#inspector-tiers-list .tier-list-torrent{color:var(--color-fg-primary);font-size:larger;font-weight:bolder;margin-left:-12px;overflow-x:hidden;padding-top:20px;text-overflow:ellipsis;white-space:nowrap}#inspector-tiers-list .tier-list-tracker{font-weight:bolder;grid-column:span 2;margin-top:8px;padding-bottom:4px}#inspector-tiers-list .tier-announce,#inspector-tiers-list .tier-scrape,#inspector-tiers-list .tier-state{text-align:left}#inspector-tiers-list .tier-downloads,#inspector-tiers-list .tier-leechers,#inspector-tiers-list .tier-seeders{text-align:right}.peer-list{border:1px solid #f6f8fa;border-collapse:collapse;cursor:default;table-layout:fixed;text-align:left;width:100%}.peer-list td,.peer-list th{font-size:smaller;padding:5px}.peer-list td{border:1px solid #f6f8fa;color:var(--color-fg-secondary)}.peer-list .torrent-row td{background:#f6f8fa;color:var(--color-fg-primary);font-size:normal;font-weight:bolder;overflow-x:hidden;padding:10px;text-overflow:ellipsis;white-space:nowrap}.peer-list .encryption{width:16px}.peer-list .encryption[data-encrypted=true]{background:transparent url('+fe+") center center no-repeat;height:16px;width:16px}.peer-list .peer-address,.peer-list .percent-done,.peer-list .speed-down,.peer-list .speed-up{text-align:right}.peer-list .percent-done{width:10%}.peer-list .speed-down,.peer-list .speed-up{width:15%}.peer-list .peer-address{width:25%}.peer-list .peer-app-name{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width: 599px){.peer-list .peer-app-name{display:none}}@media(min-width: 600px){.peer-list .peer-app-name{width:25%}}.peer-list .status{cursor:pointer}.file-priority-radiobox{grid-area:priority}.file-priority-radiobox>*{border:1px solid var(--color-border);cursor:pointer;display:inline-block;padding:3px;user-select:none;appearance:none;background-position:center;background-repeat:no-repeat;background-size:10px,20px;height:20px;margin:0;padding:0;width:20px}.file-priority-radiobox>.low{background-image:url("+K+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2));border-right-width:0}.file-priority-radiobox>.low:active,.file-priority-radiobox>.low:checked,.file-priority-radiobox>.low.selected{background-image:url("+K+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}.file-priority-radiobox>.normal{background-image:url("+Ce+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2))}.file-priority-radiobox>.normal:active,.file-priority-radiobox>.normal:checked,.file-priority-radiobox>.normal.selected{background-image:url("+Ce+"),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}.file-priority-radiobox>.high{background-image:url("+V+"),linear-gradient(var(--color-tab-deselected-1), var(--color-tab-deselected-2));border-left-width:0}.file-priority-radiobox>.high:active,.file-priority-radiobox>.high:checked,.file-priority-radiobox>.high.selected{background-image:url("+V+'),linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2))}.context-menu{background:var(--color-bg-menu);box-shadow:0 3px 6px rgba(0,0,0,.7);color:var(--color-fg-on-popup);position:absolute;z-index:2}.context-menu .context-menuitem{list-style:none;padding:5px 10px}.context-menu .context-menuitem:hover:not(:disabled),.context-menu .context-menuitem:focus:not(:disabled){background-image:linear-gradient(#fff, var(--color-bg-menu));cursor:pointer}.context-menu .context-menuitem:disabled{color:var(--color-fg-disabled);cursor:none}.context-menu-separator{border-bottom:1px solid var(--color-fg-secondary);margin-bottom:10px;padding-bottom:10px}.overflow-menu{background:linear-gradient(160deg, #d21, 1%, var(--color-bg-hover), 40%, var(--color-bg-menu));border-radius:8px;box-shadow:0 3px 6px rgba(0,0,0,.7);color:var(--color-fg-on-popup);padding:20px;position:fixed;width:200px;z-index:2}.overflow-menu fieldset{border:0;margin-bottom:8px;padding:0}.overflow-menu>.actions,.overflow-menu>.info,.overflow-menu>.links{display:flex;flex-direction:column}.overflow-menu legend{font-weight:bolder;margin-bottom:4px}.overflow-menu legend~*{margin-left:12px}.overflow-menu a,.overflow-menu button,.overflow-menu label{font-size:1em}.overflow-menu a:disabled,.overflow-menu button:disabled,.overflow-menu label:disabled{color:var(--color-fg-disabled);cursor:default}.overflow-menu a:focus:not(:disabled),.overflow-menu a:hover:not(:disabled),.overflow-menu button:focus:not(:disabled),.overflow-menu button:hover:not(:disabled),.overflow-menu label:focus:not(:disabled),.overflow-menu label:hover:not(:disabled){background-color:var(--color-bg-hover)}.overflow-menu a,.overflow-menu button{background:transparent;border:0;cursor:pointer;display:block;padding:4px 0;text-align:left;text-decoration:none;width:150px}.overflow-menu .input-and-label{align-items:center;display:inline-flex;flex-direction:row}.overflow-menu #display-options>*{align-items:center;display:inline-flex;flex-direction:row}.overflow-menu #display-options>*>*{margin:4px}.overflow-menu #display-options>* :first-child{margin-left:0}.overflow-menu #display-options>* :last-child{margin-right:0}.overflow-menu #speed-options{display:flex;flex-direction:column}.overflow-menu #speed-options>.speed-up,.overflow-menu #speed-options>.speed-down{align-items:center;display:flex;flex-direction:row;padding:4px 0}.overflow-menu #speed-options>.speed-up>label,.overflow-menu #speed-options>.speed-down>label{overflow:hidden;width:80px}.overflow-menu #speed-options .alt-speed{display:grid;grid-column-gap:5px;grid-row-gap:5px;grid-template-areas:"check lb" "turtle values";grid-template-columns:20px 1fr;margin-bottom:4px}.overflow-menu #speed-options #alt-speed-check{grid-area:check}.overflow-menu #speed-options #alt-speed-check:checked~#alt-speed-image{background-image:url('+q+")}.overflow-menu #speed-options #alt-speed-check:not(:checked)~#alt-speed-image{background-image:url("+ve+')}.overflow-menu #speed-options #alt-speed-image{background-position:center;background-repeat:no-repeat;grid-area:turtle}.overflow-menu #speed-options #alt-speed-label{grid-area:lb}.overflow-menu #speed-options #alt-speed-values-label{font-size:small;grid-area:values}@media(min-width: 600px){#display-fullscreen-check,#display-fullscreen-label{display:none}}@media(max-width: 599px){.dialog-buttons{padding-top:13.3333333333px}.dialog-container{opacity:96%;position:absolute;top:61px;width:100%}.dialog-logo{padding-bottom:13.3333333333px}.dialog-window{align-items:center;display:flex;flex-direction:column}}@media(min-width: 600px){.dialog-container{left:50%;min-width:400px;position:absolute;top:122px;transform:translateX(-50%)}.dialog-heading{grid-area:heading}.dialog-logo{grid-area:icon;padding-right:13.3333333333px}.dialog-window{color:var(--color-fg-on-popup);display:grid;grid-column-gap:12px;grid-template-areas:"icon heading" "icon message" "icon workarea" "icon buttons";grid-template-columns:64px 1fr;padding:2px 12px}}.dialog-buttons{display:flex;float:right;grid-area:buttons;margin:10px 0 0;text-align:center}.dialog-buttons button{appearance:none;background:transparent;border:1px solid var(--color-border);border-radius:5px;color:var(--color-fg-name);margin-left:8px;padding:8px;text-decoration:none}.dialog-buttons a:hover,.dialog-buttons a:active{background:linear-gradient(#fff, var(--color-bg-menu))}.dialog-buttons-begin{flex-grow:1}.dialog-buttons-end{display:none}.dialog-container{border:0;box-shadow:0 3px 6px rgba(0,0,0,.7);color:var(--color-fg-primary);display:block;margin:0;padding:0;z-index:2}.dialog-heading{align-items:center;display:flex;font-size:1.2em;font-weight:bold}.dialog-logo{background:transparent url('+ye+") top left no-repeat;height:64px;width:64px}.dialog-message{grid-area:message;margin:10px 0 0}.dialog-window{background:linear-gradient(160deg, #d21, 1%, #f7f7f7, 40%, #ccc);height:100%;padding:20px}.dialog-workarea{display:flex;flex-direction:column;grid-area:workarea;margin:10px 0 0}.dialog-workarea>*{margin-bottom:5px}.about-dialog .dialog-workarea>*{margin-bottom:10px}.about-dialog-version-number{margin-left:4px}.about-dialog-version-checksum{font-size:small;font-style:italic;font-weight:normal;margin-left:auto;padding-left:10px}.shortcuts-dialog table{border-collapse:collapse;width:100%}.shortcuts-dialog th,.shortcuts-dialog td{border:1px solid var(--color-border);padding:5px 10px}#torrent-rename-name{min-width:400px}#move-container #torrent-path{min-width:400px}.tabs-pages .content,.inspector-info-page .content,.statistics-dialog .content{column-gap:16px;display:grid;grid-row-gap:6px;grid-template-columns:auto 1fr;margin-top:4px}@media(max-width: 599px){.tabs-pages .content,.inspector-info-page .content,.statistics-dialog .content{margin:4px 0 16px}}@media(min-width: 600px){.tabs-pages .content,.inspector-info-page .content,.statistics-dialog .content{margin:4px 16px 16px}}.tabs-pages .content div,.inspector-info-page .content div,.statistics-dialog .content div{word-break:break-word}.tabs-pages fieldset,.inspector-info-page fieldset,.statistics-dialog fieldset{border:0;margin:0;padding:0}.tabs-pages legend,.inspector-info-page legend,.statistics-dialog legend{font-weight:bolder;margin-bottom:4px}#free-space-text{display:inline-block;float:right;font-size:smaller;font-style:italic}#torrent-upload-frame{border:0;display:block;height:0;left:-1000px;margin:0;padding:0;position:absolute;top:-1000px;width:0}.ui-menu{width:200px}","",{version:3,sources:["webpack://./style/transmission-app.scss"],names:[],mappings:"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",sourcesContent:["@use 'sass:color';\n@use 'sass:math';\n\n// Color palette recycled from GitHub Primer.\n// Please use those values if you need to add colors.\n// https://primer.style/css/support/color-system\n$blue-100: #dbedff;\n$blue-200: #c8e1ff;\n$blue-300: #79b8ff;\n$blue-700: #044289;\n$green-100: #dcffe4;\n$green-200: #bef5cb;\n$green-300: #85e89d;\n$green-500: #28a745;\n$green-700: #176f2c;\n$grey-100: #f6f8fa;\n$grey-200: #e1e4e8;\n$grey-300: #d1d5da;\n$grey-400: #959da5;\n$grey-500: #6a737d;\n$grey-800: #2f363d;\n$pink-300: #f692ce;\n$pink-700: #b93a86;\n$purple-000: #f5f0ff;\n$purple-100: #e6dcfd;\n$red-500: #d73a49;\n$white: #fff;\n$yellow-200: #fff5b1;\n$yellow-300: #ffea7f;\n$yellow-700: #dbab09;\n\n// Z-INDEX ENUM\n// $z-index-progressbar: 1;\n$z-index-popup: 2;\n\n// SVG ICONS -- see images/README.md for sources and license details\n// Are you a designer? New icon PRs welcomed!\n$image-analytics: 'images/analytics.svg';\n$image-baseline: 'images/horizontal-rule.svg';\n$image-files: 'images/files.svg';\n$image-chevron-dn: 'images/chevron-down.svg';\n$image-chevron-up: 'images/chevron-up.svg';\n$image-lock-fill: 'images/lock-fill.svg';\n$image-network: 'images/router.svg';\n$image-magnet: 'images/magnet.svg';\n$image-overflow: 'images/three-dots-vertical.svg';\n$image-pause-circle-active: 'images/pause-circle-active.svg';\n$image-pause-circle-idle: 'images/pause-circle-idle.svg';\n$image-peers: 'images/team.svg';\n$image-play-circle-active: 'images/play-circle-active.svg';\n$image-play-circle-idle: 'images/play-circle-idle.svg';\n$image-speed: 'images/checkered-flag.svg';\n$image-tiers: 'images/diagram-3-fill.svg';\n$image-upload-download: 'images/up-and-down-arrows.svg';\n\n@mixin for-phone-only {\n @media (max-width: 599px) {\n @content;\n }\n}\n@mixin for-tablet-portrait-up {\n @media (min-width: 600px) {\n @content;\n }\n}\n// @mixin for-tablet-landscape-up {media (min-width: 900px) { @content; }}\n// @mixin for-desktop-up {@media (min-width: 1200px) { @content; }}\n// @mixin for-big-desktop-up {@media (min-width: 1800px) { @content; }}\n\n/// MIXINS\n\n@mixin image-on-vertical-gradient($src, $topColor, $bottomColor) {\n background-image: url($src), linear-gradient($topColor, $bottomColor);\n}\n\n@mixin button {\n border: 1px solid var(--color-border);\n cursor: pointer;\n display: inline-block;\n padding: 3px;\n user-select: none;\n}\n\n@mixin rounded-box($radius) {\n border-radius: $radius;\n}\n\n@mixin rounded-button($radius) {\n @include button;\n border-radius: $radius;\n}\n\n/// GLOBAL\n\n:root {\n --color-bg-even: #{$white};\n --color-bg-hover: #{$grey-100};\n --color-bg-menu: #{$grey-200};\n --color-bg-odd: #{$grey-100};\n --color-bg-selection-1: #{$purple-100};\n --color-bg-selection-2: #{$purple-000};\n --color-border: #{$grey-400};\n --color-fg-disabled: #{$grey-400};\n --color-fg-error: #{$red-500};\n --color-fg-name: #{$grey-800};\n --color-fg-on-popup: #{$grey-800};\n --color-fg-port-closed: #{$red-500};\n --color-fg-port-open: #{$green-500};\n @media (prefers-color-scheme: dark) {\n --color-fg-primary: #{$grey-100};\n --color-fg-secondary: #{$grey-400};\n --color-fg-tertiary: #{$grey-500};\n }\n @media (prefers-color-scheme: light) {\n --color-fg-primary: #{$grey-800};\n --color-fg-secondary: #{$grey-500};\n --color-fg-tertiary: #{$grey-400};\n }\n --color-progressbar-background-1: #{$grey-100};\n --color-progressbar-background-2: #{$grey-400};\n --color-progressbar-verify-1: #{$pink-300};\n --color-progressbar-verify-2: #{$pink-700};\n --color-progressbar-magnet-1: #{$yellow-300};\n --color-progressbar-magnet-2: #{$yellow-700};\n --color-progressbar-magnet-paused-1: #{$yellow-200};\n --color-progressbar-magnet-paused-2: #{$grey-500};\n --color-progressbar-leech-paused-1: #{$blue-200};\n --color-progressbar-leech-paused-2: #{$grey-500};\n --color-progressbar-leech-queued-1: #{$blue-100};\n --color-progressbar-leech-queued-2: #{$blue-300};\n --color-progressbar-leech-1: #{$blue-300};\n --color-progressbar-leech-2: #{$blue-700};\n --color-progressbar-seed-paused-1: #{$green-200};\n --color-progressbar-seed-paused-2: #{$grey-500};\n --color-progressbar-seed-queued-1: #{$green-100};\n --color-progressbar-seed-queued-2: #{$green-300};\n --color-progressbar-seed-1: #{$green-300};\n --color-progressbar-seed-2: #{$green-700};\n --color-tab-deselected-1: #{$grey-100};\n --color-tab-deselected-2: #{$grey-400};\n --color-tab-selected-1: #{$purple-100};\n --color-tab-selected-2: #{$purple-000};\n --color-toolbar-background: linear-gradient(#{$grey-300}, #{$grey-400});\n}\n\nhtml,\nbody {\n color: var(--color-fg-primary);\n font-family: Verdana, Arial, Helvetica, sans-serif;\n height: 100%;\n margin: 0;\n overflow: hidden;\n}\n\nimg {\n border: 0;\n}\n\na {\n outline: 0;\n}\n\n.hidden {\n display: none;\n}\n\n.even {\n background-color: var(--color-bg-even);\n}\n.odd {\n background-color: var(--color-bg-odd);\n}\n\n.mainwin {\n display: flex;\n flex-direction: column;\n height: 100%;\n position: relative;\n\n > * {\n margin: 0;\n padding: 0;\n }\n}\n\n.mainwin-workarea {\n display: flex;\n flex: 1;\n flex-direction: row;\n overflow: auto;\n}\n\n/// TOOLBAR\n\n$toolbar-height-number: 36;\n$toolbar-height: $toolbar-height-number * 1px;\n\n#mainwin-toolbar {\n align-items: center;\n background: var(--color-toolbar-background);\n border-bottom: 1px solid var(--color-border);\n display: flex;\n flex-direction: row;\n height: $toolbar-height;\n margin: 0;\n padding: 2px;\n width: 100%;\n\n button {\n background-color: transparent;\n background-position: center;\n background-repeat: no-repeat;\n border: 0;\n border-radius: 10px;\n cursor: pointer;\n height: $toolbar-height;\n margin-right: 6px;\n user-select: none;\n width: $toolbar-height;\n\n &:hover:not(:disabled) {\n background-color: var(--color-bg-hover);\n }\n\n &:disabled {\n cursor: default;\n opacity: 0.25;\n }\n }\n\n > .toolbar-separator {\n border-left: 1px solid var(--color-border);\n height: 25px;\n margin: 0 6px 0 0;\n }\n\n :nth-last-child(2) {\n border: 0;\n flex-grow: 1;\n }\n}\n\n#toolbar-open {\n background-image: url('images/toolbar-folder.png');\n}\n\n#toolbar-remove {\n background-image: url('images/toolbar-close.png');\n}\n\n#toolbar-start {\n background-image: url('images/toolbar-start.png');\n}\n\n#toolbar-pause {\n background-image: url('images/toolbar-pause.png');\n}\n\n#toolbar-inspector {\n background-image: url('images/toolbar-info.png');\n}\n\n#toolbar-overflow {\n background-color: transparent;\n background-image: url($image-overflow);\n background-position: center;\n background-size: 26px;\n margin-right: 4px;\n width: 36px;\n\n &.alt-speed-enabled {\n background-image: url('images/blue-turtle.png'), url($image-overflow);\n background-position: bottom left, center, center;\n background-size: 16px 9px, 26px, 26px;\n }\n}\n\n/// FILTERBAR\n\n// $filterbar-height-number: 30;\n// $filterbar-height: $filterbar-height-number * 1px;\n\n.mainwin-filterbar {\n align-items: center;\n background: var(--color-toolbar-background);\n border-bottom: 1px solid var(--color-border);\n display: flex;\n flex-direction: row;\n font-size: smaller;\n // height: $filterbar-height;\n width: 100%;\n\n @include for-phone-only {\n > :not(select):not(input) {\n display: none;\n }\n > input {\n min-width: 50px;\n }\n > input,\n > select {\n height: 100%;\n }\n }\n\n > * {\n padding: 0 5px;\n }\n}\n\n#torrent-search {\n &.blur {\n color: var(--color-fg-tertiary);\n }\n}\n\n$speed-icon-size: 12px;\n\n.speed-up-icon {\n background-image: url($image-chevron-up);\n background-repeat: no-repeat;\n background-size: $speed-icon-size $speed-icon-size;\n height: $speed-icon-size;\n width: $speed-icon-size;\n}\n\n.speed-dn-icon {\n background-image: url($image-chevron-dn);\n background-repeat: no-repeat;\n background-size: $speed-icon-size $speed-icon-size;\n height: $speed-icon-size;\n width: $speed-icon-size;\n}\n\n/// TORRENT CONTAINER\n\n$pauseresume-size-number: 14;\n$pauseresume-size: $pauseresume-size-number * 1px;\n$progressbar-border-number: 1;\n$progressbar-height-number: 14;\n$popup-top: 61px; // TODO: ugly that this is hardcoded\n\n.flex {\n flex-grow: 1;\n}\n\n#torrent-container {\n flex-grow: 1;\n left: 0;\n margin: 0;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n padding: 0;\n right: 0;\n}\n\n.torrent-container {\n background-color: $white;\n}\n\n.torrent-list {\n $app-image: 'images/application-x-executable.png';\n $audio-image: 'images/audio-x-generic.png';\n $folder-image: 'images/folder.png';\n $font-image: 'images/font-x-generic.png';\n $image-image: 'images/image-x-generic.png';\n $package-image: 'images/package-x-generic.png';\n $text-image: 'images/folder.png';\n $text-image: 'images/text-x-generic.png';\n $video-image: 'images/video-x-generic.png';\n\n cursor: pointer;\n list-style-type: none;\n margin: 0;\n padding: 0;\n text-align: left;\n width: 100%;\n\n .torrent {\n border-bottom: 1px solid var(--color-border);\n color: var(--color-fg-secondary);\n user-select: none;\n\n &.paused {\n color: var(--color-fg-disabled);\n }\n\n .icon {\n background-position: center, top left;\n\n @mixin mime-icon-compact($mime-icon) {\n background-image: url($mime-icon);\n\n &[data-icon-multifile='true'] {\n background-image: url($mime-icon), url($folder-image);\n }\n }\n\n &[data-icon-mime-type='audio'] {\n @include mime-icon-compact($audio-image);\n }\n\n &[data-icon-mime-type='application'] {\n @include mime-icon-compact($app-image);\n }\n\n &[data-icon-mime-type='font'] {\n @include mime-icon-compact($font-image);\n }\n\n &[data-icon-mime-type='image'] {\n @include mime-icon-compact($image-image);\n }\n\n &[data-icon-mime-type='model'] {\n @include mime-icon-compact($package-image);\n }\n\n &[data-icon-mime-type='text'] {\n @include mime-icon-compact($text-image);\n }\n\n &[data-icon-mime-type='video'] {\n @include mime-icon-compact($video-image);\n }\n }\n\n &.compact {\n $icon-size-num: 16;\n $icon-size: $icon-size-num * 1px;\n\n align-items: center;\n display: flex;\n flex-direction: row-reverse;\n\n .icon {\n background-size: $icon-size, $icon-size-num * 0.5px;\n flex-shrink: 0;\n height: $icon-size;\n width: $icon-size;\n }\n\n > * {\n margin: 4px 5px;\n }\n }\n\n &:not(.compact) {\n $icon-size-num: 32;\n $icon-size: $icon-size-num * 1px;\n align-items: center;\n display: grid;\n grid-column-gap: 12px;\n grid-template-areas:\n 'icon name labels'\n 'icon peers peers'\n 'icon progressbar progressbar'\n 'icon progress-text progress-text';\n grid-template-columns: $icon-size auto 1fr;\n padding: 2px 12px;\n\n .icon {\n background-size: $icon-size, $icon-size-num * 0.5px;\n grid-area: icon;\n height: $icon-size;\n width: $icon-size;\n }\n\n .torrent-name {\n grid-area: name;\n }\n\n .torrent-labels {\n grid-area: labels;\n }\n\n .torrent-peer-details {\n grid-area: peers;\n }\n\n .torrent-progress {\n display: flex;\n flex-direction: row;\n grid-area: progressbar;\n }\n\n .torrent-progress-details {\n grid-area: progress-text;\n }\n\n > * {\n margin: 1px 0;\n }\n }\n\n &.selected {\n background-color: var(--color-bg-selection-1);\n }\n\n &.selected .torrent-progress-details.error,\n &.selected .torrent-peer-details.error {\n color: $white;\n }\n }\n\n .icon {\n background-position: center;\n background-repeat: no-repeat;\n }\n\n .torrent-pauseresume-button {\n background-position: center center;\n background-repeat: no-repeat;\n background-size: $pauseresume-size;\n margin-left: math.floor(math.div($pauseresume-size-number, 2)) * 1px;\n width: $pauseresume-size;\n\n &[data-action='pause'] {\n background-image: url($image-pause-circle-idle);\n &:active,\n &:hover {\n background-image: url($image-pause-circle-active);\n }\n }\n &[data-action='resume'] {\n background-image: url($image-play-circle-idle);\n &:active,\n &:hover {\n background-image: url($image-play-circle-active);\n }\n }\n }\n\n .torrent-progress-details.error,\n .torrent-peer-details.error {\n color: var(--color-fg-error);\n }\n\n .torrent-name {\n font-weight: bold;\n margin-bottom: 2px;\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &.compact {\n font-size: 1em;\n font-weight: normal;\n }\n\n &:not(.paused) {\n color: var(--color-fg-name);\n }\n }\n\n .torrent-labels {\n font-size: x-small;\n font-weight: normal;\n margin-bottom: 2px;\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &.compact {\n flex: 1;\n font-size: x-small;\n }\n }\n\n .torrent-progress-details,\n .torrent-peer-details {\n font-size: x-small;\n }\n\n .torrent-progress-bar {\n background-repeat: no-repeat;\n border-radius: 3px;\n border-style: solid;\n border-width: 1px;\n height: ($progressbar-height-number - ($progressbar-border-number * 2)) *\n 1px;\n\n &.full {\n flex-grow: 1;\n margin: 2px 0;\n }\n &.compact {\n min-width: 50px;\n width: 50px;\n }\n\n @function progressbar-gradient($color1, $color2) {\n @return linear-gradient(to bottom, $color1, $color2 80%);\n }\n\n @mixin progressbar-background($color1, $color2) {\n background: progressbar-gradient($color1, $color2),\n progressbar-gradient(\n var(--color-progressbar-background-1),\n var(--color-progressbar-background-2)\n );\n background-repeat: no-repeat;\n }\n\n &.leech.paused {\n @include progressbar-background(\n var(--color-progressbar-leech-paused-1),\n var(--color-progressbar-leech-paused-2)\n );\n }\n &.leech.queued {\n @include progressbar-background(\n var(--color-progressbar-leech-queued-1),\n var(--color-progressbar-leech-queued-2)\n );\n }\n &.leech {\n @include progressbar-background(\n var(--color-progressbar-leech-1),\n var(--color-progressbar-leech-2)\n );\n }\n &.magnet.paused {\n @include progressbar-background(\n var(--color-progressbar-magnet-paused-1),\n var(--color-progressbar-magnet-paused-2)\n );\n }\n &.magnet {\n @include progressbar-background(\n var(--color-progressbar-magnet-1),\n var(--color-progressbar-magnet-2)\n );\n }\n &.seed.paused {\n @include progressbar-background(\n var(--color-progressbar-seed-paused-1),\n var(--color-progressbar-seed-paused-2)\n );\n }\n &.seed.queued {\n @include progressbar-background(\n var(--color-progressbar-seed-queued-1),\n var(--color-progressbar-seed-queued-2)\n );\n }\n &.seed {\n @include progressbar-background(\n var(--color-progressbar-seed-1),\n var(--color-progressbar-seed-2)\n );\n }\n &.verify {\n @include progressbar-background(\n var(--color-progressbar-verify-1),\n var(--color-progressbar-verify-2)\n );\n }\n }\n}\n\n/// PREFERENCES DIALOG\n\n@mixin tab-image($image-url) {\n background-image: url($image-url),\n linear-gradient(\n var(--color-tab-deselected-1),\n var(--color-tab-deselected-2)\n );\n\n &:active,\n &:checked,\n &.selected {\n background-image: url($image-url),\n linear-gradient(var(--color-tab-selected-1), var(--color-tab-selected-2));\n }\n}\n\n#inspector-tab-info {\n @include tab-image($image-analytics);\n}\n\n#inspector-tab-peers {\n @include tab-image($image-peers);\n}\n\n#inspector-tab-tiers {\n @include tab-image($image-tiers);\n}\n\n#inspector-tab-files {\n @include tab-image($image-files);\n}\n\n#inspector,\n#prefs-dialog {\n @include for-phone-only {\n left: 0;\n }\n @include for-tablet-portrait-up {\n border-left: 1px solid var(--color-fg-secondary);\n width: 570px;\n }\n}\n\n#prefs-dialog {\n $background-color: $white;\n\n background: $background-color;\n bottom: 0;\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);\n position: absolute;\n right: 0;\n top: $popup-top;\n z-index: $z-index-popup;\n\n .tabs-page {\n grid-column-gap: 8px;\n grid-row-gap: 5px;\n grid-template-columns: 1fr 1fr;\n margin: 20px;\n\n &:not(.hidden) {\n display: grid;\n }\n\n .section-label {\n font-weight: bold;\n grid-column: span 2;\n margin-left: -20px;\n padding-bottom: 5px;\n\n &:not(:first-of-type) {\n margin-top: 20px;\n }\n }\n }\n\n .alt-speed-section-label {\n background: transparent url('images/blue-turtle.png') no-repeat;\n background-position: left 4px;\n padding-left: 22px;\n }\n\n :disabled,\n .disabled {\n color: var(--color-fg-disabled);\n }\n\n #alt-times-div,\n #autostart-div,\n #port-forwarding,\n #randomize-port,\n #suffix-div,\n #use-dht-div,\n #use-lpd-div,\n #use-pex-div,\n #utp-enabled,\n .alt-speed-label {\n grid-column: span 2;\n }\n\n .blocklist-size-label,\n .blocklist-update-button,\n .port-status {\n grid-column: 2 / 3;\n }\n\n .blocklist-size-label {\n font-size: smaller;\n }\n .blocklist-size-number {\n font-weight: bolder;\n }\n\n .port-status-label {\n display: inline-block;\n font-weight: bold;\n margin-left: 5px;\n &[data-open='true'] {\n color: var(--color-fg-port-open);\n }\n &[data-open='false'] {\n color: var(--color-fg-port-closed);\n }\n }\n\n .alt-speed-label {\n font-size: smaller;\n font-style: lighter;\n // nudge it up next to the section label\n margin: -10px 0 10px -20px;\n }\n}\n\n#prefs-dialog.ui-tabs .ui-tabs-panel {\n padding: 0;\n user-select: none;\n}\n\n.prefs-section {\n text-align: left;\n\n > * {\n padding: 0 8px 8px;\n }\n\n .title {\n font-size: larger;\n font-weight: bold;\n padding-left: 0;\n }\n\n .row {\n .key {\n float: left;\n padding-top: 3px;\n\n > * {\n margin-left: 0;\n }\n }\n\n .value {\n margin-left: 150px;\n\n > * {\n width: 100%;\n }\n }\n }\n\n .checkbox-row {\n > input {\n margin: 0;\n }\n\n > label {\n margin-left: 5px;\n }\n }\n\n #alternative-speed-limits-title {\n background: transparent url('images/blue-turtle.png') no-repeat;\n padding-left: 18px;\n }\n\n #alternative-speed-limits-desc {\n font-size: smaller;\n padding-bottom: 4px;\n }\n}\n\n/// TABS\n\n.tabs-container {\n align-items: stretch;\n background: $white;\n border-left: solid 1px var(--color-border);\n bottom: 0;\n display: flex;\n flex-direction: column;\n position: absolute;\n right: 0;\n top: $popup-top;\n z-index: $z-index-popup;\n @include for-phone-only {\n left: 0;\n }\n @include for-tablet-portrait-up {\n width: 550px;\n }\n}\n\n.tabs-buttons {\n align-self: center;\n display: flex;\n padding: 10px;\n\n button {\n @include button;\n appearance: none;\n padding: 3px;\n }\n}\n\n.file-priority-radiobox,\n.tabs-buttons {\n $radius: 8px;\n :first-child {\n border-bottom-left-radius: $radius;\n border-top-left-radius: $radius;\n }\n :last-child {\n border-bottom-right-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n.tabs-pages {\n box-sizing: border-box;\n flex: 1;\n overflow-x: hidden;\n overflow-y: auto;\n @include for-phone-only {\n padding: 0 8px 20px;\n }\n @include for-tablet-portrait-up {\n padding: 0 20px 20px;\n }\n}\n\n.tabs-button {\n background-position: center;\n background-repeat: no-repeat;\n}\n\n/// INSPECTOR\n\n#inspector {\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);\n}\n\n.inspector-info-page {\n // TODO: this is (mostly) copied from prefs-dialog.\n // can it be folded into a single set of rules?\n\n grid-column-gap: 8px;\n grid-row-gap: 5px;\n grid-template-columns: auto 1fr;\n margin: 20px;\n padding: 12px;\n\n &:not(.hidden) {\n display: grid;\n }\n\n .section-label {\n font-weight: bold;\n grid-column: span 2;\n margin-left: -20px;\n padding-bottom: 5px;\n\n &:not(:first-of-type) {\n margin-top: 20px;\n }\n }\n\n :not(.section-label) {\n // this section is not copied\n overflow-x: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.inspector-info-magnet {\n button {\n background-color: transparent;\n background-image: url($image-magnet);\n background-position: top;\n background-repeat: no-repeat;\n border: 0;\n cursor: pointer;\n height: 1rem;\n vertical-align: middle;\n width: 1rem;\n }\n}\n\n#inspector .tabs-button,\n#prefs-dialog .tabs-button {\n background-size: 20px 20px, 40px 30px;\n height: 30px;\n margin: 0;\n padding: 0;\n width: 40px;\n}\n\n#prefs-tab-torrent {\n @include tab-image($image-upload-download);\n}\n\n#prefs-tab-speed {\n @include tab-image($image-speed);\n}\n\n#prefs-tab-peers {\n @include tab-image($image-peers);\n}\n\n#prefs-tab-network {\n @include tab-image($image-network);\n}\n\n#inspector-file-list {\n margin: 0;\n padding: 0;\n\n .inspector-torrent-file-list-entry {\n display: grid;\n grid-column-gap: 5px;\n grid-template-areas:\n 'check name priority'\n 'blank1 info blank2';\n grid-template-columns: 20px 1fr 65px;\n margin-bottom: 4px;\n padding: 5px;\n\n &.skip {\n opacity: 0.5;\n }\n }\n\n .file-wanted-control {\n grid-area: check;\n }\n\n .inspector-torrent-file-list-entry-name {\n color: var(--color-fg-name);\n cursor: pointer;\n grid-area: name;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .inspector-torrent-file-list-entry.skip\n > .inspector-torrent-file-list-entry-name {\n color: var(--color-fg-disabled);\n }\n\n .inspector-torrent-file-list-entry-progress {\n color: var(--color-fg-secondary);\n grid-area: info;\n }\n\n .single-file .inspector-torrent-file-list-entry > .file-wanted-control,\n .inspector-torrent-file-list-entry.complete > .file-wanted-control {\n cursor: default;\n }\n}\n\n#inspector-header {\n margin: 8px 0;\n}\n\n#torrent-inspector-name {\n font-size: large;\n font-weight: bold;\n}\n\n#inspector-tiers-list {\n color: var(--color-fg-secondary);\n margin: 0 10px;\n padding: 0 12px;\n\n .tier-list-row {\n display: grid;\n grid-column-gap: 8px;\n grid-row-gap: 4px;\n margin-top: 8px;\n }\n\n .tier-list-torrent {\n color: var(--color-fg-primary);\n font-size: larger;\n font-weight: bolder;\n margin-left: -12px;\n overflow-x: hidden;\n padding-top: 20px;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tier-list-tracker {\n font-weight: bolder;\n grid-column: span 2;\n margin-top: 8px;\n padding-bottom: 4px;\n }\n\n .tier-announce,\n .tier-scrape,\n .tier-state {\n text-align: left;\n }\n\n .tier-downloads,\n .tier-leechers,\n .tier-seeders {\n text-align: right;\n }\n}\n\n// Peers Tab\n\n.peer-list {\n $table-border-color: $grey-100;\n $table-border: 1px solid $table-border-color;\n\n border: $table-border;\n border-collapse: collapse;\n cursor: default;\n table-layout: fixed;\n text-align: left;\n width: 100%;\n\n td,\n th {\n font-size: smaller;\n padding: 5px;\n }\n\n td {\n border: $table-border;\n color: var(--color-fg-secondary);\n // padding: 5px 10px;\n }\n\n .torrent-row td {\n background: $table-border-color;\n color: var(--color-fg-primary);\n font-size: normal;\n font-weight: bolder;\n overflow-x: hidden;\n padding: 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .encryption {\n width: 16px;\n &[data-encrypted='true'] {\n background: transparent url($image-lock-fill) center center no-repeat;\n height: 16px;\n width: 16px;\n }\n }\n\n .peer-address,\n .percent-done,\n .speed-down,\n .speed-up {\n text-align: right;\n }\n\n .percent-done {\n width: 10%;\n }\n .speed-down,\n .speed-up {\n width: 15%;\n }\n .peer-address {\n width: 25%;\n }\n\n .peer-app-name {\n overflow-x: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include for-phone-only {\n display: none;\n }\n @include for-tablet-portrait-up {\n width: 25%;\n }\n }\n\n .status {\n cursor: pointer;\n }\n}\n\n/// FILE PRIORITY BUTTONS\n\n.file-priority-radiobox {\n $size-number: 20;\n $size: $size-number * 1px;\n $halfsize: math.floor(math.div($size-number, 2)) * 1px;\n\n grid-area: priority;\n\n > * {\n @include button;\n appearance: none;\n background-position: center;\n background-repeat: no-repeat;\n background-size: $halfsize, $size;\n height: $size;\n margin: 0;\n padding: 0;\n width: $size;\n }\n\n > .low {\n @include tab-image($image-chevron-dn);\n border-right-width: 0;\n }\n\n > .normal {\n @include tab-image($image-baseline);\n }\n\n > .high {\n @include tab-image($image-chevron-up);\n border-left-width: 0;\n }\n}\n\n/// CONTEXT MENU\n\n.context-menu {\n $background-color: var(--color-bg-menu);\n $disabled-color: var(--color-fg-disabled);\n\n background: $background-color;\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);\n color: var(--color-fg-on-popup);\n position: absolute;\n z-index: $z-index-popup;\n\n .context-menuitem {\n list-style: none;\n padding: 5px 10px;\n\n &:hover:not(:disabled),\n &:focus:not(:disabled) {\n background-image: linear-gradient($white, var(--color-bg-menu));\n cursor: pointer;\n }\n\n &:disabled {\n color: $disabled-color;\n cursor: none;\n }\n }\n}\n\n.context-menu-separator {\n border-bottom: 1px solid var(--color-fg-secondary);\n margin-bottom: 10px;\n padding-bottom: 10px;\n}\n\n/// OVERFLOW MENU\n\n.overflow-menu {\n background: linear-gradient(\n 160deg,\n #d21,\n 1%,\n var(--color-bg-hover),\n 40%,\n var(--color-bg-menu)\n );\n border-radius: 8px;\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);\n color: var(--color-fg-on-popup);\n padding: 20px;\n position: fixed;\n width: 200px;\n z-index: $z-index-popup;\n\n fieldset {\n border: 0;\n margin-bottom: 8px;\n padding: 0;\n }\n\n > .actions,\n > .info,\n > .links {\n display: flex;\n flex-direction: column;\n }\n\n legend {\n font-weight: bolder;\n margin-bottom: 4px;\n }\n\n legend ~ * {\n margin-left: 12px;\n }\n\n a,\n button,\n label {\n font-size: 1em;\n\n &:disabled {\n color: var(--color-fg-disabled);\n cursor: default;\n }\n\n &:focus:not(:disabled),\n &:hover:not(:disabled) {\n background-color: var(--color-bg-hover);\n }\n }\n\n a,\n button {\n background: transparent;\n border: 0;\n cursor: pointer;\n display: block;\n padding: 4px 0;\n text-align: left;\n text-decoration: none;\n width: 150px;\n }\n\n .input-and-label {\n align-items: center;\n display: inline-flex;\n flex-direction: row;\n }\n\n #display-options {\n > * {\n align-items: center;\n display: inline-flex;\n flex-direction: row;\n\n > * {\n margin: 4px;\n }\n\n :first-child {\n margin-left: 0;\n }\n\n :last-child {\n margin-right: 0;\n }\n }\n }\n\n #speed-options {\n display: flex;\n flex-direction: column;\n\n > .speed-up,\n > .speed-down {\n align-items: center;\n display: flex;\n flex-direction: row;\n padding: 4px 0;\n\n > label {\n overflow: hidden;\n width: 80px;\n }\n }\n\n .alt-speed {\n display: grid;\n grid-column-gap: 5px;\n grid-row-gap: 5px;\n grid-template-areas:\n 'check lb'\n 'turtle values';\n grid-template-columns: 20px 1fr;\n margin-bottom: 4px;\n }\n\n #alt-speed-check {\n grid-area: check;\n\n &:checked ~ #alt-speed-image {\n background-image: url('images/blue-turtle.png');\n }\n\n &:not(:checked) ~ #alt-speed-image {\n background-image: url('images/turtle.png');\n }\n }\n\n #alt-speed-image {\n background-position: center;\n background-repeat: no-repeat;\n grid-area: turtle;\n }\n\n #alt-speed-label {\n grid-area: lb;\n }\n\n #alt-speed-values-label {\n font-size: small;\n grid-area: values;\n }\n }\n}\n\n// hide the fullscreen button unless we're on mobile\n@include for-tablet-portrait-up {\n #display-fullscreen-check,\n #display-fullscreen-label {\n display: none;\n }\n}\n\n/// DIALOGS\n\n$dialog-padding-number: 20;\n$dialog-logo-padding-number: math.div($dialog-padding-number * 2, 3);\n$logo-size: 64px;\n\n@include for-phone-only {\n .dialog-buttons {\n padding-top: $dialog-logo-padding-number * 1px;\n }\n\n .dialog-container {\n opacity: 96%;\n position: absolute;\n top: $popup-top;\n width: 100%;\n }\n\n .dialog-logo {\n padding-bottom: $dialog-logo-padding-number * 1px;\n }\n\n .dialog-window {\n align-items: center;\n display: flex;\n flex-direction: column;\n }\n}\n@include for-tablet-portrait-up {\n .dialog-container {\n left: 50%;\n min-width: 400px;\n position: absolute;\n top: $popup-top * 2;\n transform: translateX(-50%);\n }\n\n .dialog-heading {\n grid-area: heading;\n }\n\n .dialog-logo {\n grid-area: icon;\n padding-right: $dialog-logo-padding-number * 1px;\n }\n\n .dialog-window {\n color: var(--color-fg-on-popup);\n display: grid;\n grid-column-gap: 12px;\n grid-template-areas:\n 'icon heading'\n 'icon message'\n 'icon workarea'\n 'icon buttons';\n grid-template-columns: $logo-size 1fr;\n padding: 2px 12px;\n }\n}\n\n.dialog-buttons {\n display: flex;\n float: right;\n grid-area: buttons;\n margin: 10px 0 0;\n text-align: center;\n\n button {\n appearance: none;\n background: transparent;\n border: 1px solid var(--color-border);\n border-radius: 5px;\n color: var(--color-fg-name);\n margin-left: 8px;\n padding: 8px;\n text-decoration: none;\n }\n\n a:hover,\n a:active {\n background: linear-gradient($white, var(--color-bg-menu));\n }\n}\n\n.dialog-buttons-begin {\n flex-grow: 1;\n}\n\n.dialog-buttons-end {\n display: none;\n}\n\n.dialog-container {\n border: 0;\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.7);\n color: var(--color-fg-primary);\n display: block;\n margin: 0;\n padding: 0;\n z-index: $z-index-popup;\n}\n\n.dialog-heading {\n align-items: center;\n display: flex;\n font-size: 1.2em;\n font-weight: bold;\n}\n\n.dialog-logo {\n background: transparent url('images/logo.png') top left no-repeat;\n height: $logo-size;\n width: $logo-size;\n}\n\n.dialog-message {\n grid-area: message;\n margin: 10px 0 0;\n}\n\n.dialog-window {\n background: linear-gradient(160deg, #d21, 1%, #f7f7f7, 40%, #ccc);\n height: 100%;\n padding: $dialog-padding-number * 1px;\n}\n\n.dialog-workarea {\n display: flex;\n flex-direction: column;\n grid-area: workarea;\n margin: 10px 0 0;\n\n > * {\n margin-bottom: 5px;\n }\n}\n\n/// ABOUT DIALOG\n\n.about-dialog .dialog-workarea > * {\n margin-bottom: 10px;\n}\n\n.about-dialog-version-number {\n margin-left: 4px;\n}\n\n.about-dialog-version-checksum {\n font-size: small;\n font-style: italic;\n font-weight: normal;\n margin-left: auto;\n padding-left: 10px;\n}\n\n/// HOTKEYS DIALOG\n\n.shortcuts-dialog {\n table {\n border-collapse: collapse;\n width: 100%;\n }\n\n th,\n td {\n border: 1px solid var(--color-border);\n padding: 5px 10px;\n }\n}\n\n/// RENAME DIALOG\n\n#torrent-rename-name {\n min-width: 400px;\n}\n\n/// SET-LOCATION DIALOG\n\n#move-container #torrent-path {\n min-width: 400px;\n}\n\n/// STATISTICS DIALOG\n\n.tabs-pages,\n.inspector-info-page,\n.statistics-dialog {\n .content {\n column-gap: 16px;\n display: grid;\n grid-row-gap: 6px;\n grid-template-columns: auto 1fr;\n margin-top: 4px;\n\n @include for-phone-only {\n margin: 4px 0 16px;\n }\n @include for-tablet-portrait-up {\n margin: 4px 16px 16px;\n }\n\n div {\n word-break: break-word;\n }\n }\n\n fieldset {\n border: 0;\n margin: 0;\n padding: 0;\n }\n\n legend {\n font-weight: bolder;\n margin-bottom: 4px;\n }\n}\n\n/// UPLOAD DIALOG\n\n#free-space-text {\n display: inline-block;\n float: right;\n font-size: smaller;\n font-style: italic;\n}\n\n#torrent-upload-frame {\n border: 0;\n display: block; /* Don't change this : safari forms won't target hidden frames (they open a new window) */\n height: 0;\n left: -1000px;\n margin: 0;\n padding: 0;\n position: absolute;\n top: -1000px;\n width: 0;\n}\n\n.ui-menu {\n width: 200px;\n}\n"],sourceRoot:""}]);const Ee=G},645:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,r){"string"==typeof e&&(e=[[null,e,""]]);var o={};if(r)for(var s=0;s{"use strict";function t(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=e&&("undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"]);if(null==n)return;var r,o,s=[],i=!0,a=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(s.push(r.value),!t||s.length!==t);i=!0);}catch(e){a=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(a)throw o}}return s}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return n(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return n(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n{"use strict";e.exports=function(e,t){return t||(t={}),"string"!=typeof(e=e&&e.__esModule?e.default:e)?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]/.test(e)||t.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e)}},307:(e,t,n)=>{e=n.nmd(e);var r="__lodash_hash_undefined__",o=9007199254740991,s="[object Arguments]",i="[object Array]",a="[object Boolean]",l="[object Date]",c="[object Error]",d="[object Function]",A="[object Map]",p="[object Number]",g="[object Object]",u="[object Promise]",m="[object RegExp]",h="[object Set]",b="[object String]",f="[object Symbol]",C="[object WeakMap]",v="[object ArrayBuffer]",y="[object DataView]",E=/^\[object .+?Constructor\]$/,w=/^(?:0|[1-9]\d*)$/,x={};x["[object Float32Array]"]=x["[object Float64Array]"]=x["[object Int8Array]"]=x["[object Int16Array]"]=x["[object Int32Array]"]=x["[object Uint8Array]"]=x["[object Uint8ClampedArray]"]=x["[object Uint16Array]"]=x["[object Uint32Array]"]=!0,x[s]=x[i]=x[v]=x[a]=x[y]=x[l]=x[c]=x[d]=x[A]=x[p]=x[g]=x[m]=x[h]=x[b]=x[C]=!1;var k="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,M="object"==typeof self&&self&&self.Object===Object&&self,S=k||M||Function("return this")(),I=t&&!t.nodeType&&t,B=I&&e&&!e.nodeType&&e,D=B&&B.exports===I,T=D&&k.process,L=function(){try{return T&&T.binding&&T.binding("util")}catch(e){}}(),N=L&&L.isTypedArray;function _(e,t){for(var n=-1,r=null==e?0:e.length;++na))return!1;var c=s.get(e);if(c&&s.get(t))return c==t;var d=-1,A=!0,p=2&n?new ve:void 0;for(s.set(e,t),s.set(t,e);++d-1},fe.prototype.set=function(e,t){var n=this.__data__,r=we(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this},Ce.prototype.clear=function(){this.size=0,this.__data__={hash:new be,map:new(se||fe),string:new be}},Ce.prototype.delete=function(e){var t=Te(this,e).delete(e);return this.size-=t?1:0,t},Ce.prototype.get=function(e){return Te(this,e).get(e)},Ce.prototype.has=function(e){return Te(this,e).has(e)},Ce.prototype.set=function(e,t){var n=Te(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this},ve.prototype.add=ve.prototype.push=function(e){return this.__data__.set(e,r),this},ve.prototype.has=function(e){return this.__data__.has(e)},ye.prototype.clear=function(){this.__data__=new fe,this.size=0},ye.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},ye.prototype.get=function(e){return this.__data__.get(e)},ye.prototype.has=function(e){return this.__data__.has(e)},ye.prototype.set=function(e,t){var n=this.__data__;if(n instanceof fe){var r=n.__data__;if(!se||r.length<199)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new Ce(r)}return n.set(e,t),this.size=n.size,this};var Ne=te?function(e){return null==e?[]:(e=Object(e),function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n-1&&e%1==0&&e-1&&e%1==0&&e<=o}function Ye(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Qe(e){return null!=e&&"object"==typeof e}var Ze=N?function(e){return function(t){return e(t)}}(N):function(e){return Qe(e)&&Ge(e.length)&&!!x[xe(e)]};function We(e){return null!=(t=e)&&Ge(t.length)&&!Re(t)?Ee(e):Ie(e);var t}e.exports=function(e,t){return Me(e,t)}},379:(e,t,n)=>{"use strict";var r,o=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},s=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),i=[];function a(e){for(var t=-1,n=0;n{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di01aDJ2NXptNCAwaC0ydi0zaDJ2M3ptMC01aC0ydi0yaDJ2MnptNCA1aC0yVjdoMnYxMHoiLz48L3N2Zz4="},520:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NTMuNDA1IiBoZWlnaHQ9IjQ1My40MDUiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ1My40MDUgNDUzLjQwNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTM4Mi4wOCA2MC4zOTRjLTI2LjMyNC00LjUzNC01My40NDQtLjg0NS03OS43NjQgMS43NTEtMjYuMjIzIDIuNTg3LTUzLjYwNCA1Ljc1My03OS41ODUtLjM5Ny0zMC41OTItNy4yNDEtNDkuOTQ1LTI3LjI5NC02NC4yMTYtNTQuNDY0bC0xMS44MDMgMzEuOTM4TDY5LjQ5NCAyNDguMTYgMCA0MzYuMjAzbDI2LjgzOCA5LjkxOSA2Mi41NDEtMTY5LjIyN2MxMS42MDcgMTIuMzgzIDI1LjkzNyAyMS4zNzUgNDQuMzMzIDI1LjcyOSAyNS45NzkgNi4xNDYgNTMuMzYzIDIuOTg2IDc5LjU4NC4zOTggMjYuMzE4LTIuNjAxIDUzLjQ0MS02LjI4NyA3OS43NjUtMS43NTIgMzMuODI2IDUuODI2IDU1LjY4MiAyNi4wODYgNzEuMzIzIDU1Ljg3MSAyOS42NzctODAuMjkxIDU5LjM0OC0xNjAuNTgzIDg5LjAyMS0yNDAuODc2LTE1LjY0NC0yOS43ODYtMzcuNDk0LTUwLjA0My03MS4zMjUtNTUuODcxem0zLjI5OSAxNDIuOTU1Yy0xMy4yMzQtMTEuMTY5LTI3LjQ0MS0xOC42MzgtNDQuNTctMjEuOTMxLTUuNzE1IDE1LjQ1OC0xMS40MjggMzAuOTE2LTE3LjE0MSA0Ni4zNzQgMTcuMTMxIDMuMjk1IDMxLjMzNSAxMC43NjQgNDQuNTcyIDIxLjkzMmwtMTUuNzE3IDQyLjUyNmMtMTMuMjM0LTExLjE2OC0yNy40NDMtMTguNjQyLTQ0LjU3My0yMS45M2wxNS43MTgtNDIuNTI4Yy0xNy40NDItMi44MTMtMzQuNDczLTIuNzk3LTUyLjA3Mi0xLjcyTDI1NS44NzkgMjY4LjZjLTE4LjIxIDEuNDcxLTM2LjM1OCAzLjU2LTU0LjU2NyA1LjAyOCA1LjIzOC0xNC4xNzggMTAuNDc4LTI4LjM1MyAxNS43MTYtNDIuNTI2LTE3LjU5OSAxLjA3OC0zNC42MzEgMS4wOTYtNTIuMDczLTEuNzE5bC0xNS43MTcgNDIuNTI2Yy0xNy4xMjgtMy4yOS0zMS4zNDEtMTAuNzYzLTQ0LjU3Mi0yMS45MzNsMTUuNzE2LTQyLjUyNWMxMy4yMzYgMTEuMTcgMjcuNDQyIDE4LjY0IDQ0LjU3MyAyMS45MzJsMTcuMTM5LTQ2LjM3NmMtMTcuMTMtMy4yODUtMzEuMzM4LTEwLjc2Ni00NC41NzMtMjEuOTNsMTcuMTQtNDYuMzc4YzEzLjIzNiAxMS4xNzMgMjcuNDQyIDE4LjYzNSA0NC41NzIgMjEuOTMzbDE1LjcxNy00Mi41MjVjMTcuNDQyIDIuODEzIDM0LjQ3NiAyLjc5NyA1Mi4wNzMgMS43MTdsLTE1LjcxNyA0Mi41MjZjMTguMjA5LTEuNDcxIDM2LjM1Ny0zLjU1OCA1NC41NjctNS4wMjggNS4yMzgtMTQuMTc1IDEwLjQ3OS0yOC4zNTEgMTUuNzE3LTQyLjUyNyAxNy42MDEtMS4wNzggMzQuNjI5LTEuMDk1IDUyLjA3MiAxLjcxOWwtMTUuNzE3IDQyLjUyOGMxNy4xMzEgMy4yOTQgMzEuMzM1IDEwLjc2MSA0NC41NzMgMjEuOTMtNS43MTIgMTUuNDU5LTExLjQyMyAzMC45MTktMTcuMTM5IDQ2LjM3N3oiLz48cGF0aCBkPSJtMjM0LjE2NyAxODQuNzI2LTE3LjE0IDQ2LjM3NmMxOC4yMS0xLjQ3MiAzNi4zNTktMy41NiA1NC41NjgtNS4wM2wxNy4xMzktNDYuMzc0Yy0xOC4yMTEgMS40NzEtMzYuMzU4IDMuNTU5LTU0LjU2NyA1LjAyOHoiLz48cGF0aCBkPSJtMjM0LjE2NyAxODQuNzI2IDE3LjE0LTQ2LjM3NWMtMTcuNjA0IDEuMDc1LTM0LjYyOSAxLjA5My01Mi4wNzUtMS43MThsLTE3LjEzOSA0Ni4zNzVjMTcuNDQzIDIuODE2IDM0LjQ3MyAyLjc5OSA1Mi4wNzQgMS43MTh6TTMwNS44NzMgMTMzLjMyM2wtMTcuMTM5IDQ2LjM3NWMxNy42MDEtMS4wNzUgMzQuNjI5LTEuMDkzIDUyLjA3MyAxLjcybDE3LjEzOC00Ni4zNzVjLTE3LjQ0Mi0yLjgxNC0zNC40NzEtMi44LTUyLjA3Mi0xLjcyeiIvPjwvc3ZnPg=="},438:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktY2hldnJvbi1kb3duIiBmaWxsPSJjdXJyZW50Q29sb3IiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMS42NDYgNC42NDZhLjUuNSAwIDAgMSAuNzA4IDBMOCAxMC4yOTNsNS42NDYtNS42NDdhLjUuNSAwIDAgMSAuNzA4LjcwOGwtNiA2YS41LjUgMCAwIDEtLjcwOCAwbC02LTZhLjUuNSAwIDAgMSAwLS43MDh6Ii8+PC9zdmc+"},820:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktY2hldnJvbi11cCIgZmlsbD0iY3VycmVudENvbG9yIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTcuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwbDYgNmEuNS41IDAgMCAxLS43MDguNzA4TDggNS43MDdsLTUuNjQ2IDUuNjQ3YS41LjUgMCAwIDEtLjcwOC0uNzA4bDYtNnoiLz48L3N2Zz4="},749:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktZGlhZ3JhbS0zLWZpbGwiIGZpbGw9ImN1cnJlbnRDb2xvciIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02IDMuNUExLjUgMS41IDAgMCAxIDcuNSAyaDFBMS41IDEuNSAwIDAgMSAxMCAzLjV2MUExLjUgMS41IDAgMCAxIDguNSA2djFIMTRhLjUuNSAwIDAgMSAuNS41djFhLjUuNSAwIDAgMS0xIDBWOGgtNXYuNWEuNS41IDAgMCAxLTEgMFY4aC01di41YS41LjUgMCAwIDEtMSAwdi0xQS41LjUgMCAwIDEgMiA3aDUuNVY2QTEuNSAxLjUgMCAwIDEgNiA0LjV2LTF6bS02IDhBMS41IDEuNSAwIDAgMSAxLjUgMTBoMUExLjUgMS41IDAgMCAxIDQgMTEuNXYxQTEuNSAxLjUgMCAwIDEgMi41IDE0aC0xQTEuNSAxLjUgMCAwIDEgMCAxMi41di0xem02IDBBMS41IDEuNSAwIDAgMSA3LjUgMTBoMWExLjUgMS41IDAgMCAxIDEuNSAxLjV2MUExLjUgMS41IDAgMCAxIDguNSAxNGgtMUExLjUgMS41IDAgMCAxIDYgMTIuNXYtMXptNiAwYTEuNSAxLjUgMCAwIDEgMS41LTEuNWgxYTEuNSAxLjUgMCAwIDEgMS41IDEuNXYxYTEuNSAxLjUgMCAwIDEtMS41IDEuNWgtMWExLjUgMS41IDAgMCAxLTEuNS0xLjV2LTF6Ii8+PC9zdmc+"},886:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktZmlsZXMiIGZpbGw9ImN1cnJlbnRDb2xvciIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00IDJoN2EyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMnptMCAxYTEgMSAwIDAgMC0xIDF2MTBhMSAxIDAgMCAwIDEgMWg3YTEgMSAwIDAgMCAxLTFWNGExIDEgMCAwIDAtMS0xSDR6Ii8+PHBhdGggZD0iTTYgMGg3YTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMnYtMWExIDEgMCAwIDAgMS0xVjJhMSAxIDAgMCAwLTEtMUg2YTEgMSAwIDAgMC0xIDFINGEyIDIgMCAwIDEgMi0yeiIvPjwvc3ZnPg=="},961:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTQgMTFoMTZ2Mkg0eiIvPjwvc3ZnPg=="},371:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktbG9jay1maWxsIiBmaWxsPSJjdXJyZW50Q29sb3IiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSA5YTIgMiAwIDAgMSAyLTJoN2EyIDIgMCAwIDEgMiAydjVhMiAyIDAgMCAxLTIgMmgtN2EyIDIgMCAwIDEtMi0yVjl6Ii8+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNC41IDRhMy41IDMuNSAwIDEgMSA3IDB2M2gtMVY0YTIuNSAyLjUgMCAwIDAtNSAwdjNoLTFWNHoiLz48L3N2Zz4="},199:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktbWFnbmV0Ij48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04IDFhNyA3IDAgMCAwLTcgN3YzaDRWOGEzIDMgMCAwIDEgNiAwdjNoNFY4YTcgNyAwIDAgMC03LTdabTcgMTFoLTR2M2g0di0zWk01IDEySDF2M2g0di0zWk0wIDhhOCA4IDAgMSAxIDE2IDB2OGgtNlY4YTIgMiAwIDEgMC00IDB2OEgwVjhaIi8+PC9zdmc+"},25:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM4MDAiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMSAxNEg5VjhoMnY4em00IDBoLTJWOGgydjh6Ii8+PC9zdmc+"},173:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM5OTkiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMSAxNEg5VjhoMnY4em00IDBoLTJWOGgydjh6Ii8+PC9zdmc+"},912:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwODAiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNC41di05bDYgNC41LTYgNC41eiIvPjwvc3ZnPg=="},557:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiM5OTkiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNC41di05bDYgNC41LTYgNC41eiIvPjwvc3ZnPg=="},602:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Im0yMC4yIDUuOS44LS44QzE5LjYgMy43IDE3LjggMyAxNiAzcy0zLjYuNy01IDIuMWwuOC44QzEzIDQuOCAxNC41IDQuMiAxNiA0LjJzMyAuNiA0LjIgMS43em0tLjkuOGMtLjktLjktMi4xLTEuNC0zLjMtMS40cy0yLjQuNS0zLjMgMS40bC44LjhjLjctLjcgMS42LTEgMi41LTEgLjkgMCAxLjguMyAyLjUgMWwuOC0uOHpNMTkgMTNoLTJWOWgtMnY0SDVjLTEuMSAwLTIgLjktMiAydjRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtNGMwLTEuMS0uOS0yLTItMnpNOCAxOEg2di0yaDJ2MnptMy41IDBoLTJ2LTJoMnYyem0zLjUgMGgtMnYtMmgydjJ6Ii8+PC9zdmc+"},308:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjIuNjk5IiBoZWlnaHQ9IjEyMi42OTkiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDEyMi42OTkgMTIyLjY5OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGNpcmNsZSBjeD0iMTkuNSIgY3k9IjEyLjIiIHI9IjEyLjEiLz48cGF0aCBkPSJNNiA2Ni42OTloMS4ydjI0YzAgMy4zMDEgMi43IDYgNiA2aDEyLjZjMy4zIDAgNi0yLjY5OSA2LTZWODkuM2MtMS4xLTIuMTAxLTEuOC00LjUtMS44LTdWNTAuOWMwLTYuMSAzLjctMTEuNCA5LTEzLjd2LTIuNGMwLTMuMy0yLjctNi02LTZINmMtMy4zIDAtNiAyLjctNiA2djI1LjljMCAzLjMgMi42IDUuOTk5IDYgNS45OTl6Ii8+PGNpcmNsZSBjeD0iMTAzLjMiIGN5PSIxMi4yIiByPSIxMi4xIi8+PHBhdGggZD0iTTgzLjY5OSAzNC43djIuNGM1LjMwMSAyLjMgOSA3LjYgOSAxMy43djMxLjNjMCAyLjUtLjYgNC45LTEuNzk5IDd2MS40YzAgMy4zIDIuNjk5IDYgNiA2aDEyLjZjMy4zIDAgNi0yLjcgNi02di0yNGgxLjE5OWMzLjMwMSAwIDYtMi43IDYtNlYzNC43YzAtMy4zLTIuNjk5LTYtNi02aC0yN2MtMy4yOTkgMC02IDIuNjk5LTYgNnpNMzkuMSA1MC44OTlWODIuMjk5YzAgMy4zIDIuNyA2IDYgNmgyLjN2MjguM2MwIDMuMyAyLjcgNiA2IDZoMTYuMWMzLjMgMCA2LTIuNyA2LTZ2LTI4LjRoMi4zYzMuMyAwIDYtMi42OTkgNi02VjUwLjljMC0zLjMtMi43LTYtNi02SDQ1LjFjLTMuNC0uMDAxLTYgMi43LTYgNS45OTl6Ii8+PGNpcmNsZSBjeD0iNjEuNCIgY3k9IjI2IiByPSIxMy45Ii8+PC9zdmc+"},577:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMWVtIiBoZWlnaHQ9IjFlbSIgdmlld0JveD0iMCAwIDE2IDE2IiBjbGFzcz0iYmkgYmktdGhyZWUtZG90cy12ZXJ0aWNhbCIgZmlsbD0iY3VycmVudENvbG9yIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSAxM2ExLjUgMS41IDAgMSAxLTMgMCAxLjUgMS41IDAgMCAxIDMgMHptMC01YTEuNSAxLjUgMCAxIDEtMyAwIDEuNSAxLjUgMCAwIDEgMyAwem0wLTVhMS41IDEuNSAwIDEgMS0zIDAgMS41IDEuNSAwIDAgMSAzIDB6Ii8+PC9zdmc+"},689:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3MS43NTMiIGhlaWdodD0iNzEuNzUzIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3MS43NTMgNzEuNzUzIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNMzkuNzk4IDIwLjczNkgyOC4xNzJ2MjAuNzM4bC0xNi41NDctLjAwNFYyMC43MzZIMEwxOS44OTkuODM5bDE5Ljg5OSAxOS44OTd6bTEyLjA1NyA1MC4xNzggMTkuODk3LTE5Ljg5Nkg2MC4xMjlWMzAuMjgybC0xNi41NDctLjAwNHYyMC43NEgzMS45NTdsMTkuODk4IDE5Ljg5NnoiLz48L3N2Zz4="},54:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,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"},319:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEmUlEQVRYw+1Vz29UVRT+7r3vx7zp74rSECO0KbGRhWsF3Klhq4lEYWEkMVEWxPgH0ETjQlATCSZGE11oogtIDPHXrkajxlRxQ40JG1IoBVqYvum8ee/ee85xMdP50SJ0wJ2c1X0z73vnu9855zvAvfi/h9rsi4/9/FqS0cAJAfZD0H+3iUP4bb8/8dblYLOAjAbeg5EXwjIlm6d983BpkEEaZ71ZkECeM8ndJ18fmyfg+b9LTiRZ8xj0AuqB7+0uA3jVIwEnAASAQnGFCohwj3mDeGsQQgFCDKDojYBwO6E4ERWEDytHq5vFM3ix40GQ9VgCIQLENAaXSPIb9ZXzB0+km8U/8tXrspZOnIcuhdJbExJL6wLUq/qAeOpQkwW1nqeA1jVkjwQ6MI0eqPVIwHUkddR763vGmvmI83fkA1hzbnEMM5D0pIKwtBVg3EEJRATNb4hAsLTUowIdJeD2+aZTsOOTF4dDMrsh6gERtSBkzjYUaNfzVqa46+NDo5b14wC2iFELUO6scLuJ4QW1LNtIYNfJV/ttVLwNhwN6MGITm1Bysr5mDTziznIoszHx5PsHBlEuH7fg/cFgyDrUITmylIoR4bC7CdcpMPHhy0MFZz+GI32TyfhA0h/HKIchNNBXFA7L8yut5S1MAtOtwYPvHhpFKD9FW+LxrZP3l5LAgCEoiPvSvI76/GrLSTunqEVAeftROJbsLE8OlYaCCFtKZfQFIbRSqIcOyWSEZZvDMjVusNItQRT7T+Nt/RPbp8bi4TBGYkIwgIwcIq2xPGEgaz3kCco1jCgAgB3Hn5+CyJPliZGShsJwXMJIFGMkLCFQGiumgEAhZ4K11JyINoHxdw4+qoC9I+Oj8WAQYzRKMBTFYBFctzk8E+rsUfOuWQJZ5wOsno7GkgQaMBowUDDQiEyAJAgQKgMNBa3UmhV2jaAi2hePlfuM0dBKwSiNkg4Qa4NANb6lO3a5SNsJAwBQCpO6FMQAQALUyaPqLVShYBRQ8x519rDkmxIKgK4x3KmTILRMTWwBFoFA2ljusGLHqqsHuLApmmPGIrhhCzAENfIwCiiYsOocqt5BPEOcl8DGRWs3eErFMSwzbtgcJIJUWwiAnDyqzqJYI8ACKZypuYYGAQCQ5dniaq1SGh8eBoCcPYqcEOkCSgGOGdRsILecQ5T589z0F7ZFwNIvxZXaS6UdQ4NVb1HzDpExEAgsETrr5ZbqgNJz16a/XG31AGv3vV2q13ylaMsEQcGEnKiVHCxYnbtagbXHuiYA2Xfuai2jatFa9zl5FOuSN/DXKt76Y127YGH6TCaOD6e/XaxQ5v51F6Szi6uUuTMXjp7+uvO/89PfptrzkZVfFyqU+VvgF2pU899cPHrq1NrvrVlKZ+b+Ht4ztVifT/dCJFKR0UorcN3DXqpKOnu5QlX7+YDD4WszcxvWYWXmr3NDe6aW8/mV3YCKdGS00gBlHsWlVNLZxQpV3Wf9Tl7pxG+w9PE3n9nOSh+BUvsANQpBFYIf4P3JC9On/7jdznlo+tkJHagjMOYpYbkPGitgzCCnDy68ceos7sW6+AdV27uHYGOTWgAAAABJRU5ErkJggg=="},803:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAAqklEQVR4AWPABSzqX1oBsQYueXwaVwDxfzQ8lVjNe4D4H1gTJl4BVSMIxMuBeDEQe8M1QwX/E8B/gfgnkiWfYJrDQQLEYvO6FzD2EZDmZGI0QW39Y1b1INOi4ZW5ed1LYbDtNtU3Zcxrn9QR0gy2uf5l4KbVi5hRAu7MmTNMCiUfGS3qXvyAKk4HYgsk7AzEH6ByO3GFPhcQtwOxOQ55ZiD2BOJEIBZAlgMAXRnkb/um+ZoAAAAASUVORK5CYII="},190:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAe1BMVEUAAACii3Sfj4CikIGjkYOikYKjkIOkk4ShkYCikIGikYKhkIGhkYGhkYKunYyunY21ppihj3+ij4Cgj3+hkIKikYGikYKjkYKjkoOjk4Okk4SxoJCyoZG2p5i2p5m/rp3FtKPGtaTJuKfOw7fXzcLYzcLZz8TazsTe1MroLOxCAAAAE3RSTlMAC0CcnJ2mpvPz8/X19ff39/n73gWagwAAAHlJREFUeNrtzjUCwkAQQFHcfQhOfOX+F8TWtdqO/PqN9FLUH8/g137gB5NtWf8qVn6xrOo6KqCWFQfQWk76OnCrNsM4qMu5A4oMVJc7OD/cGqrCzxMDjyvwsobqtQycc0QDsRNHQuMA6D+ADrSLOCC7EQOh1tN+L0Fvq3hkPC72zVoAAAAASUVORK5CYII="},690:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC40lEQVR42mIYdABAbD2DS3OFcQCP+jJl6qSM08RWE9u2bX62bdtr294drm1d7/vNmWKeZ3mub/Efz3l/Bwuapq9jGVLJpcqlOZXQVGiMYYjVMwKEw7Qmm0lN1GtVaNRrUwqHgDBDjTI0uW7aANQT1Bi3mXLCLAkMTcwMwTUwNkOAgKBpYuO8AliGEgA8gsUj5hSAwuIRsz8FeMQcAaJRthdAWBNc1s4poFIuQTTC9EWwNNFSKBTXzBkAv0bIiXkDaF3xhQNsOOOF6985BSuPu6cOoMggFlAqVyEYLYKHyUMoVoRarfv52z4733WNpkJ4ABHy9wQ0uEjsKfh6dwCeXOSEx/5zCHlmmQvWX2ShUKoNBJBEAA8IBrw9AdlCBZ5exhfum+/3BKExABDwe1sAR64eCPD7XH2nYLskAi+ucvN7NBoyZxqWnqLbEFpvpi/A53XhAV6PkwNUewLQEBfL3fd+OUAIgA2X2L4Ar8fROnIEA3C77H0BKE4qB8d1cdgiCsOKMwyfj7b6BcD/x6m+ALfLhge4nNaxRq0bUKnW4LdDJCoyMP8eI/sCXA4LHuC0m8fqPQCnjQmhyFsbvHDRlgRjMIsirAMcwGEz4QF2q7EXAA21UOSAOtZ2b/lpZlIAm8XQAoCrBgKsZl1PwD5VVCjyzkYvv9rRetgqjsDj/09uCiwmLR5gNmp6AjKFCry21tNz3t9c750UwGRQ4wFGvaoNcNPHZ4Xc8ukFuOcnDTz4pxke+dsGD3H7u35QwR1fieHBP8x87v5RzT97w7un0b4NYNAp8QC9VtEGaNSnFTQCaN8G0GkUHOCPwQCtWiYAppuVx9z8r+Gig8626xqVDA/QqCQzBqCoXbGuayqVpAV/4AGNUjE3q/+E0G9LsZAHlUI8CgBXDgSoVeJL6Bcxl01DPp+ZlaC2iKBnXKOUyLF/SkUi0bVqpUiilF0cUcguwmxEJb80olaIpYrL279VgmGwAQCiLNWHPaj+YwAAAABJRU5ErkJggg=="},350:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEHUlEQVRYw+2VvY5cRRCFv6quvjO2ZWkdGKRFIkBEzrAWWzyESXkE3oAUeAregMASkRMCNicg4g3MGu9ik2B7f+beriqCvjO7y64xCCwh4ZJaM+puzTl9zqkaeFNv6v9eArC3t/eOCveBO5lprw1MxAX5AR0/2d5+7yGAASh8vVgu7l5ZXiki8tpem5nlZHXy4fFR3gfuztgQGXeWrxl8VoDlYqmZcTszZaNARLM1tH//EVgiFWQQZBAQWOmSY1lwokuOZeBIFhzK0BcDL6TyPCvPpfKMyrM0fstCCGyJc53G5299RtEB91bo9ne/W4tTmUYQTzrB7MwXgqZTJCg4haAQGIllUCWoBFWSAWFIWCJMoTSRWefcYLif4lnf8FMCqwTL+f6siyZlaJRslDRMnIpjOAPGCYqFMWSlYiyj0qQgFFYulBT0jL1n8WYLzhAYEwIkk5SZgwqqiVWnZMPSUAmKC4JRKBQxShiDGJMbV9XQECoKWTARchbhLN7lCnhCCiI5E4AsUMyp4rQEcUMwMitKRbNSqFgaNYxwBYxpFlJFNoJeosD5DBC5jm33r/Sl5kgVggJSiOjgUCENTaOkUTEilaRQEFxBM9b45/C6AhGQCSJdgZhDM79+xsNLJdRIqURWwMgsSBYkDcmC0klYKj2yoAIihXWbX1TAnVz3xZgbMmh2cINmRmsDMVXCjEyD7J8RlcxuR98vQM8AooQkotkzIK8IIWOSmZvwSYGoSpsGWlkw6UCIElFoaUQWPI2ITiajE+m+dQIkiJ5iXBLCP8yBPB8+H41WK1NbMNpAawuCQobRZmAPI2Y1wq2fp4KCIEjRzSi4MAfOteE0z4DZ+6hK80prA5NVpmlgpOJaaa5EVjwM98oU1u+m4Wk4kChokh4g+RfacMwewKmfRjPcjakZrRlNK00rIwPhBQ9l8kLzyhSV0Y0pKhOld4L0dtbZgsyYFfjyZYNo/qKACe6GzySaFyY3Jh+YpDLFAvcynxljq4wzkfdvTnywfQvTq5vffvrkV1bj2CB3Rb6Il2QgQRIxCBfcdQPis7+tFRxjjJmMF8ap0JoxtoFVGre3b1F0ydk6WZ20p7882b12feseZ955zgKmhJZkg/TSVyjuSrjSsuBRGL3Qoo/dqc3qNGM1GdNkF8CPT47bweOD3WvXt+7t7OxMfxLCefDUJFI2KhCCz0RcCimFyDITWlswk/DhPPjxUdvf39/dunHzHPilCuRaAaevFEjpgUrIECKkk6PvexY8dVZGWbmegh8dtr1Hj3a3bvx0AXyjQGa2yDQFbnz1I/9GHRw85ujwRdvbe/Tdzbf3P97Z+XS67J4CiOoPP+899Mz8eygvqYjg6PBoehU4zH+QDx48eNdKfuPut9ek/mkVLd++CvxN/Sfqd29fwFSAwYBpAAAAAElFTkSuQmCC"},166:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,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"},174:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACKUlEQVRYw93XXU/aUBgH8Dr9DMuu/AIklO4TGL0wc0t8G3LvN9gVvmTtSebSEoigICrewa681tQoirHV3c6SJdOIbJqQOEckJCJO9PGcBghGeS0txif5h8Npc87vFAo9FPXcyiSjTovEbtMSm8avmXpDS9yMJsBbmZN6ol9uh38L8PFPfRmKC/B+34ERyNcwAK88Y8WD2U4dDcWVCsIHRbhqGEHvsDfWE0fDAHfqG7gugtCnCBlG5uZbAtCEaBaggHi3XydCK8CVCj1AOC9C9SG0Aj6d+Z9ABKH3B3/FyMirO6BcyG1qltjbrgjqaAmA5GUAJsIeWAjMQWDR/yCkb2LToz+gdHK3ywnT087i+8Ulv/6A0lV7Z91qSvsMA6yJq+DzetSI4kptgB32zrpsbW8KIJfLFa8AaRsOIDVmH8cZU9stAShKFKI4LQOUlmGAOd9sWQA5pjvA/pUDgXc8ApA+O89VBVCAXmkCjOxxMBqafAQgfbbvBgBsJ/gB9HBKnXQpMK+GFOkjx/QH5EPqOHYIiURCbdf0Z9RMwL/zv8XLf47bhgPC62Lxpzi8ITYRINUGiB0dwMGvn5BMJtWPoSoAj0nXAmD2uMvBePWNSTabhXQ6rX4PSCqdO3IqwGCcB7PM/qeAaqsM2EVr3crUTX+Mh4Hj8ilMXEilc0nwmDmLjLaqPpSad9FrRv68gbdW13ijCeXC5GPJp9K5tMxe44WFTRH0hnpudQ/yep8TiQS3zAAAAABJRU5ErkJggg=="},785:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABq0lEQVR42mIYdODu3btygOrqKrmNIAjAcOgKgeP6COHcQc9mWpIsXmY2M5NwO7NhblEn8VT9ehx9W0NJHPCsC9bNMEWh141j/8VYgDSNpIP93f7V5QVcX10OFUNAGoedOApejwzIvySfjP0MXZoEEEf+eAg2QXdcwGdEFPnv/iogicPPgDwGQhDUgLwERSAAy1AG6YclQBBUgI2N5JeAz3uC9Yp0Cc7PTmFjPf4tIon8jOO4R2QAfI8E/SEB2BLg3T1AGLhkSxCFHg7wPZsMEPgODnAdk2wJHNvMAAoP/wiwLY0MYJkaDjANlQEuSJbANJSsUEAAuiaTAXStiQM0tdG9vrwgWQJNqeMAVa51r4gASrOKA+RG5TNg4jXr5QwAHvwR0KiVyAD1ahEH1CoS2RJUyyIOqKwJZIByiccBa0WObAlKEscAU38GFMUVMoAkrOAASVgiAwjCUgZTOOD69ORwon+cvy0nx0cgcIsdALj/R4AoLM7nL+LhwR4cHe1PpHwu3zV6Er+0eg8bCwsLT0R+YYlfmWtzK3MwiYTV+bbILS5z3Myze//beA8SaCTphKrdFQAAAABJRU5ErkJggg=="},466:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,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"},908:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,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"},450:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,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"},289:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACbElEQVR4Xu2Xz24TMRCHvWnaQ0BC/Cmo8Aao4kFAao9t+gY5wztwQuLUK+IFoBx4C54FJBCgXXs8zMSjZPSTs15xCQesfpJT+5v9rS3vJoGZ98os7Lf9gwHevv90LfAI16D8rVsP0HWz1dXVeahxuTwPlHnlBXSXy7NQ4+LyLHQH89Wbdzd3vDPHIkOikDKHH+QGWP5MoMxgoBvC98ROtWauMhogygSdQ1RUxnEogC4xr28AZbX0/7EVIOWsKa2IyRtHC2QwKi6hWxBXaawAsRXJgS06jmNDN4qLHpsrjJ+CgXIpkgzysI6DAS6pB866Vha30A5gF4pK2jIIrQCJ2M9XrA5PC6BCylBEcZ+xoYvzh+jrNAL0dhdDKmAIHYdWcZ0TvVtoPAe0SBH8+bdeewWIwTXMjc0VsCKavIc76RUMgC7lUbdvBsglQO9kVxCWsO324ArtFYjkLyxAEGjgMoQu4Aq0twAubJ+nbQGGHvHnO06BSvBCYe20ToG5vLVgPE7eAjxKUnSYtAJsHoPf2AJ4muE5NhhWoOb6+Wy4LZjyJKRsEj7RJj4JI7j2Pqj68/pdFFEavhEb7wILD29Ddm6kSQGCBGATPTzxZVQxmccC4BZsJzLcBhSobl8yF/04JUA3KwcjUWUFGL6S1VxmdUHTVlz0Zxu5624LD6UXvv5M6yJkJDJy6cu8Y2EhHCjWP1b326+0+fKZDFKsxu8vn++Jc8vvjaLdJ8Kzw+cvb44uXvMuDl+8+iDaqfBAOFKsf6pjDfejOE+FR5vrugCa6r7wWMPUsLETm7cQ5sbC3JOGr+5ddSHA/vj/4/QPGiED+KnBG4UAAAAASUVORK5CYII="},560:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAYAAAAFQMh/AAAEDElEQVR42u2U/U9TdxSHmyxb4l7idHFxm5o53VwXCkIDGBBJU0TItMCGwiAN4628DFcEnIyGuo6X2pZCobSlUAUqDoSIiDhoGZVt4lBgosKAATLBuTiyhP/gs9ObbBkbYKnAsmQneXLvPZ/zPc+9v1zWf7okVUnr1l5aKRLknk6G/bqm4hxjQvvlYR1OnkkG3cevmTjbGD/X9UAH22QtpNXJoGfRmohPVMSidVqK3tmzsIwbSC4C9dJWVPKJIWY7kUE0E/3EKIEvZwpg+VmJ7l90sE7oIK0RgfrHn1iYpReGE10ycwrMNgWsQ2Zcn2rGjelm9M3Wo2OmEE330tHyUzauPixD56Rdngg6k+2UMFMXzSH0ysZ0fDVSg+Hf2nF79iJuPqpDz8Mq2B5o0DYlxfnxVNSOCGEejUHzZBZsM8Uk15I8HnResizpsfJIbqb+A3zRU4CBR/W4TiLrfTlaJo7j/FgK6kZiUftDNKqHI3B66DARbr8yvQvjYnRNq9A5UUryONAuqUNSsfbIM4Sp9loOvp7Ron1KhobRJFQPRaDqThgRugRhzFzT2EewTOWjbSwPkmohaN/j5UfLwpVFrYnomJTh0o9ZMN+NQtWgAJW3DjrIIWbeNBjCPOtvHIJYFw7a+/yi0jRN2MZ03XtouJuECyOpMN+OQOX3wTAOHHCKiv4DyDkrAO1d+otTSwRpssZQ1A1GofbWYRj7AmG4yXcKXS8fJ2reBe3UsB5XycUHrSpLAKoHQlDVFwR97z6nKO/xR6YpGLRPzXKkROrgXzXdvjD2BsDwnT8t8Fk2pd/4Ir0yELRL6ZA0oSjwqUR1ILTfeqL8mjcD3c+jxOaN3EY/HDPxkKbng85A0+31Z6656oWjBqYvZzlacaqA9YnFfJR1uy/IyaY9SFDzQXNKIojgEHMlXR5Mru7kIrWcZ8/zWcutDxU8aGycfyBvc0eskgfKuX+bn1N3ukLV4Yak0n32XMpypmJO+d9XXHFBSSd7HhkmL1AmWmD+jryVg8SSvfZcwnK2hHK/c7n1HBRb3pxHitYblPkvMJ8SV+QL+5X1JBVd6CNI1XlA3b79r5CYC8r2L3JmM2slKqpgT7+saQdUV7YxlFldkHXGA9TPZq1mReZ7xQsVXBRe3ALl5VcZtO0+iCr0BmW7V1Uekecpiy3ajc8bSX5pM0Negx+o30zsX1X5kTyuOLLAA2LjTnqBV6Bo2QTpOTaECk9QJiG2rbTzBWIj8ZJb0Ja3QrJdT4V/5n4vRulCL/EG/fi34uOKHYiWu8Lr/dfd7HNLsIF4lnjaEfFrxC6CTbz9Bx6CraHBGe8YBJ9yOoLEbM2uvS/zmGxx2MROYhPxnANeZuhFYsMKsJ5Yx3zx//Vv1O+hjkmdTDrAVAAAAABJRU5ErkJggg=="},93:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAQAAABaf7ccAAAAfklEQVR4Xm3LMQ4BcRhE8R8aG6VGJdFtsokItVK5p9DqKETPRSRbuIY7bKmQcAmJT0H+WeK9ajIzEj1rlaOVv0w8xMeLDHQNAPrCUyRvCgsh7IBrs26OHRiq0z/pbq80Qju3df79t7JovYO6U1MJS1NjhbmbkGviZKbJRgnwArtVQeM0F/R2AAAAAElFTkSuQmCC"},373:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC5ElEQVRYw+1Xv08UQRT+3iwcwuKRSAQvyKGWhhjjDyoLGwpJjAlUxtqKBGMhVMaLhbGQGPkDbA0xNpoQYqmVAU2M1Gq8E06ChlP3EG5nn8Xt7u3Mzu2exVXyksne7Px433zvvW/ngH37342CH8Vi8ZogzBJRjpmpLc6ImJk34PH9oXz+SQhgvVi8DkEP7V7bFiTaemLP8+A4jsPSmxnK5x8TAJSKX0rZbHaow7LAtV2dnHifEsZS+tQp4Lo1VCo/S8P5kWECgM+fPnoDAwMkt9ZReTQNUAYQXWDKACLj9+tPFhmAupT3yjx/rNna/qkRdGQtbG5ueseOn7AEAEgpGxBZApAAu1qTkZYwhvo7QnyMWAJgRH2Kelxk4F3ZmCBjgIhNG6cDajyDXKj7FEFiKAw0O6kOCBGwhnVGsD4Dgc8gBEYGWt5YB4SEkPkW+IwzECyGRqHmlAwMxcDCB6sASmGg6cY+IOoUOHp3AYemrsI6aLeenAGQRAYYhoVSo90FhEDP6fPI3ZhD3/g4qFM0sj8tZKYcUKtARkrINQMKRSWD7IWLyE3PoGf0ZJOs10JmqgJTEpIhD0grpcCsvj70T04hc+RwxJkWlnAtpyRhS2Kjmqxs4/uzReytl1L0QirfBDMDrdR2MLu2h1+vXqK8cA/V96sx2s1a0ioDBrEJxzyJ6rvXKD+YRWX5KXjXMYOFQcBSGWhW2z4grlXxdW4SPxYXICtbrZdg2FIZcJNLUBeiSNYridtUNZFchmQqpX8RG9bkGJpqhjqglKEqRBSr+6ikGmo75duhAgqUUGWAo0KUfEppPGXrIWMwM5i9xl1peelF+ey5sUG7uwve9kbjGkUUuU5Ro5HWN8zncK663urtgbNTxerqSvnSxOUcAcDS0vO57gPdt0dHT9m2bbf1Uuo4v7G29sHZ+VO9MzFxZZ4AoFAoiLGxM7cEcNOVcrCdADos6xszzb9ZeTtfKBS8/X9G+/YXSQG4bXLPijQAAAAASUVORK5CYII="}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var s=t[r]={id:r,loaded:!1,exports:{}};return e[r](s,s.exports,n),s.loaded=!0,s.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{"use strict";class e extends EventTarget{constructor(){super(),this.actions=Object.seal({"deselect-all":{enabled:!1,shortcut:"Control+A",text:"Deselect all"},"move-bottom":{enabled:!1,text:"Move to the back of the queue"},"move-down":{enabled:!1,text:"Move down in the queue"},"move-top":{enabled:!1,text:"Move to the front of the queue"},"move-up":{enabled:!1,text:"Move up in the queue"},"open-torrent":{enabled:!0,shortcut:"Alt+O",text:"Open torrent…"},"pause-all-torrents":{enabled:!1,text:"Pause all"},"pause-selected-torrents":{enabled:!1,shortcut:"Alt+U",text:"Pause"},"reannounce-selected-torrents":{enabled:!1,text:"Ask tracker for more peers"},"remove-selected-torrents":{enabled:!1,text:"Remove from list…"},"resume-selected-torrents":{enabled:!1,shortcut:"Alt+R",text:"Resume"},"resume-selected-torrents-now":{enabled:!1,text:"Resume now"},"select-all":{enabled:!1,shortcut:"Alt+A",text:"Select all"},"show-about-dialog":{enabled:!0,text:"About"},"show-inspector":{enabled:!0,shortcut:"Alt+I",text:"Torrent Inspector"},"show-labels-dialog":{enabled:!1,text:"Edit Labels…"},"show-move-dialog":{enabled:!1,shortcut:"Alt+L",text:"Set location…"},"show-overflow-menu":{enabled:!0,text:"More options…"},"show-preferences-dialog":{enabled:!0,shortcut:"Alt+P",text:"Edit preferences"},"show-rename-dialog":{enabled:!1,shortcut:"Alt+N",text:"Rename…"},"show-shortcuts-dialog":{enabled:!0,text:"Keyboard shortcuts"},"show-statistics-dialog":{enabled:!0,shortcut:"Alt+S",text:"Statistics"},"start-all-torrents":{enabled:!1,text:"Start all"},"toggle-compact-rows":{enabled:!0,text:"Compact rows"},"trash-selected-torrents":{enabled:!1,text:"Trash data and remove from list…"},"verify-selected-torrents":{enabled:!1,shortcut:"Alt+V",text:"Verify local data"}})}click(e){if(this.isEnabled(e)){const t=new Event("click");t.action=e,this.dispatchEvent(t)}}getActionForShortcut(e){for(const[t,n]of Object.entries(this.actions))if(e===n.shortcut)return t;return null}allShortcuts(){return new Map(Object.entries(this.actions).filter((([,e])=>e.shortcut)).map((([e,t])=>[t.shortcut,e])))}isEnabled(e){return this._getAction(e).enabled}text(e){return this._getAction(e).text}keyshortcuts(e){return this._getAction(e).shortcut}update(t){const n=e._recount(t.selected,t.nonselected);this._updateStates(n)}_getAction(e){const t=this.actions[e];if(!t)throw new Error(`no such action: ${e}`);return t}static _recount(e,t){const n=e.length+t.length,r=e.filter((e=>e.isStopped())).length,o=e.length-r,s=t.filter((e=>e.isStopped())).length,i=t.length-s,a=r+s,l=o+i,c=e.filter((e=>e.isQueued())).length;return{active:l,nonselected_active:i,nonselected_paused:s,paused:a,selected:e.length,selected_active:o,selected_paused:r,selected_queued:c,total:n}}_updateStates(e){const t=(e,t)=>{for(const n of t)this._updateActionState(n,e)};t(e.selected_paused>0,["resume-selected-torrents"]),t(e.paused>0,["start-all-torrents"]),t(e.active>0,["pause-all-torrents"]),t(e.selected_paused>0||e.selected_queued>0,["resume-selected-torrents-now"]),t(e.selected_active>0,["pause-selected-torrents","reannounce-selected-torrents"]),t(e.selected>0,["deselect-all","move-bottom","move-down","move-top","move-up","remove-selected-torrents","show-inspector","show-labels-dialog","show-move-dialog","trash-selected-torrents","verify-selected-torrents"]),t(1===e.selected,["show-rename-dialog"]),t(e.selected{for(const e of o.children)e.classList.toggle("selected",e===t);for(const e of s.children)e.classList.toggle("hidden",e!==r);n&&n(r)}))}return i[0].classList.add("selected"),s.children[0].classList.remove("hidden"),{buttons:i,root:r}}function i(e){const t=document.createElement("dialog");t.classList.add("dialog-container","popup",e),t.open=!0,t.setAttribute("role","dialog");const n=document.createElement("div");n.classList.add("dialog-window"),t.append(n);const r=document.createElement("div");r.classList.add("dialog-logo"),n.append(r);const o=document.createElement("div");o.classList.add("dialog-heading"),n.append(o);const s=document.createElement("div");s.classList.add("dialog-message"),n.append(s);const i=document.createElement("div");i.classList.add("dialog-workarea"),n.append(i);const a=document.createElement("div");a.classList.add("dialog-buttons"),n.append(a);const l=document.createElement("span");l.classList.add("dialog-buttons-begin"),a.append(l);const c=document.createElement("button");c.classList.add("dialog-dismiss-button"),c.textContent="Cancel",a.append(c);const d=document.createElement("button");d.textContent="OK",a.append(d);const A=document.createElement("span");return A.classList.add("dialog-buttons-end"),a.append(A),{confirm:d,dismiss:c,heading:o,message:s,root:t,workarea:i}}function a(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function l(e,t){const n=[],{root:r,content:o}=function(e){const t=document.createElement("fieldset");t.classList.add("section");const n=document.createElement("legend");n.classList.add("title"),n.textContent=e,t.append(n);const r=document.createElement("div");return r.classList.add("content"),t.append(r),{content:r,root:t}}(e);for(const e of t){const t=document.createElement("label");t.textContent=e,o.append(t);const r=document.createElement("div");r.id=a(),o.append(r),t.setAttribute("for",r.id),n.push(r)}return{children:n,root:r}}function c(e,t=100){let n=null;return(...r)=>{n||(n=setTimeout((()=>{n=null,e(r)}),t))}}function d(e,t){return r()(e,t)}function A(e,t,n){n?e.setAttribute(t,!0):e.removeAttribute(t)}function p(e,t){A(e,"disabled",!t)}function g(e,t){A(e,"checked",t)}function u(e,t,n,r){const o=function(e,t){let{x:n,y:r}=e;const{width:o,height:s}=e;return n>t.x+t.width-o&&n-o>=t.x?n-=o:n=Math.min(n,t.x+t.width-o),r>t.y+t.height-s&&r-s>=t.y?r-=s:r=Math.min(r,t.y+t.height-s),new DOMRect(n,r,o,s)}(new DOMRect(t,n,e.clientWidth,e.clientHeight),r.getBoundingClientRect());e.style.left=`${o.left}px`,e.style.top=`${o.top}px`}class m extends EventTarget{constructor(e){super(),this.listener=t=>{e.contains(t.target)||(this.dispatchEvent(new MouseEvent(t.type,t)),t.preventDefault())},Object.seal(this),this.start()}start(){setTimeout((()=>document.addEventListener("click",this.listener)),0)}stop(){document.removeEventListener("click",this.listener)}}function h(e,t){e.textContent!==t&&(e.textContent=t)}class b{constructor(e){this._prefs=e,this._elements={toggle:document.querySelector("#toggle-notifications")}}_setEnabled(e){this.prefs.notifications_enabled=e,h(this._toggle,(e?"Disable":"Enable")+" Notifications")}_requestPermission(){Notification.requestPermission().then((e=>this._setEnabled("granted"===e)))}toggle(){this._enabled?this._setEnabled(!1):"granted"===Notification.permission?this._setEnabled(!0):"denied"!==Notification.permission&&this._requestPermission()}}class f extends EventTarget{constructor(){super(),this._cache={},this.dispatchPrefsChange=c(((e,t,n)=>{const r=new Event("change");Object.assign(r,{key:e,old_value:t,value:n}),this.dispatchEvent(r)}));for(const[e,t]of Object.entries(f._Defaults))this._set(e,f._getCookie(e,t)),Object.defineProperty(this,e.replaceAll("-","_"),{get:()=>this._get(e),set:t=>{this._set(e,t)}});Object.seal(this)}entries(){return Object.entries(this._cache)}keys(){return Object.keys(this._cache)}_get(e){const{_cache:t}=this;if(!Object.prototype.hasOwnProperty.call(t,e))throw new Error(e);return t[e]}_set(e,t){const{_cache:n}=this,r=n[e];r!==t&&(n[e]=t,f._setCookie(e,t),this.dispatchPrefsChange(e,r,t))}static _setCookie(e,t){const n=new Date;n.setFullYear(n.getFullYear()+1),document.cookie=`${e}=${t}; SameSite=Strict; expires=${n.toGMTString()}`}static _getCookie(e,t){const n=f._readCookie(e);return null===n?t:"true"===n||"false"!==n&&(/^\d+$/.test(n)?Number.parseInt(n,10):n)}static _readCookie(e){const t=`; ${document.cookie}`.split(`; ${e}=`);return 2===t.length?t.pop().split(";").shift():null}}f.AltSpeedEnabled="alt-speed-enabled",f.DisplayCompact="compact",f.DisplayFull="full",f.DisplayMode="display-mode",f.FilterActive="active",f.FilterAll="all",f.FilterDownloading="downloading",f.FilterFinished="finished",f.FilterMode="filter-mode",f.FilterPaused="paused",f.FilterSeeding="seeding",f.NotificationsEnabled="notifications-enabled",f.RefreshRate="refresh-rate-sec",f.SortAscending="ascending",f.SortByActivity="activity",f.SortByAge="age",f.SortByName="name",f.SortByProgress="progress",f.SortByQueue="queue",f.SortByRatio="ratio",f.SortBySize="size",f.SortByState="state",f.SortDescending="descending",f.SortDirection="sort-direction",f.SortMode="sort-mode",f._Defaults={[f.AltSpeedEnabled]:!1,[f.DisplayMode]:f.DisplayFull,[f.FilterMode]:f.FilterAll,[f.NotificationsEnabled]:!1,[f.RefreshRate]:5,[f.SortDirection]:f.SortAscending,[f.SortMode]:f.SortByName};class C extends EventTarget{constructor(e){super(),this.elements=C._create(e),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onDismiss(){this.close()}static _create(e){const t=i("about-dialog");t.root.setAttribute("aria-label","About transmission"),t.heading.textContent="Transmission",t.dismiss.textContent="Close";let n=document.createElement("div");return n.classList.add("about-dialog-version-number"),n.textContent=e.version,t.heading.append(n),n=document.createElement("div"),n.classList.add("about-dialog-version-checksum"),n.textContent=e.checksum,t.heading.append(n),n=document.createElement("div"),n.textContent="A fast and easy bitTorrent client",t.workarea.append(n),n=document.createElement("div"),n.textContent="Copyright © The Transmission Project",t.workarea.append(n),t.confirm.remove(),delete t.confirm,t}}class v extends EventTarget{constructor(e){super(),this.action_listener=this._update.bind(this),this.action_manager=e,this.action_manager.addEventListener("change",this.action_listener),Object.assign(this,this._create()),this.show()}show(){for(const[e,t]of Object.entries(this.actions))p(t,this.action_manager.isEnabled(e));document.body.append(this.root)}close(){if(!this.closed){this.action_manager.removeEventListener("change",this.action_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))delete this[e];this.closed=!0}}_update(e){const t=this.actions[e.action];t&&p(t,e.enabled)}_create(){const e=document.createElement("div");e.role="menu",e.classList.add("context-menu","popup");const t={},n=n=>{const r=document.createElement("div"),o=this.action_manager.text(n);r.role="menuitem",r.classList.add("context-menuitem"),r.dataset.action=n,r.textContent=o;const s=this.action_manager.keyshortcuts(n);s&&r.setAttribute("aria-keyshortcuts",s),r.addEventListener("click",(()=>{this.action_manager.click(n),this.close()})),t[n]=r,e.append(r)},r=()=>{const t=document.createElement("div");t.classList.add("context-menu-separator"),e.append(t)};return n("resume-selected-torrents"),n("resume-selected-torrents-now"),n("pause-selected-torrents"),r(),n("move-top"),n("move-up"),n("move-down"),n("move-bottom"),r(),n("remove-selected-torrents"),n("trash-selected-torrents"),r(),n("verify-selected-torrents"),n("show-move-dialog"),n("show-rename-dialog"),n("show-labels-dialog"),r(),n("reannounce-selected-torrents"),r(),n("select-all"),n("deselect-all"),{actions:t,root:e}}}const y=new Intl.PluralRules,E=y.resolvedOptions().locale,w=new Intl.NumberFormat(E),x=1e3,k=[new Intl.NumberFormat(E,{style:"unit",unit:"byte"}),new Intl.NumberFormat(E,{style:"unit",unit:"kilobyte"}),new Intl.NumberFormat(E,{style:"unit",unit:"megabyte"}),new Intl.NumberFormat(E,{style:"unit",unit:"gigabyte"}),new Intl.NumberFormat(E,{style:"unit",unit:"terabyte"}),new Intl.NumberFormat(E,{style:"unit",unit:"petabyte"})],M=new Intl.NumberFormat(E,{style:"unit",unit:"kilobyte-per-second"}),S=new Intl.NumberFormat(E,{style:"unit",unit:"megabyte-per-second"}),I={_toTruncFixed:(e,t)=>(Math.floor(e*10**t)/10**t).toFixed(t),countString(e,t,n){return`${this.number(n)} ${this.ngettext(e,t,n)}`},mem(e){if(e<0)return"Unknown";if(0===e)return"None";let t=e;for(const e of k){if(t"one"===y.select(n)?e:t,number:e=>w.format(e),percentString(e){const t=e<100?1:0;return this._toTruncFixed(e,t)},ratioString(e){return-1===e?"None":-2===e?"∞":this.percentString(e)},size(e){return this.mem(e)},speed:e=>e<999.95?M.format(e):S.format(e/1e3),speedBps(e){return this.speed(this.toKBps(e))},timeInterval(e){const t=Math.floor(e/86400);if(t)return this.countString("day","days",t);const n=Math.floor(e%86400/3600);if(n)return this.countString("hour","hours",n);const r=Math.floor(e%3600/60);return r?this.countString("minute","minutes",r):(e=Math.floor(e%60),this.countString("second","seconds",e))},timestamp(e){if(!e)return"N/A";const t=new Date(1e3*e),n=new Date;let r="",o="";const s=n.getFullYear()===t.getFullYear(),i=n.getMonth()===t.getMonth(),a=n.getDate()-t.getDate();r=s&&i&&Math.abs(a)<=1?0===a?"Today":1===a?"Yesterday":"Tomorrow":t.toDateString();let l=t.getHours(),c="AM";l>12&&(l-=12,c="PM"),0===l&&(l=12),l<10&&(l=`0${l}`);let d=t.getMinutes();return d<10&&(d=`0${d}`),(e=t.getSeconds())<10&&(e=`0${e}`),o=[l,d,e].join(":"),[r,o,c].join(" ")},toKBps:e=>Math.floor(e/x)};class B extends EventTarget{isDone(){return this.fields.have>=this.fields.size}isEditable(){return this.fields.torrent.getFileCount()>1&&!this.isDone()}refreshWantedHTML(){const e=this.elements.root;e.classList.toggle("skip",!this.fields.isWanted),e.classList.toggle("complete",this.isDone()),p(e.checkbox,this.isEditable()),e.checkbox.checked=this.fields.isWanted}refreshProgressHTML(){const{size:e,have:t}=this.fields,n=100*(e?t/e:1),r=I,o=`${r.size(t)} of ${r.size(e)} (${r.percentString(n)}%)`;h(this.elements.progress,o)}refresh(){let e=0,t=!1,n=!1,r=!1,o=0,s=!1;const i=this.fields.torrent.getFiles();for(const a of this.fields.indices){const l=i[a];switch(e+=l.bytesCompleted,o+=l.length,s|=l.wanted,l.priority){case-1:n=!0;break;case 1:t=!0;break;default:r=!0}}g(this.elements.priority_low_button,n),g(this.elements.priority_normal_button,r),g(this.elements.priority_high_button,t),this.fields.have===e&&this.fields.size===o||(this.fields.have=e,this.fields.size=o,this.refreshProgressHTML()),this.fields.isWanted!==s&&(this.fields.isWanted=s,this.refreshWantedHTML())}fireWantedChanged(e){const t=new Event("wantedToggled");t.indices=[...this.fields.indices],t.wanted=e,this.dispatchEvent(t)}firePriorityChanged(e){const t=new Event("priorityToggled");t.indices=[...this.fields.indices],t.priority=e,this.dispatchEvent(t)}createRow(e,t,n,r){const o=document.createElement("li");o.classList.add("inspector-torrent-file-list-entry",r?"even":"odd"),this.elements.root=o;let s=document.createElement("input");const i=a();s.type="checkbox",s.className="file-wanted-control",s.title="Download file",s.id=i,s.addEventListener("change",(e=>this.fireWantedChanged(e.target.checked))),o.checkbox=s,o.append(s),s=document.createElement("label"),s.className="inspector-torrent-file-list-entry-name",s.setAttribute("for",i),h(s,n),o.append(s),s=document.createElement("div"),s.className="inspector-torrent-file-list-entry-progress",o.append(s),this.elements.progress=s,s=document.createElement("div"),s.className="file-priority-radiobox";const l=s,c=e=>this.firePriorityChanged(e.target.value);s=document.createElement("input"),s.type="radio",s.value=-1,s.className="low",s.title="Low Priority",s.addEventListener("click",c),this.elements.priority_low_button=s,l.append(s),s=document.createElement("input"),s.type="radio",s.value=0,s.className="normal",s.title="Normal Priority",s.addEventListener("click",c),this.elements.priority_normal_button=s,l.append(s),s=document.createElement("input"),s.type="radio",s.value=1,s.title="High Priority",s.className="high",s.addEventListener("click",c),this.elements.priority_high_button=s,l.append(s),o.append(l),o.style.paddingLeft=20*t+"px",this.refresh()}getElement(){return this.elements.root}constructor(e,t,n,r,o){super(),this.fields={have:0,indices:r,isWanted:!0,size:0,torrent:e},this.elements={priority_high_button:null,priority_low_button:null,priority_normal_button:null,progress:null,root:null},this.createRow(e,t,n,o)}}class D extends EventTarget{constructor(e){super(),this.fieldObservers={},this.fields={},this.refresh(e)}notifyOnFieldChange(e,t){this.fieldObservers[e]=this.fieldObservers[e]||[],this.fieldObservers[e].push(t)}setField(e,t,n){const r=e[t];if(d(r,n))return!1;const o=this.fieldObservers[t];if(e===this.fields&&o&&o.length>0)for(const e of o)e.call(this,n,r,t);return e[t]=n,!0}updateFiles(e){let t=!1;const n=this.fields.files||[],r=["length","name","bytesCompleted","wanted","priority"];for(const[o,s]of e.entries()){const e=n[o]||{};for(const n of r)n in s&&(t|=this.setField(e,n,s[n]));n[o]=e}return this.fields.files=n,t}static collateTrackers(e){return e.map((e=>e.announce.toLowerCase())).join("\t")}refreshFields(e){let t=!1;for(const[n,r]of Object.entries(e))switch(n){case"files":case"fileStats":t|=this.updateFiles(r);break;case"trackerStats":t|=this.setField(this.fields,"trackers",r);break;case"trackers":n in this.fields||(t|=this.setField(this.fields,n,r));break;case"name":this.setField(this.fields,n,e[n])&&(this.fields.collatedName="",t=!0);break;default:t|=this.setField(this.fields,n,r)}return t}refresh(e){this.refreshFields(e)&&this.dispatchEvent(new Event("dataChanged"))}getComment(){return this.fields.comment}getCreator(){return this.fields.creator}getDateAdded(){return this.fields.addedDate}getDateCreated(){return this.fields.dateCreated}getDesiredAvailable(){return this.fields.desiredAvailable}getDownloadDir(){return this.fields.downloadDir}getDownloadSpeed(){return this.fields.rateDownload}getDownloadedEver(){return this.fields.downloadedEver}getError(){return this.fields.error}getErrorString(){return this.fields.errorString}getETA(){return this.fields.eta}getFailedEver(){return this.fields.corruptEver}getFiles(){return this.fields.files||[]}getFile(e){return this.fields.files[e]}getFileCount(){return this.fields["file-count"]}getHashString(){return this.fields.hashString}getHave(){return this.getHaveValid()+this.getHaveUnchecked()}getHaveUnchecked(){return this.fields.haveUnchecked}getHaveValid(){return this.fields.haveValid}getId(){return this.fields.id}getLabels(){return this.fields.labels.sort()}getLastActivity(){return this.fields.activityDate}getLeftUntilDone(){return this.fields.leftUntilDone}getMagnetLink(){return this.fields.magnetLink}getMetadataPercentComplete(){return this.fields.metadataPercentComplete}getName(){return this.fields.name||"Unknown"}getPeers(){return this.fields.peers||[]}getPeersConnected(){return this.fields.peersConnected}getPeersGettingFromUs(){return this.fields.peersGettingFromUs}getPeersSendingToUs(){return this.fields.peersSendingToUs}getPieceCount(){return this.fields.pieceCount}getPieceSize(){return this.fields.pieceSize}getPrimaryMimeType(){return this.fields["primary-mime-type"]}getPrivateFlag(){return this.fields.isPrivate}getQueuePosition(){return this.fields.queuePosition}getRecheckProgress(){return this.fields.recheckProgress}getSeedRatioLimit(){return this.fields.seedRatioLimit}getSeedRatioMode(){return this.fields.seedRatioMode}getSizeWhenDone(){return this.fields.sizeWhenDone}getStartDate(){return this.fields.startDate}getStatus(){return this.fields.status}getTotalSize(){return this.fields.totalSize}getTrackers(){return this.fields.trackers||[]}getUploadSpeed(){return this.fields.rateUpload}getUploadRatio(){return this.fields.uploadRatio}getUploadedEver(){return this.fields.uploadedEver}getWebseedsSendingToUs(){return this.fields.webseedsSendingToUs}isFinished(){return this.fields.isFinished}hasExtraInfo(){return"hashString"in this.fields}isSeeding(){return this.getStatus()===D._StatusSeed}isStopped(){return this.getStatus()===D._StatusStopped}isChecking(){return this.getStatus()===D._StatusCheck}isDownloading(){return this.getStatus()===D._StatusDownload}isQueued(){return this.getStatus()===D._StatusDownloadWait||this.getStatus()===D._StatusSeedWait}isDone(){return this.getLeftUntilDone()<1}needsMetaData(){return this.getMetadataPercentComplete()<1}getActivity(){return this.getDownloadSpeed()+this.getUploadSpeed()}getPercentDoneStr(){return I.percentString(100*this.getPercentDone())}getPercentDone(){return this.fields.percentDone}getStateString(){switch(this.getStatus()){case D._StatusStopped:return this.isFinished()?"Seeding complete":"Paused";case D._StatusCheckWait:return"Queued for verification";case D._StatusCheck:return"Verifying local data";case D._StatusDownloadWait:return"Queued for download";case D._StatusDownload:return"Downloading";case D._StatusSeedWait:return"Queued for seeding";case D._StatusSeed:return"Seeding";case null:return"Unknown";default:return"Error"}}seedRatioLimit(e){switch(this.getSeedRatioMode()){case D._RatioUseGlobal:return e.seedRatioLimit();case D._RatioUseLocal:return this.getSeedRatioLimit();default:return-1}}getErrorMessage(){const e=this.getErrorString();switch(this.getError()){case D._ErrTrackerWarning:return`Tracker returned a warning: ${e}`;case D._ErrTrackerError:return`Tracker returned an error: ${e}`;case D._ErrLocalError:return`Error: ${e}`;default:return null}}getCollatedName(){const e=this.fields;return!e.collatedName&&e.name&&(e.collatedName=e.name.toLowerCase()),e.collatedName||""}getCollatedTrackers(){const e=this.fields;return!e.collatedTrackers&&e.trackers&&(e.collatedTrackers=D.collateTrackers(e.trackers)),e.collatedTrackers||""}testState(e){const t=this.getStatus();switch(e){case f.FilterActive:return this.getPeersGettingFromUs()>0||this.getPeersSendingToUs()>0||this.getWebseedsSendingToUs()>0||this.isChecking();case f.FilterSeeding:return t===D._StatusSeed||t===D._StatusSeedWait;case f.FilterDownloading:return t===D._StatusDownload||t===D._StatusDownloadWait;case f.FilterPaused:return this.isStopped();case f.FilterFinished:return this.isFinished();default:return!0}}test(e,t,n,r){let o=this.testState(e);if(o&&n&&(o=this.getCollatedName().includes(n.toLowerCase())),o)for(const e of r){let t=!1;for(let n=0;n0&&(o=this.getCollatedTrackers().includes(t)),o}static compareById(e,t){return e.getId()-t.getId()}static compareByName(e,t){return e.getCollatedName().localeCompare(t.getCollatedName())||D.compareById(e,t)}static compareByQueue(e,t){return e.getQueuePosition()-t.getQueuePosition()}static compareByAge(e,t){const n=e.getDateAdded();return t.getDateAdded()-n||D.compareByQueue(e,t)}static compareByState(e,t){const n=e.getStatus();return t.getStatus()-n||D.compareByQueue(e,t)}static compareByActivity(e,t){const n=e.getActivity();return t.getActivity()-n||D.compareByState(e,t)}static compareByRatio(e,t){const n=e.getUploadRatio(),r=t.getUploadRatio();return nr?-1:D.compareByState(e,t)}static compareByProgress(e,t){return e.getPercentDone()-t.getPercentDone()||D.compareByRatio(e,t)}static compareBySize(e,t){return e.getTotalSize()-t.getTotalSize()||D.compareByName(e,t)}static compareTorrents(e,t,n,r){let o=0;switch(n){case f.SortByActivity:o=D.compareByActivity(e,t);break;case f.SortByAge:o=D.compareByAge(e,t);break;case f.SortByQueue:o=D.compareByQueue(e,t);break;case f.SortByProgress:o=D.compareByProgress(e,t);break;case f.SortBySize:o=D.compareBySize(e,t);break;case f.SortByState:o=D.compareByState(e,t);break;case f.SortByRatio:o=D.compareByRatio(e,t);break;case f.SortByName:o=D.compareByName(e,t);break;default:console.log(`Unrecognized sort mode: ${n}`),o=D.compareByName(e,t)}return r===f.SortDescending&&(o=-o),o}static sortTorrents(e,t,n){switch(t){case f.SortByActivity:e.sort(this.compareByActivity);break;case f.SortByAge:e.sort(this.compareByAge);break;case f.SortByName:e.sort(this.compareByName);break;case f.SortByProgress:e.sort(this.compareByProgress);break;case f.SortByQueue:e.sort(this.compareByQueue);break;case f.SortByRatio:e.sort(this.compareByRatio);break;case f.SortBySize:e.sort(this.compareBySize);break;case f.SortByState:e.sort(this.compareByState);break;default:console.log(`Unrecognized sort mode: ${t}`),e.sort(this.compareByName)}return n===f.SortDescending&&e.reverse(),e}}D._StatusStopped=0,D._StatusCheckWait=1,D._StatusCheck=2,D._StatusDownloadWait=3,D._StatusDownload=4,D._StatusSeedWait=5,D._StatusSeed=6,D._RatioUseGlobal=0,D._RatioUseLocal=1,D._RatioUnlimited=2,D._ErrNone=0,D._ErrTrackerWarning=1,D._ErrTrackerError=2,D._ErrLocalError=3,D._TrackerInactive=0,D._TrackerWaiting=1,D._TrackerQueued=2,D._TrackerActive=3,D.Fields={},D.Fields.Metadata=["addedDate","file-count","name","primary-mime-type","totalSize"],D.Fields.Stats=["error","errorString","eta","isFinished","isStalled","labels","leftUntilDone","metadataPercentComplete","peersConnected","peersGettingFromUs","peersSendingToUs","percentDone","queuePosition","rateDownload","rateUpload","recheckProgress","seedRatioMode","seedRatioLimit","sizeWhenDone","status","trackers","downloadDir","uploadedEver","uploadRatio","webseedsSendingToUs"],D.Fields.InfoExtra=["comment","creator","dateCreated","files","hashString","isPrivate","magnetLink","pieceCount","pieceSize"],D.Fields.StatsExtra=["activityDate","corruptEver","desiredAvailable","downloadedEver","fileStats","haveUnchecked","haveValid","peers","startDate","trackerStats"];const T=["encryption","speed-up","speed-down","percent-done","status","peer-address","peer-app-name"];class L extends EventTarget{constructor(e){super(),this.closed=!1,this.controller=e,this.elements=this._create(),this.current_page=this.elements.info.root,this.interval=setInterval(this._refreshTorrents.bind(this),3e3),this.name="inspector",this.selection_listener=e=>this._setTorrents(e.selected),this.torrent_listener=()=>this._updateCurrentPage(),this.torrents=[],this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null,this.outside=new m(this.elements.root),this.outside.addEventListener("click",(()=>this.close())),Object.seal(this),e.addEventListener("torrent-selection-changed",this.selection_listener),this._setTorrents(this.controller.getSelectedTorrents()),document.body.append(this.elements.root)}close(){if(!this.closed){this.outside.stop(),clearInterval(this.interval),this._setTorrents([]),this.elements.root.remove(),this.controller.removeEventListener("torrent-selection-changed",this.selection_listener),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))this[e]=null;this.closed=!0}}static _createInfoPage(){const e=document.createElement("div");e.classList.add("inspector-info-page");const t={root:e},n=t=>{const n=document.createElement("div");n.textContent=t,n.classList.add("section-label"),e.append(n)},r=t=>{const n=document.createElement("label");h(n,t),e.append(n);const r=document.createElement("label");return e.append(r),r};n("Activity");let o=[["have","Have:"],["availability","Availability:"],["uploaded","Uploaded:"],["downloaded","Downloaded:"],["state","State:"],["running_time","Running time:"],["remaining_time","Remaining:"],["last_activity","Last activity:"],["error","Error:"]];for(const[e,n]of o)t[e]=r(n);n("Details"),o=[["size","Size:"],["location","Location:"],["hash","Hash:"],["privacy","Privacy:"],["origin","Origin:"],["magnetLink","Magnet:"],["comment","Comment:"],["labels","Labels:"]];for(const[e,n]of o)t[e]=r(n);return t}static _createListPage(e,t){const n=document.createElement("div"),r=document.createElement(e);return r.id=t,n.append(r),{list:r,root:n}}static _createTiersPage(){return L._createListPage("div","inspector-tiers-list")}static _createFilesPage(){return L._createListPage("ul","inspector-file-list")}static _createPeersPage(){const e=document.createElement("table");e.classList.add("peer-list");const t=document.createElement("thead"),n=document.createElement("tr"),r=["","Up","Down","Done","Status","Address","Client"];for(const[e,t]of r.entries()){const r=document.createElement("th"),o=T[e];"encryption"===o&&(r.dataset.encrypted=!0),r.classList.add(o),h(r,t),n.append(r)}const o=document.createElement("tbody");return t.append(n),e.append(t),e.append(o),{root:e,tbody:o}}_create(){const e={files:L._createFilesPage(),info:L._createInfoPage(),peers:L._createPeersPage(),tiers:L._createTiersPage()};return{...s("inspector",[["inspector-tab-info",e.info.root],["inspector-tab-peers",e.peers.root],["inspector-tab-tiers",e.tiers.root],["inspector-tab-files",e.files.root]],(e=>{this.current_page=e,this._updateCurrentPage()}).bind(this)),...e}}_setTorrents(e){const t="dataChanged",n=this.torrent_listener;for(const e of this.torrents)e.removeEventListener(t,n);this.torrents=[...e];for(const e of this.torrents)e.addEventListener(t,n);this._refreshTorrents(),this._updateCurrentPage()}static _needsExtraInfo(e){return e.some((e=>!e.hasExtraInfo()))}_refreshTorrents(){const{controller:e,torrents:t}=this,n=t.map((e=>e.getId()));if(n&&n.length>0){const r=["id",...D.Fields.StatsExtra];L._needsExtraInfo(t)&&r.push(...D.Fields.InfoExtra),e.updateTorrents(n,r)}}_updateCurrentPage(){const{current_page:e,elements:t}=this;switch(e){case t.files.root:this._updateFiles();break;case t.info.root:this._updateInfo();break;case t.peers.root:this._updatePeers();break;case t.tiers.root:this._updateTiers();break;default:console.warn("unexpected page"),console.log(e)}}_updateInfo(){const e="None",t="Mixed",n="Unknown",r=I,s=Date.now(),{elements:i,torrents:a}=this,l=a.reduce(((e,t)=>e+t.getSizeWhenDone()),0);let c=null;if(0===a.length)c=e;else if(a.every((e=>e.isFinished())))c="Finished";else if(a.every((e=>e.isStopped())))c="Paused";else{const e=e=>e.getStateString(),n=e(a[0]);c=a.every((t=>e(t)===n))?n:t}h(i.info.state,c);const d=c;if(0===a.length)c=e;else{const e=a.reduce(((e,t)=>e+t.getHaveValid()),0),t=a.reduce(((e,t)=>e+t.getHaveUnchecked()),0),n=a.reduce(((e,t)=>e+t.getLeftUntilDone()),0),o=100*(l?(l-n)/l:1);c=r.percentString(o),c=t||n?t?`${r.size(e)} of ${r.size(l)} (${c}%), ${r.size(t)} Unverified`:`${r.size(e)} of ${r.size(l)} (${c}%)`:`${r.size(e)} (100%)`}if(h(i.info.have,c),0===a.length)c=e;else if(0===l)c=e;else{const e=a.reduce(((e,t)=>t.getHave()+t.getDesiredAvailable()),0);c=`${r.percentString(100*e/l)}%`}if(h(i.info.availability,c),0===a.length)c=e;else{const e=a.reduce(((e,t)=>e+t.getDownloadedEver()),0),t=a.reduce(((e,t)=>e+t.getFailedEver()),0);c=t?`${r.size(e)} (+${r.size(t)} discarded after failed checksum)`:r.size(e)}if(h(i.info.downloaded,c),0===a.length)c=e;else{const e=a.reduce(((e,t)=>e+t.getUploadedEver()),0),t=a.reduce(((e,t)=>e+t.getDownloadedEver()),0)||a.reduce(((e,t)=>e+t.getHaveValid()),0);c=`${r.size(e)} (Ratio: ${r.ratioString(o.ratio(e,t))})`}if(h(i.info.uploaded,c),0===a.length)c=e;else if(a.every((e=>e.isStopped())))c=d;else{const e=e=>e.getStartDate(),n=e(a[0]);c=a.every((t=>e(t)===n))?r.timeInterval(s/1e3-n):t}if(h(i.info.running_time,c),0===a.length)c=e;else{const e=e=>e.getETA(),o=e(a[0]);c=a.every((t=>e(t)===o))?o<0?n:r.timeInterval(o):t}if(h(i.info.remaining_time,c),0===a.length)c=e;else{const t=a.reduce(((e,t)=>Math.max(e,t.getLastActivity())),-1),n=Math.floor(s/1e3);if(0e.getErrorString(),n=e(a[0]);c=a.every((t=>e(t)===n))?n:t}if(h(i.info.error,c||e),0===a.length)c=e;else{const e=a.reduce(((e,t)=>e+t.getTotalSize()),0);if(e){const t=e=>e.getPieceSize(),n=a.reduce(((e,t)=>e+t.getPieceCount()),0),o=r.number(n),s=t(a[0]);c=a.every((e=>t(e)===s))?`${r.size(e)} (${o} pieces @ ${r.mem(s)})`:`${r.size(e)} (${o} pieces)`}else c="None"}if(h(i.info.size,c),0===a.length)c=e;else{const e=e=>e.getHashString(),n=e(a[0]);c=a.every((t=>e(t)===n))?n:t}if(h(i.info.hash,c),0===a.length)c=e;else{const e=e=>e.getPrivateFlag(),n=e(a[0]);c=a.every((t=>e(t)===n))?n?"Private to this tracker -- DHT and PEX disabled":"Public torrent":t}if(h(i.info.privacy,c),0===a.length)c=e;else{const e=e=>e.getComment(),n=e(a[0]);c=a.every((t=>e(t)===n))?n:t}if(c=c||e,c.startsWith("https://")||c.startsWith("http://")?(c=encodeURI(c),o.setInnerHTML(i.info.comment,`${c}`)):h(i.info.comment,c),c=0===a.length?e:a[0].getLabels().join(", "),h(i.info.labels,c),0===a.length)c=e;else{let e=e=>e.getCreator();const r=e(a[0]),o=!a.every((t=>e(t)===r));e=e=>e.getDateCreated();const s=e(a[0]),i=!a.every((t=>e(t)===s)),l=!r||0===r.length,d=!s;c=o||i?t:l&&d?n:d&&!l?`Created by ${r}`:l&&!d?`Created on ${new Date(1e3*s).toDateString()}`:`Created by ${r} on ${new Date(1e3*s).toDateString()}`}if(h(i.info.origin,c),0===a.length)c=e;else{const e=e=>e.getDownloadDir(),n=e(a[0]);c=a.every((t=>e(t)===n))?n:t}if(h(i.info.location,c),0===a.length)h(i.info.magnetLink,e);else if(a.length>1)h(i.info.magnetLink,t);else{const e=a[0].getMagnetLink();o.setInnerHTML(i.info.magnetLink,``)}}static _peerStatusTitle(e){const t=Object.seal({"?":"We unchoked this peer, but they're not interested",D:"Downloading from this peer",E:"Encrypted Connection",H:"Peer was discovered through Distributed Hash Table (DHT)",I:"Peer is an incoming connection",K:"Peer has unchoked us, but we're not interested",O:"Optimistic unchoke",T:"Peer is connected via uTP",U:"Uploading to peer",X:"Peer was discovered through Peer Exchange (PEX)",d:"We would download from this peer if they'd let us",u:"We would upload to this peer if they'd ask"});return[...e].filter((e=>t[e])).map((e=>`${e}: ${t[e]}`)).join("\n")}_updatePeers(){const e=I,{elements:t,torrents:n}=this,{tbody:r}=t.peers,o=[(e,t)=>{t.dataset.encrypted=e.isEncrypted},(t,n)=>h(n,t.rateToPeer?e.speedBps(t.rateToPeer):""),(t,n)=>h(n,t.rateToClient?e.speedBps(t.rateToClient):""),(e,t)=>h(t,`${Math.floor(100*e.progress)}%`),(e,t)=>{h(t,e.flagStr),t.setAttribute("title",L._peerStatusTitle(e.flagStr))},(e,t)=>h(t,e.address),(e,t)=>h(t,e.clientName)],s=[];for(const e of n){const t=document.createElement("tr");t.classList.add("torrent-row");const n=document.createElement("td");n.setAttribute("colspan",o.length),h(n,e.getName()),t.append(n),s.push(t);for(const t of e.getPeers()){const e=document.createElement("tr");e.classList.add("peer-row");for(const[n,r]of o.entries()){const o=document.createElement("td");o.classList.add(T[n]),r(t,o),e.append(o)}s.push(e)}for(;r.firstChild;)r.firstChild.remove();r.append(...s)}}static getAnnounceState(e){switch(e.announceState){case D._TrackerActive:return"Announce in progress";case D._TrackerWaiting:{const t=Math.max(0,e.nextAnnounceTime-Date.now()/1e3);return`Next announce in ${I.timeInterval(t)}`}case D._TrackerQueued:return"Announce is queued";case D._TrackerInactive:return e.isBackup?"Tracker will be used as a backup":"Announce not scheduled";default:return`unknown announce state: ${e.announceState}`}}static lastAnnounceStatus(e){let t="Last Announce",n=["N/A"];if(e.hasAnnounced){const r=I.timestamp(e.lastAnnounceTime);e.lastAnnounceSucceeded?n=[r," (got ",I.countString("peer","peers",e.lastAnnouncePeerCount),")"]:(t="Announce error",n=[e.lastAnnounceResult?`${e.lastAnnounceResult} - `:"",r])}return{label:t,value:n.join("")}}static lastScrapeStatus(e){let t="Last Scrape",n="N/A";if(e.hasScraped){const r=I.timestamp(e.lastScrapeTime);e.lastScrapeSucceeded?n=r:(t="Scrape error",n=(e.lastScrapeResult?`${e.lastScrapeResult} - `:"")+r)}return{label:t,value:n}}_updateTiers(){const e="N/A",{list:t}=this.elements.tiers,{torrents:n}=this,r=[];for(const t of n){const o=document.createElement("div");if(o.classList.add("inspector-group"),r.push(o),n.length>1){const e=document.createElement("div");e.classList.add("tier-list-torrent"),h(e,t.getName()),r.push(e)}for(const[n,o]of t.getTrackers().entries()){const t=L.getAnnounceState(o),s=L.lastAnnounceStatus(o),i=L.lastScrapeStatus(o),a=document.createElement("div");a.classList.add("tier-list-row",n%2?"odd":"even");let l=document.createElement("div");l.classList.add("tier-list-tracker"),h(l,`${o.sitename||o.host||o.announce} - tier ${o.tier+1}`),l.setAttribute("title",o.announce),a.append(l),l=document.createElement("div"),l.classList.add("tier-announce"),h(l,`${s.label}: ${s.value}`),a.append(l),l=document.createElement("div"),l.classList.add("tier-seeders"),h(l,`Seeders: ${o.seederCount>-1?o.seederCount:e}`),a.append(l),l=document.createElement("div"),l.classList.add("tier-state"),h(l,t),a.append(l),l=document.createElement("div"),l.classList.add("tier-leechers"),h(l,`Leechers: ${o.leecherCount>-1?o.leecherCount:e}`),a.append(l),l=document.createElement("div"),l.classList.add("tier-scrape"),h(l,`${i.label}: ${i.value}`),a.append(l),l=document.createElement("div"),l.classList.add("tier-downloads"),h(l,`Downloads: ${o.downloadCount>-1?o.downloadCount:e}`),a.append(l),r.push(a)}}for(;t.firstChild;)t.firstChild.remove();t.append(...r)}_changeFileCommand(e,t){const{controller:n,file_torrent:r}=this,o=r.getId();n.changeFileCommand(o,e,t)}_onFileWantedToggled(e){const{indices:t,wanted:n}=e;this._changeFileCommand(t,n?"files-wanted":"files-unwanted")}_onFilePriorityToggled(e){const{indices:t,priority:n}=e;let r=null;switch(n){case-1:r="priority-low";break;case 1:r="priority-high";break;default:r="priority-normal"}this._changeFileCommand(t,r)}_clearFileList(){const{list:e}=this.elements.files;for(;e.firstChild;)e.firstChild.remove();this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null}static createFileTreeModel(e){const t=[],n={children:{},file_indices:[]};for(const[r,o]of e.getFiles().entries()){const{name:e}=o,s=e.split("/");let i=n;for(const[e,t]of s.entries()){let n=i.children[t];n||(i.children[t]=n={children:{},depth:e,file_indices:[],name:t,parent:i}),i=n}i.file_index=r,delete i.children,t.push(i)}for(const e of t){const{file_index:t}=e;let n=e;do{n.file_indices.push(t),n=n.parent}while(n)}return n}addNodeToView(e,t,n,r){const o=new B(e,n.depth,n.name,n.file_indices,r%2);o.addEventListener("wantedToggled",this._onFileWantedToggled.bind(this)),o.addEventListener("priorityToggled",this._onFilePriorityToggled.bind(this)),this.file_rows.push(o),t.append(o.getElement())}addSubtreeToView(e,t,n,r){if(n.parent&&this.addNodeToView(e,t,n,r++),n.children)for(const o of Object.values(n.children))r=this.addSubtreeToView(e,t,o,r);return r}_updateFiles(){const{list:e}=this.elements.files,{file_rows:t,file_torrent:n,file_torrent_n:r,torrents:o}=this;if(1!==o.length)return void this._clearFileList();const[s]=o,i=s.getFiles().length;if(s!==n||i!==r){this._clearFileList(),this.file_torrent=s,this.file_torrent_n=i,this.file_rows=[];const t=document.createDocumentFragment(),n=L.createFileTreeModel(s);this.addSubtreeToView(s,t,n,0),e.append(t)}else for(const e of t)e.refresh()}}let N="";class _ extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){const e=this.controller.getSelectedTorrents();0!==e.length&&(N=N||e[0].getDownloadDir(),this.torrents=e,this.elements=_._create(),this.elements.confirm.addEventListener("click",(()=>this._onConfirm())),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.elements.entry.value=N,document.body.append(this.elements.root),this.elements.entry.focus())}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){const e=this.torrents.map((e=>e.getId())),t=this.elements.entry.value.trim();N=t,this.remote.moveTorrents(e,t),this.close()}static _create(){const e=i("move-dialog");e.root.setAttribute("aria-label","Move Torrent"),e.heading.textContent="Set Torrent Location",confirm.textContent="Apply";const t=document.createElement("label");t.setAttribute("for","torrent-path"),t.textContent="Location:",e.workarea.append(t);const n=document.createElement("input");return n.setAttribute("type","text"),n.id="torrent-path",e.entry=n,e.workarea.append(n),e}}class j extends EventTarget{constructor(e){super(),this.elements=j._create(e),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.options=e,document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}static _create(e){const{heading:t,message:n}=e,r=i("confirm-dialog");return r.confirm.remove(),delete r.confirm,r.heading.textContent=t,r.workarea.textContent=n,r}}class z extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements=this._create(),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.elements.confirm.addEventListener("click",(()=>this._onConfirm())),this._updateFreeSpaceInAddDialog(),document.body.append(this.elements.root),this.elements.url_input.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_updateFreeSpaceInAddDialog(){const e=this.elements.folder_input.value;this.remote.getFreeSpace(e,((e,t)=>{const n=t>0?`${I.size(t)} Free`:"";this.elements.freespace.textContent=n}))}_onConfirm(){const{controller:e,elements:t,remote:n}=this,{file_input:r,folder_input:o,start_input:s,url_input:i}=t,a=!s.checked,l=o.value.trim();for(const t of r.files){const r=new FileReader;r.addEventListener("load",(r=>{const o=r.target.result,s="base64,",i=o.indexOf(s);if(-1===i)return;const c={arguments:{"download-dir":l,metainfo:o.slice(Math.max(0,i+s.length)),paused:a},method:"torrent-add"};n.sendRequest(c,(n=>{"success"!==n.result&&(alert(`Error adding "${t.name}": ${n.result}`),e.setCurrentPopup(new j({heading:`Error adding "${t.name}"`,message:n.result})))}))})),r.readAsDataURL(t)}let c=i.value.trim();if(c.length>0){/^[\da-f]{40}$/i.test(c)&&(c=`magnet:?xt=urn:btih:${c}`);const t={arguments:{"download-dir":l,filename:c,paused:a},method:"torrent-add"};n.sendRequest(t,(t=>{"success"!==t.result&&e.setCurrentPopup(new j({heading:`Error adding "${c}"`,message:t.result}))}))}this._onDismiss()}_create(){const e=i(),{confirm:t,root:n,heading:r,workarea:o}=e;n.classList.add("open-torrent"),r.textContent="Add Torrents",t.textContent="Add";let s=a(),l=document.createElement("label");l.setAttribute("for",s),l.textContent="Please select torrent files to add:",o.append(l);let c=document.createElement("input");c.type="file",c.name="torrent-files[]",c.id=s,c.multiple="multiple",o.append(c),e.file_input=c,s=a(),l=document.createElement("label"),l.setAttribute("for",s),l.textContent="Or enter a URL:",o.append(l),c=document.createElement("input"),c.type="url",c.id=s,o.append(c),e.url_input=c,c.addEventListener("keyup",(({key:e})=>{"Enter"===e&&t.click()})),s=a(),l=document.createElement("label"),l.id="add-dialog-folder-label",l.for=s,l.textContent="Destination folder:",o.append(l);const d=document.createElement("span");d.id="free-space-text",l.append(d),o.append(l),e.freespace=d,c=document.createElement("input"),c.type="text",c.id="add-dialog-folder-input",c.addEventListener("change",(()=>this._updateFreeSpaceInAddDialog())),c.value=this.controller.session_properties["download-dir"],o.append(c),e.folder_input=c;const A=document.createElement("div");o.append(A);const p=document.createElement("input");return p.type="checkbox",p.id="auto-start-check",p.checked=this.controller.shouldAddedTorrentsStart(),A.append(p),e.start_input=p,l=document.createElement("label"),l.id="auto-start-label",l.setAttribute("for",p.id),l.textContent="Start when added",A.append(l),e}}const F="speed-limit-down",P="speed-limit-down-enabled",O="queue-move-bottom",U="queue-move-down",R="queue-move-top",G="queue-move-up",Y="../rpc",Q="alt-speed-down",Z="alt-speed-enabled",W="alt-speed-up",H="speed-limit-up",J="speed-limit-up-enabled";class q{constructor(e){this._controller=e,this._error="",this._session_id=""}sendRequest(e,t,n){const r=new Headers;r.append("cache-control","no-cache"),r.append("content-type","application/json"),r.append("pragma","no-cache"),this._session_id&&r.append(q._SessionHeader,this._session_id);let o=null;fetch(Y,{body:JSON.stringify(e),headers:r,method:"POST"}).then((e=>{if(o=e,409===e.status){const t=new Error(q._SessionHeader);throw t.header=e.headers.get(q._SessionHeader),t}return e.json()})).then((e=>{t&&t.call(n,e,o)})).catch((r=>{if(r.message===q._SessionHeader)return this._session_id=r.header,void this.sendRequest(e,t,n);console.trace(r),this._controller.togglePeriodicSessionRefresh(!1),this._controller.setCurrentPopup(new j({heading:"Connection failed",message:"Could not connect to the server. You may need to reload the page to reconnect."}))}))}loadDaemonPrefs(e,t){this.sendRequest({method:"session-get"},e,t)}checkPort(e,t){this.sendRequest({method:"port-test"},e,t)}renameTorrent(e,t,n,r,o){const s={arguments:{ids:e,name:n,path:t},method:"torrent-rename-path"};this.sendRequest(s,r,o)}setLabels(e,t,n){const r={ids:e,labels:t};this.sendRequest({arguments:r,method:"torrent-set"},n)}loadDaemonStats(e,t){this.sendRequest({method:"session-stats"},e,t)}updateTorrents(e,t,n,r){const o={arguments:{fields:t,format:"table"},method:"torrent-get"};e&&(o.arguments.ids=e),this.sendRequest(o,(e=>{const t=e.arguments;n.call(r,t.torrents,t.removed)}))}getFreeSpace(e,t,n){const r={arguments:{path:e},method:"free-space"};this.sendRequest(r,(e=>{const r=e.arguments;t.call(n,r.path,r["size-bytes"])}))}changeFileCommand(e,t,n){const r={ids:[e]};r[n]=t,this.sendRequest({arguments:r,method:"torrent-set"},(()=>{this._controller.refreshTorrents([e])}))}sendTorrentSetRequests(e,t,n,r,o){n||(n={}),n.ids=t;const s={arguments:n,method:e};this.sendRequest(s,r,o)}sendTorrentActionRequests(e,t,n,r){this.sendTorrentSetRequests(e,t,null,n,r)}startTorrents(e,t,n,r){const o=t?"torrent-start-now":"torrent-start";this.sendTorrentActionRequests(o,e,n,r)}stopTorrents(e,t,n){this.sendTorrentActionRequests("torrent-stop",e,t,n)}moveTorrents(e,t,n,r){this.sendTorrentSetRequests("torrent-set-location",e,{location:t,move:!0},n,r)}removeTorrents(e,t){const n={arguments:{"delete-local-data":t,ids:[]},method:"torrent-remove"};if(e)for(let t=0,r=e.length;t{this._controller.refreshTorrents()}))}verifyTorrents(e,t,n){this.sendTorrentActionRequests("torrent-verify",e,t,n)}reannounceTorrents(e,t,n){this.sendTorrentActionRequests("torrent-reannounce",e,t,n)}addTorrentByUrl(e,t){/^[\da-f]{40}$/i.test(e)&&(e=`magnet:?xt=urn:btih:${e}`);const n={arguments:{filename:e,paused:t.paused},method:"torrent-add"};this.sendRequest(n,(()=>{this._controller.refreshTorrents()}))}savePrefs(e){const t={arguments:e,method:"session-set"};this.sendRequest(t,(()=>{this._controller.loadDaemonPrefs()}))}updateBlocklist(){this.sendRequest({method:"blocklist-update"},(()=>{this._controller.loadDaemonPrefs()}))}moveTorrentsToTop(e,t,n){this.sendTorrentActionRequests(R,e,t,n)}moveTorrentsToBottom(e,t,n){this.sendTorrentActionRequests(O,e,t,n)}moveTorrentsUp(e,t,n){this.sendTorrentActionRequests(G,e,t,n)}moveTorrentsDown(e,t,n){this.sendTorrentActionRequests(U,e,t,n)}}function V(e,t){const n=document.createElement("fieldset");n.classList.add("section",e);const r=document.createElement("legend");return r.classList.add("title"),r.textContent=t,n.append(r),n}function K(e,t,n,r){const o=document.createElement("button");return o.textContent=t,o.addEventListener("click",r),e.append(o),o.dataset.action=n,o}q._SessionHeader="X-Transmission-Session-Id";class X extends EventTarget{constructor(e,t,n,r){super(),this.action_listener=this._onActionChange.bind(this),this.action_manager=r,this.action_manager.addEventListener("change",this.action_listener),this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=t,this.prefs.addEventListener("change",this.prefs_listener),this.closed=!1,this.remote=n,this.name="overflow-menu",this.session_listener=this._onSessionChange.bind(this),this.session_manager=e,this.session_manager.addEventListener("session-change",this.session_listener);const{session_properties:o}=e;Object.assign(this,this._create(o)),this.outside=new m(this.root),this.outside.addEventListener("click",(()=>this.close())),Object.seal(this),this.show()}show(){document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.session_listener),this.action_manager.removeEventListener("change",this.action_listener),this.prefs.removeEventListener("change",this.prefs_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))this[e]=null;this.closed=!0}}_onSessionChange(e){const{alt_speed_check:t}=this.elements,{session_properties:n}=e;t.checked=n[Z]}_onPrefsChange(e){switch(e.key){case f.SortDirection:case f.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value}}_onActionChange(e){const t=this.actions[e.action];t&&this._updateElement(t)}_updateElement(e){if(e.dataset.action){const{action:t}=e.dataset,n=this.action_manager.keyshortcuts(t);n&&e.setAttribute("aria-keyshortcuts",n),p(e,this.action_manager.isEnabled(t))}}_onClick(e){const{action:t,pref:n}=e.target.dataset;t?this.action_manager.click(t):n?this.prefs[n]=e.target.value:(console.log("unhandled"),console.log(e),console.trace())}_create(e){const t={},n={},r=this._onClick.bind(this),o=document.createElement("div");o.classList.add("overflow-menu","popup");let s=V("display","Display");o.append(s);let i=document.createElement("div");i.id="display-options",s.append(i);let a=document.createElement("div");i.append(a);let l=document.createElement("label");l.id="display-sort-mode-label",l.textContent="Sort by",a.append(l);let c=document.createElement("select");c.id="display-sort-mode-select",c.dataset.pref=f.SortMode,a.append(c);const d=[[f.SortByActivity,"Activity"],[f.SortByAge,"Age"],[f.SortByName,"Name"],[f.SortByProgress,"Progress"],[f.SortByQueue,"Queue order"],[f.SortByRatio,"Ratio"],[f.SortBySize,"Size"],[f.SortByState,"State"]];for(const[e,t]of d){const n=document.createElement("option");n.value=e,n.textContent=t,c.append(n)}l.setAttribute("for",c.id),c.value=this.prefs.sort_mode,c.addEventListener("change",(e=>{this.prefs.sort_mode=e.target.value})),a=document.createElement("div"),i.append(a);let A=document.createElement("input");A.id="display-sort-reverse-check",A.dataset.pref=f.SortDirection,A.type="checkbox",a.append(A),l=document.createElement("label"),l.id="display-sort-reverse-label",l.setAttribute("for",A.id),l.textContent="Reverse sort",a.append(l),A.checked=this.prefs.sort_direction!==f.SortAscending,A.addEventListener("input",(e=>{this.prefs.sort_direction=e.target.checked?f.SortDescending:f.SortAscending})),a=document.createElement("div"),i.append(a);const p="toggle-compact-rows";A=document.createElement("input"),A.id="display-compact-check",A.dataset.action=p,A.type="checkbox",a.append(A),l=document.createElement("label"),l.id="display-compact-label",l.for=A.id,l.setAttribute("for",A.id),l.textContent=this.action_manager.text(p),a.append(l),A.checked=this.prefs.display_mode===f.DisplayCompact,A.addEventListener("input",(e=>{const{checked:t}=e.target;this.prefs.display_mode=t?f.DisplayCompact:f.DisplayFull})),a=document.createElement("div"),i.append(a),A=document.createElement("input"),A.id="display-fullscreen-check",A.type="checkbox";const g=()=>null!==document.fullscreenElement;A.checked=g(),A.addEventListener("input",(()=>{g()?document.exitFullscreen():document.body.requestFullscreen()})),document.addEventListener("fullscreenchange",(()=>{A.checked=g()})),a.append(A),l=document.createElement("label"),l.id="display-fullscreen-label",l.for=A.id,l.setAttribute("for",A.id),l.textContent="Fullscreen",a.append(l),s=V("speed","Speed Limit"),o.append(s),i=document.createElement("div"),i.id="speed-options",s.append(i),a=document.createElement("div"),a.classList.add("speed-up"),i.append(a),l=document.createElement("label"),l.id="speed-up-label",l.textContent="Upload:",a.append(l);const u="Unlimited";c=document.createElement("select"),c.id="speed-up-select",a.append(c);const m=["10","100","200","500","750",u];for(const t of[...new Set(m).add(`${e[H]}`).values()].sort()){const e=document.createElement("option");e.value=t,e.textContent=t===u?u:I.speed(t),c.append(e)}l.setAttribute("for",c.id),c.value=e[J]?`${e[H]}`:u,c.addEventListener("change",(e=>{const{value:t}=e.target;console.log(e),t===u?this.remote.savePrefs({[J]:!1}):this.remote.savePrefs({[J]:!0,[H]:Number.parseInt(t,10)})})),a=document.createElement("div"),a.classList.add("speed-down"),i.append(a),l=document.createElement("label"),l.id="speed-down-label",l.textContent="Download:",a.append(l),c=document.createElement("select"),c.id="speed-down-select",a.append(c);for(const t of[...new Set(m).add(`${e[F]}`).values()].sort()){const e=document.createElement("option");e.value=t,e.textContent=t,c.append(e)}l.setAttribute("for",c.id),c.value=e[P]?`${e[F]}`:u,c.addEventListener("change",(e=>{const{value:t}=e.target;console.log(e),t===u?this.remote.savePrefs({[P]:!1}):this.remote.savePrefs({[P]:!0,[F]:Number.parseInt(t,10)})})),a=document.createElement("div"),a.classList.add("alt-speed"),i.append(a),A=document.createElement("input"),A.id="alt-speed-check",A.type="checkbox",A.checked=e[Z],A.addEventListener("change",(e=>{this.remote.savePrefs({[Z]:e.target.checked})})),a.append(A),n.alt_speed_check=A,l=document.createElement("label"),l.id="alt-speed-image",l.setAttribute("for",A.id),a.append(l),l=document.createElement("label"),l.id="alt-speed-label",l.setAttribute("for",A.id),l.textContent="Use Temp limits",a.append(l),l=document.createElement("label"),l.id="alt-speed-values-label",l.setAttribute("for",A.id);const h=I.speed(e[W]),b=I.speed(e[Q]);l.textContent=`(${h} up, ${b} down)`,a.append(l),s=V("actions","Actions"),o.append(s);for(const e of["show-preferences-dialog","pause-all-torrents","start-all-torrents"]){const n=this.action_manager.text(e);t[e]=K(s,n,e,r)}s=V("info","Info"),o.append(s),i=document.createElement("div"),s.append(i);for(const e of["show-about-dialog","show-shortcuts-dialog","show-statistics-dialog"]){const n=this.action_manager.text(e);t[e]=K(i,n,e,r)}s=V("links","Links"),o.append(s),i=document.createElement("div"),s.append(i);let C=document.createElement("a");return C.href="https://transmissionbt.com/",C.tabindex="0",C.textContent="Homepage",i.append(C),C=document.createElement("a"),C.href="https://transmissionbt.com/donate/",C.tabindex="0",C.textContent="Tip Jar",i.append(C),C=document.createElement("a"),C.href="https://github.com/transmission/transmission/",C.tabindex="0",C.textContent="Source Code",i.append(C),this._updateElement=this._updateElement.bind(this),{actions:t,elements:n,root:o}}}class $ extends EventTarget{static _initTimeDropDown(e){for(let t=0;t<96;++t){const n=15*t,r=`${Number.parseInt(t/4,10)}:${t%4*15||"00"}`;e.options[t]=new Option(r,n)}}static _initDayDropDown(e){const t=[["Everyday","127"],["Weekdays","62"],["Weekends","65"],["Sunday","1"],["Monday","2"],["Tuesday","4"],["Wednesday","8"],["Thursday","16"],["Friday","32"],["Saturday","64"]];for(let n=0;t[n];++n){const[r,o]=t[n];e.options[n]=new Option(r,o)}}_checkPort(){const e=this.elements.network.port_status_label;e.removeAttribute("data-open"),h(e,"Checking..."),this.remote.checkPort(this._onPortChecked,this)}_onPortChecked(e){const t=this.elements.network.port_status_label,n=e.arguments["port-is-open"];t.dataset.open=n,h(t,n?"Open":"Closed")}_setBlocklistButtonEnabled(e){const t=this.elements.peers.blocklist_update_button;p(t,e),t.value=e?"Update":"Updating..."}static _getValue(e){switch(e.type){case"checkbox":case"radio":return e.checked;case"number":case"text":case"url":{const t=e.value;return Number.parseInt(t,10).toString()===t?Number.parseInt(t,10):Number.parseFloat(t).toString()===t?Number.parseFloat(t):t}default:return null}}_onControlChanged(e){const{key:t}=e.target.dataset;this.remote.savePrefs({[t]:$._getValue(e.target)}),"peer-port"!==t&&"port-forwarding-enabled"!==t||this._checkPort()}_onDialogClosed(){this.dispatchEvent(new Event("closed"))}_update(e){if(e){this._setBlocklistButtonEnabled(!0);for(const[t,n]of Object.entries(e))for(const e of this.elements.root.querySelectorAll(`[data-key="${t}"]`))if("blocklist-size"===t){const t=I.number(n);e.innerHTML=`Blocklist has ${t} rules`,h(this.elements.peers.blocklist_update_button,"Update")}else switch(e.type){case"checkbox":case"radio":e.checked!==n&&(e.checked=n,e.dispatchEvent(new Event("change")));break;case"text":case"url":case"email":case"number":case"search":e.value!=n&&e!==document.activeElement&&(e.value=n,e.dispatchEvent(new Event("change")));break;case"select-one":e.value!==n&&(e.value=n,e.dispatchEvent(new Event("change")))}}}shouldAddedTorrentsStart(){return this.data.elements.root.find("#start-added-torrents")[0].checked}static _createCheckAndLabel(e,t){const n=document.createElement("div");n.id=e;const r=document.createElement("input");r.id=a(),r.type="checkbox",n.append(r);const o=document.createElement("label");return o.textContent=t,o.setAttribute("for",r.id),n.append(o),{check:r,label:o,root:n}}static _enableIfChecked(e,t){const n=()=>{"INPUT"===e.tagName?p(e,t.checked):e.classList.toggle("disabled",!t.checked)};t.addEventListener("change",n),n()}static _createTorrentsPage(){const e=document.createElement("div");e.classList.add("prefs-torrents-page");let t=document.createElement("div");t.textContent="Downloading",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Download to:",e.append(t);let n=document.createElement("input");n.type="text",n.id=a(),n.dataset.key="download-dir",t.setAttribute("for",n.id),e.append(n);const r=n;let o=$._createCheckAndLabel("incomplete-dir-div","Use temporary folder:");o.check.title="Separate folder to temporarily store downloads until they are complete.",o.check.dataset.key="incomplete-dir-enabled",o.label.title=o.check.title,e.append(o.root);const s=o.check;n=document.createElement("input"),n.type="text",n.dataset.key="incomplete-dir",e.append(n),$._enableIfChecked(n,o.check);const i=n;o=$._createCheckAndLabel("autostart-div","Start when added"),o.check.dataset.key="start-added-torrents",e.append(o.root);const l=o.check;o=$._createCheckAndLabel("suffix-div",'Append "part" to incomplete files\' names'),o.check.dataset.key="rename-partial-files",e.append(o.root);const c=o.check;o=$._createCheckAndLabel("download-queue-div","Download queue size:"),o.check.dataset.key="download-queue-enabled",e.append(o.root);const d=o.check;n=document.createElement("input"),n.type="number",n.dataset.key="download-queue-size",e.append(n),$._enableIfChecked(n,o.check);const A=n;t=document.createElement("div"),t.textContent="Seeding",t.classList.add("section-label"),e.append(t),o=$._createCheckAndLabel("stop-ratio-div","Stop seeding at ratio:"),o.check.dataset.key="seedRatioLimited",e.append(o.root);const p=o.check;n=document.createElement("input"),n.type="number",n.dataset.key="seedRatioLimit",e.append(n),$._enableIfChecked(n,o.check);const g=n;o=$._createCheckAndLabel("stop-idle-div","Stop seeding if idle for N mins:"),o.check.dataset.key="idle-seeding-limit-enabled",e.append(o.root);const u=o.check;n=document.createElement("input"),n.type="number",n.dataset.key="idle-seeding-limit",e.append(n),$._enableIfChecked(n,o.check);return{autostart_check:l,download_dir:r,download_queue_check:d,download_queue_input:A,incomplete_dir_check:s,incomplete_dir_input:i,root:e,stop_idle_check:u,stop_idle_input:n,stop_ratio_check:p,stop_ratio_input:g,suffix_check:c}}static _createSpeedPage(){const e=document.createElement("div");e.classList.add("prefs-speed-page");let t=document.createElement("div");t.textContent="Speed Limits",t.classList.add("section-label"),e.append(t);let n=$._createCheckAndLabel("upload-speed-div","Upload (kB/s):");n.check.dataset.key="speed-limit-up-enabled",e.append(n.root);const r=n.check;let o=document.createElement("input");o.type="number",o.dataset.key="speed-limit-up",e.append(o),$._enableIfChecked(o,n.check);const s=o;n=$._createCheckAndLabel("download-speed-div","Download (kB/s):"),n.check.dataset.key="speed-limit-down-enabled",e.append(n.root);const i=n.check;o=document.createElement("input"),o.type="number",o.dataset.key="speed-limit-down",e.append(o),$._enableIfChecked(o,n.check);const l=o;t=document.createElement("div"),t.textContent="Alternative Speed Limits",t.classList.add("section-label","alt-speed-section-label"),e.append(t),t=document.createElement("div"),t.textContent="Override normal speed limits manually or at scheduled times",t.classList.add("alt-speed-label"),e.append(t),t=document.createElement("label"),t.textContent="Upload (kB/s):",e.append(t),o=document.createElement("input"),o.type="number",o.dataset.key="alt-speed-up",o.id=a(),t.setAttribute("for",o.id),e.append(o);const c=o;t=document.createElement("label"),t.textContent="Download (kB/s):",e.append(t),o=document.createElement("input"),o.type="number",o.dataset.key="alt-speed-down",o.id=a(),t.setAttribute("for",o.id),e.append(o);const d=o;n=$._createCheckAndLabel("alt-times-div","Scheduled times"),n.check.dataset.key="alt-speed-time-enabled",e.append(n.root);const A=n.check;t=document.createElement("label"),t.textContent="From:",$._enableIfChecked(t,n.check),e.append(t);let p=document.createElement("select");p.id=a(),p.dataset.key="alt-speed-time-begin",$._initTimeDropDown(p),t.setAttribute("for",p.id),e.append(p),$._enableIfChecked(p,n.check);const g=p;t=document.createElement("label"),t.textContent="To:",$._enableIfChecked(t,n.check),e.append(t),p=document.createElement("select"),p.id=a(),p.dataset.key="alt-speed-time-end",$._initTimeDropDown(p),t.setAttribute("for",p.id),e.append(p),$._enableIfChecked(p,n.check);const u=p;t=document.createElement("label"),t.textContent="On days:",$._enableIfChecked(t,n.check),e.append(t),p=document.createElement("select"),p.id=a(),p.dataset.key="alt-speed-time-day",$._initDayDropDown(p),t.setAttribute("for",p.id),e.append(p),$._enableIfChecked(p,n.check);return{alt_days_select:p,alt_download_speed_input:d,alt_from_select:g,alt_times_check:A,alt_to_select:u,alt_upload_speed_input:c,download_speed_check:i,download_speed_input:l,root:e,upload_speed_check:r,upload_speed_input:s}}static _createPeersPage(){const e=document.createElement("div");e.classList.add("prefs-peers-page");let t=document.createElement("div");t.textContent="Connections",t.classList.add("section-label"),e.append(t);let n=$._createCheckAndLabel("max-peers-per-torrent-div","Max peers per torrent:");e.append(n.root);const r=n.check;let o=document.createElement("input");o.type="number",o.dataset.key="peer-limit-per-torrent",e.append(o),$._enableIfChecked(o,n.check);const s=o;n=$._createCheckAndLabel("max-peers-overall-div","Max peers overall:"),e.append(n.root);const i=n.check;o=document.createElement("input"),o.type="number",o.dataset.key="peer-limit-global",e.append(o),$._enableIfChecked(o,n.check);const l=o;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Encryption mode:",e.append(t);const c=document.createElement("select");c.id=a(),c.dataset.key="encryption",c.options[0]=new Option("Prefer encryption","preferred"),c.options[1]=new Option("Allow encryption","tolerated"),c.options[2]=new Option("Require encryption","required"),e.append(c);const d=c;n=$._createCheckAndLabel("use-pex-div","Use PEX to find more peers"),n.check.title="PEX is a tool for exchanging peer lists with the peers you're connected to.",n.check.dataset.key="pex-enabled",n.label.title=n.check.title,e.append(n.root);const A=n.check;n=$._createCheckAndLabel("use-dht-div","Use DHT to find more peers"),n.check.title="DHT is a tool for finding peers without a tracker.",n.check.dataset.key="dht-enabled",n.label.title=n.check.title,e.append(n.root);const p=n.check;n=$._createCheckAndLabel("use-lpd-div","Use LPD to find more peers"),n.check.title="LPD is a tool for finding peers on your local network.",n.check.dataset.key="lpd-enabled",n.label.title=n.check.title,e.append(n.root);const g=n.check;t=document.createElement("div"),t.textContent="Blocklist",t.classList.add("section-label"),e.append(t),n=$._createCheckAndLabel("blocklist-enabled-div","Enable blocklist:"),n.check.dataset.key="blocklist-enabled",e.append(n.root);const u=n.check;o=document.createElement("input"),o.type="url",o.value="http://www.example.com/blocklist",o.dataset.key="blocklist-url",e.append(o),$._enableIfChecked(o,n.check);const m=o;t=document.createElement("label"),t.textContent="Blocklist has {n} rules",t.dataset.key="blocklist-size",t.classList.add("blocklist-size-label"),$._enableIfChecked(t,n.check),e.append(t);const h=document.createElement("button");h.classList.add("blocklist-update-button"),h.textContent="Update",e.append(h),$._enableIfChecked(h,n.check);return{blocklist_enabled_check:u,blocklist_update_button:h,blocklist_url_input:m,dht_check:p,encryption_select:d,lpd_check:g,max_peers_overall_check:i,max_peers_overall_input:l,max_peers_per_torrent_check:r,max_peers_per_torrent_input:s,pex_check:A,root:e}}static _createNetworkPage(){const e=document.createElement("div");e.classList.add("prefs-network-page");let t=document.createElement("div");t.textContent="Listening Port",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Peer listening port:",e.append(t);const n=document.createElement("input");n.type="number",n.dataset.key="peer-port",n.id=a(),t.setAttribute("for",n.id),e.append(n);const r=n,o=document.createElement("div");o.classList.add("port-status"),t=document.createElement("label"),t.textContent="Port is",o.append(t);const s=document.createElement("label");s.textContent="?",s.classList.add("port-status-label"),o.append(s),e.append(o);let i=$._createCheckAndLabel("randomize-port","Randomize port on launch");i.check.dataset.key="peer-port-random-on-start",e.append(i.root);const l=i.check;i=$._createCheckAndLabel("port-forwarding","Use port forwarding from my router"),i.check.dataset.key="port-forwarding-enabled",e.append(i.root);const c=i.check;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),i=$._createCheckAndLabel("utp-enabled","Enable uTP for peer communication"),i.check.dataset.key="utp-enabled",e.append(i.root);return{port_forwarding_check:c,port_input:r,port_status_label:s,random_port_check:l,root:e,utp_check:i.check}}static _create(){const e={network:$._createNetworkPage(),peers:$._createPeersPage(),speed:$._createSpeedPage(),torrents:$._createTorrentsPage()};return{...s("prefs-dialog",[["prefs-tab-torrent",e.torrents.root],["prefs-tab-speed",e.speed.root],["prefs-tab-peers",e.peers.root],["prefs-tab-network",e.network.root]]),...e}}constructor(e,t){super(),this.closed=!1,this.session_manager=e,this.remote=t,this.update_soon=()=>this._update(this.session_manager.session_properties),this.elements=$._create(),this.elements.peers.blocklist_update_button.addEventListener("click",(e=>{h(e.target,"Updating blocklist..."),this.remote.updateBlocklist(),this._setBlocklistButtonEnabled(!1)})),this.outside=new m(this.elements.root),this.outside.addEventListener("click",(()=>this.close())),Object.seal(this);const n=this._onControlChanged.bind(this),r=e=>{for(const t of Object.values(e))if("INPUT"===t.tagName)switch(t.type){case"checkbox":case"radio":case"number":case"text":case"url":t.addEventListener("change",n);break;default:console.trace(`unhandled input: ${t.type}`)}};r(this.elements.network),r(this.elements.peers),r(this.elements.speed),r(this.elements.torrents),this.session_manager.addEventListener("session-change",this.update_soon),this.update_soon(),document.body.append(this.elements.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.update_soon),this.elements.root.remove(),dispatchEvent(new Event("close"));for(const e of Object.keys(this))this[e]=null;this.closed=!0}}}class ee extends EventTarget{constructor(e){super(),this.options=e,this.elements=ee._create(e),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.elements.confirm.addEventListener("click",(()=>this._onConfirm())),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(const e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_onConfirm(){const{remote:e,torrents:t,trash:n}=this.options;t.length>0&&e.removeTorrents(t,n),this.close()}static _create(e){const{trash:t}=e,{heading:n,message:r}=ee._createMessage(e),o=i("remove-dialog");return o.heading.textContent=n,o.message.textContent=r,o.confirm.textContent=t?"Trash":"Remove",o}static _createMessage(e){let t=null,n=null;const{torrents:r,trash:o}=e,[s]=r;return o&&1===r.length?(t=`Remove ${s.getName()} and delete data?`,n="All data downloaded for this torrent will be deleted. Are you sure you want to remove it?"):o?(t=`Remove ${r.length} transfers and delete data?`,n="All data downloaded for these torrents will be deleted. Are you sure you want to remove them?"):1===r.length?(t=`Remove ${s.getName()}?`,n="Once removed, continuing the transfer will require the torrent file. Are you sure you want to remove it?"):(t=`Remove ${r.length} transfers?`,n="Once removed, continuing the transfers will require the torrent files. Are you sure you want to remove them?"),{heading:t,message:n}}}class te extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){const e=this.controller.getSelectedTorrents();1===e.length?(this.torrents=e,this.elements=te._create(),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.elements.confirm.addEventListener("click",(()=>this._onConfirm())),this.elements.entry.value=e[0].getName(),document.body.append(this.elements.root),this.elements.entry.focus()):console.trace()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){const[e]=this.torrents,t=e.getName(),n=this.elements.entry.value;this.remote.renameTorrent([e.getId()],t,n,(t=>{"success"===t.result&&e.refresh(t.arguments)})),this.close()}static _create(){const e=i("rename-dialog");e.root.setAttribute("aria-label","Rename Torrent"),e.heading.textContent="Enter new name:",e.confirm.textContent="Rename";const t=document.createElement("label");t.setAttribute("for","torrent-rename-name"),t.textContent="Enter new name:",e.workarea.append(t);const n=document.createElement("input");return n.setAttribute("type","text"),n.id="torrent-rename-name",e.entry=n,e.workarea.append(n),e}}class ne extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){const e=this.controller.getSelectedTorrents();if(0===e.length)return void console.error("At least one selected torrent expected.");const[t]=e;this.torrents=e,this.elements=ne._create(),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),this.elements.confirm.addEventListener("click",(()=>this._onConfirm())),this.elements.entry.value=t.getLabels().join(", "),document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){const{torrents:e}=this,{remote:t}=this,n=e.map((e=>e.getId())),{elements:r}=this,{entry:o}=r,{value:s}=o,i=s.split(/ *, */).filter((e=>e.length>0));t.setLabels(n,i,(t=>{if("success"===t.result)for(const t of e)t.refresh({labels:i})})),this.close()}static _create(){const e=i("labels-dialog");e.root.setAttribute("aria-label","Edit Labels"),e.heading.textContent="Edit Labels:",e.confirm.textContent="Save";const t=document.createElement("label");t.setAttribute("for","torrent-labels"),t.textContent="Labels:",e.workarea.append(t);const n=document.createElement("input");return n.setAttribute("type","text"),n.id="torrent-labels",e.entry=n,e.workarea.append(n),e}}class re extends EventTarget{constructor(e){super(),this.elements=re._create(e),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onDismiss(){this.close()}static _create(e){const t=i("shortcuts-dialog");t.root.setAttribute("aria-label","Keyboard Shortcuts");const n=document.createElement("table"),r=document.createElement("thead");n.append(r);let o=document.createElement("tr");r.append(o);let s=document.createElement("th");s.textContent="Key",o.append(s),s=document.createElement("th"),s.textContent="Action",o.append(s);const a=document.createElement("tbody");n.append(a);const l={};for(const[t,n]of e.allShortcuts().entries()){const e=t.split("+");l[[e.pop(),...e].join("+")]={name:n,shortcut:t}}for(const[,t]of Object.entries(l).sort()){const{name:n,shortcut:r}=t;o=document.createElement("tr"),a.append(o);let s=document.createElement("td");s.textContent=r.replaceAll("+"," + "),o.append(s),s=document.createElement("td"),s.textContent=e.text(n),o.append(s)}return t.heading.textContent="Transmission",t.dismiss.textContent="Close",t.heading.textContent="Keyboard shortcuts",t.message.append(n),t.confirm.remove(),delete t.confirm,t}}class oe extends EventTarget{constructor(e){super(),this.remote=e;const t=()=>this.remote.loadDaemonStats((e=>this._update(e.arguments)));this.interval=setInterval(t,5e3),t(),this.elements=oe._create(),this.elements.dismiss.addEventListener("click",(()=>this._onDismiss())),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove();for(const e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_update(e){console.log(e);const t=I;let n=e["current-stats"],r=o.ratio(n.uploadedBytes,n.downloadedBytes);h(this.elements.session.up,t.size(n.uploadedBytes)),h(this.elements.session.down,t.size(n.downloadedBytes)),h(this.elements.session.ratio,t.ratioString(r)),h(this.elements.session.time,t.timeInterval(n.secondsActive)),n=e["cumulative-stats"],r=o.ratio(n.uploadedBytes,n.downloadedBytes),h(this.elements.total.up,t.size(n.uploadedBytes)),h(this.elements.total.down,t.size(n.downloadedBytes)),h(this.elements.total.ratio,t.ratioString(r)),h(this.elements.total.time,t.timeInterval(n.secondsActive))}static _create(){const e=i("statistics-dialog"),{confirm:t,dismiss:n,heading:r,root:o,workarea:s}=e;t.remove(),n.textContent="Close",delete e.confirm;const a="Statistics";o.setAttribute("aria-label",a),r.textContent=a;const c=["Uploaded:","Downloaded:","Ratio:","Running time:"];let d=l("Current session",c);const[A,p,g,u]=d.children,m=e.session={};m.up=A,m.down=p,m.ratio=g,m.time=u,s.append(d.root),d=l("Total",c);const[h,b,f,C]=d.children,v=e.total={};return v.up=h,v.down=b,v.ratio=f,v.time=C,s.append(d.root),e}}const se={formatDL:e=>`▼${I.speedBps(e.getDownloadSpeed())}`,formatETA:e=>{const t=e.getETA();return t<0||t>=3596400?"":`ETA: ${I.timeInterval(t)}`},formatLabels:e=>e.getLabels().length>0?`🏷 ${e.getLabels().join(", ")}`:"",formatUL:e=>`▲${I.speedBps(e.getUploadSpeed())}`,getProgressInfo:(e,t)=>{const n=t.getStatus(),r=["torrent-progress-bar"];let o=null;if(n===D._StatusStopped&&r.push("paused"),t.needsMetaData())r.push("magnet"),o=Math.round(100*t.getMetadataPercentComplete());else if(n===D._StatusCheck)r.push("verify"),o=Math.round(100*t.getRecheckProgress());else if(t.getLeftUntilDone()>0)r.push("leech"),o=Math.round(100*t.getPercentDone());else{r.push("seed");const n=t.seedRatioLimit(e);o=n>0?100*t.getUploadRatio()/n:100}return t.isQueued()&&r.push("queued"),{classList:r,percent:o}},renderProgressbar:(e,t,n)=>{const r=se.getProgressInfo(e,t);n.className=r.classList.join(" "),n.style["background-size"]=`${r.percent}% 100%, 100% 100%`}};class ie{static getPeerDetails(e){const t=I,n=e.getErrorMessage();if(n)return n;if(e.isDownloading()){const n=e.getPeersConnected(),r=e.getWebseedsSendingToUs();return r&&n?["Downloading from",e.getPeersSendingToUs(),"of",t.countString("peer","peers",n),"and",t.countString("web seed","web seeds",r),"–",se.formatDL(e),se.formatUL(e)].join(" "):r?["Downloading from",t.countString("web seed","web seeds",r),"–",se.formatDL(e),se.formatUL(e)].join(" "):["Downloading from",e.getPeersSendingToUs(),"of",t.countString("peer","peers",n),"–",se.formatDL(e),se.formatUL(e)].join(" ")}return e.isSeeding()?["Seeding to",e.getPeersGettingFromUs(),"of",t.countString("peer","peers",e.getPeersConnected()),"-",se.formatUL(e)].join(" "):e.isChecking()?["Verifying local data (",I.percentString(100*e.getRecheckProgress()),"% tested)"].join(""):e.getStateString()}static getProgressDetails(e,t){if(t.needsMetaData()){let e="retrieving";t.isStopped()&&(e="needs");const n=100*t.getMetadataPercentComplete();return[`Magnetized transfer - ${e} metadata (`,I.percentString(n),"%)"].join("")}const n=t.getSizeWhenDone(),r=t.getTotalSize(),o=t.isDone()||t.isSeeding(),s=[];if(o?(r===n?s.push(I.size(r)):s.push(I.size(n)," of ",I.size(t.getTotalSize())," (",t.getPercentDoneStr(),"%)"),s.push(", uploaded ",I.size(t.getUploadedEver())," (Ratio ",I.ratioString(t.getUploadRatio()),")")):s.push(I.size(n-t.getLeftUntilDone())," of ",I.size(n)," (",t.getPercentDoneStr(),"%)"),!t.isStopped()&&(!o||t.seedRatioLimit(e)>0)){s.push(" - ");const e=t.getETA();e<0||e>=3596400?s.push("remaining time unknown"):s.push(I.timeInterval(t.getETA())," remaining")}return s.join("")}render(e,t,n){const r=t.isStopped();let o=n._name_container;h(o,t.getName()),o.classList.toggle("paused",r),o=n._labels_container,h(o,se.formatLabels(t)),se.renderProgressbar(e,t,n._progressbar),n._progressbar.classList.add("full");const s=t.getError()!==D._ErrNone;o=n._peer_details_container,o.classList.toggle("error",s),h(o,ie.getPeerDetails(t)),o=n._progress_details_container,h(o,ie.getProgressDetails(e,t)),o=n._toggle_running_button,o.alt=r?"Resume":"Pause",o.dataset.action=r?"resume":"pause"}createRow(e){const t=document.createElement("li");t.className="torrent";const n=document.createElement("div");n.classList.add("icon"),n.dataset.iconMimeType=e.getPrimaryMimeType().split("/",1).pop(),n.dataset.iconMultifile=e.getFileCount()>1?"true":"false";const r=document.createElement("div");r.className="torrent-name";const o=document.createElement("div");o.className="torrent-labels";const s=document.createElement("div");s.className="torrent-peer-details";const i=document.createElement("div");i.classList.add("torrent-progress");const a=document.createElement("div");a.classList.add("torrent-progress-bar","full"),i.append(a);const l=document.createElement("a");l.className="torrent-pauseresume-button",i.append(l);const c=document.createElement("div");return c.className="torrent-progress-details",t.append(n),t.append(r),t.append(o),t.append(s),t.append(i),t.append(c),t._icon=n,t._name_container=r,t._labels_container=o,t._peer_details_container=s,t._progress_details_container=c,t._progressbar=a,t._toggle_running_button=l,t}}class ae{static getPeerDetails(e){const t=e.getErrorMessage();if(t)return t;if(e.isDownloading()){const t=e.getDownloadSpeed()>0,n=e.getUploadSpeed()>0;if(!n&&!t)return"Idle";const r=[`${se.formatETA(e)} `];return t&&r.push(se.formatDL(e)),n&&r.push(se.formatUL(e)),r.join(" ")}return e.isSeeding()?`Ratio: ${I.ratioString(e.getUploadRatio())}, ${se.formatUL(e)}`:e.getStateString()}render(e,t,n){let r=n._name_container;r.classList.toggle("paused",t.isStopped()),h(r,t.getName()),r=n._labels_container,h(r,se.formatLabels(t));const o=t.getError()!==D._ErrNone;r=n._details_container,r.classList.toggle("error",o),h(r,ae.getPeerDetails(t)),se.renderProgressbar(e,t,n._progressbar),n._progressbar.classList.add("compact")}createRow(e){const t=document.createElement("div");t.classList.add("torrent-progress-bar","compact");const n=document.createElement("div");n.classList.add("icon"),n.dataset.iconMimeType=e.getPrimaryMimeType().split("/",1).pop(),n.dataset.iconMultifile=e.getFileCount()>1?"true":"false";const r=document.createElement("div");r.className="torrent-peer-details compact";const o=document.createElement("div");o.className="torrent-labels compact";const s=document.createElement("div");s.className="torrent-name compact";const i=document.createElement("li");return i.append(t),i.append(r),i.append(o),i.append(s),i.append(n),i.className="torrent compact",i._progressbar=t,i._details_container=r,i._labels_container=o,i._name_container=s,i}}class le{constructor(e,t,n){this._view=e,this._torrent=n,this._element=e.createRow(n);const r=()=>this.render(t);this._torrent.addEventListener("dataChanged",r),r()}getElement(){return this._element}render(e){const t=this.getTorrent();t&&this._view.render(e,t,this.getElement())}isSelected(){return this.getElement().classList.contains("selected")}getTorrent(){return this._torrent}getTorrentId(){return this.getTorrent().getId()}}class ce extends EventTarget{constructor(e,t,n){super(),this.action_manager=e,this.notifications=t,this.prefs=n,this.remote=new q(this),this.addEventListener("torrent-selection-changed",(e=>this.action_manager.update(e))),this.filterText="",this._torrents={},this._rows=[],this.dirtyTorrents=new Set,this.refilterSoon=c((()=>this._refilter(!1))),this.refilterAllSoon=c((()=>this._refilter(!0))),this.boundPopupCloseListener=this.popupCloseListener.bind(this),this.dispatchSelectionChangedSoon=c((()=>this._dispatchSelectionChanged()),200);for(const e of document.querySelectorAll("button[data-action]")){const{action:t}=e.dataset;p(e,this.action_manager.isEnabled(t)),e.addEventListener("click",(()=>{this.action_manager.click(t)}))}document.querySelector("#filter-tracker").addEventListener("change",(e=>{this.setFilterTracker("all"===e.target.value?null:e.target.value)})),this.action_manager.addEventListener("change",(e=>{for(const t of document.querySelectorAll(`[data-action="${e.action}"]`))p(t,e.enabled)})),this.action_manager.addEventListener("click",(e=>{switch(e.action){case"deselect-all":this._deselectAll();break;case"move-bottom":this._moveBottom();break;case"move-down":this._moveDown();break;case"move-top":this._moveTop();break;case"move-up":this._moveUp();break;case"open-torrent":this.setCurrentPopup(new z(this,this.remote));break;case"pause-all-torrents":this._stopTorrents(this._getAllTorrents());break;case"pause-selected-torrents":this._stopTorrents(this.getSelectedTorrents());break;case"reannounce-selected-torrents":this._reannounceTorrents(this.getSelectedTorrents());break;case"remove-selected-torrents":this._removeSelectedTorrents(!1);break;case"resume-selected-torrents":this._startSelectedTorrents(!1);break;case"resume-selected-torrents-now":this._startSelectedTorrents(!0);break;case"select-all":this._selectAll();break;case"show-about-dialog":this.setCurrentPopup(new C(this.version_info));break;case"show-inspector":this.setCurrentPopup(new L(this));break;case"show-move-dialog":this.setCurrentPopup(new _(this,this.remote));break;case"show-overflow-menu":if(this.popup instanceof X)this.setCurrentPopup(null);else{this.setCurrentPopup(new X(this,this.prefs,this.remote,this.action_manager));const e=document.querySelector("#toolbar-overflow").getBoundingClientRect();u(this.popup.root,e.left+e.width,e.top+e.height,document.body)}break;case"show-preferences-dialog":this.setCurrentPopup(new $(this,this.remote));break;case"show-shortcuts-dialog":this.setCurrentPopup(new re(this.action_manager));break;case"show-statistics-dialog":this.setCurrentPopup(new oe(this.remote));break;case"show-rename-dialog":this.setCurrentPopup(new te(this,this.remote));break;case"show-labels-dialog":this.setCurrentPopup(new ne(this,this.remote));break;case"start-all-torrents":this._startTorrents(this._getAllTorrents());break;case"toggle-compact-rows":this.prefs.display_mode=this.prefs.display_mode!==f.DisplayCompact?f.DisplayCompact:f.DisplayFull;break;case"trash-selected-torrents":this._removeSelectedTorrents(!0);break;case"verify-selected-torrents":this._verifyTorrents(this.getSelectedTorrents());break;default:console.warn(`unhandled action: ${e.action}`)}}));let r=document.querySelector("#filter-mode");r.value=this.prefs.filter_mode,r.addEventListener("change",(e=>{this.prefs.filter_mode=e.target.value})),document.addEventListener("keydown",this._keyDown.bind(this)),document.addEventListener("keyup",this._keyUp.bind(this)),r=document.querySelector("#torrent-container"),r.addEventListener("click",(()=>{this.popup&&"inspector"!==this.popup.name?this.setCurrentPopup(null):this._deselectAll()})),r.addEventListener("dragenter",ce._dragenter),r.addEventListener("dragover",ce._dragenter),r.addEventListener("drop",this._drop.bind(this)),this._setupSearchBox(),this.elements={torrent_list:document.querySelector("#torrent-list")},this.elements.torrent_list.addEventListener("contextmenu",(e=>{let t=event.target;for(;t&&!t.classList.contains("torrent");)t=t.parentNode;const n=this._rows.find((e=>e.getElement()===t));n&&!n.isSelected()&&this._setSelectedRow(n);const r=new v(this.action_manager);this.setCurrentPopup(r),u(r.root,e.x,e.y,document.querySelector("#torrent-container")),e.preventDefault()})),this.loadDaemonPrefs(),this._initializeTorrents(),this.refreshTorrents(),this.togglePeriodicSessionRefresh(!0),this.prefs.addEventListener("change",(({key:e,value:t})=>this._onPrefChanged(e,t)));for(const[e,t]of this.prefs.entries())this._onPrefChanged(e,t)}loadDaemonPrefs(){this.remote.loadDaemonPrefs((e=>{this.session_properties=e.arguments}))}get session_properties(){return this._session_properties}set session_properties(e){if(d(this._session_properties,e))return;this._session_properties=Object.seal(e);const t=new Event("session-change");t.session_properties=e,this.dispatchEvent(t),this._updateGuiFromSession(e)}_setupSearchBox(){const e=document.querySelector("#torrent-search"),t="blur";e.classList.add(t),e.addEventListener("blur",(()=>e.classList.add(t))),e.addEventListener("focus",(()=>e.classList.remove(t))),e.addEventListener("keyup",(()=>this._setFilterText(e.value)))}_onPrefChanged(e,t){switch(e){case f.DisplayMode:this.torrentRenderer="compact"===t?new ae:new ie,this.refilterAllSoon();break;case f.FilterMode:case f.SortDirection:case f.SortMode:this.refilterAllSoon();break;case f.RefreshRate:{clearInterval(this.refreshTorrentsInterval);const e=this.refreshTorrents.bind(this),t=1e3*Math.max(2,this.prefs.refresh_rate_sec);this.refreshTorrentsInterval=setInterval(e,t);break}case f.AltSpeedEnabled:case f.NotificationsEnabled:}}_getAllTorrents(){return Object.values(this._torrents)}static _getTorrentIds(e){return e.map((e=>e.getId()))}seedRatioLimit(){const e=this.session_properties;return e&&e.seedRatioLimited?e.seedRatioLimit:-1}_getSelectedRows(){return this._rows.filter((e=>e.isSelected()))}getSelectedTorrents(){return this._getSelectedRows().map((e=>e.getTorrent()))}_getSelectedTorrentIds(){return ce._getTorrentIds(this.getSelectedTorrents())}_setSelectedRow(e){const t=e?e.getElement():null;for(const e of this.elements.torrent_list.children)e.classList.toggle("selected",e===t);this.dispatchSelectionChangedSoon()}_selectRow(e){e.getElement().classList.add("selected"),this.dispatchSelectionChangedSoon()}_deselectRow(e){e.getElement().classList.remove("selected"),this.dispatchSelectionChangedSoon()}_selectAll(){for(const e of this.elements.torrent_list.children)e.classList.add("selected");this.dispatchSelectionChangedSoon()}_deselectAll(){for(const e of this.elements.torrent_list.children)e.classList.remove("selected");this.dispatchSelectionChangedSoon(),delete this._last_torrent_clicked}_indexOfLastTorrent(){return this._rows.findIndex((e=>e.getTorrentId()===this._last_torrent_clicked))}_selectRange(e){const t=this._indexOfLastTorrent();if(-1===t)this._selectRow(e);else{const n=this._rows.indexOf(e),r=Math.min(t,n),o=Math.max(t,n);for(let e=r;e<=o;++e)this._selectRow(this._rows[e])}this.dispatchSelectionChangedSoon()}_dispatchSelectionChanged(){const e=[],t=[];for(const n of this._rows)(n.isSelected()?t:e).push(n.getTorrent());const n=new Event("torrent-selection-changed");n.nonselected=e,n.selected=t,this.dispatchEvent(n)}static _createKeyShortcutFromKeyboardEvent(e){const t=[];return e.ctrlKey&&t.push("Control"),e.altKey&&t.push("Alt"),e.metaKey&&t.push("Meta"),e.shitKey&&t.push("Shift"),t.push(1===e.key.length?e.key.toUpperCase():e.key),t.join("+")}_keyDown(e){const{ctrlKey:t,keyCode:n,metaKey:r,shiftKey:o,target:s}=e,i=ce._createKeyShortcutFromKeyboardEvent(e),a=this.action_manager.getActionForShortcut(i);if(a)return e.preventDefault(),void this.action_manager.click(a);if(27===n&&this.popup)return this.setCurrentPopup(null),void e.preventDefault();const l=document.querySelector(".popup:not(.hidden)"),c=s.matches("input"),d=this._rows;if(!(c||l||r||t)){const t=16===n,r=38===n,s=40===n;if((r||s)&&d.length>0){const t=this._indexOfLastTorrent(),n=this._shift_index,i=0,a=d.length-1;let l=t;s&&l+1<=a?++l:r&&l-1>=i&&--l;const c=d[l];n>=0?n<=t&&t=t&&t>l?this._selectRow(c):(n>=t&&l>t||n<=t&&t>l)&&this._deselectRow(d[t]):o?this._selectRange(c):this._setSelectedRow(c),c&&(this._last_torrent_clicked=c.getTorrentId(),c.getElement().scrollIntoView(),e.preventDefault())}else t&&(this._shift_index=this._indexOfLastTorrent())}}_keyUp(e){16===e.keyCode&&delete this._shift_index}static _dragenter(e){if(e.dataTransfer&&e.dataTransfer.types){const t=new Set(["text/uri-list","text/plain"]);if(e.dataTransfer.types.some((e=>t.has(e))))return e.stopPropagation(),e.preventDefault(),e.dataTransfer.dropEffect="copy",!1}else e.dataTransfer&&(e.dataTransfer.dropEffect="none");return!0}static _isValidURL(e){try{return!!new URL(e)}catch{return!1}}shouldAddedTorrentsStart(){return this.session_properties["start-added-torrents"]}_drop(e){const t=!this.shouldAddedTorrentsStart();if(!e.dataTransfer||!e.dataTransfer.types)return!0;const n=e.data.Transfer.types.filter((e=>["text/uri-list","text/plain"].contains(e))).pop();for(const r of e.dataTransfer.getData(n).split("\n").map((e=>e.trim())).filter((e=>ce._isValidURL(e))))this.remote.addTorrentByUrl(r,t);return e.preventDefault(),!1}togglePeriodicSessionRefresh(e){if(!e&&this.sessionInterval&&(clearInterval(this.sessionInterval),delete this.sessionInterval),e&&(this.loadDaemonPrefs(),!this.sessionInterval)){const e=8e3;this.sessionInterval=setInterval(this.loadDaemonPrefs.bind(this),e)}}_setFilterText(e){this.filterText=e?e.trim():null,this.refilterAllSoon()}_onTorrentChanged(e){const t=e.currentTarget;this.dirtyTorrents.add(t.getId()),this.refilterSoon()}updateTorrents(e,t){this.remote.updateTorrents(e,t,((e,t)=>{const n=[],r=e.shift(),o={};for(const t of e){for(const[e,n]of r.entries())o[n]=t[e];const{id:e}=o;let s=this._torrents[e];if(s){const t=s.needsMetaData();s.refresh(o),t&&!s.needsMetaData()&&n.push(e)}else s=this._torrents[e]=new D(o),s.addEventListener("dataChanged",this._onTorrentChanged.bind(this)),this.dirtyTorrents.add(e),"name"in s.fields&&"status"in s.fields||n.push(e)}if(n.length>0){const e=["id",...D.Fields.Metadata,...D.Fields.Stats];this.updateTorrents(n,e),this.refilterSoon()}t&&(this._deleteTorrents(t),this.refilterSoon())}))}refreshTorrents(){const e=["id",...D.Fields.Stats];this.updateTorrents("recently-active",e)}_initializeTorrents(){const e=["id",...D.Fields.Metadata,...D.Fields.Stats];this.updateTorrents(null,e)}_onRowClicked(e){const t=e.metaKey||e.ctrlKey,{row:n}=e.currentTarget;if(this.popup&&"inspector"!==this.popup.name)this.setCurrentPopup(null);else{if(e.target.classList.contains("torrent-pauseresume-button"))switch(e.target.dataset.action){case"pause":this._stopTorrents([n.getTorrent()]);break;case"resume":this._startTorrents([n.getTorrent()])}e.stopPropagation(),e.shiftKey?(this._selectRange(n),window.focus()):!n.isSelected()&&t?this._selectRow(n):n.isSelected()?n.isSelected()&&t?this._deselectRow(n):n.isSelected()&&this._setSelectedRow(n):this._setSelectedRow(n),this._last_torrent_clicked=n.getTorrentId()}}_deleteTorrents(e){if(e&&e.length>0){for(const t of e)this.dirtyTorrents.add(t),delete this._torrents[t];this.refilterSoon()}}_removeSelectedTorrents(e){const t=this.getSelectedTorrents();t.length>0&&this.setCurrentPopup(new ee({remote:this.remote,torrents:t,trash:e}))}_startSelectedTorrents(e){this._startTorrents(this.getSelectedTorrents(),e)}_startTorrents(e,t){this.remote.startTorrents(ce._getTorrentIds(e),t,this.refreshTorrents,this)}_verifyTorrents(e){this.remote.verifyTorrents(ce._getTorrentIds(e),this.refreshTorrents,this)}_reannounceTorrents(e){this.remote.reannounceTorrents(ce._getTorrentIds(e),this.refreshTorrents,this)}_stopTorrents(e){this.remote.stopTorrents(ce._getTorrentIds(e),this.refreshTorrents,this)}changeFileCommand(e,t,n){this.remote.changeFileCommand(e,t,n)}_moveTop(){this.remote.moveTorrentsToTop(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveUp(){this.remote.moveTorrentsUp(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveDown(){this.remote.moveTorrentsDown(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveBottom(){this.remote.moveTorrentsToBottom(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_updateGuiFromSession(e){const[,t,n]=e.version.match(/(.*)\s\(([\da-f]+)\)/);this.version_info={checksum:n,version:t};document.querySelector("#toolbar-overflow").classList.toggle("alt-speed-enabled",e[Z])}_updateStatusbar(){const e=I,t=this._getAllTorrents(),n=t.reduce(((e,t)=>e+t.getUploadSpeed()),0),r=t.reduce(((e,t)=>e+t.getDownloadSpeed()),0),o=e.countString("Transfer","Transfers",this._rows.length);h(document.querySelector("#speed-up-label"),e.speedBps(n)),h(document.querySelector("#speed-dn-label"),e.speedBps(r)),h(document.querySelector("#filter-count"),o)}static _displayName(e){let t=e;return t.length>0&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}_updateFilterSelect(){const e=this._getTrackerCounts(),t=Object.keys(e).sort();let n="";n+=this.filterTracker?'':'';for(const e of t)n+=``;this.filterTrackersStr&&this.filterTrackersStr===n||(this.filterTrackersStr=n,document.querySelector("#filter-tracker").innerHTML=n)}sortRows(e){const t=e.map((e=>e.getTorrent())),n=e.reduce(((e,t)=>(e[t.getTorrent().getId()]=t,e)),{});D.sortTorrents(t,this.prefs.sort_mode,this.prefs.sort_direction);for(const[r,o]of t.entries())e[r]=n[o.getId()]}_refilter(e){const{sort_mode:t,sort_direction:n,filter_mode:r}=this.prefs,o=this.filterTracker,s=this.torrentRenderer,i=this.elements.torrent_list;let a=null,l=null;const c=/^labels:([\w,]*)(.*)$/.exec(this.filterText);c?(a=c[2].trim(),l=c[1].split(",")):(a=this.filterText,l=[]);const d=()=>[...i.children].length,A=()=>[...i.children].reduce(((e,t)=>e+t.classList.contains("selected")?1:0),0),p=d(),g=A();if(this._updateFilterSelect(),clearTimeout(this.refilterTimer),delete this.refilterTimer,e){for(;i.firstChild;)i.firstChild.remove();this._rows=[],this.dirtyTorrents=new Set(Object.keys(this._torrents))}const u=[];let m=[];for(const e of this._rows)this.dirtyTorrents.has(e.getTorrentId())?m.push(e):u.push(e);for(const e of m)e.getElement().remove();const h=[];for(const e of m){const t=e.getTorrentId(),n=this._torrents[t];n&&n.test(r,o,a,l)&&h.push(e),this.dirtyTorrents.delete(t)}m=h;for(const e of this.dirtyTorrents.values()){const t=this._torrents[e];if(t&&t.test(r,o,a,l)){const e=new le(s,this,t),n=e.getElement();n.row=e,m.push(e),n.addEventListener("click",this._onRowClicked.bind(this)),n.addEventListener("dblclick",(()=>this.action_manager.click("show-inspector")))}}this.sortRows(m);const b=[],f=u.length,C=m.length,v=document.createDocumentFragment();let y=0,E=0;for(;y!==f||E!==C;){let e=null;if(y===f)e=!1;else if(E===C)e=!0;else{e=D.compareTorrents(u[y].getTorrent(),m[E].getTorrent(),t,n)<0}if(e)b.push(u[y++]);else{const e=m[E++],t=e.getElement();y!==f?i.insertBefore(t,u[y].getElement()):v.append(t),b.push(e)}}i.append(v),this._rows=b,this.dirtyTorrents.clear();for(const[e,t]of b.map((e=>e.getElement())).entries()){const n=e%2==0;t.classList.toggle("even",n),t.classList.toggle("odd",!n)}this._updateStatusbar(),g===A()&&p===d()||this.dispatchSelectionChangedSoon()}setFilterTracker(e){document.querySelector("#filter-tracker").value=e?ce._getReadableDomain(e):"all",this.filterTracker=e,this.refilterAllSoon()}_getTrackerCounts(){const e={};for(const t of this._getAllTorrents())for(const n of t.getTrackers()){const{sitename:t}=n;e[t]=(e[t]||0)+1}return e}popupCloseListener(e){if(e.target!==this.popup)throw new Error(e);this.popup.removeEventListener("close",this.boundPopupCloseListener),delete this.popup}setCurrentPopup(e){this.popup&&this.popup.close(),this.popup=e,this.popup&&this.popup.addEventListener("close",this.boundPopupCloseListener)}}var de=n(379),Ae=n.n(de),pe=n(592),ge={insert:"head",singleton:!1};Ae()(pe.Z,ge);pe.Z.locals;document.addEventListener("DOMContentLoaded",(function(){const t=new e,n=new f,r=new b(n),o=new ce(t,r,n),s=c((()=>o.elements.torrent_list.scrollTo(0,1)));window.addEventListener("load",s),window.onorientationchange=s}))})()})(); //# sourceMappingURL=transmission-app.js.map \ No newline at end of file diff --git a/web/src/inspector.js b/web/src/inspector.js index 473d2fb9e..4749fc05e 100644 --- a/web/src/inspector.js +++ b/web/src/inspector.js @@ -738,7 +738,7 @@ export class Inspector extends EventTarget { element.classList.add('tier-list-tracker'); setTextContent( element, - `${tracker.domain || tracker.host || tracker.announce} - tier ${ + `${tracker.sitename || tracker.host || tracker.announce} - tier ${ tracker.tier + 1 }` ); diff --git a/web/src/torrent.js b/web/src/torrent.js index 3ac078539..1bc915bfc 100644 --- a/web/src/torrent.js +++ b/web/src/torrent.js @@ -7,46 +7,6 @@ import { Formatter } from './formatter.js'; import { Prefs } from './prefs.js'; import { deepEqual } from './utils.js'; -/// DOMAINS - -// example: "tracker.ubuntu.com" returns "ubuntu.com" -function getDomainName(host) { - const dot = host.indexOf('.'); - if (dot !== host.lastIndexOf('.')) { - host = host.slice(dot + 1); - } - return host; -} - -// example: "ubuntu.com" returns "Ubuntu" -function getReadableDomain(name) { - if (name.length > 0) { - name = name.charAt(0).toUpperCase() + name.slice(1); - } - const dot = name.indexOf('.'); - if (dot !== -1) { - name = name.slice(0, dot); - } - return name; -} - -// key: url string -// val: { domain, readable_domain } -const announce_to_domain_cache = {}; - -function getAnnounceDomain(announce) { - if (announce_to_domain_cache[announce]) { - return announce_to_domain_cache[announce]; - } - - const url = new URL(announce); - const domain = getDomainName(url.host); - const name = getReadableDomain(domain); - const o = { domain, name, url }; - announce_to_domain_cache[announce] = o; - return o; -} - /// export class Torrent extends EventTarget { @@ -270,13 +230,7 @@ export class Torrent extends EventTarget { return this.fields.totalSize; } getTrackers() { - const trackers = this.fields.trackers || []; - for (const tracker of trackers) { - if (tracker.announce && !tracker.domain) { - Object.assign(tracker, getAnnounceDomain(tracker.announce)); - } - } - return this.fields.trackers; + return this.fields.trackers || []; } getUploadSpeed() { return this.fields.rateUpload; diff --git a/web/src/transmission.js b/web/src/transmission.js index c03845a12..14ef91edf 100644 --- a/web/src/transmission.js +++ b/web/src/transmission.js @@ -869,22 +869,29 @@ TODO: fix this when notifications get fixed setTextContent(document.querySelector('#filter-count'), string); } + static _displayName(hostname) { + let name = hostname; + if (name.length > 0) { + name = name.charAt(0).toUpperCase() + name.slice(1); + } + return name; + } + _updateFilterSelect() { - const trackers = this._getTrackers(); - const names = Object.keys(trackers).sort(); + const trackers = this._getTrackerCounts(); + const sitenames = Object.keys(trackers).sort(); // build the new html let string = ''; string += !this.filterTracker ? '' : ''; - for (const name of names) { - const o = trackers[name]; - string += ``; + string += `>${Transmission._displayName(sitename)}`; } if (!this.filterTrackersStr || this.filterTrackersStr !== string) { @@ -1059,36 +1066,25 @@ TODO: fix this when notifications get fixed } } - setFilterTracker(domain) { + setFilterTracker(sitename) { const e = document.querySelector('#filter-tracker'); - e.value = domain ? Transmission._getReadableDomain(domain) : 'all'; + e.value = sitename ? Transmission._getReadableDomain(sitename) : 'all'; - this.filterTracker = domain; + this.filterTracker = sitename; this.refilterAllSoon(); } - _getTrackers() { - const returnValue = {}; + _getTrackerCounts() { + const counts = {}; for (const torrent of this._getAllTorrents()) { - const names = new Set(); - for (const tracker of torrent.getTrackers()) { - const { domain, name } = tracker; - - if (!returnValue[name]) { - returnValue[name] = { count: 0, domain }; - } - - names.add(name); - } - - for (const name of names.values()) { - ++returnValue[name].count; + const { sitename } = tracker; + counts[sitename] = (counts[sitename] || 0) + 1; } } - return returnValue; + return counts; } ///