diff --git a/README.md b/README.md index bdba5a0a4..16ecc63e6 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne ### Firefox Versions - [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `142.0.1`! 🚀 -- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 142.0.1`! +- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 143.0`! ### Contributing diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash index bd5e2ba6b..d233c0aa3 100644 --- a/build/firefox-cache/l10n-last-commit-hash +++ b/build/firefox-cache/l10n-last-commit-hash @@ -1 +1 @@ -df0d5e625b9e55c502d3e9e81b29a0d52d0f8d20 \ No newline at end of file +900c4f612d9432ae34a1a596a271fd2ce343dd18 \ No newline at end of file diff --git a/build/flatpak/app.zen_browser.zen.yml.template b/build/flatpak/app.zen_browser.zen.yml.template index 0a5d6d8b0..5e2b9538d 100644 --- a/build/flatpak/app.zen_browser.zen.yml.template +++ b/build/flatpak/app.zen_browser.zen.yml.template @@ -29,6 +29,7 @@ finish-args: - --system-talk-name=org.freedesktop.NetworkManager - --talk-name=org.a11y.Bus - --talk-name=org.gtk.vfs.* + - --talk-name=org.freedesktop.Notifications - --own-name=org.mpris.MediaPlayer2.firefox.* - --own-name=org.mozilla.zen.* cleanup: diff --git a/package.json b/package.json index 737a39e6e..b19b48c6a 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "test:dbg": "python3 scripts/run_tests.py --jsdebugger --debug-on-failure", "ffprefs": "cd tools/ffprefs && cargo run --bin ffprefs -- ../../", "lc": "surfer license-check", - "lc:fix": "surfer license-check --fix" + "lc:fix": "surfer license-check --fix", + "use-moz-src": "cd engine && ./mach use-moz-src" }, "repository": { "type": "git", diff --git a/prefs/browser.yaml b/prefs/browser.yaml index 08c1a567a..de4ddcf6a 100644 --- a/prefs/browser.yaml +++ b/prefs/browser.yaml @@ -76,3 +76,6 @@ - name: browser.urlbar.scotchBonnet.enableOverride value: false + +- name: browser.tabs.groups.hoverPreview.enabled + value: false diff --git a/prefs/disablemozilla.yaml b/prefs/disablemozilla.yaml index 048b75e18..388be59fa 100644 --- a/prefs/disablemozilla.yaml +++ b/prefs/disablemozilla.yaml @@ -37,3 +37,7 @@ - name: browser.newtabpage.activity-stream.showSponsoredCheckboxes value: false + +- name: sidebar.verticalTabs.dragToPinPromo.dismissed + value: true + locked: true diff --git a/scripts/recalculate-patches.sh b/scripts/recalculate-patches.sh index 6904cc90d..05d10f361 100644 --- a/scripts/recalculate-patches.sh +++ b/scripts/recalculate-patches.sh @@ -10,21 +10,16 @@ IGNORE_FILES=( # Recursively find all .patch files in the current directory and its subdirectories find src -type f -name "*.patch" | while read -r patch_file; do - # Replace all - with . and remove the .patch extension - new_file="${patch_file%/*}/$(basename "$patch_file" | sed 's/-/./' | sed 's/\.patch$//').patch" - new_file="${new_file%.patch}" - new_file="${new_file#src/}" - - if [[ $new_file == *-mjs ]]; then - new_file="${new_file/-mjs/.mjs}" - fi - if [[ $new_file == *-ftl ]]; then - new_file="${new_file/-ftl/.ftl}" + # Get the file from the inside of the file as indicated by the patch + target_file=$(grep -m 1 -oP '(?<=\+\+\+ b/).+' "$patch_file") + if [[ -z "$target_file" ]]; then + echo "No target file found in patch: $patch_file" + continue fi - new_file_base=$(basename "$new_file") + new_file_base=$(basename "$target_file") if [[ ! " ${IGNORE_FILES[@]} " =~ " ${new_file_base} " ]]; then - npm run export ${new_file} + npm run export ${target_file} fi done diff --git a/scripts/update_ts_types.py b/scripts/update_ts_types.py index f5a175628..afc9a4684 100644 --- a/scripts/update_ts_types.py +++ b/scripts/update_ts_types.py @@ -6,6 +6,13 @@ import os FILES = [ "index.d.ts", + "lib.gecko.tweaks.d.ts", + "lib.gecko.xpidl.d.ts", +] + +GENERATED_FILES = [ + "lib.gecko.win32.d.ts", + "lib.gecko.xpcom.d.ts", "lib.gecko.darwin.d.ts", "lib.gecko.dom.d.ts", "lib.gecko.glean.d.ts", @@ -13,21 +20,21 @@ FILES = [ "lib.gecko.modules.d.ts", "lib.gecko.nsresult.d.ts", "lib.gecko.services.d.ts", - "lib.gecko.tweaks.d.ts", - "lib.gecko.win32.d.ts", - "lib.gecko.xpcom.d.ts", - "lib.gecko.xpidl.d.ts", ] ENGINE_PATH = os.path.join("engine", "tools", "@types") +GENERATED_PATH = os.path.join(ENGINE_PATH, "generated") SRC_PATH = os.path.join("src", "zen", "@types") def update_ts_types(): os.system("cd engine && ./mach ts build && ./mach ts update") # copy the files from engine/tools/@types to src/@types - for file in FILES: - src_file = os.path.join(ENGINE_PATH, file) + for file in FILES + GENERATED_FILES: + if file in GENERATED_FILES: + src_file = os.path.join(GENERATED_PATH, file) + else: + src_file = os.path.join(ENGINE_PATH, file) dest_file = os.path.join(SRC_PATH, file) if os.path.exists(src_file): os.system(f"cp {src_file} {dest_file}") diff --git a/src/Cargo-lock.patch b/src/Cargo-lock.patch index 11e71b9db..e33677b06 100644 --- a/src/Cargo-lock.patch +++ b/src/Cargo-lock.patch @@ -1,8 +1,8 @@ diff --git a/Cargo.lock b/Cargo.lock -index fe4eff865884fb79983f636861897648c36491b5..a9516246ffacfd50b7e4198967bebb71b2c73eca 100644 +index 2ac65181b1a9561ee4760e0569dfdd621c684142..b159fd8a351ba7c6541e8994a815de8150db619f 100644 --- a/Cargo.lock +++ b/Cargo.lock -@@ -4067,8 +4067,6 @@ dependencies = [ +@@ -4029,8 +4029,6 @@ dependencies = [ [[package]] name = "mime_guess" version = "2.0.4" diff --git a/src/Cargo-toml.patch b/src/Cargo-toml.patch index 7617d5bae..e4b55038b 100644 --- a/src/Cargo-toml.patch +++ b/src/Cargo-toml.patch @@ -1,5 +1,5 @@ diff --git a/Cargo.toml b/Cargo.toml -index c41cc4f4e68e5b30e1a290e07b2c5061db4400cc..7fa5402b32116922766ee1463b441d3fc86c1eff 100644 +index 0fdad8b956be8119f5a914b9cee01bb6520cd13d..f1414b5afd5c66c61d1585184de6b32f9918670d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -218,6 +218,8 @@ moz_asserts = { path = "mozglue/static/rust/moz_asserts" } diff --git a/src/browser/actors/WebRTCParent-sys-mjs.patch b/src/browser/actors/WebRTCParent-sys-mjs.patch index 321d1b520..fed9ceb84 100644 --- a/src/browser/actors/WebRTCParent-sys-mjs.patch +++ b/src/browser/actors/WebRTCParent-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs -index 49ba7724801e699c60fac72d67b3b2d11b6c8c93..5a9f209b3e6b625c6346083ab7eace552a81a3b4 100644 +index f327e1684d0966a0dcfdcdbf8cc70259b27a4504..c8f722bda4cf297f5d0a6aa22dafbe27c4218123 100644 --- a/browser/actors/WebRTCParent.sys.mjs +++ b/browser/actors/WebRTCParent.sys.mjs @@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent { diff --git a/src/browser/app/macbuild/Contents/Info-plist-in.patch b/src/browser/app/macbuild/Contents/Info-plist-in.patch index d683c6419..c6684c4ce 100644 --- a/src/browser/app/macbuild/Contents/Info-plist-in.patch +++ b/src/browser/app/macbuild/Contents/Info-plist-in.patch @@ -1,5 +1,5 @@ diff --git a/browser/app/macbuild/Contents/Info.plist.in b/browser/app/macbuild/Contents/Info.plist.in -index 73b400d58fd25ac13132f1a3fe3ea619e4f4e4f9..ee90ce7ac67bd9aa7bbc2a656843875afb985591 100644 +index ea28831b90662b12bdcb137c35b6bb83626c77e7..d28f4eca976ad9de12b03d995d2363e643224421 100644 --- a/browser/app/macbuild/Contents/Info.plist.in +++ b/browser/app/macbuild/Contents/Info.plist.in @@ -191,7 +191,7 @@ diff --git a/src/browser/base/content/browser-addons-js.patch b/src/browser/base/content/browser-addons-js.patch index b74708a70..318539af9 100644 --- a/src/browser/base/content/browser-addons-js.patch +++ b/src/browser/base/content/browser-addons-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js -index 061edde0e05e0744ba1aa80df5f9699e264fe69b..cc2b2f04758ee9690429ea6c4aad959d858218e8 100644 +index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd693f1f1135 100644 --- a/browser/base/content/browser-addons.js +++ b/browser/base/content/browser-addons.js -@@ -1057,7 +1057,7 @@ var gXPInstallObserver = { +@@ -1064,7 +1064,7 @@ var gXPInstallObserver = { persistent: true, hideClose: true, popupOptions: { @@ -11,7 +11,7 @@ index 061edde0e05e0744ba1aa80df5f9699e264fe69b..cc2b2f04758ee9690429ea6c4aad959d }, }; -@@ -1266,7 +1266,7 @@ var gXPInstallObserver = { +@@ -1273,7 +1273,7 @@ var gXPInstallObserver = { hideClose: true, timeout: Date.now() + 30000, popupOptions: { @@ -20,7 +20,7 @@ index 061edde0e05e0744ba1aa80df5f9699e264fe69b..cc2b2f04758ee9690429ea6c4aad959d }, }; -@@ -2571,7 +2571,7 @@ var gUnifiedExtensions = { +@@ -2608,7 +2608,7 @@ var gUnifiedExtensions = { this.recordButtonTelemetry(reason || "extensions_panel_showing"); this.ensureButtonShownBeforeAttachingPanel(panel); PanelMultiView.openPopup(panel, this._button, { @@ -29,7 +29,7 @@ index 061edde0e05e0744ba1aa80df5f9699e264fe69b..cc2b2f04758ee9690429ea6c4aad959d triggerEvent: aEvent, }); } -@@ -2758,18 +2758,20 @@ var gUnifiedExtensions = { +@@ -2795,18 +2795,20 @@ var gUnifiedExtensions = { this._maybeMoveWidgetNodeBack(widgetId); } diff --git a/src/browser/base/content/browser-commands-js.patch b/src/browser/base/content/browser-commands-js.patch index 10216d64e..7e98cf714 100644 --- a/src/browser/base/content/browser-commands-js.patch +++ b/src/browser/base/content/browser-commands-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-commands.js b/browser/base/content/browser-commands.js -index b0b2383453ef771af3eb9260618f1e2e3022eb4e..d631cc8db95b4285e892ac8fcb5e72b7da489850 100644 +index 637e9dda83df5b490d6340367dd63077904ea056..6ffb1dc6ed1d6e58b4e8de1faca887f6b38115cb 100644 --- a/browser/base/content/browser-commands.js +++ b/browser/base/content/browser-commands.js -@@ -318,6 +318,10 @@ var BrowserCommands = { +@@ -317,6 +317,10 @@ var BrowserCommands = { } } @@ -13,7 +13,7 @@ index b0b2383453ef771af3eb9260618f1e2e3022eb4e..d631cc8db95b4285e892ac8fcb5e72b7 // A notification intended to be useful for modular peformance tracking // starting as close as is reasonably possible to the time when the user // expressed the intent to open a new tab. Since there are a lot of -@@ -402,6 +406,11 @@ var BrowserCommands = { +@@ -401,6 +405,11 @@ var BrowserCommands = { return; } @@ -25,7 +25,7 @@ index b0b2383453ef771af3eb9260618f1e2e3022eb4e..d631cc8db95b4285e892ac8fcb5e72b7 // Keyboard shortcuts that would close a tab that is pinned select the first // unpinned tab instead. if ( -@@ -409,8 +418,8 @@ var BrowserCommands = { +@@ -408,8 +417,8 @@ var BrowserCommands = { (event.ctrlKey || event.metaKey || event.altKey) && gBrowser.selectedTab.pinned ) { diff --git a/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch b/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch index ddf7c2095..b71398c94 100644 --- a/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch +++ b/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-fullScreenAndPointerLock.js b/browser/base/content/browser-fullScreenAndPointerLock.js -index c61a424d3871d94e7086418c72ce22d5aef0a047..b6e3939b1ce67185acc3b9a66385869bd5490a39 100644 +index d477ac782e0cb921203f8cd38da70a003ac41b39..648d0b4066b630a9b31da0bb8490f29da701dd3d 100644 --- a/browser/base/content/browser-fullScreenAndPointerLock.js +++ b/browser/base/content/browser-fullScreenAndPointerLock.js -@@ -431,10 +431,10 @@ var FullScreen = { +@@ -427,10 +427,10 @@ var FullScreen = { gNavToolbox.classList.toggle("fullscreen-with-menubar", shiftSize > 0); let transform = shiftSize > 0 ? `translateY(${shiftSize}px)` : ""; diff --git a/src/browser/base/content/browser-init-js.patch b/src/browser/base/content/browser-init-js.patch index 69de60ba6..9b3a7c42d 100644 --- a/src/browser/base/content/browser-init-js.patch +++ b/src/browser/base/content/browser-init-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-init.js b/browser/base/content/browser-init.js -index bcbfab4a3781ff3c7349115751b3830976eec4bf..b1b774e0d335ed3c5ca565a45cd624c7ea2718af 100644 +index e4a94863c0f0810d1894475b020814b2ad32ffb3..515f61d2df5d4a593fc32d3f32e8fdec2b8f5983 100644 --- a/browser/base/content/browser-init.js +++ b/browser/base/content/browser-init.js -@@ -186,6 +186,7 @@ var gBrowserInit = { +@@ -191,6 +191,7 @@ var gBrowserInit = { }, onLoad() { @@ -10,7 +10,7 @@ index bcbfab4a3781ff3c7349115751b3830976eec4bf..b1b774e0d335ed3c5ca565a45cd624c7 gBrowser.addEventListener("DOMUpdateBlockedPopups", e => PopupBlockerObserver.handleEvent(e) ); -@@ -344,6 +345,7 @@ var gBrowserInit = { +@@ -359,6 +360,7 @@ var gBrowserInit = { this._handleURIToLoad(); diff --git a/src/browser/base/content/browser-js.patch b/src/browser/base/content/browser-js.patch index 2c8f9416d..afc190969 100644 --- a/src/browser/base/content/browser-js.patch +++ b/src/browser/base/content/browser-js.patch @@ -1,16 +1,16 @@ diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js -index 05f6aec3dac31231e15cb316f6e06d66ee87bea9..3bbbe8553777056798ea9ddce1744a8e48848a37 100644 +index c5b7ef2616c1dab9f42970605897e862d57ab7d0..77f0731db6c4a8d835cf8733115d27ae7782a987 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js -@@ -29,6 +29,7 @@ ChromeUtils.defineESModuleGetters(this, { - ContextualIdentityService: +@@ -31,6 +31,7 @@ ChromeUtils.defineESModuleGetters(this, { "resource://gre/modules/ContextualIdentityService.sys.mjs", - CustomizableUI: "resource:///modules/CustomizableUI.sys.mjs", -+ ZenCustomizableUI: "chrome://browser/content/ZenCustomizableUI.sys.mjs", + CustomizableUI: + "moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs", ++ ZenCustomizableUI: "resource:///modules/ZenCustomizableUI.sys.mjs", DevToolsSocketStatus: "resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs", DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs", -@@ -2287,6 +2288,8 @@ var XULBrowserWindow = { +@@ -2291,6 +2292,8 @@ var XULBrowserWindow = { AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser); TranslationsParent.onLocationChange(gBrowser.selectedBrowser); @@ -19,25 +19,7 @@ index 05f6aec3dac31231e15cb316f6e06d66ee87bea9..3bbbe8553777056798ea9ddce1744a8e PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser); if (!gMultiProcessBrowser) { -@@ -4630,7 +4633,7 @@ function switchToTabHavingURI( - ignoreQueryString || replaceQueryString, - ignoreFragmentWhenComparing - ); -- let browsers = aWindow.gBrowser.browsers; -+ let browsers = aWindow.gZenWorkspaces.allUsedBrowsers; - for (let i = 0; i < browsers.length; i++) { - let browser = browsers[i]; - let browserCompare = cleanURL( -@@ -4673,7 +4676,7 @@ function switchToTabHavingURI( - } - - if (!doAdopt) { -- aWindow.gBrowser.tabContainer.selectedIndex = i; -+ aWindow.gZenWorkspaces.switchIfNeeded(browser); - } - - return true; -@@ -5489,6 +5492,9 @@ var ConfirmationHint = { +@@ -5232,6 +5235,9 @@ var ConfirmationHint = { MozXULElement.insertFTLIfNeeded("toolkit/branding/brandings.ftl"); MozXULElement.insertFTLIfNeeded("browser/confirmationHints.ftl"); document.l10n.setAttributes(this._message, messageId, options.l10nArgs); diff --git a/src/browser/base/content/browser-places-js.patch b/src/browser/base/content/browser-places-js.patch index 2f0d03519..e7baf596a 100644 --- a/src/browser/base/content/browser-places-js.patch +++ b/src/browser/base/content/browser-places-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js -index 62b3665394a8256ebedf88a8f10bb6766977cf57..12ac643f913290b20fb7adba8f224f49bb82bf5c 100644 +index 5ba2b6a58776e2b1d70b80e8cb1533cb20caafc6..65736705968732a185e81561b2866bfbe6f3233a 100644 --- a/browser/base/content/browser-places.js +++ b/browser/base/content/browser-places.js @@ -252,6 +252,8 @@ var StarUI = { diff --git a/src/browser/base/content/browser-sets-inc.patch b/src/browser/base/content/browser-sets-inc.patch index 54f3f1f5d..837f55c92 100644 --- a/src/browser/base/content/browser-sets-inc.patch +++ b/src/browser/base/content/browser-sets-inc.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser-sets.inc b/browser/base/content/browser-sets.inc -index 269b025d7fb942602c1b1b6c9747540bcde11375..9dcecfe205cadacace5195ec84d8b2ee292a0632 100644 +index 2e7654036647796715aec392f9e714e7256c9864..0b3b76ab479bb6ae5439dd424b69f641d3b86c28 100644 --- a/browser/base/content/browser-sets.inc +++ b/browser/base/content/browser-sets.inc @@ -405,3 +405,4 @@ diff --git a/src/browser/base/content/browser-sets-js.patch b/src/browser/base/content/browser-sets-js.patch index 78d0fb929..b2968174e 100644 --- a/src/browser/base/content/browser-sets-js.patch +++ b/src/browser/base/content/browser-sets-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-sets.js b/browser/base/content/browser-sets.js -index 61aef2d420a78fb1910f556b71f6db75a16180ed..a3a1e70bedb760c165c338c28de6f2ee924df8de 100644 +index 9cff49a7b86f7697f70c4ef61d3c3561f058dc45..15ac9a8a79e8642b3add2f6df63ed32eb0c8bcb9 100644 --- a/browser/base/content/browser-sets.js +++ b/browser/base/content/browser-sets.js -@@ -250,7 +250,7 @@ document.addEventListener( +@@ -253,7 +253,7 @@ document.addEventListener( } }); diff --git a/src/browser/base/content/browser-siteIdentity-js.patch b/src/browser/base/content/browser-siteIdentity-js.patch index cc5edc8fc..0da25c7ce 100644 --- a/src/browser/base/content/browser-siteIdentity-js.patch +++ b/src/browser/base/content/browser-siteIdentity-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js -index a2a5f6ff71b9a6587e2a033aee39385abd319645..8111c6bcffdcfd51d03cc9dea4aac902d57c83d8 100644 +index 65354e0ad3097e10de72f36e257c94472524baf7..bc9527ec9ddfab11c0839398d3f3953872ad9632 100644 --- a/browser/base/content/browser-siteIdentity.js +++ b/browser/base/content/browser-siteIdentity.js -@@ -825,7 +825,7 @@ var gIdentityHandler = { +@@ -834,7 +834,7 @@ var gIdentityHandler = { // This is a secure internal Firefox page. this._identityBox.className = "chromeUI"; let brandBundle = document.getElementById("bundle_brand"); @@ -11,7 +11,7 @@ index a2a5f6ff71b9a6587e2a033aee39385abd319645..8111c6bcffdcfd51d03cc9dea4aac902 } else if (this._pageExtensionPolicy) { // This is a WebExtension page. this._identityBox.className = "extensionPage"; -@@ -1143,6 +1143,12 @@ var gIdentityHandler = { +@@ -1163,6 +1163,12 @@ var gIdentityHandler = { } } diff --git a/src/browser/base/content/browser-xhtml.patch b/src/browser/base/content/browser-xhtml.patch index 91a5e11a9..7b1a16f57 100644 --- a/src/browser/base/content/browser-xhtml.patch +++ b/src/browser/base/content/browser-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml -index 665b048cf149b9a6d0ccc43f8d9199f077b8ada2..fcff5cc6a4a50ff2d76930e4d2a1e1d0b2e6bc02 100644 +index 7c4c05b72845dfb37c11317d011b8e7c6ba07934..856c368e4d6fe7c7d7ab468423348c844cbf1cdf 100644 --- a/browser/base/content/browser.xhtml +++ b/browser/base/content/browser.xhtml @@ -26,6 +26,7 @@ @@ -10,7 +10,7 @@ index 665b048cf149b9a6d0ccc43f8d9199f077b8ada2..fcff5cc6a4a50ff2d76930e4d2a1e1d0 persist="screenX screenY width height sizemode" data-l10n-sync="true">
-@@ -103,8 +104,10 @@ +@@ -105,8 +106,10 @@