Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
at netboot-syslinux-multiplatform 618 lines 19 kB view raw
1# Do not use overrides in this file to add `meta.mainProgram` to packages. Use `./main-programs.nix` 2# instead. 3{ pkgs, nodejs }: 4 5let 6 inherit (pkgs) 7 stdenv 8 lib 9 callPackage 10 fetchFromGitHub 11 fetchurl 12 fetchpatch 13 nixosTests; 14 15 since = version: lib.versionAtLeast nodejs.version version; 16 before = version: lib.versionOlder nodejs.version version; 17in 18 19final: prev: { 20 "@angular/cli" = prev."@angular/cli".override { 21 prePatch = '' 22 export NG_CLI_ANALYTICS=false 23 ''; 24 }; 25 26 "@electron-forge/cli" = prev."@electron-forge/cli".override { 27 buildInputs = [ final.node-gyp-build ]; 28 }; 29 30 "@forge/cli" = prev."@forge/cli".override { 31 nativeBuildInputs = [ pkgs.pkg-config ]; 32 buildInputs = with pkgs; [ 33 libsecret 34 final.node-gyp-build 35 final.node-pre-gyp 36 ] ++ lib.optionals stdenv.isDarwin [ 37 darwin.apple_sdk.frameworks.AppKit 38 darwin.apple_sdk.frameworks.Security 39 ]; 40 }; 41 42 "@medable/mdctl-cli" = prev."@medable/mdctl-cli".override (oldAttrs: { 43 nativeBuildInputs = with pkgs; with darwin.apple_sdk.frameworks; [ 44 glib 45 libsecret 46 pkg-config 47 ] ++ lib.optionals stdenv.isDarwin [ 48 AppKit 49 Security 50 ]; 51 buildInputs = [ 52 final.node-gyp-build 53 final.node-pre-gyp 54 nodejs 55 ]; 56 57 meta = oldAttrs.meta // { broken = since "16"; }; 58 }); 59 mdctl-cli = final."@medable/mdctl-cli"; 60 61 autoprefixer = prev.autoprefixer.override { 62 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 63 postInstall = '' 64 wrapProgram "$out/bin/autoprefixer" \ 65 --prefix NODE_PATH : ${final.postcss}/lib/node_modules 66 ''; 67 passthru.tests = { 68 simple-execution = callPackage ./package-tests/autoprefixer.nix { inherit (final) autoprefixer; }; 69 }; 70 }; 71 72 aws-azure-login = prev.aws-azure-login.override (oldAttrs: { 73 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 74 prePatch = '' 75 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 76 ''; 77 postInstall = '' 78 wrapProgram $out/bin/aws-azure-login \ 79 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium}/bin/chromium 80 ''; 81 meta = oldAttrs.meta // { platforms = lib.platforms.linux; }; 82 }); 83 84 balanceofsatoshis = prev.balanceofsatoshis.override { 85 nativeBuildInputs = [ pkgs.installShellFiles ]; 86 postInstall = '' 87 installShellCompletion --cmd bos\ 88 --bash <($out/bin/bos completion bash)\ 89 --zsh <($out/bin/bos completion zsh)\ 90 --fish <($out/bin/bos completion fish) 91 ''; 92 }; 93 94 bitwarden-cli = prev."@bitwarden/cli".override { 95 name = "bitwarden-cli"; 96 nativeBuildInputs = with pkgs; [ 97 pkg-config 98 ] ++ lib.optionals stdenv.isDarwin [ 99 darwin.apple_sdk.frameworks.CoreText 100 ]; 101 buildInputs = with pkgs; [ 102 pixman 103 cairo 104 pango 105 giflib 106 ]; 107 }; 108 109 bower2nix = prev.bower2nix.override { 110 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 111 postInstall = '' 112 for prog in bower2nix fetch-bower; do 113 wrapProgram "$out/bin/$prog" --prefix PATH : ${lib.makeBinPath [ pkgs.git pkgs.nix ]} 114 done 115 ''; 116 }; 117 118 carbon-now-cli = prev.carbon-now-cli.override { 119 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 120 prePatch = '' 121 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 122 ''; 123 postInstall = '' 124 wrapProgram $out/bin/carbon-now \ 125 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium 126 ''; 127 }; 128 129 coc-imselect = prev.coc-imselect.override (oldAttrs: { 130 meta = oldAttrs.meta // { broken = since "10"; }; 131 }); 132 133 dat = prev.dat.override (oldAttrs: { 134 buildInputs = [ final.node-gyp-build pkgs.libtool pkgs.autoconf pkgs.automake ]; 135 meta = oldAttrs.meta // { broken = since "12"; }; 136 }); 137 138 eask = prev."@emacs-eask/cli".override { 139 name = "eask"; 140 }; 141 142 expo-cli = prev."expo-cli".override (oldAttrs: { 143 # The traveling-fastlane-darwin optional dependency aborts build on Linux. 144 dependencies = builtins.filter (d: d.packageName != "@expo/traveling-fastlane-${if stdenv.isLinux then "darwin" else "linux"}") oldAttrs.dependencies; 145 }); 146 147 fast-cli = prev.fast-cli.override { 148 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 149 prePatch = '' 150 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 151 ''; 152 postInstall = '' 153 wrapProgram $out/bin/fast \ 154 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium 155 ''; 156 }; 157 158 fauna-shell = prev.fauna-shell.override { 159 # printReleaseNotes just pulls them from GitHub which is not allowed in sandbox 160 preRebuild = '' 161 sed -i 's|"node ./tools/printReleaseNotes"|"true"|' node_modules/faunadb/package.json 162 ''; 163 }; 164 165 firebase-tools = prev.firebase-tools.override { 166 nativeBuildInputs = lib.optionals stdenv.isDarwin [ pkgs.xcbuild ]; 167 }; 168 169 flood = prev.flood.override { 170 buildInputs = [ final.node-pre-gyp ]; 171 }; 172 173 git-ssb = prev.git-ssb.override (oldAttrs: { 174 buildInputs = [ final.node-gyp-build ]; 175 meta = oldAttrs.meta // { broken = since "10"; }; 176 }); 177 178 graphite-cli = prev."@withgraphite/graphite-cli".override { 179 name = "graphite-cli"; 180 nativeBuildInputs = [ pkgs.installShellFiles ]; 181 # 'gt completion' auto-detects zshell from environment variables: 182 # https://github.com/yargs/yargs/blob/2b6ba3139396b2e623aed404293f467f16590039/lib/completion.ts#L45 183 postInstall = '' 184 installShellCompletion --cmd gt \ 185 --bash <($out/bin/gt completion) \ 186 --zsh <(ZSH_NAME=zsh $out/bin/gt completion) 187 ''; 188 }; 189 190 graphql-language-service-cli = prev.graphql-language-service-cli.override { 191 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 192 postInstall = '' 193 wrapProgram "$out/bin/graphql-lsp" \ 194 --prefix NODE_PATH : ${final.graphql}/lib/node_modules 195 ''; 196 }; 197 198 hsd = prev.hsd.override { 199 buildInputs = [ final.node-gyp-build pkgs.unbound ]; 200 }; 201 202 ijavascript = prev.ijavascript.override (oldAttrs: { 203 preRebuild = '' 204 export npm_config_zmq_external=true 205 ''; 206 buildInputs = oldAttrs.buildInputs ++ [ final.node-gyp-build pkgs.zeromq ]; 207 }); 208 209 insect = prev.insect.override (oldAttrs: { 210 nativeBuildInputs = oldAttrs.nativeBuildInputs or [] ++ [ pkgs.psc-package final.pulp ]; 211 }); 212 213 intelephense = prev.intelephense.override (oldAttrs: { 214 meta = oldAttrs.meta // { license = lib.licenses.unfree; }; 215 }); 216 217 joplin = prev.joplin.override { 218 nativeBuildInputs = [ 219 pkgs.pkg-config 220 ] ++ lib.optionals stdenv.isDarwin [ 221 pkgs.xcbuild 222 ]; 223 buildInputs = with pkgs; [ 224 # required by sharp 225 # https://sharp.pixelplumbing.com/install 226 vips 227 228 libsecret 229 final.node-gyp-build 230 final.node-pre-gyp 231 232 pixman 233 cairo 234 pango 235 ] ++ lib.optionals stdenv.isDarwin [ 236 darwin.apple_sdk.frameworks.AppKit 237 darwin.apple_sdk.frameworks.Security 238 ]; 239 }; 240 241 jsonplaceholder = prev.jsonplaceholder.override { 242 buildInputs = [ nodejs ]; 243 postInstall = '' 244 exe=$out/bin/jsonplaceholder 245 mkdir -p $out/bin 246 cat >$exe <<EOF 247 #!${pkgs.runtimeShell} 248 exec -a jsonplaceholder ${nodejs}/bin/node $out/lib/node_modules/jsonplaceholder/index.js 249 EOF 250 chmod a+x $exe 251 ''; 252 }; 253 254 keyoxide = prev.keyoxide.override { 255 nativeBuildInputs = [ pkgs.pkg-config ]; 256 buildInputs = with pkgs; [ 257 pixman 258 cairo 259 pango 260 ] ++ lib.optionals stdenv.isDarwin [ 261 darwin.apple_sdk.frameworks.CoreText 262 ]; 263 }; 264 265 makam = prev.makam.override { 266 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 267 postFixup = '' 268 wrapProgram "$out/bin/makam" --prefix PATH : ${lib.makeBinPath [ nodejs ]} 269 ${lib.optionalString stdenv.isLinux "patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux-x86-64.so.2 \"$out/lib/node_modules/makam/makam-bin-linux64\""} 270 ''; 271 }; 272 273 mermaid-cli = prev."@mermaid-js/mermaid-cli".override ( 274 if stdenv.isDarwin 275 then {} 276 else { 277 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 278 prePatch = '' 279 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 280 ''; 281 postInstall = '' 282 wrapProgram $out/bin/mmdc \ 283 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium 284 ''; 285 }); 286 287 near-cli = prev.near-cli.override { 288 nativeBuildInputs = with pkgs; [ 289 libusb1 290 final.prebuild-install 291 final.node-gyp-build 292 pkg-config 293 ]; 294 }; 295 296 node-gyp = prev.node-gyp.override { 297 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 298 # Teach node-gyp to use nodejs headers locally rather that download them form https://nodejs.org. 299 # This is important when build nodejs packages in sandbox. 300 postInstall = '' 301 wrapProgram "$out/bin/node-gyp" \ 302 --set npm_config_nodedir ${nodejs} 303 ''; 304 }; 305 306 node-inspector = prev.node-inspector.override (oldAttrs: { 307 buildInputs = [ final.node-pre-gyp ]; 308 meta = oldAttrs.meta // { broken = since "10"; }; 309 }); 310 311 node-red = prev.node-red.override { 312 buildInputs = [ final.node-pre-gyp ]; 313 }; 314 315 node2nix = prev.node2nix.override { 316 # Get latest commit for misc fixes 317 src = fetchFromGitHub { 318 owner = "svanderburg"; 319 repo = "node2nix"; 320 rev = "315e1b85a6761152f57a41ccea5e2570981ec670"; 321 sha256 = "sha256-8OxTOkwBPcnjyhXhxQEDd8tiaQoHt91zUJX5Ka+IXco="; 322 }; 323 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 324 postInstall = let 325 patches = [ 326 # Needed to fix packages with DOS line-endings after above patch - PR svanderburg/node2nix#314 327 (fetchpatch { 328 name = "convert-crlf-for-script-bin-files.patch"; 329 url = "https://github.com/svanderburg/node2nix/commit/91aa511fe7107938b0409a02ab8c457a6de2d8ca.patch"; 330 hash = "sha256-ISiKYkur/o8enKDzJ8mQndkkSC4yrTNlheqyH+LiXlU="; 331 }) 332 # fix nodejs attr names 333 (fetchpatch { 334 url = "https://github.com/svanderburg/node2nix/commit/3b63e735458947ef39aca247923f8775633363e5.patch"; 335 hash = "sha256-pe8Xm4mjPh9oKXugoMY6pRl8YYgtdw0sRXN+TienalU="; 336 }) 337 ]; 338 in '' 339 ${lib.concatStringsSep "\n" (map (patch: "patch -d $out/lib/node_modules/node2nix -p1 < ${patch}") patches)} 340 wrapProgram "$out/bin/node2nix" --prefix PATH : ${lib.makeBinPath [ pkgs.nix ]} 341 ''; 342 }; 343 344 parcel = prev.parcel.override { 345 buildInputs = [ final.node-gyp-build ]; 346 preRebuild = '' 347 sed -i -e "s|#!/usr/bin/env node|#! ${nodejs}/bin/node|" node_modules/node-gyp-build/bin.js 348 ''; 349 }; 350 351 pnpm = prev.pnpm.override { 352 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 353 354 preRebuild = '' 355 sed 's/"link:/"file:/g' --in-place package.json 356 ''; 357 358 postInstall = let 359 pnpmLibPath = lib.makeBinPath [ 360 nodejs.passthru.python 361 nodejs 362 ]; 363 in '' 364 for prog in $out/bin/*; do 365 wrapProgram "$prog" --prefix PATH : ${pnpmLibPath} 366 done 367 ''; 368 }; 369 370 postcss-cli = prev.postcss-cli.override (oldAttrs: { 371 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 372 postInstall = '' 373 wrapProgram "$out/bin/postcss" \ 374 --prefix NODE_PATH : ${final.postcss}/lib/node_modules \ 375 --prefix NODE_PATH : ${final.autoprefixer}/lib/node_modules 376 ln -s '${final.postcss}/lib/node_modules/postcss' "$out/lib/node_modules/postcss" 377 ''; 378 passthru.tests = { 379 simple-execution = callPackage ./package-tests/postcss-cli.nix { 380 inherit (final) postcss-cli; 381 }; 382 }; 383 meta = oldAttrs.meta // { maintainers = with lib.maintainers; [ Luflosi ]; }; 384 }); 385 386 # To update prisma, please first update prisma-engines to the latest 387 # version. Then change the correct hash to this package. The PR should hold 388 # two commits: one for the engines and the other one for the node package. 389 prisma = prev.prisma.override rec { 390 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 391 392 inherit (pkgs.prisma-engines) version; 393 394 src = fetchurl { 395 url = "https://registry.npmjs.org/prisma/-/prisma-${version}.tgz"; 396 hash = "sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA=="; 397 }; 398 postInstall = with pkgs; '' 399 wrapProgram "$out/bin/prisma" \ 400 --set PRISMA_MIGRATION_ENGINE_BINARY ${prisma-engines}/bin/migration-engine \ 401 --set PRISMA_QUERY_ENGINE_BINARY ${prisma-engines}/bin/query-engine \ 402 --set PRISMA_QUERY_ENGINE_LIBRARY ${lib.getLib prisma-engines}/lib/libquery_engine.node \ 403 --set PRISMA_FMT_BINARY ${prisma-engines}/bin/prisma-fmt 404 ''; 405 406 passthru.tests = { 407 simple-execution = pkgs.callPackage ./package-tests/prisma.nix { 408 inherit (final) prisma; 409 }; 410 }; 411 }; 412 413 pulp = prev.pulp.override { 414 # tries to install purescript 415 npmFlags = builtins.toString [ "--ignore-scripts" ]; 416 417 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 418 postInstall = '' 419 wrapProgram "$out/bin/pulp" --suffix PATH : ${lib.makeBinPath [ 420 pkgs.purescript 421 ]} 422 ''; 423 }; 424 425 readability-cli = prev.readability-cli.override (oldAttrs: { 426 # Wrap src to fix this build error: 427 # > readability-cli/readable.ts: unsupported interpreter directive "#!/usr/bin/env -S deno..." 428 # 429 # Need to wrap the source, instead of patching in patchPhase, because 430 # buildNodePackage only unpacks sources in the installPhase. 431 src = pkgs.srcOnly { 432 src = oldAttrs.src; 433 name = oldAttrs.name; 434 patchPhase = "chmod a-x readable.ts"; 435 }; 436 437 nativeBuildInputs = [ pkgs.pkg-config ]; 438 buildInputs = with pkgs; [ 439 pixman 440 cairo 441 pango 442 ]; 443 }); 444 445 reveal-md = prev.reveal-md.override ( 446 lib.optionalAttrs (!stdenv.isDarwin) { 447 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 448 prePatch = '' 449 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 450 ''; 451 postInstall = '' 452 wrapProgram $out/bin/reveal-md \ 453 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium 454 ''; 455 } 456 ); 457 458 rush = prev."@microsoft/rush".override { 459 name = "rush"; 460 }; 461 462 ssb-server = prev.ssb-server.override (oldAttrs: { 463 buildInputs = [ pkgs.automake pkgs.autoconf final.node-gyp-build ]; 464 meta = oldAttrs.meta // { broken = since "10"; }; 465 }); 466 467 stf = prev.stf.override (oldAttrs: { 468 meta = oldAttrs.meta // { broken = since "10"; }; 469 }); 470 471 tailwindcss = prev.tailwindcss.override { 472 plugins = [ ]; 473 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 474 postInstall = '' 475 nodePath="" 476 for p in "$out" "${final.postcss}" $plugins; do 477 nodePath="$nodePath''${nodePath:+:}$p/lib/node_modules" 478 done 479 wrapProgram "$out/bin/tailwind" \ 480 --prefix NODE_PATH : "$nodePath" 481 wrapProgram "$out/bin/tailwindcss" \ 482 --prefix NODE_PATH : "$nodePath" 483 unset nodePath 484 ''; 485 passthru.tests = { 486 simple-execution = callPackage ./package-tests/tailwindcss.nix { 487 inherit (final) tailwindcss; 488 }; 489 }; 490 }; 491 492 teck-programmer = prev.teck-programmer.override { 493 nativeBuildInputs = [ final.node-gyp-build ]; 494 buildInputs = [ pkgs.libusb1 ]; 495 }; 496 497 tedicross = prev."tedicross-git+https://github.com/TediCross/TediCross.git#v0.8.7".override { 498 nativeBuildInputs = with pkgs; [ makeWrapper libtool autoconf ]; 499 postInstall = '' 500 makeWrapper '${nodejs}/bin/node' "$out/bin/tedicross" \ 501 --add-flags "$out/lib/node_modules/tedicross/main.js" 502 ''; 503 }; 504 505 thelounge-plugin-closepms = prev.thelounge-plugin-closepms.override { 506 nativeBuildInputs = [ final.node-pre-gyp ]; 507 }; 508 509 thelounge-plugin-giphy = prev.thelounge-plugin-giphy.override { 510 nativeBuildInputs = [ final.node-pre-gyp ]; 511 }; 512 513 thelounge-theme-flat-blue = prev.thelounge-theme-flat-blue.override { 514 nativeBuildInputs = [ final.node-pre-gyp ]; 515 # TODO: needed until upstream pins thelounge version 4.3.1+ (which fixes dependency on old sqlite3 and transitively very old node-gyp 3.x) 516 preRebuild = '' 517 rm -r node_modules/node-gyp 518 ''; 519 }; 520 521 thelounge-theme-flat-dark = prev.thelounge-theme-flat-dark.override { 522 nativeBuildInputs = [ final.node-pre-gyp ]; 523 # TODO: needed until upstream pins thelounge version 4.3.1+ (which fixes dependency on old sqlite3 and transitively very old node-gyp 3.x) 524 preRebuild = '' 525 rm -r node_modules/node-gyp 526 ''; 527 }; 528 529 ts-node = prev.ts-node.override { 530 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 531 postInstall = '' 532 wrapProgram "$out/bin/ts-node" \ 533 --prefix NODE_PATH : ${final.typescript}/lib/node_modules 534 ''; 535 }; 536 537 tsun = prev.tsun.override { 538 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 539 postInstall = '' 540 wrapProgram "$out/bin/tsun" \ 541 --prefix NODE_PATH : ${final.typescript}/lib/node_modules 542 ''; 543 }; 544 545 typescript-language-server = prev.typescript-language-server.override { 546 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 547 postInstall = '' 548 ${pkgs.xorg.lndir}/bin/lndir ${final.typescript} $out 549 ''; 550 }; 551 552 uppy-companion = prev."@uppy/companion".override { 553 name = "uppy-companion"; 554 }; 555 556 vega-cli = prev.vega-cli.override { 557 nativeBuildInputs = [ pkgs.pkg-config ]; 558 buildInputs = with pkgs; [ 559 final.node-pre-gyp 560 pixman 561 cairo 562 pango 563 libjpeg 564 ] ++ lib.optionals stdenv.isDarwin [ 565 darwin.apple_sdk.frameworks.CoreText 566 ]; 567 }; 568 569 vega-lite = prev.vega-lite.override { 570 postInstall = '' 571 cd node_modules 572 for dep in ${final.vega-cli}/lib/node_modules/vega-cli/node_modules/*; do 573 if [[ ! -d ''${dep##*/} ]]; then 574 ln -s "${final.vega-cli}/lib/node_modules/vega-cli/node_modules/''${dep##*/}" 575 fi 576 done 577 ''; 578 passthru.tests = { 579 simple-execution = callPackage ./package-tests/vega-lite.nix { 580 inherit (final) vega-lite; 581 }; 582 }; 583 }; 584 585 volar = final."@volar/vue-language-server".override { 586 name = "volar"; 587 }; 588 589 wavedrom-cli = prev.wavedrom-cli.override { 590 nativeBuildInputs = [ pkgs.pkg-config final.node-pre-gyp ]; 591 # These dependencies are required by 592 # https://github.com/Automattic/node-canvas. 593 buildInputs = with pkgs; [ 594 giflib 595 pixman 596 cairo 597 pango 598 ] ++ lib.optionals stdenv.isDarwin [ 599 darwin.apple_sdk.frameworks.CoreText 600 ]; 601 }; 602 603 webtorrent-cli = prev.webtorrent-cli.override { 604 buildInputs = [ final.node-gyp-build ]; 605 }; 606 607 wrangler = prev.wrangler.override (oldAttrs: { 608 meta = oldAttrs.meta // { broken = before "16.13"; }; 609 }); 610 611 yaml-language-server = prev.yaml-language-server.override { 612 nativeBuildInputs = [ pkgs.buildPackages.makeWrapper ]; 613 postInstall = '' 614 wrapProgram "$out/bin/yaml-language-server" \ 615 --prefix NODE_PATH : ${final.prettier}/lib/node_modules 616 ''; 617 }; 618}