diff --git a/.eslintignore b/.eslintignore index 5e87d14d..bd505289 100644 --- a/.eslintignore +++ b/.eslintignore @@ -17,3 +17,5 @@ typedoc-theme/ # ms IDE stuff .history/ .vscode/ + +env_installer diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f67892ec..aed0700c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -14,9 +14,9 @@ jobs: strategy: matrix: cfg: - - { platform: linux, platform_name: Linux, os: ubuntu-latest } - - { platform: mac, platform_name: macOS, os: macos-latest } - - { platform: win, platform_name: Windows, os: windows-latest } + - { platform: linux, platform_name: Linux, os: ubuntu-latest, conda_platform: linux-64 } + - { platform: mac, platform_name: macOS, os: macos-latest, conda_platform: osx-64 } + - { platform: win, platform_name: Windows, os: windows-latest, conda_platform: win-64 } name: '${{ matrix.cfg.platform_name }} installer' runs-on: ${{ matrix.cfg.os }} @@ -24,8 +24,7 @@ jobs: steps: - uses: actions/checkout@v3 - uses: s-weigand/setup-conda@v1 - # downgrade conda since v23.1.0 is causing issues in "Create Application Server Installer" step - - run: conda install -c conda-forge conda=22.11.1 -y + - run: conda install --file ./workflow_env/conda-${{ matrix.cfg.conda_platform }}.lock -y - name: Install node uses: actions/setup-node@v3 @@ -34,10 +33,8 @@ jobs: cache: 'yarn' - name: Install dependencies - # pin Pillow version to prevent Windows build errors run: | npm install --global yarn --prefer-offline - conda install -c conda-forge constructor Pillow=9.3.0 yarn install - name: Check JupyterLab version match @@ -73,6 +70,38 @@ jobs: run: | yarn create_env_installer:${{ matrix.cfg.platform }} + # contents of tarball needs to be signed for notarization + - name: Codesign Application Server + if: matrix.cfg.platform == 'mac' && steps.release-exists.outputs.result == 'true' + env: + CSC_IDENTITY_AUTO_DISCOVERY: true + CSC_FOR_PULL_REQUEST: true + CSC_LINK: ${{ secrets.CSC_LINK }} + CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} + APPLEID: ${{ secrets.APPLEID }} + APPLEIDPASS: ${{ secrets.APPLEIDPASS }} + ENV_INSTALLER_KEYCHAIN_PASS: ${{ secrets.ENV_INSTALLER_KEYCHAIN_PASS }} + run: | + echo "Extracting env installer" + yarn extract_env_installer:${{ matrix.cfg.platform }} + echo $CSC_LINK | base64 -d -o certificate.p12 + security create-keychain -p $ENV_INSTALLER_KEYCHAIN_PASS build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p $ENV_INSTALLER_KEYCHAIN_PASS build.keychain + security import certificate.p12 -k build.keychain -P $CSC_KEY_PASSWORD -T /usr/bin/codesign + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $ENV_INSTALLER_KEYCHAIN_PASS build.keychain + echo "Signing env binaries" + while read line; do /usr/bin/codesign --force --options=runtime --deep -s "Developer ID Application" ./env_installer/jlab_server_extracted/"$line" -v; done < ./env_installer/sign-osx-64.txt + rm certificate.p12 + security delete-keychain build.keychain + + # recreate tarball after signing contents + - name: Re-archive Application Server Installer + if: matrix.cfg.platform == 'mac' && steps.release-exists.outputs.result == 'true' + run: | + yarn compress_env_installer:${{ matrix.cfg.platform }} + rm -rf ./env_installer/jlab_server_extracted + - name: Create Application Installer for Test env: CSC_IDENTITY_AUTO_DISCOVERY: false # disable code signing if not release asset diff --git a/.gitignore b/.gitignore index f139f7e5..d3fed51a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,4 @@ __pycache__ .idea/ *.log -env_installer/ -!env_installer/construct.yaml - +env_installer/jlab_server/ diff --git a/.prettierignore b/.prettierignore index ef996a83..49c1ac07 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,3 +9,5 @@ # ms IDE stuff .history/ .vscode/ + +env_installer diff --git a/.stylelintignore b/.stylelintignore index 712d7c4d..b9af83af 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -1 +1,2 @@ build/**/* +env_installer diff --git a/Release.md b/Release.md index 1d76ea6d..46132f54 100644 --- a/Release.md +++ b/Release.md @@ -20,23 +20,21 @@ If the JupyterLab version is not changing with the new JupyterLab Desktop releas In order to change the JupyterLab version bundled with the application: -1. Update all `@jupyterlab` package dependencies in [package.json](package.json) using +1. Bump the application version using `tbump` to `new-jlab-version-1` ```bash - yarn set_jupyterlab_version + tbump --only-patch -1 ``` - `` must match a released JupyterLab version such as `3.1.13`. This command will update dependencies with `@jupyterlab` scope. - -2. Bump the application version using `tbump` to `new-jlab-version-1` +2. Update conda lock files using ```bash - tbump --only-patch -1 + yarn update_conda_lock ``` -3. Update `@jupyter-widgets/jupyterlab-manager` version in [package.json](package.json) for ipywidgets if a compatible newer version is available. +3. If python version is updated in [`env_installer/jlab_server.yaml`](env_installer/jlab_server.yaml), also update `pythonBin` variables in [`util.ts`](src/main/utils.ts) that are used in code signing related methods. -4. Update `ipywidgets` python package version in [`env_installer/construct.yaml`](env_installer/construct.yaml) if there is a compatible newer version available. +4. Update `ipywidgets` python package version in [`env_installer/jlab_server.yaml`](env_installer/jlab_server.yaml) if there is a compatible newer version available. Note that after updating the bundled JupyterLab version, it is necessary to bump JupyterLab Desktop version using `tbump` as described in the section below. Run `check_version_match` script before committing the changes to ensure version integrity. diff --git a/dev.md b/dev.md index db8c37c8..a2e315b9 100644 --- a/dev.md +++ b/dev.md @@ -6,10 +6,10 @@ You can install `conda` as part of a [Miniforge](https://github.com/conda-forge/miniforge) installer. -- [(conda) Constructor](https://github.com/conda/constructor) to bundle JupyterLab Desktop Server into the stand-alone application. You can install Constructor using: +- [conda pack](https://github.com/conda/conda-pack) and [conda lock](https://github.com/conda/conda-lock) to bundle JupyterLab Desktop Server into the standalone application and to create lock files. You can install them using: ```bash - conda install -c conda-forge constructor + conda install -c conda-forge conda-pack conda-lock ``` - nodejs diff --git a/env_installer/conda-linux-64.lock b/env_installer/conda-linux-64.lock new file mode 100644 index 00000000..92376b42 --- /dev/null +++ b/env_installer/conda-linux-64.lock @@ -0,0 +1,186 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 41702ab4d175471289359ad79629688a32b870aed8725478a4b0fd35390fe5f6 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.1.0-h15d22d2_0.conda#afb656a334c409dd9805508af1c89c7a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-3_cp38.conda#2f3f7af062b42d664117662612022204 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0.conda#506dc07710dd5b0ba63cbf134897fc10 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-h0b41bf4_0.conda#1edd9e67bdb90d78cea97733ff6b54e6 +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.23-pthreads_h80387f5_0.conda#9c5ea51ccb8ffae7d06c645869d24ce6 +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.0-h0b41bf4_0.conda#0d4a7508d8c6c65314f2b9c1f56ad408 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-ha587672_6.conda#4e5ee4b062c21519efbee7e2ae608748 +https://conda.anaconda.org/conda-forge/linux-64/python-3.8.16-he550d4f_1_cpython.conda#9de84cccfbc5f8350a3667bb6ef6fc30 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/boltons-23.0.0-pyhd8ed1ab_0.conda#033eb25fffd222aceeca6d58cd953680 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb +https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.6.7-py38h8dc9893_0.conda#e3c2cc835cf3223d585d1d25d56fd3de +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 +https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jsonpointer-2.0-py_0.tar.bz2#07d85c22a3beb102a48cd123df84c2a6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py38h01eb140_0.conda#17d2a5314adf0f25220eeebb312d00a4 +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.3-py38h59b608b_0.conda#5836e4ab0399136ede58446a4776b2ff +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py38h1de0b5d_0.conda#92e899e7b0ed27c793014d1fa54f9b7b +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/linux-64/pycosat-0.6.4-py38h0a891b7_1.tar.bz2#f1c39cf3c19238d1e50429f81d4afae2 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc +https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.19.3-py38h1de0b5d_0.conda#a33157288d499397a2a56da4d724948d +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0.conda#2590495f608a63625e165915fb4e2e34 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.0-py38h509eb50_0.conda#33872b6650886eba869408b76c96994c +https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py38h1de0b5d_1.conda#9afa2fc3c51cc4e7d1589c38e4e00d5c +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh41d4057_0.conda#ada5a17adcd10be4fc7e37e4166ba0e2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.2-py38h01eb140_0.conda#3db869202b0e523d606d13e81ca79ab6 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7_0.tar.bz2#44421904760e9f5ae2035193e04360f0 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.3-pyhd8ed1ab_0.conda#9beb712a1de20fea4e339a2d62851564 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.2-pyhd8ed1ab_0.conda#41221f97a0c82e5a60b21716a3d7469c +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.4-py38h01eb140_0.conda#8eb5a370d618aa8a65dee377153a3451 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.32-pyhd8ed1ab_0.tar.bz2#09150b51b0528a31a0f6500b96fdde82 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/overrides-7.3.1-pyhd8ed1ab_0.tar.bz2#a5745ced46e69aa9754053ba061974ab +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/linux-64/pillow-9.5.0-py38h885162f_1.conda#0eec8a20a17f17ec9e0b6839be466866 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.31-py38h01eb140_0.conda#aa614283cae1c213b2cafd22870dc503 +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyh41d4057_0.conda#3788984d535770cad699efaeb6cb3037 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.65.0-pyhd8ed1ab_1.conda#ed792aff3acb977d09c7013358097f83 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py38h0a891b7_3.tar.bz2#efcaa056d265a3138d2038a4b6b68791 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.1-py38hcdda232_0.conda#8dc6f3a9342a870c3c927927e86aa4ad +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.4.4-pyhd8ed1ab_1.conda#7c0965e1d4a0ee1529e8eaa03a78a5b3 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.0.2-py38h01efb38_0.conda#71066496987a1b50632526154e3d9711 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.3-pyhd8ed1ab_0.conda#c085a16ba3d0c9ee282c438308b57724 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.19.0-py38h5945529_1.conda#c082b3fdcc1f26a187814a6e180058fb +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.8.0-pyhd8ed1ab_0.conda#ebe3230a4c1e135954eee4fb6ef8cded +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.3.0-py38h578d9bd_0.conda#d75b783a348cf33c6d3d75480300fecd +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py38hd6c3c57_0.conda#3b8ba76acae09fbd4b2247c4ee4c0324 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.0.2-pyh38be061_0.conda#44800e9bd13143292097c65e57323038 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py38h59b608b_3.conda#2f2a57462fcfbc67dfdbb0de6f7484c2 +https://conda.anaconda.org/conda-forge/linux-64/conda-23.5.0-py38h578d9bd_1.conda#dea1e5aa7cd88839f1287aa860b4d5f2 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.2-pyh41d4057_0.conda#acebfd89278ecac2a67b60b657e00d5c +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh210e3f2_0.conda#4b57b688e22d094d1479a35543c18e93 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.6.0-pyhd8ed1ab_0.conda#39fd52b0fcb2fb52bac47a1419bf09bd +https://conda.anaconda.org/conda-forge/noarch/ipympl-0.9.3-pyhd8ed1ab_0.conda#da113e1ecd782afd5ed2f7b5187aaea8 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.0-pyhd8ed1ab_0.conda#38589f4104d11f2a59ff01a9f4e3bfb3 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.1-pyhd8ed1ab_0.conda#93cc832cb8e18caa52c7b36ea6ce7f3d diff --git a/env_installer/conda-osx-64.lock b/env_installer/conda-osx-64.lock new file mode 100644 index 00000000..7eb534d7 --- /dev/null +++ b/env_installer/conda-osx-64.lock @@ -0,0 +1,183 @@ +# Generated by conda-lock. +# platform: osx-64 +# input_hash: 6e97d20e35cbebb831f4938fbe8cf751a891f9adea54e29c4a679efae77c788d +@EXPLICIT +https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h0d85af4_4.tar.bz2#37edc4e6304ca87316e160f5ca0bd1b5 +https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2023.5.7-h8857fd0_0.conda#b704e4b79ba0d887c4870b7b09d6a4df +https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.0.9-hb7f2c08_8.tar.bz2#37157d273eaf3bc7d6862104161d9ec9 +https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.5-hd57cbcb_0.conda#d34eed0a4fb993f0d934db6394ba23ef +https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.18-hac1461d_0.conda#3d131584456b277ce0871e6481fde49b +https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2#ccb34fb14960ad8b125962d3d79b31a9 +https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-2.1.5.1-hb7f2c08_0.conda#d7309a152b9b79799063b8bb47e34a3a +https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.18-hbcb3906_1.tar.bz2#24632c09ed931af617fe6d5292919cab +https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.0-hb7f2c08_0.conda#18981e4c840126d6118d8952485fea51 +https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-hfd90126_4.tar.bz2#35eb3fce8d51ed3c1fd4122bad48250b +https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-16.0.5-hff08bdf_0.conda#af8df1a61e8137e3479b0f71d5bd0a49 +https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4-hf0c8a7f_0.conda#c3dbae2411164d9b02c69090a9a91857 +https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2#addd19059de62181cd11ae8f4ef26084 +https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.8-3_cp38.conda#ff192f59f7fe23555612030493a079f8 +https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h0dc2134_0.conda#9566b4c29274125b0266d0177b5eb97b +https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.3-h35c211d_0.tar.bz2#86ac76d6bf1cbb9621943eb3bd9ae36e +https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2#a72f9d4ea13d55d745ff1ed594747f10 +https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2#d7e08fcf8259d742156188e8762b4d20 +https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2#f9d6a4c82889d5ecedec1d90eb673c55 +https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.0.9-hb7f2c08_8.tar.bz2#7f952a036d9014b4dab96c6ea0f8c2a7 +https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.0.9-hb7f2c08_8.tar.bz2#b36a3bfe866d9127f25f286506982166 +https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-12.2.0-he409387_31.conda#5a544130e584b1f204ac896ff071d5b3 +https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.39-ha978bb4_0.conda#35e4928794c5391aec14ffdf1deaaee5 +https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.42.0-h58db7d2_0.conda#a7d3b44b7b0c9901ac7813b7a0462893 +https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda#5513f57e0238c87c12dffedbcc9c1a4a +https://conda.anaconda.org/conda-forge/osx-64/openssl-3.1.1-h8a1eda9_1.conda#c7822d6ee74e34af1fd74365cfd18983 +https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda#f17f77f2acf4d344734bda76829ce14e +https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.12-h5dbffcc_0.tar.bz2#8e9480d9c47061db2ed1b4ecce519a7f +https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.4-he49afe7_1.tar.bz2#1972d732b123ed04b60fd21e94f0b178 +https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.2-hbc0c0cd_6.conda#40a188783d3c425bdccc9ae9104acbb8 +https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.0.9-hb7f2c08_8.tar.bz2#aac5ad0d8f747ef7f871508146df75d9 +https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h3f81eb7_1.conda#852224ea3e8991a8342228eab274840e +https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-11_3_0_h97931a8_31.conda#97451338600bd9c5b535eb224ef6c471 +https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.5.0-hedf67fa_6.conda#800b810c1aa3eb4a08106698441871bb +https://conda.anaconda.org/conda-forge/osx-64/python-3.8.16-hf9b03c3_1_cpython.conda#96d23d997c18a90efde924d9ca6dd5b3 +https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.3-pyhd8ed1ab_0.tar.bz2#54ac328d703bff191256ffa1183126d1 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/boltons-23.0.0-pyhd8ed1ab_0.conda#033eb25fffd222aceeca6d58cd953680 +https://conda.anaconda.org/conda-forge/osx-64/brotli-1.0.9-hb7f2c08_8.tar.bz2#55f612fe4a9b5f6ac76348b6de94aaeb +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb +https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.6.7-py38h4cd09af_0.conda#32626ffd5cd7eaad3036d7dca808ddc7 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 +https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jsonpointer-2.0-py_0.tar.bz2#07d85c22a3beb102a48cd123df84c2a6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.4-py38h98b9b1b_1.tar.bz2#c11eff21a36bc5809b8e23a05ee71df8 +https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.15-h2dcdeff_1.conda#f1df9b0c2d9fbe985e62f4b24773a9e4 +https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.23-openmp_h429af6e_0.conda#7000a828e29608e4f57e662b5502d2c9 +https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.3-py38hcafd530_0.conda#e8ee9933dc3749c889baccb1c4b4f014 +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.0-h13ac156_2.conda#299a29af9ac9f550ad459d655739280b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/osx-64/psutil-5.9.5-py38hef030d1_0.conda#20b4cc7adae881327b943c883be6335e +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/osx-64/pycosat-0.6.4-py38hef030d1_1.tar.bz2#5a66b20057598773411e5a2d79165241 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc +https://conda.anaconda.org/conda-forge/osx-64/pyrsistent-0.19.3-py38hef030d1_0.conda#01ca11f08679d88fc881a19902a0a008 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0.conda#2590495f608a63625e165915fb4e2e34 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0-py38hef030d1_5.tar.bz2#e27d698dc29c6d5b49f1385bcd1d50f9 +https://conda.anaconda.org/conda-forge/osx-64/pyzmq-25.1.0-py38h3b70857_0.conda#a48761bc98b3bc22d209e9bb2f3dc5c1 +https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f +https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml.clib-0.2.7-py38hef030d1_1.conda#9a8e866b0680b61b2e988b18a1eaecae +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/osx-64/tornado-6.3.2-py38hcafd530_0.conda#afefcf665a5049b030efb084a51e3935 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 +https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.0.0-py38hef030d1_0.tar.bz2#51020c740c53f14657f6307b9eb23f85 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.3-pyhd8ed1ab_0.conda#9beb712a1de20fea4e339a2d62851564 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.2-pyhd8ed1ab_0.conda#41221f97a0c82e5a60b21716a3d7469c +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/osx-64/cffi-1.15.1-py38hb368cf1_3.conda#a2b3ae2a1fd2aea0b4433d9e7fff8cf3 +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.39.4-py38hcafd530_0.conda#29176e9dbfd966b76dd571790249b4ac +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.32-pyhd8ed1ab_0.tar.bz2#09150b51b0528a31a0f6500b96fdde82 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-17_osx64_openblas.conda#65299527582e2449b05d27fcf8352125 +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/noarch/overrides-7.3.1-pyhd8ed1ab_0.tar.bz2#a5745ced46e69aa9754053ba061974ab +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 +https://conda.anaconda.org/conda-forge/osx-64/pillow-9.5.0-py38h16710f9_1.conda#c5bf174a033ef668679cc80918422515 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-9.2-py38h095c2e5_0.conda#8dbb4798b2066b678d8da47734d1c763 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml-0.17.31-py38hcafd530_0.conda#d1c4f31c669843018dafac2ef5ec1a74 +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.1-pyhd1c38e8_0.conda#046120b71d8896cb7faef78bfdbfee1e +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.65.0-pyhd8ed1ab_1.conda#ed792aff3acb977d09c7013358097f83 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-21.2.0-py38hef030d1_3.tar.bz2#fc1bc20add8eff07c367973bba25e8eb +https://conda.anaconda.org/conda-forge/osx-64/cryptography-41.0.1-py38he13da33_0.conda#845f16b2278f26769e23796d04636e06 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.4.4-pyhd8ed1ab_1.conda#7c0965e1d4a0ee1529e8eaa03a78a5b3 +https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-17_osx64_openblas.conda#380151ca00704172b242a63701b7bf8a +https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-17_osx64_openblas.conda#6ab83532872bf3659613638589dd10af +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.3-pyhd8ed1ab_0.conda#c085a16ba3d0c9ee282c438308b57724 +https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-9.2-py38h095c2e5_0.conda#fa3e3307ff143e7a9e823ce7bbc916ad +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.19.0-py38h7cbeef7_1.conda#4a2e5e473f9e8c88e3df62390f59073d +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.8.0-pyhd8ed1ab_0.conda#ebe3230a4c1e135954eee4fb6ef8cded +https://conda.anaconda.org/conda-forge/osx-64/jupyter_core-5.3.0-py38h50d1736_0.conda#c342b82641ef032fa8b256eb4f0a5649 +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/osx-64/numpy-1.24.3-py38h9a4a08f_0.conda#5ff64b8133dea66865fe1bd35fb1d6d6 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyhd1c38e8_0.conda#2657c3de5371c571aef6678afb4aaadd +https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.0.2-pyh38be061_0.conda#44800e9bd13143292097c65e57323038 +https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.0.7-py38h98b9b1b_0.conda#c3d26ebf025c7b9c9ff2fbcaee1f7646 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/osx-64/pandas-2.0.2-py38h78e6021_0.conda#e27c7a6bf8586100d29f898126f9d0f9 +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/osx-64/scipy-1.10.1-py38h9cf86d3_3.conda#5e20c77455e815704b008ab8f42f6169 +https://conda.anaconda.org/conda-forge/osx-64/conda-23.5.0-py38h50d1736_1.conda#d2ca034ab9e1381f8761104081fc5343 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.2-pyhd1c38e8_0.conda#acc618532cbc899f5721cc96407b16cc +https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.7.1-py38hcb346ec_0.conda#1f1eea98c232c8ef720175e12b00d0c4 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh736e0ef_0.conda#d5aa7d2cc9fe03f62cf6e7bcc8e1a8df +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.6.0-pyhd8ed1ab_0.conda#39fd52b0fcb2fb52bac47a1419bf09bd +https://conda.anaconda.org/conda-forge/noarch/ipympl-0.9.3-pyhd8ed1ab_0.conda#da113e1ecd782afd5ed2f7b5187aaea8 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.0-pyhd8ed1ab_0.conda#38589f4104d11f2a59ff01a9f4e3bfb3 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.1-pyhd8ed1ab_0.conda#93cc832cb8e18caa52c7b36ea6ce7f3d diff --git a/env_installer/conda-win-64.lock b/env_installer/conda-win-64.lock new file mode 100644 index 00000000..5f7217d4 --- /dev/null +++ b/env_installer/conda-win-64.lock @@ -0,0 +1,193 @@ +# Generated by conda-lock. +# platform: win-64 +# input_hash: a759d6b36af04b6fc5326c48c49c8e00c28511936fcca5d95dbe663ea062ca21 +@EXPLICIT +https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2023.5.7-h56e8100_0.conda#604212634bd8c4d6f20d44b946e8eedb +https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2023.1.0-h57928b3_46319.conda#dbc4636f419722fbf3ab6501377228ba +https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2#b0309b72560df66f71a9d5e34a5efdfa +https://conda.anaconda.org/conda-forge/win-64/python_abi-3.8-3_cp38.conda#c6df946723dadd4a5830a8ff8c6b9a20 +https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2#72608f6cd3e5898229c3ea16deb1ac43 +https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2#1cee351bf20b830d991dbe0bc8cd7dfe +https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2#53a1c73e1e3d185516d7e3af177596d9 +https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2#774130a326dee16f1ceb05cc687ee4f0 +https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.34.31931-h5081d32_16.conda#22125178654c6a8a393f9743d585704b +https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2#4289d80fb4d272f1f3b56cfe87ac90bd +https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hb25d44b_16.conda#ea326b37e3bd6d2616988e09f3a9396c +https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.34.31931-hed1258a_16.conda#0374eae69b6dbfb27c3dc27167109eb4 +https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h8ffe710_4.tar.bz2#7c03c66026944073040cb19a4f3ec3c9 +https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2#1900cb3cab5055833cfddb0ba233b074 +https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.0.9-hcfcfb64_8.tar.bz2#e8078e37208cd7d3e1eb5053f370ded8 +https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.18-hcfcfb64_0.conda#493acc14c556ef6f1d13ba00b099c679 +https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2#2c96d1b6915b408893f9472569dee135 +https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-h8ffe710_0.tar.bz2#050119977a86e4856f0416e2edcf81bb +https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-2.1.5.1-hcfcfb64_0.conda#f2fad2ae9f1365e343e4329fdb1e9d63 +https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.18-h8d14728_1.tar.bz2#5c1fb45b5e2912c19098750ae8a32604 +https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.42.0-hcfcfb64_0.conda#9a71d93deb99cc09d8939d5235b5909a +https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.0-hcfcfb64_0.conda#381a3645c51cbf478872899b16490318 +https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_4.tar.bz2#0cc5c5cc64ee1637f37f8540a175854c +https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2#066552ac6b907ec6d72c0ddab29050dc +https://conda.anaconda.org/conda-forge/win-64/openssl-3.1.1-hcfcfb64_1.conda#1d913a5de46c6b2f7e4cfbd26b106b8b +https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2#e2da8758d7d51ff6aa78a14dfb9dbed4 +https://conda.anaconda.org/conda-forge/win-64/tk-8.6.12-h8ffe710_0.tar.bz2#c69a5047cc9291ae40afd4a1ad6f0c0f +https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2#515d77642eaa3639413c6b1bc3f94219 +https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2#adbfb9f45d1004a26763652246a33764 +https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.0.9-hcfcfb64_8.tar.bz2#99839d9d81f33afa173c0fa82a702038 +https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.0.9-hcfcfb64_8.tar.bz2#88e62627120c20289bf8982b15e0a6a1 +https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.39-h19919ed_0.conda#ab6febdb2dbd9c00803609079db4de71 +https://conda.anaconda.org/conda-forge/win-64/libxml2-2.11.4-hc3477c8_0.conda#586627982a63815637f871a6360fe3f9 +https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2#fe759119b8b3bfa720b8762c6fdc35de +https://conda.anaconda.org/conda-forge/win-64/python-3.8.16-h4de0772_1_cpython.conda#461d9fc92cfde68f2ca7ef0988f6326a +https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.4-h0e60522_1.tar.bz2#e1aff0583dda5fb917eb3d2c1025aa80 +https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.2-h12be248_6.conda#62826565682d013b3e2346aaf7bded0e +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 +https://conda.anaconda.org/conda-forge/noarch/boltons-23.0.0-pyhd8ed1ab_0.conda#033eb25fffd222aceeca6d58cd953680 +https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.0.9-hcfcfb64_8.tar.bz2#e18b70ed349d96086fd60a9c642b1b58 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb +https://conda.anaconda.org/conda-forge/win-64/debugpy-1.6.7-py38hd3f51b4_0.conda#de2533e0a4ad84a4e5c5d6ad196f8e14 +https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 +https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 +https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 +https://conda.anaconda.org/conda-forge/noarch/flit-core-3.9.0-pyhd8ed1ab_0.conda#e8cfceef004266b259604c3faa2a0191 +https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-h546665d_1.conda#1b513009cd012591f3fdc9e03a74ec0a +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/json5-0.9.5-pyh9f0ad1d_0.tar.bz2#10759827a94e6b14996e81fb002c0bda +https://conda.anaconda.org/conda-forge/noarch/jsonpointer-2.0-py_0.tar.bz2#07d85c22a3beb102a48cd123df84c2a6 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.7-pyhd8ed1ab_1.conda#0c0a54e16b764bafcae35913cc9d60ff +https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.4-py38hb1fd069_1.tar.bz2#1dcc50e3241f9e4e59713eec2653abd5 +https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.9.1-nocuda_h15da153_6.conda#95b1bd8df3033d08ae5125ed69d71194 +https://conda.anaconda.org/conda-forge/win-64/libtiff-4.5.0-h6c8260b_6.conda#12628df645fcf0f74922138858724831 +https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.3-py38h91455d4_0.conda#a674b0be89418013ffa8f92c89d08640 +https://conda.anaconda.org/conda-forge/win-64/menuinst-1.4.19-py38haa244fe_1.tar.bz2#b5bd8e4f1ab01d146e36dfb916b757eb +https://conda.anaconda.org/conda-forge/noarch/mistune-2.0.5-pyhd8ed1ab_0.conda#61a07195cfc935f1c1901d8ecf4af441 +https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.5.6-pyhd8ed1ab_0.tar.bz2#7b868f21adde0d9b8b38f9c16836589b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.3-pyhd8ed1ab_0.tar.bz2#17a565a0c3899244e938cdf417e7b094 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 +https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_0.tar.bz2#89e3c7cdde7d3aaa2aee933b604dd07f +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.17.0-pyhd8ed1ab_0.conda#95c5be3c7cbd872509d16c216617fdab +https://conda.anaconda.org/conda-forge/win-64/psutil-5.9.5-py38h91455d4_0.conda#091a6bc808bfd07c97be1eb316440070 +https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2#a1f820480193ea83582b13249a7e7bd9 +https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 +https://conda.anaconda.org/conda-forge/win-64/pycosat-0.6.4-py38h91455d4_1.tar.bz2#cba43cf2d481b2cb8eb0c927089bf857 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc +https://conda.anaconda.org/conda-forge/win-64/pyrsistent-0.19.3-py38h91455d4_0.conda#fb4aa6d774c3a286a8561af24ff87185 +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.17.1-pyhd8ed1ab_0.conda#dd4f393d857e9283eef2442234bd05e3 +https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda#a61bf9ec79426938ff785eb69dbb1960 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0.conda#2590495f608a63625e165915fb4e2e34 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/win-64/pywin32-304-py38hd3f51b4_2.tar.bz2#cfefffaad808b61f2932f64c079417b8 +https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.10-py38hd3f51b4_0.conda#cc93c5fe55b8a7bdd719ce74bfbe819c +https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0-py38h91455d4_5.tar.bz2#f62ab7e18711e3cbc068319448ecf771 +https://conda.anaconda.org/conda-forge/win-64/pyzmq-25.1.0-py38ha85f68a_0.conda#5e97b9e91fc8cb7ec32647d5bec74030 +https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2#912a71cc01012ee38e6b90ddd561e36f +https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.7-py38h91455d4_1.conda#ff7d3491a9f308bebc8031eabfb30d3e +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.0-pyhd8ed1ab_0.tar.bz2#dd6cbc539e74cb1f430efbd4575b9303 +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/win-64/tornado-6.3.2-py38h91455d4_0.conda#3e625e06e8892112acb47695eaf22b47 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda#d0b4f5c87cd35ac3fb3d47b223263a64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_0.tar.bz2#eb67e3cace64c66233e2d35949e20f92 +https://conda.anaconda.org/conda-forge/win-64/unicodedata2-15.0.0-py38h91455d4_0.tar.bz2#7a135e40d9f26c15419e5e82e1c436c0 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.5.3-pyhd8ed1ab_0.conda#9beb712a1de20fea4e339a2d62851564 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.7-pyhd8ed1ab_0.conda#bcc54b91a8ce88f60f538b87b409909e +https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2#30878ecc4bd36e8deeea1e3c151b2e0b +https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda#c46ba8712093cb0114404ae8a7582e1a +https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2#46878ebb6b9cbd8afcf8088d7ef00ece +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/anyio-3.7.0-pyhd8ed1ab_1.conda#2b35a85d654a47aac8f34c1bb6de7142 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.2.1-pyhd8ed1ab_0.conda#bf7f54dd0f25c3f06ecb82a07341841a +https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.2-pyhd8ed1ab_0.conda#41221f97a0c82e5a60b21716a3d7469c +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.4-pyhd8ed1ab_0.tar.bz2#c5b3edc62d6309088f4970b3eaaa65a6 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/noarch/bleach-6.0.0-pyhd8ed1ab_0.conda#d48b143d01385872a88ef8417e96c30e +https://conda.anaconda.org/conda-forge/win-64/brotli-1.0.9-hcfcfb64_8.tar.bz2#2e661f21e1741c11506bdc7226e6b0bc +https://conda.anaconda.org/conda-forge/win-64/cffi-1.15.1-py38h57701bc_3.conda#9b94af390cfdf924a063302a2ddb3860 +https://conda.anaconda.org/conda-forge/noarch/comm-0.1.3-pyhd8ed1ab_0.conda#168ae0f82cdf7505048e81054c7354e4 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/jedi-0.18.2-pyhd8ed1ab_0.conda#b5e695ef9c3f0d27d6cd96bf5adc9e07 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.32-pyhd8ed1ab_0.tar.bz2#09150b51b0528a31a0f6500b96fdde82 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 +https://conda.anaconda.org/conda-forge/win-64/lcms2-2.15-h3e3b177_1.conda#a76c36ad1b4b87f038d67890122d08ec +https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda#090d91b69396f14afef450c285f9758c +https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de +https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.0-ha2aaf27_2.conda#db0490689232e8e38c312281df6f31a2 +https://conda.anaconda.org/conda-forge/noarch/overrides-7.3.1-pyhd8ed1ab_0.tar.bz2#a5745ced46e69aa9754053ba061974ab +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2#56cd9fe388baac0e90c7149cfac95b60 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_0.tar.bz2#fed45fc5ea0813240707998abe49f520 +https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.17.31-py38h91455d4_0.conda#01dfac18b2088f4cdbee87c10de1546c +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.2-pyh08f2357_0.conda#c00d32dfa733d381b6a1908d0d67e0d7 +https://conda.anaconda.org/conda-forge/win-64/tbb-2021.9.0-h91493d7_0.conda#6aa3f1becefeaa00a4d2a79b2a478aee +https://conda.anaconda.org/conda-forge/noarch/terminado-0.17.0-pyh08f2357_0.tar.bz2#0152a609d5748ed9887d195b1e61a6c9 +https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.65.0-pyhd8ed1ab_1.conda#ed792aff3acb977d09c7013358097f83 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-21.2.0-py38h91455d4_3.tar.bz2#a262d1c7aaf5a93a02b33dd985c27831 +https://conda.anaconda.org/conda-forge/win-64/cryptography-41.0.1-py38h95f5157_0.conda#77308ee4bae00fcc666015dd2f4f0ede +https://conda.anaconda.org/conda-forge/win-64/fonttools-4.39.4-py38h91455d4_0.conda#9eb3fd3d1aed8bc15853dd978d9abcdb +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.17.3-pyhd8ed1ab_0.conda#723268a468177cd44568eb8f794e0d80 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.4.4-pyhd8ed1ab_1.conda#7c0965e1d4a0ee1529e8eaa03a78a5b3 +https://conda.anaconda.org/conda-forge/win-64/mkl-2022.1.0-h6a75c08_874.tar.bz2#2ff89a7337a9636029b4db9466e9f8e3 +https://conda.anaconda.org/conda-forge/win-64/pillow-9.5.0-py38ha7eb54a_1.conda#a7066629f65b5a301e76114e06a91096 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.3-pyhd8ed1ab_0.conda#c085a16ba3d0c9ee282c438308b57724 +https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_0.conda#ae465d0fbf9f1979cb2d8d4043d885e2 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.6-pyhd8ed1ab_0.conda#078979d33523cb477bd1916ce41aacc9 +https://conda.anaconda.org/conda-forge/win-64/zstandard-0.19.0-py38hea8d35e_1.conda#eec18ed3b35cc6a69fec1a46993b5ff2 +https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-21.3.0-pyhd8ed1ab_0.tar.bz2#a0b402db58f73aaab8ee0ca1025a362e +https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.8.0-pyhd8ed1ab_0.conda#ebe3230a4c1e135954eee4fb6ef8cded +https://conda.anaconda.org/conda-forge/win-64/jupyter_core-5.3.0-py38haa244fe_0.conda#ff05e328ef5915b4a8176844f5effddd +https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.6.3-pyhd8ed1ab_0.conda#d98c5196ab6ffeb0c2feca2912801353 +https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-17_win64_mkl.conda#9e42ac6b256b96bfaa19f829c25940e8 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.38-pyha770c72_0.conda#59ba1bf8ea558751a0d391249a248765 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.0.2-pyh38be061_0.conda#44800e9bd13143292097c65e57323038 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.2.0-pyhd8ed1ab_0.conda#58ca2d50c3b27b86fd7df62eaadbf9a9 +https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-17_win64_mkl.conda#768b2c3be666ecf9e62f939ea919f819 +https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-17_win64_mkl.conda#278121fe8f0d65d496998aa290f36322 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.0-pyhd8ed1ab_0.conda#f525a01528c3eba1d381a232a6971c6a +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.38-hd8ed1ab_0.conda#45b74f64d8808eda7e6f6e6b1d641fd2 +https://conda.anaconda.org/conda-forge/win-64/conda-23.5.0-py38haa244fe_1.conda#a1676e16bfef4356db1918a6dd30b0a0 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.12.2-pyh08f2357_0.conda#f289f9dc26526b8bd9f5845486f53a4d +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b +https://conda.anaconda.org/conda-forge/win-64/numpy-1.24.3-py38h1d91fd2_0.conda#2768aa0aa44da206dc5fc3d1ba6ad857 +https://conda.anaconda.org/conda-forge/win-64/contourpy-1.0.7-py38hb1fd069_0.conda#6b53200dddcec578cdd90cac146eeadd +https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.23.1-pyh025b116_0.conda#d18e38ce1f195efa2d76f9dc33832bf5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.4.0-pyhd8ed1ab_0.conda#4456e6030a8309bdad57569b0170b6a3 +https://conda.anaconda.org/conda-forge/win-64/pandas-2.0.2-py38hf08cf0d_0.conda#70bfeaca72c1a47f44db5c8d50e513b3 +https://conda.anaconda.org/conda-forge/win-64/scipy-1.10.1-py38h1aea9ed_3.conda#1ed766b46170f86ead2ae6b9b8151191 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.0.6-pyhd8ed1ab_0.conda#68627a08556e4a273e4c7bfc84251457 +https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.6.0-pyhd8ed1ab_0.conda#39fd52b0fcb2fb52bac47a1419bf09bd +https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.7.1-py38h528a6c7_0.conda#0aebccad15d74ec7f1bc3d62497ad1a8 +https://conda.anaconda.org/conda-forge/noarch/ipympl-0.9.3-pyhd8ed1ab_0.conda#da113e1ecd782afd5ed2f7b5187aaea8 +https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.2.0-pyhd8ed1ab_0.conda#38589f4104d11f2a59ff01a9f4e3bfb3 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.22.1-pyhd8ed1ab_0.conda#fc7172a6742a7c3c4331ddd7ed463ffc +https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.3-pyhd8ed1ab_0.conda#67e0fe74c156267d9159e9133df7fd37 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.1-pyhd8ed1ab_0.conda#93cc832cb8e18caa52c7b36ea6ce7f3d diff --git a/env_installer/construct.yaml b/env_installer/construct.yaml deleted file mode 100644 index 47331445..00000000 --- a/env_installer/construct.yaml +++ /dev/null @@ -1,37 +0,0 @@ -name: JupyterLabDesktopAppServer -version: 4.0.1-1 -company: "Project Jupyter" - -welcome_image_text: "JupyterLab" -header_image_text: "JupyterLab" - -# see https://github.com/conda-forge/miniforge/blob/master/Miniforge3/construct.yaml -channels: - # specifying the channel with the full URL adds two channels - # when the end user adds the channel without the full URL - # - https://conda.anaconda.org/conda-forge - - conda-forge - -write_condarc: True -# keep pkgs for space-saving implications for hardlinks when create new environments -# and keep the same with Miniconda -keep_pkgs: True -license_file: ../LICENSE - -specs: - - conda - - ipywidgets >= 8.0.1 - - jupyterlab 4.0.1 - - ipympl >= 0.8.2 - - matplotlib-base - - numpy - - pandas - - pip - - python 3.8* - - scipy - -default_prefix: "%APPDATA%\\jupyterlab-desktop\\jlab_server" -default_prefix_all_users: "%APPDATA%\\jupyterlab-desktop\\jlab_server" -check_path_length: False - -register_python_default: False diff --git a/env_installer/jlab_server.yaml b/env_installer/jlab_server.yaml new file mode 100644 index 00000000..7a14a548 --- /dev/null +++ b/env_installer/jlab_server.yaml @@ -0,0 +1,18 @@ +name: jlab_server +channels: + - conda-forge +dependencies: + - conda + - ipywidgets >= 8.0.1 + - jupyterlab 4.0.1 + - ipympl >= 0.8.2 + - matplotlib-base + - numpy + - pandas + - pip + - python 3.8* + - scipy +platforms: + - linux-64 + - osx-64 + - win-64 diff --git a/env_installer/sign-osx-64.txt b/env_installer/sign-osx-64.txt new file mode 100644 index 00000000..d216efc7 --- /dev/null +++ b/env_installer/sign-osx-64.txt @@ -0,0 +1,447 @@ +bin/bzip2recover +bin/lzmainfo +bin/tabs +bin/toe +bin/tificc +bin/xzdec +bin/tiffsplit +bin/fax2tiff +bin/linkicc +bin/opj_compress +bin/opj_dump +bin/wish8.6 +bin/png-fix-itxt +bin/opj_decompress +bin/tiffdump +bin/bunzip2 +bin/tiff2bw +bin/libdeflate-gzip +bin/cjpeg +bin/jpegtran +bin/pngfix +bin/tiffcmp +bin/brotli +bin/tset +bin/tiff2pdf +bin/bzcat +bin/tclsh8.6 +bin/python3.8 +bin/djpeg +bin/tiffcrop +bin/xz +bin/tiffdither +bin/clear +bin/tiffset +bin/tic +bin/libdeflate-gunzip +bin/tiff2ps +bin/tiffinfo +bin/infocmp +bin/pal2rgb +bin/zstd +bin/transicc +bin/wrjpgcom +bin/psicc +bin/jpgicc +bin/tjbench +bin/lzmadec +bin/fax2ps +bin/tiffcp +bin/tput +bin/openssl +bin/tiffmedian +bin/curve_keygen +bin/rdjpgcom +bin/bzip2 +bin/raw2tiff +bin/ppm2tiff +bin/tiff2rgba +lib/libsqlite3.0.dylib +lib/libreadline.8.2.dylib +lib/libxcb.1.dylib +lib/libffi.8.dylib +lib/libncurses.6.dylib +lib/libxcb-dpms.0.dylib +lib/libtcl8.6.dylib +lib/libxcb-shm.0.dylib +lib/libz.1.2.13.dylib +lib/libxcb-sync.1.dylib +lib/libxcb-screensaver.0.dylib +lib/libform.6.dylib +lib/liblcms2.2.dylib +lib/libpng16.16.dylib +lib/libc++.1.0.dylib +lib/libxcb-res.0.dylib +lib/libssl.3.dylib +lib/libomp.dylib +lib/libpanelw.6.dylib +lib/libxcb-randr.0.dylib +lib/libfreetype.6.dylib +lib/libxcb-record.0.dylib +lib/libcrypto.3.dylib +lib/libbrotlienc.1.0.9.dylib +lib/libtinfow.6.dylib +lib/libXau.6.0.0.dylib +lib/libtiffxx.6.dylib +lib/libxcb-damage.0.dylib +lib/libxcb-xkb.1.dylib +lib/libxcb-xfixes.0.dylib +lib/libsodium.23.dylib +lib/libpanel.6.dylib +lib/libsharpyuv.0.dylib +lib/libxcb-glx.0.dylib +lib/libbz2.1.0.8.dylib +lib/libxcb-xvmc.0.dylib +lib/libgfortran.5.dylib +lib/libxcb-shape.0.dylib +lib/libxcb-render.0.dylib +lib/libdeflate.0.dylib +lib/libxcb-dri2.0.dylib +lib/libwebp.7.dylib +lib/libzstd.1.5.2.dylib +lib/libXdmcp.6.dylib +lib/libopenblasp-r0.3.23.dylib +lib/libmenuw.6.dylib +lib/libturbojpeg.0.2.0.dylib +lib/libwebpmux.3.dylib +lib/libncursesw.6.dylib +lib/libopenjp2.2.5.0.dylib +lib/libwebpdemux.2.dylib +lib/libxcb-dri3.0.dylib +lib/libLerc.4.dylib +lib/liblzma.5.dylib +lib/libxcb-composite.0.dylib +lib/libtk8.6.dylib +lib/libtinfo.6.dylib +lib/libxcb-xtest.0.dylib +lib/libbrotlidec.1.0.9.dylib +lib/libxcb-xinput.0.dylib +lib/libzmq.5.dylib +lib/libxcb-xf86dri.0.dylib +lib/libbrotlicommon.1.0.9.dylib +lib/libquadmath.0.dylib +lib/libmenu.6.dylib +lib/libgcc_s.1.1.dylib +lib/libxcb-present.0.dylib +lib/libxcb-xinerama.0.dylib +lib/libgcc_s.1.dylib +lib/libyaml-0.2.dylib +lib/libformw.6.dylib +lib/libtiff.6.dylib +lib/libwebpdecoder.3.dylib +lib/libpython3.8.dylib +lib/libjpeg.8.2.2.dylib +lib/libhistory.8.2.dylib +lib/libxcb-xv.0.dylib +lib/thread2.8.7/libthread2.8.7.dylib +lib/tdbc1.1.3/libtdbc1.1.3.dylib +lib/tdbcpostgres1.1.3/libtdbcpostgres1.1.3.dylib +lib/python3.8/lib-dynload/_lzma.cpython-38-darwin.so +lib/python3.8/lib-dynload/fcntl.cpython-38-darwin.so +lib/python3.8/lib-dynload/audioop.cpython-38-darwin.so +lib/python3.8/lib-dynload/readline.cpython-38-darwin.so +lib/python3.8/lib-dynload/_hashlib.cpython-38-darwin.so +lib/python3.8/lib-dynload/_blake2.cpython-38-darwin.so +lib/python3.8/lib-dynload/_xxtestfuzz.cpython-38-darwin.so +lib/python3.8/lib-dynload/_testimportmultiple.cpython-38-darwin.so +lib/python3.8/lib-dynload/_posixshmem.cpython-38-darwin.so +lib/python3.8/lib-dynload/xxlimited.cpython-38-darwin.so +lib/python3.8/lib-dynload/resource.cpython-38-darwin.so +lib/python3.8/lib-dynload/_decimal.cpython-38-darwin.so +lib/python3.8/lib-dynload/zlib.cpython-38-darwin.so +lib/python3.8/lib-dynload/termios.cpython-38-darwin.so +lib/python3.8/lib-dynload/_sha1.cpython-38-darwin.so +lib/python3.8/lib-dynload/_codecs_cn.cpython-38-darwin.so +lib/python3.8/lib-dynload/binascii.cpython-38-darwin.so +lib/python3.8/lib-dynload/_uuid.cpython-38-darwin.so +lib/python3.8/lib-dynload/_md5.cpython-38-darwin.so +lib/python3.8/lib-dynload/_sqlite3.cpython-38-darwin.so +lib/python3.8/lib-dynload/pyexpat.cpython-38-darwin.so +lib/python3.8/lib-dynload/_bz2.cpython-38-darwin.so +lib/python3.8/lib-dynload/grp.cpython-38-darwin.so +lib/python3.8/lib-dynload/mmap.cpython-38-darwin.so +lib/python3.8/lib-dynload/parser.cpython-38-darwin.so +lib/python3.8/lib-dynload/_pickle.cpython-38-darwin.so +lib/python3.8/lib-dynload/_xxsubinterpreters.cpython-38-darwin.so +lib/python3.8/lib-dynload/array.cpython-38-darwin.so +lib/python3.8/lib-dynload/_ssl.cpython-38-darwin.so +lib/python3.8/lib-dynload/_crypt.cpython-38-darwin.so +lib/python3.8/lib-dynload/_posixsubprocess.cpython-38-darwin.so +lib/python3.8/lib-dynload/_ctypes_test.cpython-38-darwin.so +lib/python3.8/lib-dynload/_lsprof.cpython-38-darwin.so +lib/python3.8/lib-dynload/unicodedata.cpython-38-darwin.so +lib/python3.8/lib-dynload/_testmultiphase.cpython-38-darwin.so +lib/python3.8/lib-dynload/_csv.cpython-38-darwin.so +lib/python3.8/lib-dynload/_testbuffer.cpython-38-darwin.so +lib/python3.8/lib-dynload/_opcode.cpython-38-darwin.so +lib/python3.8/lib-dynload/_sha256.cpython-38-darwin.so +lib/python3.8/lib-dynload/_multiprocessing.cpython-38-darwin.so +lib/python3.8/lib-dynload/_sha3.cpython-38-darwin.so +lib/python3.8/lib-dynload/_sha512.cpython-38-darwin.so +lib/python3.8/lib-dynload/_tkinter.cpython-38-darwin.so +lib/python3.8/lib-dynload/math.cpython-38-darwin.so +lib/python3.8/lib-dynload/_curses.cpython-38-darwin.so +lib/python3.8/lib-dynload/_testcapi.cpython-38-darwin.so +lib/python3.8/lib-dynload/nis.cpython-38-darwin.so +lib/python3.8/lib-dynload/select.cpython-38-darwin.so +lib/python3.8/lib-dynload/_codecs_tw.cpython-38-darwin.so +lib/python3.8/lib-dynload/_dbm.cpython-38-darwin.so +lib/python3.8/lib-dynload/_random.cpython-38-darwin.so +lib/python3.8/lib-dynload/_socket.cpython-38-darwin.so +lib/python3.8/lib-dynload/syslog.cpython-38-darwin.so +lib/python3.8/lib-dynload/_datetime.cpython-38-darwin.so +lib/python3.8/lib-dynload/_asyncio.cpython-38-darwin.so +lib/python3.8/lib-dynload/_codecs_kr.cpython-38-darwin.so +lib/python3.8/lib-dynload/_bisect.cpython-38-darwin.so +lib/python3.8/lib-dynload/_scproxy.cpython-38-darwin.so +lib/python3.8/lib-dynload/_testinternalcapi.cpython-38-darwin.so +lib/python3.8/lib-dynload/_queue.cpython-38-darwin.so +lib/python3.8/lib-dynload/_curses_panel.cpython-38-darwin.so +lib/python3.8/lib-dynload/_elementtree.cpython-38-darwin.so +lib/python3.8/lib-dynload/cmath.cpython-38-darwin.so +lib/python3.8/lib-dynload/_codecs_iso2022.cpython-38-darwin.so +lib/python3.8/lib-dynload/_contextvars.cpython-38-darwin.so +lib/python3.8/lib-dynload/_statistics.cpython-38-darwin.so +lib/python3.8/lib-dynload/_codecs_hk.cpython-38-darwin.so +lib/python3.8/lib-dynload/_multibytecodec.cpython-38-darwin.so +lib/python3.8/lib-dynload/_json.cpython-38-darwin.so +lib/python3.8/lib-dynload/_ctypes.cpython-38-darwin.so +lib/python3.8/lib-dynload/_struct.cpython-38-darwin.so +lib/python3.8/lib-dynload/_heapq.cpython-38-darwin.so +lib/python3.8/lib-dynload/_codecs_jp.cpython-38-darwin.so +lib/python3.8/site-packages/pycosat.cpython-38-darwin.so +lib/python3.8/site-packages/unicodedata2.cpython-38-darwin.so +lib/python3.8/site-packages/_cffi_backend.cpython-38-darwin.so +lib/python3.8/site-packages/_ruamel_yaml.cpython-38-darwin.so +lib/python3.8/site-packages/pvectorc.cpython-38-darwin.so +lib/python3.8/site-packages/markupsafe/_speedups.cpython-38-darwin.so +lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_cython.cpython-38-darwin.so +lib/python3.8/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_x86_64.dylib +lib/python3.8/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/pydevd_frame_evaluator.cpython-38-darwin.so +lib/python3.8/site-packages/cryptography/hazmat/bindings/_rust.abi3.so +lib/python3.8/site-packages/fontTools/qu2cu/qu2cu.cpython-38-darwin.so +lib/python3.8/site-packages/fontTools/misc/bezierTools.cpython-38-darwin.so +lib/python3.8/site-packages/fontTools/cu2qu/cu2qu.cpython-38-darwin.so +lib/python3.8/site-packages/fontTools/varLib/iup.cpython-38-darwin.so +lib/python3.8/site-packages/fontTools/pens/momentsPen.cpython-38-darwin.so +lib/python3.8/site-packages/fontTools/feaLib/lexer.cpython-38-darwin.so +lib/python3.8/site-packages/_argon2_cffi_bindings/_ffi.abi3.so +lib/python3.8/site-packages/Foundation/_inlines.cpython-38-darwin.so +lib/python3.8/site-packages/Foundation/_Foundation.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/core/_simd.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/core/_operand_flag_tests.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/core/_multiarray_umath.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/core/_multiarray_tests.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/core/_rational_tests.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/core/_umath_tests.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/core/_struct_ufunc_tests.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/linalg/_umath_linalg.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/linalg/lapack_lite.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/fft/_pocketfft_internal.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/random/mtrand.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/random/_generator.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/random/_pcg64.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/random/_sfc64.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/random/bit_generator.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/random/_common.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/random/_mt19937.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/random/_philox.cpython-38-darwin.so +lib/python3.8/site-packages/numpy/random/_bounded_integers.cpython-38-darwin.so +lib/python3.8/site-packages/PIL/_imagingft.cpython-38-darwin.so +lib/python3.8/site-packages/PIL/_imagingcms.cpython-38-darwin.so +lib/python3.8/site-packages/PIL/_webp.cpython-38-darwin.so +lib/python3.8/site-packages/PIL/_imaging.cpython-38-darwin.so +lib/python3.8/site-packages/PIL/_imagingmath.cpython-38-darwin.so +lib/python3.8/site-packages/PIL/_imagingtk.cpython-38-darwin.so +lib/python3.8/site-packages/PIL/_imagingmorph.cpython-38-darwin.so +lib/python3.8/site-packages/tornado/speedups.abi3.so +lib/python3.8/site-packages/contourpy/_contourpy.cpython-38-darwin.so +lib/python3.8/site-packages/kiwisolver/_cext.cpython-38-darwin.so +lib/python3.8/site-packages/AppKit/_AppKit.cpython-38-darwin.so +lib/python3.8/site-packages/AppKit/_inlines.cpython-38-darwin.so +lib/python3.8/site-packages/matplotlib/_ttconv.cpython-38-darwin.so +lib/python3.8/site-packages/matplotlib/_image.cpython-38-darwin.so +lib/python3.8/site-packages/matplotlib/_path.cpython-38-darwin.so +lib/python3.8/site-packages/matplotlib/ft2font.cpython-38-darwin.so +lib/python3.8/site-packages/matplotlib/_qhull.cpython-38-darwin.so +lib/python3.8/site-packages/matplotlib/_c_internal_utils.cpython-38-darwin.so +lib/python3.8/site-packages/matplotlib/_tri.cpython-38-darwin.so +lib/python3.8/site-packages/matplotlib/backends/_macosx.cpython-38-darwin.so +lib/python3.8/site-packages/matplotlib/backends/_backend_agg.cpython-38-darwin.so +lib/python3.8/site-packages/matplotlib/backends/_tkagg.cpython-38-darwin.so +lib/python3.8/site-packages/yaml/_yaml.cpython-38-darwin.so +lib/python3.8/site-packages/objc/_machsignals.cpython-38-darwin.so +lib/python3.8/site-packages/objc/_objc.cpython-38-darwin.so +lib/python3.8/site-packages/psutil/_psutil_posix.abi3.so +lib/python3.8/site-packages/psutil/_psutil_osx.abi3.so +lib/python3.8/site-packages/zstandard/backend_c.cpython-38-darwin.so +lib/python3.8/site-packages/zstandard/_cffi.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/odr/__odrpack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/cluster/_optimal_leaf_ordering.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/cluster/_vq.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/cluster/_hierarchy.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/ndimage/_ni_label.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/ndimage/_nd_image.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/cython_lapack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/_solve_toeplitz.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/_cythonized_array_utils.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/cython_blas.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/_flapack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/_flinalg.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/_decomp_update.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/_matfuncs_expm.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/_interpolative.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/_fblas.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/linalg/_matfuncs_sqrtm_triu.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/__nnls.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_moduleTNC.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_lsap.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_zeros.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_group_columns.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_minpack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_cobyla.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_slsqp.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_direct.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_lbfgsb.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_minpack2.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_bglu_dense.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_trlib/_trlib.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_highs/_highs_constants.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_highs/_highs_wrapper.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/_lsq/givens_elimination.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/optimize/cython_optimize/_zeros.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/integrate/_lsoda.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/integrate/_vode.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/integrate/_quadpack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/integrate/_odepack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/integrate/_dop.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/io/matlab/_streams.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/io/matlab/_mio5_utils.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/io/matlab/_mio_utils.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/_lib/_ccallback_c.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/_lib/_fpumode.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/_lib/messagestream.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/_lib/_uarray/_uarray.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/special/cython_special.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/special/_comb.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/special/_ellip_harm_2.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/special/_specfun.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/special/_ufuncs.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/special/_ufuncs_cxx.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/fftpack/convolve.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/interpolate/_rbfinterp_pythran.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/interpolate/_fitpack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/interpolate/_rgi_cython.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/interpolate/_bspl.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/interpolate/interpnd.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/interpolate/_ppoly.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/interpolate/dfitpack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/fft/_pocketfft/pypocketfft.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/_sparsetools.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/_csparsetools.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/linalg/_propack/_zpropack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/linalg/_propack/_cpropack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/linalg/_propack/_dpropack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/linalg/_propack/_spropack.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/linalg/_isolve/_iterative.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/linalg/_dsolve/_superlu.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/csgraph/_tools.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/csgraph/_matching.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/csgraph/_reordering.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/csgraph/_min_spanning_tree.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/csgraph/_traversal.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/csgraph/_flow.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/sparse/csgraph/_shortest_path.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/spatial/_hausdorff.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/spatial/_voronoi.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/spatial/_ckdtree.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/spatial/_distance_pybind.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/spatial/_distance_wrap.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/spatial/_qhull.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/spatial/transform/_rotation.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/signal/_peak_finding_utils.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/signal/_spectral.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/signal/_sosfilt.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/signal/_max_len_seq_inner.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/signal/_sigtools.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/signal/_upfirdn_apply.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/signal/_spline.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_stats_pythran.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_qmc_cy.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_sobol.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_stats.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_mvn.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_biasedurn.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_statlib.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_levy_stable/levyst.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_boost/nbinom_ufunc.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_boost/invgauss_ufunc.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_boost/hypergeom_ufunc.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_boost/binom_ufunc.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_boost/ncf_ufunc.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_boost/nct_ufunc.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_boost/skewnorm_ufunc.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_boost/ncx2_ufunc.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_boost/beta_ufunc.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_rcont/rcont.cpython-38-darwin.so +lib/python3.8/site-packages/scipy/stats/_unuran/unuran_wrapper.cpython-38-darwin.so +lib/python3.8/site-packages/zmq/backend/cython/_poll.cpython-38-darwin.so +lib/python3.8/site-packages/zmq/backend/cython/socket.cpython-38-darwin.so +lib/python3.8/site-packages/zmq/backend/cython/error.cpython-38-darwin.so +lib/python3.8/site-packages/zmq/backend/cython/message.cpython-38-darwin.so +lib/python3.8/site-packages/zmq/backend/cython/_version.cpython-38-darwin.so +lib/python3.8/site-packages/zmq/backend/cython/_proxy_steerable.cpython-38-darwin.so +lib/python3.8/site-packages/zmq/backend/cython/utils.cpython-38-darwin.so +lib/python3.8/site-packages/zmq/backend/cython/context.cpython-38-darwin.so +lib/python3.8/site-packages/zmq/backend/cython/_device.cpython-38-darwin.so +lib/python3.8/site-packages/zmq/devices/monitoredqueue.cpython-38-darwin.so +lib/python3.8/site-packages/CoreFoundation/_inlines.cpython-38-darwin.so +lib/python3.8/site-packages/CoreFoundation/_CoreFoundation.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/io/sas/_byteswap.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/io/sas/_sas.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/parsers.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/sparse.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/reduction.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslib.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/properties.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/internals.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/reshape.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/index.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/join.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/interval.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/missing.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/testing.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/ops.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/indexing.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/hashing.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/lib.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/algos.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/hashtable.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/json.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/arrays.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/groupby.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/writers.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/ops_dispatch.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/window/indexers.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/window/aggregations.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/nattype.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/vectorized.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/dtypes.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/period.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/ccalendar.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/timedeltas.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/conversion.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/strptime.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/np_datetime.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/tzconversion.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/base.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/timestamps.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/timezones.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/offsets.cpython-38-darwin.so +lib/python3.8/site-packages/pandas/_libs/tslibs/fields.cpython-38-darwin.so +lib/sqlite3.36.0/libsqlite3.36.0.dylib +lib/tdbcmysql1.1.3/libtdbcmysql1.1.3.dylib +lib/itcl4.2.2/libitcl4.2.2.dylib +lib/tdbcodbc1.1.3/libtdbcodbc1.1.3.dylib diff --git a/package.json b/package.json index b36d2699..84477965 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jupyterlab-desktop", - "version": "4.0.1-1", + "version": "4.0.1-2", "description": "JupyterLab Desktop", "main": "./build/out/main/main.js", "scripts": { @@ -22,11 +22,14 @@ "dist:linux": "yarn build && electron-builder --linux --publish never", "dist:mac": "yarn build && electron-builder --macos --publish never", "dist:win": "yarn build && electron-builder --win --publish never", - "dockerdist:linux": "docker run --rm -ti -v ${PWD}:/project -v ${PWD##*/}-node-modules:/project/node_modules -v ~/.electron:/root/.electron electronuserland/builder:wine /bin/bash -c \"yarn && yarn dist:linux\"", - "dockerdist:win": "docker run --rm -ti -v ${PWD}:/project -v ${PWD##*/}-node-modules:/project/node_modules -v ~/.electron:/root/.electron electronuserland/builder:wine /bin/bash -c \"yarn && yarn dist:win\"", - "create_env_installer:linux": "rimraf ./env_installer/JupyterLab*.sh && constructor ./env_installer --platform=linux-64 --output-dir ./env_installer", - "create_env_installer:mac": "rimraf ./env_installer/JupyterLab*.sh && constructor ./env_installer --platform=osx-64 --output-dir ./env_installer", - "create_env_installer:win": "rimraf ./env_installer/JupyterLab*.exe && constructor ./env_installer --platform=win-64 --output-dir ./env_installer", + "update_workflow_conda_lock": "cd workflow_env && rimraf *.lock && conda-lock --kind explicit -f publish_env.yaml && cd -", + "update_conda_lock": "cd env_installer && rimraf *.lock && conda-lock --kind explicit -f jlab_server.yaml && cd -", + "clean_env_installer": "rimraf ./env_installer/jlab_server.tar.gz && conda env remove -p ./env_installer/jlab_server -y", + "create_env_installer:linux": "yarn clean_env_installer && conda-lock install --prefix ./env_installer/jlab_server ./env_installer/conda-linux-64.lock && conda pack -p ./env_installer/jlab_server -o ./env_installer/jlab_server.tar.gz", + "create_env_installer:mac": "yarn clean_env_installer && conda-lock install --prefix ./env_installer/jlab_server ./env_installer/conda-osx-64.lock && conda pack -p ./env_installer/jlab_server -o ./env_installer/jlab_server.tar.gz", + "create_env_installer:win": "yarn clean_env_installer && conda-lock install --prefix ./env_installer/jlab_server ./env_installer/conda-win-64.lock && conda pack -p ./env_installer/jlab_server -o ./env_installer/jlab_server.tar.gz", + "extract_env_installer:mac": "cd ./env_installer && rimraf jlab_server_extracted && mkdir jlab_server_extracted && tar -xzf jlab_server.tar.gz -C jlab_server_extracted && cd -", + "compress_env_installer:mac": "rimraf ./env_installer/jlab_server.tar.gz && cd ./env_installer/jlab_server_extracted && tar -czf ../jlab_server.tar.gz . && cd -", "check_version_match": "node scripts/buildutil.js --check-version-match", "eslint": "eslint --ext .js,.jsx,.ts,.tsx --cache --fix .", "eslint:check": "eslint --ext .js,.jsx,.ts,.tsx --cache .", @@ -51,11 +54,12 @@ }, "files": [ "!**/*.d.ts", - "!env_installer/JupyterLab*.*" + "!env_installer", + "!workflow_env" ], "extraResources": [ - "env_installer/JupyterLabDesktopAppServer-*[.sh,.exe]", - "build/schemas" + "env_installer/jlab_server.tar.gz", + "env_installer/sign*.txt" ], "afterSign": "scripts/notarize.js", "linux": { @@ -135,7 +139,8 @@ "from": "dist-resources/darwin/jlab.sh", "to": "app/jlab" } - ] + ], + "signIgnore": "env_installer/jlab_server.tar.gz" }, "dmg": { "sign": false @@ -161,6 +166,7 @@ "@types/react": "~17.0.2", "@types/react-dom": "^17.0.1", "@types/semver": "^7.3.4", + "@types/tar": "^6.1.5", "@types/yargs": "^17.0.18", "@typescript-eslint/eslint-plugin": "~5.28.0", "@typescript-eslint/parser": "~5.28.0", @@ -202,6 +208,7 @@ "js-yaml": "^4.1.0", "node-fetch": "^2.6.7", "semver": "^7.5.0", + "tar": "^6.1.15", "update-electron-app": "^2.0.1", "which": "^2.0.2", "winreg": "^1.2.4", diff --git a/scripts/buildutil.js b/scripts/buildutil.js index 813e1ef9..ca41f94b 100644 --- a/scripts/buildutil.js +++ b/scripts/buildutil.js @@ -44,24 +44,15 @@ if (cli.flags.checkVersionMatch) { const appVersion = pkgjsonFileData['version']; console.log(`JupyterLab Desktop version: ${appVersion}`); - // check JupyterLab version bundled to Application Server - const constructorData = yaml.load( + // check JupyterLab version bundled + const bundledEnvData = yaml.load( fs.readFileSync( - path.resolve(__dirname, '../env_installer/construct.yaml'), + path.resolve(__dirname, '../env_installer/jlab_server.yaml'), 'utf8' ) ); - const appServerVersion = constructorData['version']; - console.log(`Application Server version: ${appServerVersion}`); - if (appServerVersion !== appVersion) { - console.error( - `Application Server version ${appServerVersion} doesn't match Application version ${appVersion}` - ); - process.exit(1); - } - - const jlabCondaPkg = constructorData['specs'].find(pkg => + const jlabCondaPkg = bundledEnvData['dependencies'].find(pkg => pkg.startsWith('jupyterlab') ); if (!jlabCondaPkg) { diff --git a/scripts/notarize.js b/scripts/notarize.js index 43f439f7..3bfda228 100644 --- a/scripts/notarize.js +++ b/scripts/notarize.js @@ -2,11 +2,16 @@ const { notarize } = require('electron-notarize'); +function isDevMode() { + return require.main.filename.indexOf('app.asar') === -1; +} + exports.default = async function notarizing(context) { const { electronPlatformName, appOutDir } = context; if ( electronPlatformName !== 'darwin' || - process.env.CSC_IDENTITY_AUTO_DISCOVERY === 'false' + process.env.CSC_IDENTITY_AUTO_DISCOVERY === 'false' || + isDevMode() ) { return; } diff --git a/src/main/app.ts b/src/main/app.ts index 6382af21..f78a90ab 100644 --- a/src/main/app.ts +++ b/src/main/app.ts @@ -17,13 +17,12 @@ import * as semver from 'semver'; import * as fs from 'fs'; import { clearSession, - getAppDir, getBundledPythonEnvPath, getBundledPythonPath, + installBundledEnvironment, isDarkTheme, waitForDuration } from './utils'; -import { execFile } from 'child_process'; import { IServerFactory, JupyterServerFactory } from './server'; import { connectAndGetServerInfo, IJupyterServerInfo } from './connect'; import { UpdateDialog } from './updatedialog/updatedialog'; @@ -667,80 +666,40 @@ export class JupyterApplication implements IApplication, IDisposable { this._evm.registerEventHandler( EventTypeMain.InstallBundledPythonEnv, async event => { - event.sender.send( - EventTypeRenderer.InstallBundledPythonEnvStatus, - 'STARTED' - ); - const platform = process.platform; - const isWin = platform === 'win32'; - const appDir = getAppDir(); - const appVersion = app.getVersion(); - const installerPath = isWin - ? `${appDir}\\env_installer\\JupyterLabDesktopAppServer-${appVersion}-Windows-x86_64.exe` - : platform === 'darwin' - ? `${appDir}/env_installer/JupyterLabDesktopAppServer-${appVersion}-MacOSX-x86_64.sh` - : `${appDir}/env_installer/JupyterLabDesktopAppServer-${appVersion}-Linux-x86_64.sh`; const installPath = getBundledPythonEnvPath(); - - if (fs.existsSync(installPath)) { - const choice = dialog.showMessageBoxSync({ - type: 'warning', - message: 'Do you want to overwrite?', - detail: `Install path (${installPath}) is not empty. Would you like to overwrite it?`, - buttons: ['Overwrite', 'Cancel'], - defaultId: 1, - cancelId: 1 - }); - - if (choice === 0) { - // allow dialog to close - await waitForDuration(200); - fs.rmdirSync(installPath, { recursive: true }); - } else { - event.sender.send( - EventTypeRenderer.InstallBundledPythonEnvStatus, - 'CANCELLED' - ); - return; - } - } - - const installerProc = execFile( - installerPath, - ['-b', '-p', installPath], - { - shell: isWin ? 'cmd.exe' : '/bin/bash', - env: { - ...process.env - } - } - ); - - installerProc.on('exit', (exitCode: number) => { - if (exitCode === 0) { - event.sender.send( - EventTypeRenderer.InstallBundledPythonEnvStatus, - 'SUCCESS' - ); - } else { - const message = `Installer Exit: ${exitCode}`; + await installBundledEnvironment(installPath, { + onInstallStatus: (status, message) => { event.sender.send( EventTypeRenderer.InstallBundledPythonEnvStatus, - 'FAILURE', + status, message ); - log.error(new Error(message)); + }, + get forceOverwrite() { + return false; + }, + confirmOverwrite: () => { + return new Promise(resolve => { + const choice = dialog.showMessageBoxSync({ + type: 'warning', + message: 'Do you want to overwrite?', + detail: `Install path (${installPath}) is not empty. Would you like to overwrite it?`, + buttons: ['Overwrite', 'Cancel'], + defaultId: 1, + cancelId: 1 + }); + + // allow dialog to close + if (choice === 0) { + waitForDuration(200).then(() => { + resolve(true); + }); + } else { + resolve(false); + } + }); } }); - - installerProc.on('error', (err: Error) => { - event.sender.send( - EventTypeRenderer.InstallBundledPythonEnvStatus, - 'FAILURE', - err.message - ); - log.error(err); - }); } ); diff --git a/src/main/cli.ts b/src/main/cli.ts new file mode 100644 index 00000000..b0728e99 --- /dev/null +++ b/src/main/cli.ts @@ -0,0 +1,472 @@ +import { execFileSync, spawn } from 'child_process'; +import { + createCommandScriptInEnv, + createTempFile, + EnvironmentInstallStatus, + envPathForPythonPath, + getBundledPythonEnvPath, + getBundledPythonPath, + installBundledEnvironment, + isBaseCondaEnv, + markEnvironmentAsJupyterInstalled, + pythonPathForEnvPath +} from './utils'; +import yargs from 'yargs/yargs'; +import * as fs from 'fs'; +import * as path from 'path'; +import { appData } from './config/appdata'; +import { IEnvironmentType, IPythonEnvironment } from './tokens'; +import { SettingType, userSettings } from './config/settings'; +import { Registry } from './registry'; + +export function parseCLIArgs(argv: string[]) { + return yargs(argv) + .scriptName('jlab') + .usage('jlab [options] folder/file paths') + .example('jlab', 'Launch in default working directory') + .example('jlab .', 'Launch in current directory') + .example( + 'jlab /data/nb/test.ipynb', + 'Launch in /data/nb and open test.ipynb' + ) + .example('jlab /data/nb', 'Launch in /data/nb') + .example( + 'jlab --working-dir /data/nb test.ipynb sub/test2.ipynb', + 'Launch in /data/nb and open /data/nb/test.ipynb and /data/nb/sub/test2.ipynb' + ) + .example( + 'jlab env install', + 'Install bundled Python environment to the default path' + ) + .example( + 'jlab env install --path /opt/jlab_server', + 'Install bundled Python environment to /opt/jlab_server' + ) + .example( + 'jlab env create --path /opt/jlab_server', + 'Create new Python environment at /opt/jlab_server' + ) + .example( + 'jlab env activate', + 'Activate bundled Python environment at the default path' + ) + .option('python-path', { + describe: 'Python path', + type: 'string' + }) + .option('working-dir', { + describe: 'Working directory', + type: 'string' + }) + .option('log-level', { + describe: 'Log level', + choices: ['error', 'warn', 'info', 'verbose', 'debug'], + default: 'warn' + }) + .help('h') + .alias({ + h: 'help' + }) + .command( + 'env [path]', + 'Manage Python environments', + yargs => { + yargs + .positional('action', { + describe: 'Python environment action', + type: 'string', + default: '' + }) + .positional('path', { + type: 'string', + default: '', + describe: 'Destination path' + }) + .option('force', { + describe: 'Force the action', + type: 'boolean', + default: false + }) + .option('exclude-jlab', { + describe: 'Exclude jupyterlab Python package in env create', + type: 'boolean', + default: false + }) + .option('env-type', { + describe: 'Python environment type', + choices: ['auto', 'conda', 'venv'], + default: 'auto' + }); + }, + async argv => { + console.log('Note: This is an experimental feature.'); + + const action = argv.action; + switch (action) { + case 'info': + await handleEnvInfoCommand(argv); + break; + case 'list': + await handleEnvListCommand(argv); + break; + case 'install': + await handleEnvInstallCommand(argv); + break; + case 'activate': + await handleEnvActivateCommand(argv); + break; + case 'create': + await handleEnvCreateCommand(argv); + break; + case 'set-base-conda-env-path': + await handleEnvSetBaseCondaCommand(argv); + break; + case 'update-registry': + await handleEnvUpdateRegistryCommand(argv); + break; + default: + console.log('Invalid input for "env" command.'); + break; + } + } + ) + .parseAsync(); +} + +export async function handleEnvInfoCommand(argv: any) { + const bundledEnvPath = getBundledPythonEnvPath(); + const bundledEnvPathExists = + fs.existsSync(bundledEnvPath) && fs.statSync(bundledEnvPath).isDirectory(); + let defaultPythonPath = userSettings.getValue(SettingType.pythonPath); + if (defaultPythonPath === '') { + defaultPythonPath = getBundledPythonPath(); + } + const defaultEnvPath = envPathForPythonPath(defaultPythonPath); + const defaultEnvPathExists = + fs.existsSync(defaultEnvPath) && fs.statSync(defaultEnvPath).isDirectory(); + const condaRootPath = appData.condaRootPath; + const condaRootPathExists = + condaRootPath && + fs.existsSync(condaRootPath) && + fs.statSync(condaRootPath).isDirectory(); + const systemPythonPath = appData.systemPythonPath; + const systemPythonPathExists = + systemPythonPath && + fs.existsSync(systemPythonPath) && + fs.statSync(systemPythonPath).isFile(); + + const infoLines: string[] = []; + infoLines.push( + `Default Python environment path:\n "${defaultEnvPath}" [${ + defaultEnvPathExists ? 'exists' : 'not found' + }]` + ); + infoLines.push( + `Bundled Python environment installation path:\n "${bundledEnvPath}" [${ + bundledEnvPathExists ? 'exists' : 'not found' + }]` + ); + infoLines.push( + `Base conda environment path:\n "${condaRootPath}" [${ + condaRootPathExists ? 'exists' : 'not found' + }]` + ); + infoLines.push( + `System Python path:\n "${systemPythonPath}" [${ + systemPythonPathExists ? 'exists' : 'not found' + }]` + ); + + console.log(infoLines.join('\n')); +} + +export async function handleEnvListCommand(argv: any) { + const listLines: string[] = []; + + const listEnvironments = (envs: IPythonEnvironment[]) => { + envs.forEach(env => { + const versions = Object.keys(env.versions).map( + name => `${name}: ${env.versions[name]}` + ); + const envPath = envPathForPythonPath(env.path); + const installedByApp = fs.existsSync( + path.join(envPath, '.jupyter', 'env.json') + ); + listLines.push( + ` [${env.name}], path: ${envPath}${ + installedByApp ? ', installed by JupyterLab Desktop' : '' + }\n packages: ${versions.join(', ')}` + ); + }); + }; + + listLines.push('Discovered Python environments:'); + if (appData.discoveredPythonEnvs.length > 0) { + listEnvironments(appData.discoveredPythonEnvs); + } else { + listLines.push(' None'); + } + + listLines.push('\nUser set Python environments:'); + if (appData.userSetPythonEnvs.length > 0) { + listEnvironments(appData.userSetPythonEnvs); + } else { + listLines.push(' None'); + } + + console.log(listLines.join('\n')); +} + +function addUserSetEnvironment(envPath: string, isConda: boolean) { + const pythonPath = pythonPathForEnvPath(envPath, isConda); + + // this record will get updated with the correct data once app launches + console.log( + `Saving the environment at "${envPath}" to application environments list` + ); + appData.userSetPythonEnvs.push({ + path: pythonPath, + name: `${isConda ? 'conda' : 'venv'}: ${path.basename(envPath)}`, + type: IEnvironmentType.Path, + versions: {}, + defaultKernel: 'python3' + }); + appData.save(); + + // use as the default Python if not exists + let defaultPythonPath = userSettings.getValue(SettingType.pythonPath); + if (defaultPythonPath === '') { + defaultPythonPath = getBundledPythonPath(); + + if (!fs.existsSync(defaultPythonPath)) { + defaultPythonPath = pythonPathForEnvPath(envPath, isConda); + if (fs.existsSync(defaultPythonPath)) { + console.log( + `Setting "${defaultPythonPath}" as the default Python path` + ); + userSettings.setValue(SettingType.pythonPath, defaultPythonPath); + userSettings.save(); + } + } + } +} + +export async function handleEnvInstallCommand(argv: any) { + const installPath = (argv.path as string) || getBundledPythonEnvPath(); + console.log(`Installing to "${installPath}"`); + + await installBundledEnvironment(installPath, { + onInstallStatus: (status, message) => { + switch (status) { + case EnvironmentInstallStatus.RemovingExistingInstallation: + console.log('Removing the existing installation...'); + break; + case EnvironmentInstallStatus.Started: + console.log('Installing Python environment...'); + break; + case EnvironmentInstallStatus.Cancelled: + console.log( + 'Installation cancelled since install path is not empty. Retry with --force to overwrite.' + ); + break; + case EnvironmentInstallStatus.Failure: + console.error(`Failed to install.`, message); + break; + case EnvironmentInstallStatus.Success: + if (argv.path) { + addUserSetEnvironment(installPath, true); + } + console.log('Installation succeeded.'); + break; + } + }, + get forceOverwrite() { + return argv.force; + } + }).catch(reason => { + // + }); +} + +export async function handleEnvActivateCommand(argv: any) { + const envPath = (argv.path as string) || getBundledPythonEnvPath(); + console.log(`Activating Python environment "${envPath}"`); + + await launchCLIinEnvironment(envPath); +} + +export async function handleEnvUpdateRegistryCommand(argv: any) { + console.log(`Updating JupyterLab Desktop's Python environment registry...`); + const registry = new Registry(); + await registry.ready; + appData.save(); +} + +export async function handleEnvCreateCommand(argv: any) { + const envPath = argv.path as string; + + if (!envPath) { + console.error('Environment path not set.'); + return; + } + + if (fs.existsSync(envPath)) { + if (argv.force) { + console.log('Removing the existing environment...'); + try { + fs.rmSync(envPath, { recursive: true }); + } catch (error) { + console.error(`Failed to delete ${envPath}`); + return; + } + } else { + console.error( + 'Environment path not empty. Use --force flag to overwrite.' + ); + return; + } + } + + const excludeJlab = argv.excludeJlab === true; + const envType = argv.envType; + const isConda = envType === 'conda'; + const condaRootExists = isBaseCondaEnv(appData.condaRootPath); + + const packageList = argv._.slice(1); + if (!excludeJlab) { + packageList.push('jupyterlab'); + } + + console.log(`Creating Python environment at "${envPath}"...`); + + if (isConda && !condaRootExists) { + console.error( + 'conda base environment not found. You can set using jlab --set-base-conda-env-path command.' + ); + return; + } + + const createCondaEnv = isConda || (envType === 'auto' && condaRootExists); + + if (createCondaEnv) { + const createCommand = `conda create -y -c conda-forge -p ${envPath} ${packageList.join( + ' ' + )}`; + await runCommandInEnvironment(appData.condaRootPath, createCommand); + } else { + if (condaRootExists) { + const createCommand = `python -m venv create ${envPath}`; + await runCommandInEnvironment(appData.condaRootPath, createCommand); + } else if (fs.existsSync(appData.systemPythonPath)) { + execFileSync(appData.systemPythonPath, ['-m', 'venv', 'create', envPath]); + } else { + console.error( + 'Failed to create Python environment. Python executable not found.' + ); + return; + } + + if (packageList.length > 0) { + const installCommand = `python -m pip install ${packageList.join(' ')}`; + console.log('Installing packages...'); + await runCommandInEnvironment(envPath, installCommand); + } + } + + markEnvironmentAsJupyterInstalled(envPath); + addUserSetEnvironment(envPath, createCondaEnv); +} + +export async function handleEnvSetBaseCondaCommand(argv: any) { + const envPath = argv.path as string; + if (!fs.existsSync(envPath)) { + console.error(`Environment path "${envPath}" does not exist`); + return; + } else if (!isBaseCondaEnv(envPath)) { + console.error(`"${envPath}" is not a base conda environemnt`); + return; + } + + console.log(`Setting "${envPath}" as the base conda environment`); + appData.condaRootPath = envPath; + appData.save(); +} + +export async function launchCLIinEnvironment( + envPath: string +): Promise { + return new Promise((resolve, reject) => { + const isWin = process.platform === 'win32'; + envPath = envPath || getBundledPythonEnvPath(); + + const activateCommand = createCommandScriptInEnv( + envPath, + appData.condaRootPath + ); + const ext = isWin ? 'bat' : 'sh'; + const activateFilePath = createTempFile(`activate.${ext}`, activateCommand); + + const shell = isWin + ? spawn('cmd', ['/C', `start cmd.exe /k ${activateFilePath}`], { + stdio: 'inherit', + env: process.env + }) + : spawn('bash', ['--init-file', activateFilePath], { + stdio: 'inherit', + env: { + ...process.env, + BASH_SILENCE_DEPRECATION_WARNING: '1' + } + }); + + shell.on('close', code => { + if (code !== 0) { + console.error('Shell exit with code:', code); + } + + if (isWin) { + setTimeout(() => { + fs.unlinkSync(activateFilePath); + resolve(true); + }, 5000); + } else { + fs.unlinkSync(activateFilePath); + resolve(true); + } + }); + }); +} + +export async function runCommandInEnvironment( + envPath: string, + command: string +) { + const isWin = process.platform === 'win32'; + const commandScript = createCommandScriptInEnv( + envPath, + appData.condaRootPath, + command, + ' && ' + ); + + return new Promise((resolve, reject) => { + const shell = isWin + ? spawn('cmd', ['/c', commandScript], { + env: process.env + }) + : spawn('bash', ['-c', commandScript], { + stdio: 'inherit', + env: { + ...process.env, + BASH_SILENCE_DEPRECATION_WARNING: '1' + } + }); + + shell.on('close', code => { + if (code !== 0) { + console.error('Shell exit with code:', code); + } + resolve(true); + }); + }); +} diff --git a/src/main/config/appdata.ts b/src/main/config/appdata.ts index 0697a061..97248ec5 100644 --- a/src/main/config/appdata.ts +++ b/src/main/config/appdata.ts @@ -68,6 +68,10 @@ export class ApplicationData { this.condaRootPath = jsonData.condaRootPath; } + if ('systemPythonPath' in jsonData) { + this.systemPythonPath = jsonData.systemPythonPath; + } + this.sessions = []; if ('sessions' in jsonData && Array.isArray(jsonData.sessions)) { for (const session of jsonData.sessions) { @@ -185,6 +189,10 @@ export class ApplicationData { appDataJSON.condaRootPath = this.condaRootPath; } + if (this.systemPythonPath !== '') { + appDataJSON.systemPythonPath = this.systemPythonPath; + } + appDataJSON.sessions = []; for (const sessionConfig of this.sessions) { appDataJSON.sessions.push(sessionConfig.serialize()); @@ -376,6 +384,7 @@ export class ApplicationData { newsList: INewsItem[] = []; condaRootPath: string = ''; + systemPythonPath: string = ''; sessions: SessionConfig[] = []; recentRemoteURLs: IRecentRemoteURL[] = []; recentSessions: IRecentSession[] = []; diff --git a/src/main/main.ts b/src/main/main.ts index 74b5e3f4..c1d60c18 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -1,6 +1,5 @@ import { app, Menu, MenuItem } from 'electron'; import log, { LevelOption } from 'electron-log'; -import yargs from 'yargs/yargs'; import * as fs from 'fs'; import { getAppDir, isDevMode, waitForFunction } from './utils'; import { execSync } from 'child_process'; @@ -8,6 +7,7 @@ import { JupyterApplication } from './app'; import { ICLIArguments } from './tokens'; import { SessionConfig } from './config/sessionconfig'; import { SettingType, userSettings } from './config/settings'; +import { parseCLIArgs } from './cli'; let jupyterApp: JupyterApplication; let fileToOpenInMainInstance = ''; @@ -30,40 +30,6 @@ async function appReady(): Promise { */ require('fix-path')(); -function parseArgs(argv: string[]) { - return yargs(argv) - .usage('jlab [options] folder/file paths') - .example('jlab', 'Launch in default working directory') - .example('jlab .', 'Launch in current directory') - .example( - 'jlab /data/nb/test.ipynb', - 'Launch in /data/nb and open test.ipynb' - ) - .example('jlab /data/nb', 'Launch in /data/nb') - .example( - 'jlab --working-dir /data/nb test.ipynb sub/test2.ipynb', - 'Launch in /data/nb and open /data/nb/test.ipynb and /data/nb/sub/test2.ipynb' - ) - .option('python-path', { - describe: 'Python path', - type: 'string' - }) - .option('working-dir', { - describe: 'Working directory', - type: 'string' - }) - .option('log-level', { - describe: 'Log level', - choices: ['error', 'warn', 'info', 'verbose', 'debug'], - default: 'warn' - }) - .help('h') - .alias({ - h: 'help' - }) - .parseSync(); -} - function getLogLevel(): LevelOption { if (isDevMode()) { return 'debug'; @@ -77,32 +43,35 @@ function getLogLevel(): LevelOption { return userSettings.getValue(SettingType.logLevel); } -const argv = parseArgs(process.argv.slice(isDevMode() ? 2 : 1)); -const logLevel = getLogLevel(); - -if (isDevMode()) { - log.transports.console.level = logLevel; - log.transports.file.level = false; - - log.info('In development mode'); - log.info(`Logging to console at '${log.transports.console.level}' level`); -} else { - log.transports.file.level = logLevel; - log.transports.console.level = false; - - log.info('In production mode'); - log.info( - `Logging to file (${log.transports.file.getFile().path}) at '${ - log.transports.file.level - }' level` - ); -} +let argv: ICLIArguments; + +function redirectConsoleToLog() { + console.log = log.log; + console.error = log.error; + console.warn = log.warn; + console.info = log.info; + console.debug = log.debug; -console.log = log.log; -console.error = log.error; -console.warn = log.warn; -console.info = log.info; -console.debug = log.debug; + const logLevel = getLogLevel(); + + if (isDevMode()) { + log.transports.console.level = logLevel; + log.transports.file.level = false; + + log.info('In development mode'); + log.info(`Logging to console at '${log.transports.console.level}' level`); + } else { + log.transports.file.level = logLevel; + log.transports.console.level = false; + + log.info('In production mode'); + log.info( + `Logging to file (${log.transports.file.getFile().path}) at '${ + log.transports.file.level + }' level` + ); + } +} const thisYear = new Date().getFullYear(); @@ -132,7 +101,7 @@ app.on('open-file', (event: Electron.Event, filePath: string) => { fileOrFolders = [filePath]; } } catch (error) { - console.error('Failed to open files', error); + log.error('Failed to open files', error); } if (fileOrFolders.length > 0) { @@ -200,25 +169,42 @@ function setApplicationMenu() { Menu.setApplicationMenu(menu); } -/** - * Load all services when the electron app is - * ready. - */ -app.on('ready', () => { - handleMultipleAppInstances() - .then(() => { - setApplicationMenu(); - setupJLabCommand(); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - argv.cwd = process.cwd(); - jupyterApp = new JupyterApplication((argv as unknown) as ICLIArguments); - }) - .catch(e => { - log.error(e); - app.quit(); - }); +app.on('ready', async () => { + try { + await processArgs(); + } catch (error) { + log.error(error); + app.quit(); + } + + try { + await handleMultipleAppInstances(); + redirectConsoleToLog(); + setApplicationMenu(); + setupJLabCommand(); + argv.cwd = process.cwd(); + jupyterApp = new JupyterApplication((argv as unknown) as ICLIArguments); + } catch (error) { + log.error(error); + app.quit(); + } }); +function processArgs(): Promise { + return new Promise(resolve => { + parseCLIArgs(process.argv.slice(isDevMode() ? 2 : 1)).then(value => { + argv = value; + if ( + ['--help', '--version', 'env'].find(arg => process.argv?.includes(arg)) + ) { + app.quit(); + return; + } + resolve(); + }); + }); +} + /** * When a second instance of the application is executed, this passes the arguments * to first instance. Files that are opened with the application on Linux and Windows @@ -227,7 +213,7 @@ app.on('ready', () => { * application. */ function handleMultipleAppInstances(): Promise { - let promise = new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { // only the first instance will get the lock // pass cliArgs to main instance since argv provided by second-instance // event is out of order @@ -255,9 +241,7 @@ function handleMultipleAppInstances(): Promise { resolve(); } else { // is second instance - app.quit(); - reject(); + reject('Handling request in the main instance.'); } }); - return promise; } diff --git a/src/main/registry.ts b/src/main/registry.ts index d7a9f9d9..f974338e 100644 --- a/src/main/registry.ts +++ b/src/main/registry.ts @@ -15,11 +15,14 @@ import { IVersionContainer } from './tokens'; import { + envPathForPythonPath, getBundledPythonEnvPath, getBundledPythonPath, getEnvironmentPath, getUserHomeDir, + isBaseCondaEnv, isPortInUse, + pythonPathForEnvPath, versionWithoutSuffix } from './utils'; import { SettingType, userSettings } from './config/settings'; @@ -95,10 +98,7 @@ export class Registry implements IRegistry, IDisposable { // set default env from appData.condaRootPath if (!this._defaultEnv) { - const pythonPath = - process.platform === 'win32' - ? join(appData.condaRootPath, 'python.exe') - : join(appData.condaRootPath, 'bin', 'python'); + const pythonPath = pythonPathForEnvPath(appData.condaRootPath, true); const defaultEnv = this._resolveEnvironmentSync(pythonPath); if (defaultEnv) { this._defaultEnv = defaultEnv; @@ -107,6 +107,14 @@ export class Registry implements IRegistry, IDisposable { } } + if ( + !this._systemPythonPath && + appData.systemPythonPath && + fs.existsSync(appData.systemPythonPath) + ) { + this.setSystemPythonPath(appData.systemPythonPath); + } + const pathEnvironments = this._loadPathEnvironments(); const condaEnvironments = this._loadCondaEnvironments(); const allEnvironments = [pathEnvironments, condaEnvironments]; @@ -293,6 +301,15 @@ export class Registry implements IRegistry, IDisposable { appData.condaRootPath = rootPath; } + get systemPythonPath(): string { + return this._systemPythonPath; + } + + setSystemPythonPath(pythonPath: string) { + this._systemPythonPath = pythonPath; + appData.systemPythonPath = pythonPath; + } + /** * Create a new environment from a python executable, without waiting for the * entire registry to be resolved first. @@ -336,13 +353,7 @@ export class Registry implements IRegistry, IDisposable { } validateCondaBaseEnvironmentAtPath(envPath: string): boolean { - const isWin = process.platform === 'win32'; - const condaBinPath = path.join( - envPath, - 'condabin', - isWin ? 'conda.bat' : 'conda' - ); - return fs.existsSync(condaBinPath) && fs.lstatSync(condaBinPath).isFile(); + return isBaseCondaEnv(envPath); } async getEnvironmentInfo(pythonPath: string): Promise { @@ -419,10 +430,7 @@ export class Registry implements IRegistry, IDisposable { getAdditionalPathIncludesForPythonPath(pythonPath: string): string { const platform = process.platform; - let envPath = path.dirname(pythonPath); - if (platform !== 'win32') { - envPath = path.normalize(path.join(envPath, '../')); - } + let envPath = envPathForPythonPath(pythonPath); let pathEnv = ''; if (platform === 'win32') { @@ -510,7 +518,7 @@ export class Registry implements IRegistry, IDisposable { ]; if (process.platform === 'darwin') { - pythonInstances.push( + pythonInstances.unshift( this._getExecutableInstances('python3', process.env.PATH) ); } @@ -523,6 +531,10 @@ export class Registry implements IRegistry, IDisposable { const pythonPaths = await flattenedPythonPaths; + if (!this._systemPythonPath && pythonPaths.length > 0) { + this.setSystemPythonPath(pythonPaths[0]); + } + return pythonPaths.map((pythonPath, index) => { let newPythonEnvironment: IPythonEnvironment = { name: `${basename(pythonPath)}-${index}`, @@ -590,7 +602,6 @@ export class Registry implements IRegistry, IDisposable { return new Promise((resolve, reject) => { if (!fs.existsSync(subEnvironmentsFolder)) { - console.warn('No sub-environments in root: ' + rootPath); return resolve([]); } fs.readdir(subEnvironmentsFolder, (err, files) => { @@ -599,9 +610,10 @@ export class Registry implements IRegistry, IDisposable { } else { let subEnvsWithPython = files .map(subEnvPath => { - return process.platform === 'win32' - ? join(subEnvironmentsFolder, subEnvPath, 'python.exe') - : join(subEnvironmentsFolder, subEnvPath, 'bin', 'python'); + return pythonPathForEnvPath( + path.join(subEnvironmentsFolder, subEnvPath), + true + ); }) .filter(pythonPath => this._pathExists(pythonPath)); @@ -633,14 +645,9 @@ export class Registry implements IRegistry, IDisposable { const uniqueCondaRoots = this._getUniqueObjects(flattenedCondaRoots); return uniqueCondaRoots.map(condaRootPath => { - let path: string; - if (process.platform === 'win32') { - path = join(condaRootPath, 'python.exe'); - } else { - path = join(condaRootPath, 'bin', 'python'); - } + const path = pythonPathForEnvPath(condaRootPath, true); - let newRootEnvironment: IPythonEnvironment = { + const newRootEnvironment: IPythonEnvironment = { name: basename(condaRootPath), path: path, type: IEnvironmentType.CondaRoot, @@ -1059,6 +1066,10 @@ export class Registry implements IRegistry, IDisposable { } } + get ready(): Promise { + return this._registryBuilt; + } + dispose(): Promise { this._disposing = true; @@ -1075,6 +1086,7 @@ export class Registry implements IRegistry, IDisposable { private _userSetEnvironments: IPythonEnvironment[] = []; private _defaultEnv: IPythonEnvironment; private _condaRootPath: string; + private _systemPythonPath: string; private _registryBuilt: Promise; private _requirements: Registry.IRequirement[]; private _disposing: boolean = false; diff --git a/src/main/server.ts b/src/main/server.ts index c6fc8f99..7eb79e2d 100644 --- a/src/main/server.ts +++ b/src/main/server.ts @@ -4,12 +4,12 @@ import { dialog } from 'electron'; import { ArrayExt } from '@lumino/algorithm'; import log from 'electron-log'; import * as fs from 'fs'; -import * as os from 'os'; import * as path from 'path'; import { request as httpRequest } from 'http'; import { request as httpsRequest } from 'https'; import { IDisposable, IEnvironmentType, IPythonEnvironment } from './tokens'; import { + createTempFile, getEnvironmentPath, getFreePort, getSchemasDir, @@ -29,20 +29,6 @@ import { randomBytes } from 'crypto'; const SERVER_LAUNCH_TIMEOUT = 30000; // milliseconds const SERVER_RESTART_LIMIT = 3; // max server restarts -function createTempFile( - fileName = 'temp', - data = '', - encoding: BufferEncoding = 'utf8' -) { - const tempDirPath = path.join(os.tmpdir(), 'jlab_desktop'); - const tmpDir = fs.mkdtempSync(tempDirPath); - const tmpFilePath = path.join(tmpDir, fileName); - - fs.writeFileSync(tmpFilePath, data, { encoding }); - - return tmpFilePath; -} - function createLaunchScript( serverInfo: JupyterServer.IInfo, baseCondaPath: string, @@ -81,11 +67,42 @@ function createLaunchScript( serverInfo.environment.type === IEnvironmentType.CondaRoot || serverInfo.environment.type === IEnvironmentType.CondaEnv; + // conda activate is only available in base conda environments or + // conda-packed environments + + let condaActivatePath = ''; + let isBaseCondaActivate = true; + + // use activate from the environment instead of base when possible + if (isConda) { + if (isWin) { + const envActivatePath = path.join(envPath, 'condabin', 'activate.bat'); + if (fs.existsSync(envActivatePath)) { + condaActivatePath = envActivatePath; + isBaseCondaActivate = false; + } else { + condaActivatePath = path.join( + baseCondaPath, + 'condabin', + 'activate.bat' + ); + } + } else { + const envActivatePath = path.join(envPath, 'bin', 'activate'); + if (fs.existsSync(envActivatePath)) { + condaActivatePath = envActivatePath; + isBaseCondaActivate = false; + } else { + condaActivatePath = path.join(baseCondaPath, 'bin', 'activate'); + } + } + } + if (isWin) { if (isConda) { script = ` - CALL ${baseCondaPath}\\condabin\\activate.bat - CALL conda activate ${envPath} + CALL ${condaActivatePath} + ${isBaseCondaActivate ? `CALL conda activate ${envPath}` : ''} CALL ${launchCmd}`; } else { script = ` @@ -95,8 +112,8 @@ function createLaunchScript( } else { if (isConda) { script = ` - source "${baseCondaPath}/bin/activate" - conda activate "${envPath}" + source "${condaActivatePath}" + ${isBaseCondaActivate ? `conda activate "${envPath}"` : ''} ${launchCmd}`; } else { script = ` diff --git a/src/main/settingsdialog/settingsdialog.ts b/src/main/settingsdialog/settingsdialog.ts index 53646aa0..b806513d 100644 --- a/src/main/settingsdialog/settingsdialog.ts +++ b/src/main/settingsdialog/settingsdialog.ts @@ -418,7 +418,9 @@ export class SettingsDialog { }); window.electronAPI.onInstallBundledPythonEnvStatus((status) => { - const message = status === 'STARTED' ? + const message = status === 'REMOVING_EXISTING_INSTALLATION' ? + 'Removing the existing installation' : + status === 'STARTED' ? 'Installing Python environment' : status === 'CANCELLED' ? 'Installation cancelled!' : @@ -426,7 +428,8 @@ export class SettingsDialog { 'Failed to install the environment!' : status === 'SUCCESS' ? 'Installation succeeded' : ''; - const animate = status === 'STARTED'; + const animate = status === 'REMOVING_EXISTING_INSTALLATION' + || status === 'STARTED'; showProgress(message, animate); diff --git a/src/main/tokens.ts b/src/main/tokens.ts index b287054a..b1a456a3 100644 --- a/src/main/tokens.ts +++ b/src/main/tokens.ts @@ -69,7 +69,7 @@ export interface IDisposable { } export interface ICLIArguments { - cwd: string; + cwd?: string; _: (string | number)[]; // eslint-disable-next-line id-match $0: string; diff --git a/src/main/utils.ts b/src/main/utils.ts index bfcc4c09..d3d4e5c1 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -4,10 +4,13 @@ import * as path from 'path'; import * as fs from 'fs'; import * as semver from 'semver'; +import * as tar from 'tar'; +import * as os from 'os'; import log from 'electron-log'; import { AddressInfo, createServer, Socket } from 'net'; import { app, nativeTheme } from 'electron'; import { IPythonEnvironment } from './tokens'; +import { exec } from 'child_process'; export const DarkThemeBGColor = '#212121'; export const LightThemeBGColor = '#ffffff'; @@ -53,19 +56,12 @@ export function getSchemasDir(): string { } export function getEnvironmentPath(environment: IPythonEnvironment): string { - const isWin = process.platform === 'win32'; - const pythonPath = environment.path; - let envPath = path.dirname(pythonPath); - if (!isWin) { - envPath = path.normalize(path.join(envPath, '../')); - } - - return envPath; + return envPathForPythonPath(environment.path); } export function getBundledPythonInstallDir(): string { // this directory path cannot have any spaces since - // conda constructor cannot install to such paths + // conda environments cannot be installed to such paths const installDir = process.platform === 'darwin' ? path.normalize(path.join(app.getPath('home'), 'Library', app.getName())) @@ -89,24 +85,12 @@ export function getOldUserConfigPath() { export function getBundledPythonEnvPath(): string { const userDataDir = getBundledPythonInstallDir(); - let envPath = path.join(userDataDir, 'jlab_server'); - return envPath; + return path.join(userDataDir, 'jlab_server'); } export function getBundledPythonPath(): string { - const platform = process.platform; - let envPath = getBundledPythonEnvPath(); - if (platform !== 'win32') { - envPath = path.join(envPath, 'bin'); - } - - const bundledPythonPath = path.join( - envPath, - `python${platform === 'win32' ? '.exe' : ''}` - ); - - return bundledPythonPath; + return pythonPathForEnvPath(getBundledPythonEnvPath(), true); } export function isDarkTheme(themeType: string) { @@ -238,3 +222,291 @@ export function versionWithoutSuffix(version: string) { loose: true })}.${semver.patch(version, { loose: true })}`; } + +export enum EnvironmentInstallStatus { + Started = 'STARTED', + Failure = 'FAILURE', + Cancelled = 'CANCELLED', + Success = 'SUCCESS', + RemovingExistingInstallation = 'REMOVING_EXISTING_INSTALLATION' +} + +export interface IBundledEnvironmentInstallListener { + onInstallStatus: (status: EnvironmentInstallStatus, message?: string) => void; + forceOverwrite?: boolean; + confirmOverwrite?: () => Promise; +} + +export async function installBundledEnvironment( + installPath: string, + listener?: IBundledEnvironmentInstallListener +): Promise { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve, reject) => { + const platform = process.platform; + const isWin = platform === 'win32'; + const appDir = getAppDir(); + const installerPath = path.join( + appDir, + 'env_installer', + 'jlab_server.tar.gz' + ); + installPath = installPath || getBundledPythonEnvPath(); + + if (fs.existsSync(installPath)) { + if (listener) { + const confirmed = + listener.forceOverwrite || + (listener.confirmOverwrite !== undefined && + (await listener.confirmOverwrite())); + if (confirmed) { + listener?.onInstallStatus( + EnvironmentInstallStatus.RemovingExistingInstallation + ); + fs.rmSync(installPath, { recursive: true }); + } else { + listener?.onInstallStatus(EnvironmentInstallStatus.Cancelled); + reject(); + return; + } + } else { + reject(); + return; + } + } + + listener?.onInstallStatus(EnvironmentInstallStatus.Started); + + try { + fs.mkdirSync(installPath, { recursive: true }); + await tar.x({ C: installPath, file: installerPath }); + } catch (error) { + listener?.onInstallStatus( + EnvironmentInstallStatus.Failure, + 'Failed to install the environment' + ); + log.error(new Error(`Installer Exit: ${error}`)); + reject(); + return; + } + + markEnvironmentAsJupyterInstalled(installPath); + + let unpackCommand = isWin + ? `${installPath}\\Scripts\\activate.bat && conda-unpack` + : `source "${installPath}/bin/activate" && conda-unpack`; + + if (platform === 'darwin') { + unpackCommand = `${createUnsignScriptInEnv( + installPath + )}\n${unpackCommand}`; + } + + const installerProc = exec(unpackCommand, { + shell: isWin ? 'cmd.exe' : '/bin/bash' + }); + + installerProc.on('exit', (exitCode: number) => { + if (exitCode === 0) { + listener?.onInstallStatus(EnvironmentInstallStatus.Success); + resolve(true); + } else { + const message = `Installer Exit: ${exitCode}`; + listener?.onInstallStatus(EnvironmentInstallStatus.Failure, message); + log.error(new Error(message)); + reject(); + return; + } + }); + + installerProc.on('error', (err: Error) => { + listener?.onInstallStatus(EnvironmentInstallStatus.Failure, err.message); + log.error(err); + reject(); + return; + }); + }); +} + +export function markEnvironmentAsJupyterInstalled( + envPath: string, + extraData?: { [key: string]: any } +) { + const envInstallInfoPath = jupyterEnvInstallInfoPathForEnvPath(envPath); + + const data = { + installer: 'jupyterlab-desktop', + ...(extraData || {}) + }; + + try { + const dirPath = path.dirname(envInstallInfoPath); + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); + } + + fs.writeFileSync(envInstallInfoPath, JSON.stringify(data, null, 2)); + } catch (error) { + console.error('Failed to create file', envInstallInfoPath, error); + } +} + +export function createTempFile( + fileName = 'temp', + data = '', + encoding: BufferEncoding = 'utf8' +) { + const tempDirPath = path.join(os.tmpdir(), 'jlab_desktop'); + const tmpDir = fs.mkdtempSync(tempDirPath); + const tmpFilePath = path.join(tmpDir, fileName); + + fs.writeFileSync(tmpFilePath, data, { encoding }); + + return tmpFilePath; +} + +export function pythonPathForEnvPath(envPath: string, isConda?: boolean) { + if (process.platform === 'win32') { + if (isConda === undefined) { + isConda = isCondaEnv(envPath); + } + return isConda + ? path.join(envPath, 'python.exe') + : path.join(envPath, 'Scripts', 'python.exe'); + } else { + return path.join(envPath, 'bin', 'python'); + } +} + +export function envPathForPythonPath(pythonPath: string): string { + const isWin = process.platform === 'win32'; + let envPath = path.dirname(pythonPath); + if (!isWin || path.basename(envPath) === 'Scripts') { + envPath = path.normalize(path.join(envPath, '../')); + } + + return envPath; +} + +export function activatePathForEnvPath(envPath: string) { + return process.platform === 'win32' + ? path.join(envPath, 'Scripts', 'activate.bat') + : path.join(envPath, 'bin', 'activate'); +} + +export function condaSourcePathForEnvPath(envPath: string) { + if (process.platform !== 'win32') { + return path.join(envPath, 'etc', 'profile.d', 'conda.sh'); + } +} + +export function jupyterEnvInstallInfoPathForEnvPath(envPath: string) { + return path.join(envPath, '.jupyter', 'env.json'); +} + +export function isCondaEnv(envPath: string): boolean { + return fs.existsSync(path.join(envPath, 'conda-meta')); +} + +export function isBaseCondaEnv(envPath: string): boolean { + const isWin = process.platform === 'win32'; + const condaBinPath = path.join( + envPath, + 'condabin', + isWin ? 'conda.bat' : 'conda' + ); + return fs.existsSync(condaBinPath) && fs.lstatSync(condaBinPath).isFile(); +} + +export function createCommandScriptInEnv( + envPath: string, + baseCondaPath: string, + command?: string, + joinStr?: string +): string { + try { + const stat = fs.lstatSync(envPath); + if (!stat.isDirectory()) { + return ''; + } + } catch (error) { + // + } + + if (joinStr === undefined) { + joinStr = '\n'; + } + const isWin = process.platform === 'win32'; + + let activatePath = activatePathForEnvPath(envPath); + let condaSourcePath; + + let hasActivate = fs.existsSync(activatePath); + const isConda = isCondaEnv(envPath); + + // conda activate is only available in base conda environments or + // conda-packed environments + let isBaseCondaActivate = false; + if (!hasActivate && isConda) { + if (fs.existsSync(baseCondaPath)) { + activatePath = activatePathForEnvPath(baseCondaPath); + condaSourcePath = condaSourcePathForEnvPath(baseCondaPath); + hasActivate = fs.existsSync(activatePath); + isBaseCondaActivate = true; + } + } + + if (!hasActivate) { + return ''; + } + + const scriptLines: string[] = []; + + if (isWin) { + scriptLines.push(`CALL ${activatePath}`); + if (isConda && isBaseCondaActivate) { + scriptLines.push(`CALL conda activate ${envPath}`); + } + if (command) { + scriptLines.push(`CALL ${command}`); + } + } else { + scriptLines.push(`source "${activatePath}"`); + if (isConda && isBaseCondaActivate) { + scriptLines.push(`source "${condaSourcePath}"`); + scriptLines.push(`conda activate "${envPath}"`); + } + if (command) { + scriptLines.push(command); + } + } + + return scriptLines.join(joinStr); +} + +/* + signed tarball contents need to be unsigned except for python binary, + otherwise server runs into issues at runtime. python binary comes originally + ad-hoc signed. after installation it needs be converted from hardened runtime, + back to ad-hoc signed. +*/ +export function createUnsignScriptInEnv(envPath: string): string { + const pythonBin = 'bin/python3.8'; + const appDir = getAppDir(); + const signListFile = path.join(appDir, 'env_installer', 'sign-osx-64.txt'); + const fileContents = fs.readFileSync(signListFile, 'utf-8'); + const signList: string[] = []; + + fileContents.split(/\r?\n/).forEach(line => { + if (line && line !== pythonBin) { + signList.push(`"${line}"`); + } + }); + + // remove hardened runtime flag, convert to ad-hoc + const removeRuntimeFlagCommand = `codesign -s - -o 0x2 -f ${pythonBin}`; + + return `cd ${envPath} && codesign --remove-signature ${signList.join( + ' ' + )} && ${removeRuntimeFlagCommand} && cd -`; +} diff --git a/tbump.toml b/tbump.toml index 485d9858..e6c26b65 100644 --- a/tbump.toml +++ b/tbump.toml @@ -1,7 +1,7 @@ # github_url = "https://github.com/jupyterlab/jupyterlab-desktop/" [version] -current = "4.0.1-1" +current = "4.0.1-2" regex = ''' (?P\d+) @@ -21,10 +21,7 @@ tag_template = "v{new_version}" src = "package.json" search = '"version": "{current_version}"' [[file]] -src = "env_installer/construct.yaml" -search = 'version: {current_version}' -[[file]] -src = "env_installer/construct.yaml" +src = "env_installer/jlab_server.yaml" version_template = "{major}.{minor}.{patch}" search = '- jupyterlab {current_version}' diff --git a/workflow_env/conda-linux-64.lock b/workflow_env/conda-linux-64.lock new file mode 100644 index 00000000..b4b401ff --- /dev/null +++ b/workflow_env/conda-linux-64.lock @@ -0,0 +1,105 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 65b66c4bfa6615c73eb4748306d1d455861ea93c0c8d1d07c7a87f048ae1c305 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-3_cp311.conda#c2e2630ddb68cf52eec74dc7dfab20b5 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.76.3-hebfc3b9_0.conda#a64f11b244b2c112cd3fa1cbe9493999 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.4-hab00c5b_0_cpython.conda#1c628861a2a126b9fc9363ca1b7d014e +https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2#5f095bc6454094e96f146491fd03633b +https://conda.anaconda.org/conda-forge/noarch/boltons-23.0.0-pyhd8ed1ab_0.conda#033eb25fffd222aceeca6d58cd953680 +https://conda.anaconda.org/conda-forge/noarch/cachy-0.3.0-pyhd8ed1ab_1.tar.bz2#5dfee17f24e2dfd18d7392b48c9351e2 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_0.tar.bz2#709a2295dd907bb34afb57d54320642f +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2#b65b4d50dbd2d50fa0aeac367ec9eed7 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.1-pyhd8ed1ab_0.conda#1f262528bc0ca9d410b98c02d09de3ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2#9800ad1699b42612478755a2d26c722d +https://conda.anaconda.org/conda-forge/noarch/jsonpointer-2.0-py_0.tar.bz2#07d85c22a3beb102a48cd123df84c2a6 +https://conda.anaconda.org/conda-forge/noarch/lockfile-0.12.2-py_1.tar.bz2#c104d98e09c47519950cffb8dd5b4f10 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_0.conda#9904dc4adb5d547cb21e136f98cb24b0 +https://conda.anaconda.org/conda-forge/noarch/more-itertools-9.1.0-pyhd8ed1ab_0.conda#1698a717f83cfecf644a877c174c84bd +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.5-py311ha3edf6b_0.conda#7415f24f8c44e44152623d93c5015000 +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pastel-0.2.1-pyhd8ed1ab_0.tar.bz2#a4eea5bff523f26442405bc5d1f52adb +https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.9.6-pyhd8ed1ab_0.conda#be1e9f1c65a1ed0f2ae9352fec99db64 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 +https://conda.anaconda.org/conda-forge/linux-64/pycosat-0.6.4-py311hd4cff14_1.tar.bz2#17399f8b68b4592f098ab18d4fdb0ac4 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pylev-1.4.0-pyhd8ed1ab_0.tar.bz2#edf8651c4379d9d1495ad6229622d150 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py311hd4cff14_5.tar.bz2#da8769492e423103c59f469f4f17f8d9 +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h2582759_1.conda#5e997292429a22ad50c11af0a2cb0f08 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/smmap-3.0.5-pyh44b312d_0.tar.bz2#3a8dc70789709aa315325d5df06fb7e4 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.11.8-pyha770c72_0.conda#75838e8556166263a82038b51d01d5f1 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce +https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.2-pyhd8ed1ab_1.tar.bz2#72a46ffc25701c173932fd55cf0965d3 +https://conda.anaconda.org/conda-forge/noarch/clikit-0.6.2-pyhd8ed1ab_2.conda#02abb7b66b02e8b9f5a9b05454400087 +https://conda.anaconda.org/conda-forge/noarch/conda-pack-0.7.0-pyh6c4a22f_0.tar.bz2#84b284cebf2a158306653f9a6961d589 +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.10-pyhd8ed1ab_0.conda#3706d2f3d7cb5dae600c833345a76132 +https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyh9f0ad1d_0.tar.bz2#b2355343d6315c892543200231d7154a +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.2.3-pyhd8ed1ab_0.tar.bz2#31e4a1506968d017229bdb64695013a1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.32-pyhd8ed1ab_0.tar.bz2#09150b51b0528a31a0f6500b96fdde82 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.31-py311h459d7ec_0.conda#f0fc1409f49257fe5ec2d86d0595d9bc +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.65.0-pyhd8ed1ab_1.conda#ed792aff3acb977d09c7013358097f83 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py311hd4cff14_1005.tar.bz2#9bdac7084ecfc08338bae1b976535724 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.1-py311h63ff55d_0.conda#69ad01f66b8efff535d341ba5b283c2c +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.31-pyhd8ed1ab_0.conda#f6e6b482110246a81c3f03e81c68752d +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.3-pyhd8ed1ab_0.conda#c085a16ba3d0c9ee282c438308b57724 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-1.10.9-py311h459d7ec_0.conda#1d8d643ba4e4fcf3e95ce787261798da +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.19.0-py311hbe0fcd7_1.conda#1f48d127dd18240505cba632b67f7931 +https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.8.0-pyhd8ed1ab_0.conda#ebe3230a4c1e135954eee4fb6ef8cded +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py311h38be061_1.tar.bz2#ec745aaae03cc47120c1f11ac7b7bcf5 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.23.0-pyhd8ed1ab_0.conda#a920e114c4c2ced2280e266da65ab5e6 +https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.0.2-pyh38be061_0.conda#44800e9bd13143292097c65e57323038 +https://conda.anaconda.org/conda-forge/linux-64/keyring-23.13.1-py311h38be061_0.conda#0dc0127b1daefefa5e2caa49dde5c230 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.13.0-pyhd8ed1ab_0.conda#9f0b2eb5f5dd2cec36d5342a80adfec0 +https://conda.anaconda.org/conda-forge/linux-64/conda-23.5.0-py311h38be061_1.conda#2d45d1c5f23f0ccfe184ac6c7c70bef0 +https://conda.anaconda.org/conda-forge/noarch/ensureconda-1.4.3-pyhd8ed1ab_0.tar.bz2#c99ae3abf501990769047b4b40a98f17 +https://conda.anaconda.org/conda-forge/noarch/cachecontrol-with-filecache-0.13.0-pyhd8ed1ab_0.conda#3fd3d55ea862cc0736ac1cce6f44c2d1 +https://conda.anaconda.org/conda-forge/noarch/conda-lock-2.0.0-pyhd8ed1ab_0.conda#b21d640094b5b8acb270334b5950cc74 diff --git a/workflow_env/conda-osx-64.lock b/workflow_env/conda-osx-64.lock new file mode 100644 index 00000000..dc314cdb --- /dev/null +++ b/workflow_env/conda-osx-64.lock @@ -0,0 +1,90 @@ +# Generated by conda-lock. +# platform: osx-64 +# input_hash: 9c1bb7f068e42d6769ca55918911ab412d6ff912e4927014e7866061f43ae5e1 +@EXPLICIT +https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h0d85af4_4.tar.bz2#37edc4e6304ca87316e160f5ca0bd1b5 +https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2023.5.7-h8857fd0_0.conda#b704e4b79ba0d887c4870b7b09d6a4df +https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.5-hd57cbcb_0.conda#d34eed0a4fb993f0d934db6394ba23ef +https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.5.0-hf0c8a7f_1.conda#6c81cb022780ee33435cca0127dd43c9 +https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2#ccb34fb14960ad8b125962d3d79b31a9 +https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-hfd90126_4.tar.bz2#35eb3fce8d51ed3c1fd4122bad48250b +https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4-hf0c8a7f_0.conda#c3dbae2411164d9b02c69090a9a91857 +https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-3_cp311.conda#5e0a069a585445333868d2c6651c3b3f +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2#a72f9d4ea13d55d745ff1ed594747f10 +https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2#d7e08fcf8259d742156188e8762b4d20 +https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.42.0-h58db7d2_0.conda#a7d3b44b7b0c9901ac7813b7a0462893 +https://conda.anaconda.org/conda-forge/osx-64/openssl-3.1.1-h8a1eda9_1.conda#c7822d6ee74e34af1fd74365cfd18983 +https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda#f17f77f2acf4d344734bda76829ce14e +https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.12-h5dbffcc_0.tar.bz2#8e9480d9c47061db2ed1b4ecce519a7f +https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.2-hbc0c0cd_6.conda#40a188783d3c425bdccc9ae9104acbb8 +https://conda.anaconda.org/conda-forge/osx-64/python-3.11.4-h30d4d87_0_cpython.conda#e40b3075f85db0184d5f61d17c580ef7 +https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2#5f095bc6454094e96f146491fd03633b +https://conda.anaconda.org/conda-forge/noarch/boltons-23.0.0-pyhd8ed1ab_0.conda#033eb25fffd222aceeca6d58cd953680 +https://conda.anaconda.org/conda-forge/noarch/cachy-0.3.0-pyhd8ed1ab_1.tar.bz2#5dfee17f24e2dfd18d7392b48c9351e2 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_0.tar.bz2#709a2295dd907bb34afb57d54320642f +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2#b65b4d50dbd2d50fa0aeac367ec9eed7 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.1-pyhd8ed1ab_0.conda#1f262528bc0ca9d410b98c02d09de3ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/jsonpointer-2.0-py_0.tar.bz2#07d85c22a3beb102a48cd123df84c2a6 +https://conda.anaconda.org/conda-forge/noarch/lockfile-0.12.2-py_1.tar.bz2#c104d98e09c47519950cffb8dd5b4f10 +https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.3-py311h2725bcf_0.conda#65b70928fcc2a81891ad1a8a6a7b085a +https://conda.anaconda.org/conda-forge/noarch/more-itertools-9.1.0-pyhd8ed1ab_0.conda#1698a717f83cfecf644a877c174c84bd +https://conda.anaconda.org/conda-forge/osx-64/msgpack-python-1.0.5-py311hd2070f0_0.conda#d3a60c5422b7d61b2740c7c5df508c86 +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pastel-0.2.1-pyhd8ed1ab_0.tar.bz2#a4eea5bff523f26442405bc5d1f52adb +https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.9.6-pyhd8ed1ab_0.conda#be1e9f1c65a1ed0f2ae9352fec99db64 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 +https://conda.anaconda.org/conda-forge/osx-64/pycosat-0.6.4-py311h5547dcb_1.tar.bz2#229e642050372d50ebdc24e2265ce8b2 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pylev-1.4.0-pyhd8ed1ab_0.tar.bz2#edf8651c4379d9d1495ad6229622d150 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0-py311h5547dcb_5.tar.bz2#8d1e456914ce961119b07f396187a564 +https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml.clib-0.2.7-py311h5547dcb_1.conda#fdae97fc41b9e4aa53d644cca8ba6c54 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/smmap-3.0.5-pyh44b312d_0.tar.bz2#3a8dc70789709aa315325d5df06fb7e4 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.11.8-pyha770c72_0.conda#75838e8556166263a82038b51d01d5f1 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/osx-64/cffi-1.15.1-py311ha86e640_3.conda#5967be4da33261eada7cc79593f71088 +https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.2-pyhd8ed1ab_1.tar.bz2#72a46ffc25701c173932fd55cf0965d3 +https://conda.anaconda.org/conda-forge/noarch/clikit-0.6.2-pyhd8ed1ab_2.conda#02abb7b66b02e8b9f5a9b05454400087 +https://conda.anaconda.org/conda-forge/noarch/conda-pack-0.7.0-pyh6c4a22f_0.tar.bz2#84b284cebf2a158306653f9a6961d589 +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.10-pyhd8ed1ab_0.conda#3706d2f3d7cb5dae600c833345a76132 +https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyh9f0ad1d_0.tar.bz2#b2355343d6315c892543200231d7154a +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.2.3-pyhd8ed1ab_0.tar.bz2#31e4a1506968d017229bdb64695013a1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.32-pyhd8ed1ab_0.tar.bz2#09150b51b0528a31a0f6500b96fdde82 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml-0.17.31-py311h2725bcf_0.conda#a81b5091605ed21fb00f03a110c14cf8 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.65.0-pyhd8ed1ab_1.conda#ed792aff3acb977d09c7013358097f83 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/osx-64/brotlipy-0.7.0-py311h5547dcb_1005.tar.bz2#5f97ac938a90d06eebea42c321abe0d7 +https://conda.anaconda.org/conda-forge/osx-64/cryptography-41.0.1-py311h892b619_0.conda#d1e57a1ae104a8d97fd68c4d61c26323 +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.31-pyhd8ed1ab_0.conda#f6e6b482110246a81c3f03e81c68752d +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.3-pyhd8ed1ab_0.conda#c085a16ba3d0c9ee282c438308b57724 +https://conda.anaconda.org/conda-forge/osx-64/pydantic-1.10.9-py311h2725bcf_0.conda#c6e744d388e4de3c75aa3b00b102503c +https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.19.0-py311hebd4beb_1.conda#b0d4f55c803038fd429494acf684e6ef +https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.8.0-pyhd8ed1ab_0.conda#ebe3230a4c1e135954eee4fb6ef8cded +https://conda.anaconda.org/conda-forge/osx-64/keyring-23.13.1-py311h6eed73b_0.conda#ae2618c59c8f3481aa7014de862c6d57 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.23.0-pyhd8ed1ab_0.conda#a920e114c4c2ced2280e266da65ab5e6 +https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.0.2-pyh38be061_0.conda#44800e9bd13143292097c65e57323038 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.13.0-pyhd8ed1ab_0.conda#9f0b2eb5f5dd2cec36d5342a80adfec0 +https://conda.anaconda.org/conda-forge/osx-64/conda-23.5.0-py311h6eed73b_1.conda#dbfaf298e30d2472e862fc79cb640607 +https://conda.anaconda.org/conda-forge/noarch/ensureconda-1.4.3-pyhd8ed1ab_0.tar.bz2#c99ae3abf501990769047b4b40a98f17 +https://conda.anaconda.org/conda-forge/noarch/cachecontrol-with-filecache-0.13.0-pyhd8ed1ab_0.conda#3fd3d55ea862cc0736ac1cce6f44c2d1 +https://conda.anaconda.org/conda-forge/noarch/conda-lock-2.0.0-pyhd8ed1ab_0.conda#b21d640094b5b8acb270334b5950cc74 diff --git a/workflow_env/conda-win-64.lock b/workflow_env/conda-win-64.lock new file mode 100644 index 00000000..9ec09dec --- /dev/null +++ b/workflow_env/conda-win-64.lock @@ -0,0 +1,94 @@ +# Generated by conda-lock. +# platform: win-64 +# input_hash: 335906fc0e02ede68856e59312ec6eddff4268c6ce57a142750e3db044c75f84 +@EXPLICIT +https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2023.5.7-h56e8100_0.conda#604212634bd8c4d6f20d44b946e8eedb +https://conda.anaconda.org/conda-forge/win-64/libexpat-2.5.0-h63175ca_1.conda#636cc3cbbd2e28bcfd2f73b2044aac2c +https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-3_cp311.conda#fd1634ba85cfea9376e1fc02d6f592e9 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2#72608f6cd3e5898229c3ea16deb1ac43 +https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.34.31931-h5081d32_16.conda#22125178654c6a8a393f9743d585704b +https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hb25d44b_16.conda#ea326b37e3bd6d2616988e09f3a9396c +https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.34.31931-hed1258a_16.conda#0374eae69b6dbfb27c3dc27167109eb4 +https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h8ffe710_4.tar.bz2#7c03c66026944073040cb19a4f3ec3c9 +https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2#2c96d1b6915b408893f9472569dee135 +https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.42.0-hcfcfb64_0.conda#9a71d93deb99cc09d8939d5235b5909a +https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_4.tar.bz2#0cc5c5cc64ee1637f37f8540a175854c +https://conda.anaconda.org/conda-forge/win-64/openssl-3.1.1-hcfcfb64_1.conda#1d913a5de46c6b2f7e4cfbd26b106b8b +https://conda.anaconda.org/conda-forge/win-64/tk-8.6.12-h8ffe710_0.tar.bz2#c69a5047cc9291ae40afd4a1ad6f0c0f +https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2#515d77642eaa3639413c6b1bc3f94219 +https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2#adbfb9f45d1004a26763652246a33764 +https://conda.anaconda.org/conda-forge/win-64/python-3.11.4-h2628c8c_0_cpython.conda#3187a32fba79e835f099ecea054026f4 +https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.2-h12be248_6.conda#62826565682d013b3e2346aaf7bded0e +https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2#5f095bc6454094e96f146491fd03633b +https://conda.anaconda.org/conda-forge/noarch/boltons-23.0.0-pyhd8ed1ab_0.conda#033eb25fffd222aceeca6d58cd953680 +https://conda.anaconda.org/conda-forge/noarch/cachy-0.3.0-pyhd8ed1ab_1.tar.bz2#5dfee17f24e2dfd18d7392b48c9351e2 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_0.tar.bz2#709a2295dd907bb34afb57d54320642f +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2#b65b4d50dbd2d50fa0aeac367ec9eed7 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.1-pyhd8ed1ab_0.conda#1f262528bc0ca9d410b98c02d09de3ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/jsonpointer-2.0-py_0.tar.bz2#07d85c22a3beb102a48cd123df84c2a6 +https://conda.anaconda.org/conda-forge/noarch/lockfile-0.12.2-py_1.tar.bz2#c104d98e09c47519950cffb8dd5b4f10 +https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.3-py311ha68e1ae_0.conda#db2c2f72a83bdc5b70947964e1ddc8bb +https://conda.anaconda.org/conda-forge/win-64/menuinst-1.4.19-py311h1ea47a8_1.tar.bz2#8eb00075c8acb7dd264c4a8537b89549 +https://conda.anaconda.org/conda-forge/noarch/more-itertools-9.1.0-pyhd8ed1ab_0.conda#1698a717f83cfecf644a877c174c84bd +https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.0.5-py311h005e61a_0.conda#01a252f384a5d1ad338cff1184d9a9c0 +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pastel-0.2.1-pyhd8ed1ab_0.tar.bz2#a4eea5bff523f26442405bc5d1f52adb +https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.9.6-pyhd8ed1ab_0.conda#be1e9f1c65a1ed0f2ae9352fec99db64 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 +https://conda.anaconda.org/conda-forge/win-64/pycosat-0.6.4-py311ha68e1ae_1.tar.bz2#c7af04cd8a66f6d782982751200239d0 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pylev-1.4.0-pyhd8ed1ab_0.tar.bz2#edf8651c4379d9d1495ad6229622d150 +https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.0-py311h1ea47a8_1006.tar.bz2#86ee973a16f5449d9ded34b512331dce +https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0-py311ha68e1ae_5.tar.bz2#0c97d59d54eb52e170224b3de6ade906 +https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.7-py311ha68e1ae_1.conda#654fbe603c79490699cd7447e4627aee +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.2-pyhd8ed1ab_0.conda#3b68bc43ec6baa48f7354a446267eefe +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/smmap-3.0.5-pyh44b312d_0.tar.bz2#3a8dc70789709aa315325d5df06fb7e4 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.11.8-pyha770c72_0.conda#75838e8556166263a82038b51d01d5f1 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.6.3-pyha770c72_0.conda#4a3014a4d107d15475d106b751c4e352 +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2#30878ecc4bd36e8deeea1e3c151b2e0b +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/win-64/cffi-1.15.1-py311h7d9ee11_3.conda#a8524727eb956b4741e25a64af79edb8 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-win_pyhd8ed1ab_2.tar.bz2#6b58680207b526c42dcff68b543803dd +https://conda.anaconda.org/conda-forge/noarch/clikit-0.6.2-pyhd8ed1ab_2.conda#02abb7b66b02e8b9f5a9b05454400087 +https://conda.anaconda.org/conda-forge/noarch/conda-pack-0.7.0-pyh6c4a22f_0.tar.bz2#84b284cebf2a158306653f9a6961d589 +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.10-pyhd8ed1ab_0.conda#3706d2f3d7cb5dae600c833345a76132 +https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyh9f0ad1d_0.tar.bz2#b2355343d6315c892543200231d7154a +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.6.0-pyha770c72_0.conda#f91a5d5175fb7ff2a91952ec7da59cb9 +https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.2.3-pyhd8ed1ab_0.tar.bz2#31e4a1506968d017229bdb64695013a1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.32-pyhd8ed1ab_0.tar.bz2#09150b51b0528a31a0f6500b96fdde82 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2#56cd9fe388baac0e90c7149cfac95b60 +https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.17.31-py311ha68e1ae_0.conda#211e024535a77ae712ad05d2ec7ac4fe +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.65.0-pyhd8ed1ab_1.conda#ed792aff3acb977d09c7013358097f83 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.6.3-hd8ed1ab_0.conda#3876f650ed7d0f95d70fa4b647621909 +https://conda.anaconda.org/conda-forge/win-64/brotlipy-0.7.0-py311ha68e1ae_1005.tar.bz2#dd9604ece454103e7210110c6d343e37 +https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.2-pyhd8ed1ab_1.tar.bz2#72a46ffc25701c173932fd55cf0965d3 +https://conda.anaconda.org/conda-forge/win-64/cryptography-41.0.1-py311h28e9c30_0.conda#d2b52be40a519bd255397a884bd3fb1c +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.31-pyhd8ed1ab_0.conda#f6e6b482110246a81c3f03e81c68752d +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.6.0-hd8ed1ab_0.conda#3cbc9615f10a3d471532b83e4250b971 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.5.3-pyhd8ed1ab_0.conda#c085a16ba3d0c9ee282c438308b57724 +https://conda.anaconda.org/conda-forge/win-64/pydantic-1.10.9-py311ha68e1ae_0.conda#b086521bbe799f96dcc8006869496d1a +https://conda.anaconda.org/conda-forge/win-64/zstandard-0.19.0-py311he5d195f_1.conda#af889af78c5389e344392e305b4d7bc7 +https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.8.0-pyhd8ed1ab_0.conda#ebe3230a4c1e135954eee4fb6ef8cded +https://conda.anaconda.org/conda-forge/win-64/keyring-23.13.1-py311h1ea47a8_0.conda#ff14a49b769ea59ee6709a890e17f317 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.23.0-pyhd8ed1ab_0.conda#a920e114c4c2ced2280e266da65ab5e6 +https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.0.2-pyh38be061_0.conda#44800e9bd13143292097c65e57323038 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.13.0-pyhd8ed1ab_0.conda#9f0b2eb5f5dd2cec36d5342a80adfec0 +https://conda.anaconda.org/conda-forge/win-64/conda-23.5.0-py311h1ea47a8_1.conda#7b69b8d7ebe1e0cad27ecee1663cedcc +https://conda.anaconda.org/conda-forge/noarch/ensureconda-1.4.3-pyhd8ed1ab_0.tar.bz2#c99ae3abf501990769047b4b40a98f17 +https://conda.anaconda.org/conda-forge/noarch/cachecontrol-with-filecache-0.13.0-pyhd8ed1ab_0.conda#3fd3d55ea862cc0736ac1cce6f44c2d1 +https://conda.anaconda.org/conda-forge/noarch/conda-lock-2.0.0-pyhd8ed1ab_0.conda#b21d640094b5b8acb270334b5950cc74 diff --git a/workflow_env/publish_env.yaml b/workflow_env/publish_env.yaml new file mode 100644 index 00000000..8b756ea7 --- /dev/null +++ b/workflow_env/publish_env.yaml @@ -0,0 +1,11 @@ +name: jlab_server +channels: + - conda-forge +dependencies: + - conda + - conda-lock + - conda-pack +platforms: + - linux-64 + - osx-64 + - win-64 diff --git a/yarn.lock b/yarn.lock index 68f342bb..03b3940e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -449,6 +449,14 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== +"@types/tar@^6.1.5": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@types/tar/-/tar-6.1.5.tgz#90ccb3b6a35430e7427410d50eed564e85feaaff" + integrity sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q== + dependencies: + "@types/node" "*" + minipass "^4.0.0" + "@types/verror@^1.10.3": version "1.10.6" resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.6.tgz#3e600c62d210c5826460858f84bcbb65805460bb" @@ -2974,6 +2982,11 @@ minipass@^4.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.1.tgz#2b9408c6e81bb8b338d600fb3685e375a370a057" integrity sha512-V9esFpNbK0arbN3fm2sxDKqMYgIp7XtVdE4Esj+PE4Qaaxdg1wIw48ITQIOn1sc8xXSmUviVL3cyjMqPlrVkiA== +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -4081,6 +4094,18 @@ tar@^6.1.11: mkdirp "^1.0.3" yallist "^4.0.0" +tar@^6.1.15: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + temp-file@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7"