anchor.diff:  
       # Fix extension attempting to write to 'modifiedInternalSettings.json'.
       # Move this write to the tmp directory indexed by the nix store basename.
  -    sed -i \
  -      -E -e $'s/path\.resolve\(constants_1\.EXTENSION_ROOT_PATH, \'\.\/modifiedInternalSettings\.json\'\)/path.join\(os.tmpdir(), "'$ext_unique_id'" + "-modifiedInternalSettings.json"\)/g' \
  -      out/prod/extension-prod.js
  +    substituteInPlace out/prod/extension-prod.js \
  +      --replace "path.resolve(constants_1.EXTENSION_ROOT_PATH, './modifiedInternalSettings.json')" \
  +                "path.join(os.tmpdir(), '$ext_unique_id-modifiedInternalSettings.json')"
   
       # Fix extension attempting to write to 'vsls-agent.lock'.
       # Move this write to the tmp directory indexed by the nix store basename.
  -    sed -i \
  -      -E -e $'s/(Agent_1.getAgentPath\(\) \+ \'.lock\')/path.join\(os.tmpdir(), "'$ext_unique_id'" + "-vsls-agent.lock"\)/g' \
  -      out/prod/extension-prod.js
  +    substituteInPlace out/prod/extension-prod.js \
  +      --replace "path + '.lock'" \
  +                "__webpack_require__('path').join(__webpack_require__('os').tmpdir(), '$ext_unique_id-vsls-agent.lock')"
   
  -    # TODO: Under 'node_modules/@vsliveshare/vscode-launcher-linux' need to hardcode path to 'desktop-file-install'
  -    # 'update-desktop-database' and 'xprop'. Might want to wrap the script instead.
  +    # Hardcode executable paths
  +    echo '#!/bin/sh' >node_modules/@vsliveshare/vscode-launcher-linux/check-reqs.sh
  +    substituteInPlace node_modules/@vsliveshare/vscode-launcher-linux/install.sh \
  +      --replace desktop-file-install ${desktop-file-utils}/bin/desktop-file-install
  +    substituteInPlace node_modules/@vsliveshare/vscode-launcher-linux/uninstall.sh \
  +      --replace update-desktop-database ${desktop-file-utils}/bin/update-desktop-database
  +    substituteInPlace node_modules/@vsliveshare/vscode-launcher-linux/vsls-launcher \
  +      --replace /bin/bash ${bash}/bin/bash
  +    substituteInPlace out/prod/extension-prod.js \
  +      --replace xprop ${xprop}/bin/xprop \
  +      --replace "'xsel'" "'${xsel}/bin/xsel'"
     '';
   
  -  # Support for the `postInstall` hook was added only in nixos-20.03,
  -  # so for backwards compatibility reasons lets not use it yet.
  -  installPhase = attrs.installPhase + ''
  -    # Support both the new and old directory structure of vscode extensions.
  -    if [[ -d $out/ms-vsliveshare.vsliveshare ]]; then
  -      cd $out/ms-vsliveshare.vsliveshare
  -    elif [[ -d $out/share/vscode/extensions/ms-vsliveshare.vsliveshare ]]; then
  -      cd $out/share/vscode/extensions/ms-vsliveshare.vsliveshare
  -    else
  -      echo "Could not find extension directory 'ms-vsliveshare.vsliveshare'." >&2
  -      exit 1
  -    fi
  +  postInstall = ''
  +    cd $out/share/vscode/extensions/ms-vsliveshare.vsliveshare
   
       bash -s <<ENDSUBSHELL
       shopt -s extglob
  
positive.code:   mktplcRef = {
      name = "vsliveshare";
      publisher = "ms-vsliveshare";
      version = "1.0.2902";
      sha256 = "0fx2vi0wxamcwqcgcx7wpg8hi7f1c2pibrmd2qy2whilpsv3gzmb";
    };
  }).overrideAttrs(attrs: {
    buildInputs = attrs.buildInputs ++ libs ++ [ autoPatchelfHook bash file makeWrapper ];
  
    # Using a patch file won't work, because the file changes too often, causing the patch to fail on most updates.
    # Rather than patching the calls to functions, we modify the functions to return what we want,
  
negative.code: 
      # The required executables are already copied over,
      # and the other runtimes won't be used and thus are just a waste of space.
      rm -r dotnet_modules/exes dotnet_modules/runtimes/!(linux-x64|unix)
  
      # Not all executables and libraries are executable, so make sure that they are.
      jq <package.json '.executables.linux[]' -r | xargs chmod +x
  
      # Lock the extension downloader.
      touch install-linux.Lock externalDeps-linux.Lock
      ENDSUBSHELL
    '';
  
    postFixup = ''
      # We cannot use `wrapProgram`, because it will generate a relative path,
      # which will break when copying over the files.
      mv dotnet_modules/vsls-agent{,-wrapped}
      makeWrapper $PWD/dotnet_modules/vsls-agent{-wrapped,} \
        --prefix LD_LIBRARY_PATH : "${makeLibraryPath libs}" \
        --set LD_PRELOAD $PWD/dotnet_modules/noop-syslog.so \
        --set DOTNET_ROOT ${dotnet-sdk_3}
    '';
  
    meta = {
  