diff --git a/.changes/unreleased/Added-20250929-130247.yaml b/.changes/unreleased/Added-20250929-130247.yaml new file mode 100644 index 0000000..a3e735c --- /dev/null +++ b/.changes/unreleased/Added-20250929-130247.yaml @@ -0,0 +1,3 @@ +kind: Added +body: Click to copy on codeblocks +time: 2025-09-29T13:02:47.581202939+10:00 diff --git a/.changes/unreleased/Added-20250929-130255.yaml b/.changes/unreleased/Added-20250929-130255.yaml new file mode 100644 index 0000000..456dc13 --- /dev/null +++ b/.changes/unreleased/Added-20250929-130255.yaml @@ -0,0 +1,3 @@ +kind: Added +body: Hightlight.js for code hightlighting +time: 2025-09-29T13:02:55.149029223+10:00 diff --git a/.changes/unreleased/Added-20250930-072149.yaml b/.changes/unreleased/Added-20250930-072149.yaml new file mode 100644 index 0000000..8e393c4 --- /dev/null +++ b/.changes/unreleased/Added-20250930-072149.yaml @@ -0,0 +1,3 @@ +kind: Added +body: Playwright testing init +time: 2025-09-30T07:21:49.847142979+10:00 diff --git a/.changes/unreleased/Added-20250930-182748.yaml b/.changes/unreleased/Added-20250930-182748.yaml new file mode 100644 index 0000000..1ea6fa5 --- /dev/null +++ b/.changes/unreleased/Added-20250930-182748.yaml @@ -0,0 +1,3 @@ +kind: Added +body: Typst code render +time: 2025-09-30T18:27:48.705433051+10:00 diff --git a/.changes/unreleased/Added-20250930-182758.yaml b/.changes/unreleased/Added-20250930-182758.yaml new file mode 100644 index 0000000..ee28091 --- /dev/null +++ b/.changes/unreleased/Added-20250930-182758.yaml @@ -0,0 +1,3 @@ +kind: Added +body: Mermaid raw text display option +time: 2025-09-30T18:27:58.86821716+10:00 diff --git a/.changes/unreleased/Added-20250930-190005.yaml b/.changes/unreleased/Added-20250930-190005.yaml new file mode 100644 index 0000000..851bb8a --- /dev/null +++ b/.changes/unreleased/Added-20250930-190005.yaml @@ -0,0 +1,3 @@ +kind: Added +body: Correctly rendering blockquotes +time: 2025-09-30T19:00:05.281956224+10:00 diff --git a/.changes/unreleased/Added-20251001-082427.yaml b/.changes/unreleased/Added-20251001-082427.yaml new file mode 100644 index 0000000..e567144 --- /dev/null +++ b/.changes/unreleased/Added-20251001-082427.yaml @@ -0,0 +1,3 @@ +kind: Added +body: Playwright testing suite added +time: 2025-10-01T08:24:27.186267905+10:00 diff --git a/.changes/unreleased/Changed-20250930-185943.yaml b/.changes/unreleased/Changed-20250930-185943.yaml new file mode 100644 index 0000000..8b7ad15 --- /dev/null +++ b/.changes/unreleased/Changed-20250930-185943.yaml @@ -0,0 +1,3 @@ +kind: Changed +body: Colour correction for hyperlinks +time: 2025-09-30T18:59:43.054642843+10:00 diff --git a/.changes/unreleased/Changed-20250930-185951.yaml b/.changes/unreleased/Changed-20250930-185951.yaml new file mode 100644 index 0000000..94ea3c1 --- /dev/null +++ b/.changes/unreleased/Changed-20250930-185951.yaml @@ -0,0 +1,3 @@ +kind: Changed +body: Hyperlinks now bold text +time: 2025-09-30T18:59:51.40831382+10:00 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..887a2c1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting & preventing 3-way merges +pixi.lock merge=binary linguist-language=YAML linguist-generated=true diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml index 1a47d2f..07e894b 100644 --- a/.github/workflows/hugo.yml +++ b/.github/workflows/hugo.yml @@ -1,4 +1,4 @@ -# Sample workflow for building and deploying a Hugo site to GitHub Pages +# Sample workflow for building and deploying a Hugo site to GitHub Pages name: Platform release to Pages on: @@ -8,24 +8,24 @@ on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: group: "pages" cancel-in-progress: true - -# Default to bash -defaults: - run: - shell: bash - + +# Default to bash +defaults: + run: + shell: bash + jobs: # Verify job (extra checks for platform releases) verify: @@ -44,6 +44,17 @@ jobs: && sudo dpkg -i ${{ runner.temp }}/hugo.deb - name: Install Dart Sass run: sudo snap install dart-sass + - name: Install Rust and Typst + run: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + source "$HOME/.cargo/env" + cargo install --locked typst-cli + echo "$HOME/.cargo/bin" >> $GITHUB_PATH + - name: Render Typst code blocks + run: | + if [ -f scripts/render-typst.sh ]; then + bash scripts/render-typst.sh + fi - name: Build with Hugo (panic on warnings) env: HUGO_ENVIRONMENT: production @@ -62,6 +73,12 @@ jobs: && sudo dpkg -i ${{ runner.temp }}/hugo.deb - name: Install Dart Sass run: sudo snap install dart-sass + - name: Install Rust and Typst + run: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + source "$HOME/.cargo/env" + cargo install --locked typst-cli + echo "$HOME/.cargo/bin" >> $GITHUB_PATH - name: Checkout uses: actions/checkout@v4 with: @@ -72,6 +89,11 @@ jobs: uses: actions/configure-pages@v5 - name: Install Node.js dependencies run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" + - name: Render Typst code blocks + run: | + if [ -f scripts/render-typst.sh ]; then + bash scripts/render-typst.sh + fi - name: Build with Hugo env: HUGO_CACHEDIR: ${{ runner.temp }}/hugo_cache diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml new file mode 100644 index 0000000..3eb1314 --- /dev/null +++ b/.github/workflows/playwright.yml @@ -0,0 +1,27 @@ +name: Playwright Tests +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] +jobs: + test: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + - name: Install dependencies + run: npm ci + - name: Install Playwright Browsers + run: npx playwright install --with-deps + - name: Run Playwright tests + run: npx playwright test + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/.gitignore b/.gitignore index 753e23c..b602d47 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,29 @@ CLAUDE.md GEMINI.md AGENTS.md .claude -.copilot \ No newline at end of file +.copilot + +# Playwright +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ +/playwright/.auth/ + +# Typst / LaTeX +*.pdf +*.aux +*.log +*.out +*.toc +*.synctex.gz +*.fdb_latexmk +*.fls +*.xdv + +# Notes +*.txt# pixi environments +.pixi/* +!.pixi/config.toml +.typst-temp-* diff --git a/README.md b/README.md index a15ed63..49dcee9 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Use `hugo new` with the available archetypes to create new content: ### Blog Posts ```bash -# Structured blog post +# Structured blog post hugo new content/blog/posts/your-post-title.md # Creates a note hugo new content/notes/posts/your-note-title.md @@ -33,3 +33,71 @@ hugo new content/projects/your-project-name.md # Add a publication hugo new content/publications/your-publication-title.md ``` + +## Code Block Rendering + +Control how code blocks are displayed vs rendered using attributes: + +### Mermaid Diagrams +- ` ```mermaid ` - Default: render the diagram +- ` ```mermaid {.raw} ` - Show raw mermaid code (syntax highlighted) + +### Typst Documents +- ` ```typst ` - Default: show raw typst code (syntax highlighted) +- ` ```typst {.render} ` - Compile and show output +- ` ```typst {.side-by-side} ` - Show code and output side by side + +#### Rendering Typst Outputs + +To generate PNG images for Typst code blocks marked with `{.render}` or `{.side-by-side}`: + +```bash +bash scripts/render-typst.sh +``` + +This script will: +- Scan all markdown files for Typst code blocks that need rendering +- Compile them using the Typst CLI to PNG images +- Save outputs to `static/rendered/typst/{page-slug}/typst-{hash}.png` +- Cache previously rendered images (won't re-render if unchanged) + +## Content Publishing Workflow + +### For posts with Typst rendering: + +1. **Create or edit your markdown file:** + ```bash + hugo new content/notes/posts/my-new-post.md + # Edit the file, add Typst code blocks with {.render} or {.side-by-side} + ``` + +2. **Generate Typst PNG outputs:** + ```bash + bash scripts/render-typst.sh + ``` + +3. **Test locally:** + ```bash + hugo server -D + # Visit http://localhost:1313 and verify your content renders correctly + ``` + +4. **Commit and push:** + ```bash + git add content/notes/posts/my-new-post.md + git add static/rendered/typst/my-new-post/ + git commit -m "Add new post with Typst rendering" + git push + ``` + +### For posts without Typst rendering: + +1. Create/edit markdown file +2. Test locally with `hugo server -D` +3. Commit and push + +### Important Notes: +- **Always commit the generated PNG files** - They must be in the repository for GitHub Pages to serve them +- The render script uses caching - only re-renders changed content +- Raw Typst code blocks (` ```typst `) don't need the script, they just show syntax-highlighted code +- Mermaid diagrams work without scripts (rendered client-side) diff --git a/content/notes/posts/typst-env-management.md b/content/notes/posts/typst-env-management.md new file mode 100644 index 0000000..93d8107 --- /dev/null +++ b/content/notes/posts/typst-env-management.md @@ -0,0 +1,460 @@ +--- +title: "Typst Environment Management and Quick Start" +date: 2025-09-29T11:11:08+10:00 +lastmod: 2025-09-29T11:11:08+10:00 +description: "Creating Typst workspace on Linux" +categories: ["technical-notes"] +tags: ["typst", "environment", "academic-writing"] +draft: false +--- + +_I have only started using Typst in my toolchain, traditionally I use LaTeX for academic writing. Currently, this note serves as a "quick start" and where Typst fits in my documentation workflow._ + +## Documentation Hierarchy + +My documentation workflow follows a hierarchy based on audience and formality (this can/will change): + +1. **Personal/Laboratory Notes** (Zero dissemination) + - **Tool**: Obsidian/Markdown + - **Use**: Personal knowledge management, lab notebooks, daily notes, research ideas + - **Output**: Stay in markdown, occasionally export to PDF via Obsidian + +2. **Professional Dissemination** (Internal/semi-formal, formal) + - **Tool**: Typst + - **Use**: Progress reports, meeting agendas, presentations, technical documentation, internal reports + - **Output**: Direct to PDF + - **Why**: Fast compilation, clean output, **simpler than LaTeX** + +3. **Academic Dissemination** (Publication) + - **Tool**: LaTeX + - **Use**: Journal articles, conference papers, thesis chapters + - **Output**: PDF for submission, or LaTeX source if required + - **Why**: Universal journal acceptance, mature ecosystem, required by most publishers +4. **Word.docx** + - Only if I **must**. +# Environment + +1. Fedora Linux 42 +2. cargo 1.89.0 +3. typst 0.13.1 + +## Install typst-cli + +I am assuming [cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html) has been installed. +1. To install typst: + +```bash +cargo install --locked typst-cli +``` +2. Check that it is installed correctly: + +```bash +typst --version +``` + +Expected Output: +```console {.no-copy} +typst 0.13.1 +``` +From here you can use VSCode as the editor, I am using the [tinymist plugin](https://myriad-dreamin.github.io/tinymist/). + +To official typst app is [online only](https://typst.app/pricing/). + +## Basics + +_I am setting all the typst output with page width 10cm and diffent heights to display nicely within this page._ + +### Sections + +```typst {.side-by-side} +#set page(width: 10cm, height: auto) += Introduction +This is a paragraph +``` + +### Lists + +For an unordered list use `-`, for ordered lists use `+` + +```typst {.side-by-side} +#set page(width: 10cm, height: auto) +The following is an undordered list: +- Item 1 +- Item 2 +- Item 3 +This will be an ordered list: ++ Item 1 ++ Item 2 ++ Item 3 +``` + +### Tables + +Creating a basic table, using the [table function](https://typst.app/docs/reference/model/table/): + +```typst {.side-by-side} +#set page(width: 10cm, height: auto) +#table( + columns: 2, + [*Amount*], [*Ingredient*], + [360g], [Baking flour], + [250g], [Butter (room temp.)], + [150g], [Brown sugar], + [100g], [Cane sugar], + [100g], [70% cocoa chocolate], + [100g], [35-40% cocoa chocolate], + [2], [Eggs], + [Pinch], [Salt], + [Drizzle], [Vanilla extract], +) +``` + +#### Table Captions + +By default, Typst places captions below tables. For academic writing, captions should appear above tables. Add this configuration to place table captions at the top: + +```typst {.side-by-side} +// Place table captions above tables +#set page(width: 10cm, height: 19cm) + +== Default caption + +By default, the caption will be at the bottom of the table: + +#figure( + table( + columns: 2, + [*Amount*], [*Ingredient*], + [360g], [Baking flour], + [250g], [Butter (room temp.)], + [150g], [Brown sugar], + [100g], [Cane sugar], + [100g], [70% cocoa chocolate], + [100g], [35-40% cocoa chocolate], + [2], [Eggs], + [Pinch], [Salt], + [Drizzle], [Vanilla extract], + ), + caption: [Table caption appears below the table], +) + +#v(1em) + +== Set caption position + +And now, at the top! + +#show figure.where( + kind: table +): set figure.caption(position: top) + +#figure( + table( + columns: 2, + [*Feature*], [*Value*], + [Speed], [Fast], + [Quality], [High], + ), + caption: [Table caption appears above the table], +) +``` + +### Figures / Images + +Figures are very simple, using the [figure function](https://typst.app/docs/reference/model/figure/) and adding `image` to display an image: + +```typst {.side-by-side} +#set page(width: 10cm, height: auto) + +#figure( + image("tree.jpg", width: 80%), + caption: [A lonely tree.], +) +``` + + +#### Referencing Figures + +To reference figures (or tables) in your text, use the `@` symbol followed by the label you assigned to the figure: + +```typst +#figure( + image("plot.png"), + caption: [Results from experiment A], +) + +As shown in @figure1, the results indicate... +``` + +For example: + +```typst {.side-by-side} +#set page(width: 10cm, height: auto) +@tree shows a figure of a tree. + +#figure( + image("tree.jpg", width: 80%), + caption: [A lonely tree.], +) +``` + +The `@figure1` reference will automatically render as "Figure 1" (or the appropriate number). You can also reference: +- Tables: `@table-label` +- Equations: `@eq-label` +- Any labeled element in your document + +Example with multiple references: + +```typst +We installed typst using cargo @crates_io. + +Our typical day is outlined in @figure1, and results +are summarized in @table1. +``` + +## Example - Basic Article + +An internal whitepaper example, following _loose_ academic journal requirements. + +- Paper size: Letter (8.5" × 11") +- Font size: 10pt +- Margins: Top 0.85in, Left 2.75in (wide for annotations), Footer 0.75in +- Text dimensions: 5.25in width × 8.75in height +- Line numbers: Right side +- Paragraph: 0.5cm indent, ragged right + + +```typst +#set page( + paper: "us-letter", + margin: ( + top: 0.85in, + left: 1.75in, + right: 0.5in, + bottom: 0.85in, + ), + // footer: 0.75in, //this caused an error - need to review +) + +// Text configuration +#set text( + size: 10pt, +) + +// Paragraph configuration +#set par( + first-line-indent: 0.5cm, + justify: false, // ragged right +) + +// Bibliography configuration +#set bibliography(style: "ieee") + +// Table caption configuration - place captions above tables (Vancouver/MLA style) +#show figure.where( + kind: table +): set figure.caption(position: top) + += The impact of typst on scientific writing in Digital Health + +#v(1em) // vertical space, same as \vspace in LaTeX + +#grid( + columns: (1fr, 1fr), + align(center)[ + Rudolf J Schnetler \ + The University of Queensland \ + #link("mailto:r.schnetler@uq.edu.au") + ], + align(center)[ + Dr. John Collaborator \ + The University of Queensland \ + #link("mailto:c.collaborator@uq.edu.au") + ] +) + +#v(1em) + +#align(center)[ + #set par(justify: false) + *Abstract* \ + Typst is a new typesetting system that aims to improve the scientific writing process. This article explores its features, advantages, and potential impact on the field of Digital Health. +] + +#v(1em) + +== Introduction + +Typst is a modern, fast typesetting system for technical and academic documents. Start with the +#link("https://typst.app/docs/")[official documentation]. + +For reproducible builds across machines, use a per‑project environment manager such as typstenv. It lets +you pin the Typst version, manage dependencies, and create isolated project environments, making +collaboration and CI safer and repeatable. + +== Materials & Methods + +We installed typst using cargo @crates_io. + +We also used some math: + + +$ A = pi r^2 $ + + +And our typical day outlined in @fig1. +#figure( + image("sine_is_life.png"), + caption: [*The Function of Life.* A sinusoidal representation of daily happiness levels from 6am to 10pm, showing key life events and their impact on well-being throughout a typical day.], +) + +== Results + +The main features of typst include a user-friendly syntax, powerful layout capabilities, and seamless integration with other tools. These features make it easier for researchers to create high-quality documents quickly and efficiently. + +#figure( + table( + columns: 4, + table.header( + [*Feature*], [*Typst*], [*LaTeX*], [*Word*], + ), + [Compilation Speed], [Fast], [Slow], [N/A], + [Learning Curve], [Low], [High], [Low], + [Version Control], [Excellent], [Excellent], [Poor], + [Mathematical Typesetting], [Good], [Excellent], [Fair], + ), + caption: [*Comparison of document preparation systems.* Feature comparison across three commonly used document preparation systems for academic writing.], +) + +== Discussion + +The results of our study indicate that typst has the potential to significantly improve the scientific writing process in Digital Health. Its user-friendly interface and powerful features make it an attractive option for researchers and practitioners alike. + +== Conclusion + +In conclusion, typst represents a promising advancement in the field of scientific writing. By streamlining the writing process and enhancing collaboration, it has the potential to improve the quality and efficiency of research in Digital Health. + +#bibliography("references.bib") + +``` + +```typst {.render} +#set page( + paper: "us-letter", + margin: ( + top: 0.85in, + left: 1.75in, + right: 0.5in, + bottom: 0.85in, + ), + // footer: 0.75in, //this caused an error - need to review +) + +// Text configuration +#set text( + size: 10pt, +) + +// Paragraph configuration +#set par( + first-line-indent: 0.5cm, + justify: false, // ragged right +) + +// Bibliography configuration +#set bibliography(style: "ieee") + +// Table caption configuration - place captions above tables (Vancouver/MLA style) +#show figure.where( + kind: table +): set figure.caption(position: top) + += The impact of typst on scientific writing in Digital Health + +#v(1em) // vertical space, same as \vspace in LaTeX + +#grid( + columns: (1fr, 1fr), + align(center)[ + Rudolf J Schnetler \ + The University of Queensland \ + #link("mailto:r.schnetler@uq.edu.au") + ], + align(center)[ + Dr. John Collaborator \ + The University of Queensland \ + #link("mailto:c.collaborator@uq.edu.au") + ] +) + +#v(1em) + +#align(center)[ + #set par(justify: false) + *Abstract* \ + Typst is a new typesetting system that aims to improve the scientific writing process. This article explores its features, advantages, and potential impact on the field of Digital Health. +] + +#v(1em) + +== Introduction + +Typst is a modern, fast typesetting system for technical and academic documents. Start with the +#link("https://typst.app/docs/")[official documentation]. + +For reproducible builds across machines, use a per‑project environment manager such as typstenv. It lets +you pin the Typst version, manage dependencies, and create isolated project environments, making +collaboration and CI safer and repeatable. + +== Materials & Methods + +We installed typst using cargo @crates_io. + +We also used some math: + + +$ A = pi r^2 $ + + +And our typical day outlined in @fig1. +#figure( + image("sine_is_life.png"), + caption: [*The Function of Life.* A sinusoidal representation of daily happiness levels from 6am to 10pm, showing key life events and their impact on well-being throughout a typical day.], +) + +== Results + +The main features of typst include a user-friendly syntax, powerful layout capabilities, and seamless integration with other tools. These features make it easier for researchers to create high-quality documents quickly and efficiently. + +#figure( + table( + columns: 4, + table.header( + [*Feature*], [*Typst*], [*LaTeX*], [*Word*], + ), + [Compilation Speed], [Fast], [Slow], [N/A], + [Learning Curve], [Low], [High], [Low], + [Version Control], [Excellent], [Excellent], [Poor], + [Mathematical Typesetting], [Good], [Excellent], [Fair], + ), + caption: [*Comparison of document preparation systems.* Feature comparison across three commonly used document preparation systems for academic writing.], +) + +== Discussion + +The results of our study indicate that typst has the potential to significantly improve the scientific writing process in Digital Health. Its user-friendly interface and powerful features make it an attractive option for researchers and practitioners alike. + +== Conclusion + +In conclusion, typst represents a promising advancement in the field of scientific writing. By streamlining the writing process and enhancing collaboration, it has the potential to improve the quality and efficiency of research in Digital Health. + +#bibliography("references.bib") + +``` + + +## References + +1. [Writing in typst](https://typst.app/docs/tutorial/writing-in-typst/) +2. [Guide for LaTex Users](https://typst.app/docs/guides/guide-for-latex-users/) +3. [Typst Table Guide](https://typst.app/docs/guides/table-guide/) \ No newline at end of file diff --git a/layouts/_default/_markup/render-codeblock-mermaid.html b/layouts/_default/_markup/render-codeblock-mermaid.html index c9d810c..3157f40 100644 --- a/layouts/_default/_markup/render-codeblock-mermaid.html +++ b/layouts/_default/_markup/render-codeblock-mermaid.html @@ -1,4 +1,10 @@ -
-  {{- .Inner | safeHTML }}
-
-{{ .Page.Store.Set "hasMermaid" true }} \ No newline at end of file +{{ if in .Attributes.class "raw" }} + {{/* Show raw mermaid code with consistent unsupported language formatting */}} +
{{- .Inner -}}
+{{ else }} + {{/* Render the mermaid diagram */}} +
+    {{- .Inner | safeHTML }}
+  
+ {{ .Page.Store.Set "hasMermaid" true }} +{{ end }} \ No newline at end of file diff --git a/layouts/_default/_markup/render-codeblock-typst.html b/layouts/_default/_markup/render-codeblock-typst.html new file mode 100644 index 0000000..75102ed --- /dev/null +++ b/layouts/_default/_markup/render-codeblock-typst.html @@ -0,0 +1,41 @@ +{{ $id := printf "typst-%d" (hash.FNV32a .Inner) }} +{{ $pageSlug := .Page.File.ContentBaseName }} + +{{ if in .Attributes.class "render" }} + {{/* Render only the output */}} +
+
+ {{ $pngPath := printf "/rendered/typst/%s/%s.png" $pageSlug $id }} + {{ $pdfPath := printf "/rendered/typst/%s/%s.pdf" $pageSlug $id }} + {{ if fileExists (printf "static%s" $pngPath) }} + Typst output + {{ else if fileExists (printf "static%s" $pdfPath) }} + + {{ end }} +
+
{{- .Inner -}}
+

Note: Typst rendering requires compilation. Output will be generated during build.

+
+
+
+ {{ .Page.Store.Set "hasTypst" true }} + +{{ else if in .Attributes.class "side-by-side" }} + {{/* Show code and output side by side */}} +
+
+
{{- .Inner -}}
+
+
+ Typst output +
+

Note: Typst rendering requires compilation. Output will be generated during build.

+
+
+
+ {{ .Page.Store.Set "hasTypst" true }} + +{{ else }} + {{/* Default: Show raw typst code with consistent unsupported language formatting */}} +
{{- .Inner -}}
+{{ end }} \ No newline at end of file diff --git a/layouts/_default/_markup/render-image.html b/layouts/_default/_markup/render-image.html new file mode 100644 index 0000000..7aa5c89 --- /dev/null +++ b/layouts/_default/_markup/render-image.html @@ -0,0 +1 @@ +{{ .Text }} \ No newline at end of file diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index 352e90d..89d4a53 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -302,125 +302,344 @@ {{ end }} - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -661,7 +941,7 @@ -
+
{{ block "main" . }}{{ end }}
@@ -700,5 +980,168 @@ }); {{ end }} + + + {{ if .Page.Store.Get "hasMermaid" }} + + + {{ end }} + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..fb56ec5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,97 @@ +{ + "name": "rudolfjs.github.io", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rudolfjs.github.io", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@playwright/test": "^1.55.1", + "@types/node": "^24.6.0" + } + }, + "node_modules/@playwright/test": { + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.1.tgz", + "integrity": "sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.55.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/node": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.0.tgz", + "integrity": "sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.13.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.1.tgz", + "integrity": "sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.55.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.1.tgz", + "integrity": "sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/undici-types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", + "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c051861 --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "rudolfjs.github.io", + "version": "1.0.0", + "description": "Rudolf J profile hosted using GitHub Pages.", + "main": "index.js", + "directories": { + "test": "tests" + }, + "scripts": { + "test": "playwright test", + "test:headed": "playwright test --headed", + "test:debug": "playwright test --debug", + "test:ui": "playwright test --ui", + "test:report": "playwright show-report" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/rudolfjs/rudolfjs.github.io.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "bugs": { + "url": "https://github.com/rudolfjs/rudolfjs.github.io/issues" + }, + "homepage": "https://github.com/rudolfjs/rudolfjs.github.io#readme", + "devDependencies": { + "@playwright/test": "^1.55.1", + "@types/node": "^24.6.0" + } +} diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 0000000..d809a79 --- /dev/null +++ b/pixi.lock @@ -0,0 +1,2783 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.1-h48c9088_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.2-he7b75e1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.4-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h92c474e_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.6-h82d11aa_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.4-h94feff3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.22.0-h57f3b0d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.3-h2b1cf8c_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.8.6-h4e5ac4b_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h92c474e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-h92c474e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.34.4-h60c762c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.606-h32384e2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.0-h3a458e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.12.0-ha729027_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.14.0-hb1c9500_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.10.0-h4bb41a7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-h8b27e44_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb03c661_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313h7037e92_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/duckdb-1.3.2-hca7485f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py313h3dea7bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.0.0-h15599e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py313hc8edb43_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-21.0.0-h73424eb_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-21.0.0-h635bf11_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-21.0.0-h8c2c5c3_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-21.0.0-h635bf11_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-21.0.0-h3f74fd7_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-36_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb03c661_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-36_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.2-default_h99862b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-21.1.2-default_h746c552_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.39.0-hdb79228_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.39.0-hdbdcf42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.73.1-h1e535eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-36_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.2-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hb9b0907_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-21.0.0-h790f06f_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.0-h3675c94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h9ef548d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.08.12-h7b12aa8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h8261f1e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.0-hb04c3b8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.313.0-h5279c79_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.11.0-hca5e8e5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.6-py313h78bf25f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py313h683a580_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py313hf6604e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.2.0-h1bc01a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py313ha492abd_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-21.0.0-py313h78bf25f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-21.0.0-py313he109ebe_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.2-py313h85046ba_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.7-h2b335a9_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-duckdb-1.3.2-py313h7033f15_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.2-h5c1c036_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.08.12-h5301d42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.26-h5ac9029_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: ./ +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.14-hb9d3cd8_0.conda + sha256: b9214bc17e89bf2b691fad50d952b7f029f6148f4ac4fe7c60c08f093efdf745 + md5: 76df83c2a9035c54df5d04ff81bcc02d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + license_family: GPL + purls: [] + size: 566531 + timestamp: 1744668655747 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.1-h48c9088_3.conda + sha256: e9c3dece30c12dfac995a8386bd2d1225d0b5f14c0753fcf4fef086047f77048 + md5: afdbdbe7f786f47a36a51fdc2fe91210 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-cal >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.22.0,<0.22.1.0a0 + - aws-c-http >=0.10.4,<0.10.5.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-common >=0.12.4,<0.12.5.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 122946 + timestamp: 1757625693207 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.2-he7b75e1_1.conda + sha256: 30ecca069fdae0aa6a8bb64c47eb5a8d9a7bef7316181e8cbb08b7cb47d8b20f + md5: c04d1312e7feec369308d656c18e7f3e + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.4,<0.12.5.0a0 + - libgcc >=14 + - openssl >=3.5.1,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 50942 + timestamp: 1752240577225 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.4-hb03c661_0.conda + sha256: 6c9e1b9e82750c39ac0251dcfbeebcbb00a1af07c0d7e3fb1153c4920da316eb + md5: ae5621814cb99642c9308977fe90ed0d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 236420 + timestamp: 1752193614294 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h92c474e_6.conda + sha256: 154d4a699f4d8060b7f2cec497a06e601cbd5c8cde6736ced0fb7e161bc6f1bb + md5: 3490e744cb8b9d5a3b9785839d618a17 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.12.4,<0.12.5.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 22116 + timestamp: 1752240005329 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.6-h82d11aa_3.conda + sha256: 849d645bf5c7923d9b0d4ba02050714c856495e34b0328b46c0c968045691117 + md5: a6374ed86387e0b1967adc8d8988db86 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - aws-c-io >=0.22.0,<0.22.1.0a0 + - aws-c-common >=0.12.4,<0.12.5.0a0 + - aws-checksums >=0.2.7,<0.2.8.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 58941 + timestamp: 1757606335645 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.4-h94feff3_3.conda + sha256: ce1fb6eb7a3bb633112b334647382c4a28a1bf85ab7b02b53a34aebc984a8e89 + md5: 8dd69714ac24879be0865676eb333f6b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-cal >=0.9.2,<0.9.3.0a0 + - aws-c-compression >=0.3.1,<0.3.2.0a0 + - aws-c-io >=0.22.0,<0.22.1.0a0 + - aws-c-common >=0.12.4,<0.12.5.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 224208 + timestamp: 1757610690937 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.22.0-h57f3b0d_1.conda + sha256: 3dc378afddcdaf4179daccba1ef0b755eea264ff739ceab1d499b271340ea874 + md5: 2de3494a513d360155b7f4da7b017840 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-cal >=0.9.2,<0.9.3.0a0 + - s2n >=1.5.26,<1.5.27.0a0 + - aws-c-common >=0.12.4,<0.12.5.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 180809 + timestamp: 1758212800114 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.3-h2b1cf8c_6.conda + sha256: e4d782791591d6d19e1ea196e1f9494a4c30b0a052555648b64098a682ce9703 + md5: 7bb5e26afec09a59283ec1783798d74a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.12.4,<0.12.5.0a0 + - aws-c-io >=0.22.0,<0.22.1.0a0 + - aws-c-http >=0.10.4,<0.10.5.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 216041 + timestamp: 1757626689282 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.8.6-h4e5ac4b_5.conda + sha256: 2e1fdbcbb3da881ae0eb381697f4f1ece2bd9f534b05e7ed9f21b0e6cbac6f32 + md5: 1557911474d926a8bd7b32a5f02bba35 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.2,<4.0a0 + - aws-c-http >=0.10.4,<0.10.5.0a0 + - aws-c-common >=0.12.4,<0.12.5.0a0 + - aws-checksums >=0.2.7,<0.2.8.0a0 + - aws-c-io >=0.22.0,<0.22.1.0a0 + - aws-c-auth >=0.9.1,<0.9.2.0a0 + - aws-c-cal >=0.9.2,<0.9.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 137467 + timestamp: 1757647972268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h92c474e_1.conda + sha256: a9e071a584be0257b2ec6ab6e1f203e9d6b16d2da2233639432727ffbf424f3d + md5: 4ab554b102065910f098f88b40163835 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.12.4,<0.12.5.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 59146 + timestamp: 1752240966518 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-h92c474e_2.conda + sha256: 7168007329dfb1c063cd5466b33a1f2b8a28a00f587a0974d97219432361b4db + md5: 248831703050fe9a5b2680a7589fdba9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.12.4,<0.12.5.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 76748 + timestamp: 1752241068761 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.34.4-h60c762c_0.conda + sha256: 4fce59fd1fc9848cb060e9ad59f0934ff848ca06455eb487ea52152d7299b7ed + md5: d41cf259f1b3e2a2347b11b98f64623d + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-io >=0.22.0,<0.22.1.0a0 + - aws-c-common >=0.12.4,<0.12.5.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-s3 >=0.8.6,<0.8.7.0a0 + - aws-c-http >=0.10.4,<0.10.5.0a0 + - aws-c-event-stream >=0.5.6,<0.5.7.0a0 + - aws-c-mqtt >=0.13.3,<0.13.4.0a0 + - aws-c-cal >=0.9.2,<0.9.3.0a0 + - aws-c-auth >=0.9.1,<0.9.2.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 408260 + timestamp: 1758141985203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.606-h32384e2_4.conda + sha256: 9ec76250145458fed50f02ac26af254c90a90d49249649e0eb81f9ddb6176384 + md5: 31067fbcb4ddfd76bc855532cc228568 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.34.4,<0.34.5.0a0 + - aws-c-event-stream >=0.5.6,<0.5.7.0a0 + - aws-c-common >=0.12.4,<0.12.5.0a0 + - libcurl >=8.14.1,<9.0a0 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 3367060 + timestamp: 1758606136188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.0-h3a458e0_1.conda + sha256: a1f1be2e34a2e331899a69b642e8bda1e66002bda3b611d70141a43c397181ca + md5: 682cb082bbd998528c51f1e77d9ce415 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.14.1,<9.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 351962 + timestamp: 1758035811172 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.12.0-ha729027_0.conda + sha256: 734857814400585dca2bee2a4c2e841bc89c143bf0dcc11b4c7270cea410650c + md5: 3dab8d6fa3d10fe4104f1fbe59c10176 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.0,<1.16.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 241853 + timestamp: 1753212593417 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.14.0-hb1c9500_1.conda + sha256: 83cea4a570a457cc18571c92d7927e6cc4ea166f0f819f0b510d4e2c8daf112d + md5: 30da390c211967189c58f83ab58a6f0c + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.0,<1.16.1.0a0 + - azure-storage-common-cpp >=12.10.0,<12.10.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 577592 + timestamp: 1753219590665 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.10.0-h4bb41a7_3.conda + sha256: c73806006c2c92aee3c45456d243a3c61a51f42a0cbb6f82e6b2877a2f9ff04c + md5: 1efaf34774bfb92ecf2fa8fa985b2752 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.0,<1.16.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.5 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 149403 + timestamp: 1757359303437 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-h8b27e44_3.conda + sha256: aec2e2362a605e37a38c4b34f191e98dd33fdc64ce4feebd60bd0b4d877ab36b + md5: 7b738aea4f1b8ae2d1118156ad3ae993 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.0,<1.16.1.0a0 + - azure-storage-blobs-cpp >=12.14.0,<12.14.1.0a0 + - azure-storage-common-cpp >=12.10.0,<12.10.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 299871 + timestamp: 1753226720130 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb03c661_4.conda + sha256: 294526a54fa13635341729f250d0b1cf8f82cad1e6b83130304cbf3b6d8b74cc + md5: eaf3fbd2aa97c212336de38a51fe404e + depends: + - __glibc >=2.17,<3.0.a0 + - brotli-bin 1.1.0 hb03c661_4 + - libbrotlidec 1.1.0 hb03c661_4 + - libbrotlienc 1.1.0 hb03c661_4 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 19883 + timestamp: 1756599394934 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda + sha256: 444903c6e5c553175721a16b7c7de590ef754a15c28c99afbc8a963b35269517 + md5: ca4ed8015764937c81b830f7f5b68543 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlidec 1.1.0 hb03c661_4 + - libbrotlienc 1.1.0 hb03c661_4 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 19615 + timestamp: 1756599385418 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 260341 + timestamp: 1757437258798 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + sha256: f8003bef369f57396593ccd03d08a8e21966157269426f71e943f96e4b579aeb + md5: f7f0d6cc2dc986d42ac2689ec88192be + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 206884 + timestamp: 1744127994291 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 + md5: 74784ee3d225fc3dca89edb635b4e5cc + depends: + - __unix + license: ISC + purls: [] + size: 154402 + timestamp: 1754210968730 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda + sha256: 3bd6a391ad60e471de76c0e9db34986c4b5058587fbf2efa5a7f54645e28c2c7 + md5: 09262e66b19567aff4f592fb53b28760 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.47,<1.7.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.44.2,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.5,<2.0a0 + - xorg-libx11 >=1.8.11,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + size: 978114 + timestamp: 1741554591855 +- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313h7037e92_2.conda + sha256: 5c31b1113f9e5a21bb6c2434795e10c8ee52e82dbc533fa4ec3041b5a28ea7fa + md5: 6c8b4c12099023fcd85e520af74fd755 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.25 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 296706 + timestamp: 1756544800085 +- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + sha256: 9827efa891e507a91a8a2acf64e210d2aff394e1cde432ad08e1f8c66b12293c + md5: 44600c4667a319d67dbe0681fc0bc833 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cycler?source=hash-mapping + size: 13399 + timestamp: 1733332563512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda + sha256: ee09ad7610c12c7008262d713416d0b58bf365bc38584dce48950025850bdf3f + md5: cae723309a49399d2949362f4ab5c9e4 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libntlm >=1.8,<2.0a0 + - libstdcxx >=13 + - libxcrypt >=4.4.36 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause-Attribution + license_family: BSD + purls: [] + size: 209774 + timestamp: 1750239039316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + sha256: 3b988146a50e165f0fa4e839545c679af88e4782ec284cc7b6d07dd226d6a068 + md5: 679616eb5ad4e521c83da4650860aba7 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libexpat >=2.7.0,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.84.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 437860 + timestamp: 1747855126005 +- conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.1-h5888daf_0.conda + sha256: 1bcc132fbcc13f9ad69da7aa87f60ea41de7ed4d09f3a00ff6e0e70e1c690bc2 + md5: bfd56492d8346d669010eccafe0ba058 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 69544 + timestamp: 1739569648873 +- conda: https://conda.anaconda.org/conda-forge/noarch/duckdb-1.3.2-hca7485f_0.conda + sha256: 41bf20cce21c5c6038c7d97902c0abb2500e59e1bad88cc120c7e4bcb15d99fd + md5: 0b31523d50b15f95e071712b9f803aed + depends: + - python-duckdb >=1.3.2,<1.3.3.0a0 + license: MIT + license_family: MIT + purls: [] + size: 8852 + timestamp: 1752087395717 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 397370 + timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + purls: [] + size: 96530 + timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + purls: [] + size: 700814 + timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + purls: [] + size: 1620504 + timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 + md5: 8f5b0b297b59e1ac160ad4beec99dbee + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 265599 + timestamp: 1730283881107 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3667 + timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 + md5: f766549260d6815b0c52253f1fb1bb29 + depends: + - font-ttf-dejavu-sans-mono + - font-ttf-inconsolata + - font-ttf-source-code-pro + - font-ttf-ubuntu + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4102 + timestamp: 1566932280397 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py313h3dea7bd_0.conda + sha256: 063df49ae505478a6904f137a49ca4caf1afeccdc582133be231b0bc15601427 + md5: 904860fc0d57532d28e9c6c4501f19a9 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli + - libgcc >=14 + - munkres + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=compressed-mapping + size: 2927817 + timestamp: 1759187293931 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + sha256: bf8e4dffe46f7d25dc06f31038cacb01672c47b9f45201f065b0f4d00ab0a83e + md5: 4afc585cd97ba8a23809406cd8a9eda8 + depends: + - libfreetype 2.14.1 ha770c72_0 + - libfreetype6 2.14.1 h73754d4_0 + license: GPL-2.0-only OR FTL + purls: [] + size: 173114 + timestamp: 1757945422243 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c + md5: 2cd94587f3a401ae05e03a6caf09539d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 99596 + timestamp: 1755102025473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.0.0-h15599e2_0.conda + sha256: 72c7db250fa0817ecc4b528f5aea9bba78214b72848b802a03a986976fd6a482 + md5: f51141497ab3059b7529304deb6ef9d7 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.7.1,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: MIT + purls: [] + size: 2409486 + timestamp: 1759198318078 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: b38117a3c920364aff79f870c984b4a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + purls: [] + size: 134088 + timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py313hc8edb43_1.conda + sha256: 1a046c37e54239efc2768ce4a2fbaf721314cda3ef8358e85c8e544b5e4b133a + md5: 87215c60837a8494bf3453d08b404eed + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 77227 + timestamp: 1756467528380 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 + md5: 000e85703f0fd9594c81710dd5066471 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + size: 248046 + timestamp: 1739160907615 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda + sha256: 707dfb8d55d7a5c6f95c772d778ef07a7ca85417d9971796f7d3daad0b615de8 + md5: 14bae321b8127b63cba276bd53fac237 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.44 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 747158 + timestamp: 1758810907507 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + sha256: 412381a43d5ff9bbed82cd52a0bbca5b90623f62e41007c9c42d3870c60945ff + md5: 9344155d33912347b37f0ae6c410a835 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 264243 + timestamp: 1745264221534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda + sha256: dcd1429a1782864c452057a6c5bc1860f2b637dc20a2b7e6eacd57395bbceff8 + md5: 83b160d4da3e1e847bf044997621ed63 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20250512.1=cxx17* + - abseil-cpp =20250512.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1310612 + timestamp: 1750194198254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-21.0.0-h73424eb_6_cpu.conda + build_number: 6 + sha256: 3f30d362ca1f0e1e245f5166f8b43cf6c14cd91afd991cbc94b867b495aa945d + md5: be902e5f83fc6fc04b982b42c69c6df3 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.34.4,<0.34.5.0a0 + - aws-sdk-cpp >=1.11.606,<1.11.607.0a0 + - azure-core-cpp >=1.16.0,<1.16.1.0a0 + - azure-identity-cpp >=1.12.0,<1.12.1.0a0 + - azure-storage-blobs-cpp >=12.14.0,<12.14.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20250512.1,<20250513.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=14 + - libgoogle-cloud >=2.39.0,<2.40.0a0 + - libgoogle-cloud-storage >=2.39.0,<2.40.0a0 + - libopentelemetry-cpp >=1.21.0,<1.22.0a0 + - libprotobuf >=6.31.1,<6.31.2.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.2.0,<2.2.1.0a0 + - snappy >=1.2.2,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 6504951 + timestamp: 1758728303665 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-21.0.0-h635bf11_6_cpu.conda + build_number: 6 + sha256: 25734d30db69e0c538af13e97b40b20a2ae2437145e2c7902aaa74080c04014a + md5: 327560b3e83d90bcb967e7ec8753e284 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 21.0.0 h73424eb_6_cpu + - libarrow-compute 21.0.0 h8c2c5c3_6_cpu + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 659098 + timestamp: 1758728482002 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-21.0.0-h8c2c5c3_6_cpu.conda + build_number: 6 + sha256: 6803d7c51100baccadd368836be41820414301262079b51f291a6100f8b87dd6 + md5: ea69d06ceb6ca5d6a37343ce4ec86952 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 21.0.0 h73424eb_6_cpu + - libgcc >=14 + - libre2-11 >=2025.8.12 + - libstdcxx >=14 + - libutf8proc >=2.11.0,<2.12.0a0 + - re2 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 3129251 + timestamp: 1758728366515 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-21.0.0-h635bf11_6_cpu.conda + build_number: 6 + sha256: 6b191d241ccd9ebe305d6ef9292e60f165a3e40f9e66a8eccc6608e9129dbee5 + md5: d0e284d8c9e9eae4dce492713cb2ac61 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 21.0.0 h73424eb_6_cpu + - libarrow-acero 21.0.0 h635bf11_6_cpu + - libarrow-compute 21.0.0 h8c2c5c3_6_cpu + - libgcc >=14 + - libparquet 21.0.0 h790f06f_6_cpu + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 630062 + timestamp: 1758728557197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-21.0.0-h3f74fd7_6_cpu.conda + build_number: 6 + sha256: 945d126283c6857c234c245e7ef0dc3bc60012c28aa2ac5472187f538b5a900d + md5: e53e93711bab1b156729de4e5c1026aa + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20250512.1,<20250513.0a0 + - libarrow 21.0.0 h73424eb_6_cpu + - libarrow-acero 21.0.0 h635bf11_6_cpu + - libarrow-dataset 21.0.0 h635bf11_6_cpu + - libgcc >=14 + - libprotobuf >=6.31.1,<6.31.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 514767 + timestamp: 1758728582531 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-36_h4a7cf45_openblas.conda + build_number: 36 + sha256: a1670eb8c9293f37a245e313bd9d72a301c79e8668a6a5d418c90335719fbaff + md5: 2a6122504dc8ea139337046d34a110cb + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - liblapacke 3.9.0 36*_openblas + - blas 2.136 openblas + - liblapack 3.9.0 36*_openblas + - mkl <2025 + - libcblas 3.9.0 36*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17421 + timestamp: 1758396490057 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda + sha256: 2338a92d1de71f10c8cf70f7bb9775b0144a306d75c4812276749f54925612b6 + md5: 1d29d2e33fe59954af82ef54a8af3fe1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 69333 + timestamp: 1756599354727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda + sha256: fcec0d26f67741b122f0d5eff32f0393d7ebd3ee6bb866ae2f17f3425a850936 + md5: 5cb5a1c9a94a78f5b23684bcb845338d + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb03c661_4 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 33406 + timestamp: 1756599364386 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb03c661_4.conda + sha256: d42c7f0afce21d5279a0d54ee9e64a2279d35a07a90e0c9545caae57d6d7dc57 + md5: 2e55011fa483edb8bfe3fd92e860cd79 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb03c661_4 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 289680 + timestamp: 1756599375485 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-36_h0358290_openblas.conda + build_number: 36 + sha256: 45110023d1661062288168c6ee01510bcb472ba2f5184492acdcdd3d1af9b58d + md5: 13a3fe5f9812ac8c5710ef8c03105121 + depends: + - libblas 3.9.0 36_h4a7cf45_openblas + constrains: + - liblapacke 3.9.0 36*_openblas + - blas 2.136 openblas + - liblapack 3.9.0 36*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17401 + timestamp: 1758396499759 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.2-default_h99862b1_0.conda + sha256: 61aa5bb5f2e61cfdb2a3d66ea72f829a1a7056674acd002f5bf0de1c0e39b29e + md5: 4ddb1793f7c9493e24f2034ff0a19cff + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libllvm21 >=21.1.2,<21.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 21082467 + timestamp: 1758875974778 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-21.1.2-default_h746c552_0.conda + sha256: f14eb6df9de14f991c4c652794243c2fbd137a77bb93e341f89a426deb30e687 + md5: f1a8955f73d2eb209666739946a8b517 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libllvm21 >=21.1.2,<21.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 12344958 + timestamp: 1758876158891 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda + sha256: cb83980c57e311783ee831832eb2c20ecb41e7dee6e86e8b70b8cef0e43eab55 + md5: d4a250da4737ee127fb1fa6452a9002e + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 4523621 + timestamp: 1749905341688 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + sha256: b6c5cf340a4f80d70d64b3a29a7d9885a5918d16a5cb952022820e6d3e79dc8b + md5: 45f6713cb00f124af300342512219182 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + size: 449910 + timestamp: 1749033146806 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda + sha256: 8420748ea1cc5f18ecc5068b4f24c7a023cc9b20971c99c824ba10641fb95ddf + md5: 64f0c503da58ec25ebd359e4d990afa8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 72573 + timestamp: 1747040452262 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501 + md5: 9314bc5a1fe7d1044dc9dfd3ef400535 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpciaccess >=0.18,<0.19.0a0 + license: MIT + license_family: MIT + purls: [] + size: 310785 + timestamp: 1757212153962 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723 + md5: c151d5eb730e9b7480e6d48c0fc44048 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 44840 + timestamp: 1731330973553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 74811 + timestamp: 1752719572741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 57433 + timestamp: 1743434498161 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda + sha256: 4641d37faeb97cf8a121efafd6afd040904d4bca8c46798122f417c31d5dfbec + md5: f4084e4e6577797150f9b04a4560ceb0 + depends: + - libfreetype6 >=2.14.1 + license: GPL-2.0-only OR FTL + purls: [] + size: 7664 + timestamp: 1757945417134 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + sha256: 4a7af818a3179fafb6c91111752954e29d3a2a950259c14a2fc7ba40a8b03652 + md5: 8e7251989bca326a28f4a5ffbd74557a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.50,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - freetype >=2.14.1 + license: GPL-2.0-only OR FTL + purls: [] + size: 386739 + timestamp: 1757945416744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + sha256: 0caed73aac3966bfbf5710e06c728a24c6c138605121a3dacb2e03440e8baa6a + md5: 264fbfba7fb20acf3b29cde153e345ce + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.1.0 h767d61c_5 + - libgcc-ng ==15.1.0=*_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 824191 + timestamp: 1757042543820 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + sha256: f54bb9c3be12b24be327f4c1afccc2969712e0b091cdfbd1d763fb3e61cda03f + md5: 069afdf8ea72504e48d23ae1171d951c + depends: + - libgcc 15.1.0 h767d61c_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29187 + timestamp: 1757042549554 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda + sha256: 4c1a526198d0d62441549fdfd668cc8e18e77609da1e545bdcc771dd8dc6a990 + md5: 0c91408b3dec0b97e8a3c694845bd63b + depends: + - libgfortran5 15.1.0 hcea5267_5 + constrains: + - libgfortran-ng ==15.1.0=*_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29169 + timestamp: 1757042575979 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda + sha256: 9d06adc6d8e8187ddc1cad87525c690bc8202d8cb06c13b76ab2fc80a35ed565 + md5: fbd4008644add05032b6764807ee2cba + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.1.0 + constrains: + - libgfortran 15.1.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1564589 + timestamp: 1757042559498 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d + md5: 928b8be80851f5d8ffb016f9c81dae7a + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - libglx 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 134712 + timestamp: 1731330998354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda + sha256: 33336bd55981be938f4823db74291e1323454491623de0be61ecbe6cf3a4619c + md5: b8e4c93f4ab70c3b6f6499299627dbdc + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + purls: [] + size: 3978602 + timestamp: 1757403291664 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 + md5: 434ca7e50e40f4918ab701e3facd59a0 + depends: + - __glibc >=2.17,<3.0.a0 + license: LicenseRef-libglvnd + purls: [] + size: 132463 + timestamp: 1731330968309 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7 + md5: c8013e438185f33b13814c5c488acd5c + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + license: LicenseRef-libglvnd + purls: [] + size: 75504 + timestamp: 1731330988898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda + sha256: 125051d51a8c04694d0830f6343af78b556dd88cc249dfec5a97703ebfb1832d + md5: dcd5ff1940cd38f6df777cac86819d60 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 447215 + timestamp: 1757042483384 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.39.0-hdb79228_0.conda + sha256: d3341cf69cb02c07bbd1837968f993da01b7bd467e816b1559a3ca26c1ff14c5 + md5: a2e30ccd49f753fd30de0d30b1569789 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20250512.1,<20250513.0a0 + - libcurl >=8.14.1,<9.0a0 + - libgcc >=14 + - libgrpc >=1.73.1,<1.74.0a0 + - libprotobuf >=6.31.1,<6.31.2.0a0 + - libstdcxx >=14 + - openssl >=3.5.1,<4.0a0 + constrains: + - libgoogle-cloud 2.39.0 *_0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1307909 + timestamp: 1752048413383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.39.0-hdbdcf42_0.conda + sha256: 59eb8365f0aee384f2f3b2a64dcd454f1a43093311aa5f21a8bb4bd3c79a6db8 + md5: bd21962ff8a9d1ce4720d42a35a4af40 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=14 + - libgoogle-cloud 2.39.0 hdb79228_0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + purls: [] + size: 804189 + timestamp: 1752048589800 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.73.1-h1e535eb_0.conda + sha256: f91e61159bf2cb340884ec92dd6ba42a620f0f73b68936507a7304b7d8445709 + md5: 8075d8550f773a17288c7ec2cf2f2d56 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.5,<2.0a0 + - libabseil * cxx17* + - libabseil >=20250512.1,<20250513.0a0 + - libgcc >=13 + - libprotobuf >=6.31.1,<6.31.2.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.1,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.73.1 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 8408884 + timestamp: 1751746547271 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + purls: [] + size: 790176 + timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + sha256: 98b399287e27768bf79d48faba8a99a2289748c65cd342ca21033fab1860d4a4 + md5: 9fa334557db9f63da6c9285fd2a48638 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 628947 + timestamp: 1745268527144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-36_h47877c9_openblas.conda + build_number: 36 + sha256: 1bbd142b34dfc8cb55e1e37c00e78ebba909542ac1054d22fc54843a94797337 + md5: 55daaac7ecf8ebd169cdbe34dc79549e + depends: + - libblas 3.9.0 36_h4a7cf45_openblas + constrains: + - liblapacke 3.9.0 36*_openblas + - libcblas 3.9.0 36*_openblas + - blas 2.136 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17409 + timestamp: 1758396509549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.2-hf7376ad_0.conda + sha256: 8a18dc5e1d46cb2be46658c3c8c5afba2a3ca9866c679d4a310084d257d7c24f + md5: 85ccb5afca5e1fa67364ea19154e8148 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 44347174 + timestamp: 1758823362425 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 112894 + timestamp: 1749230047870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 91183 + timestamp: 1748393666725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 + md5: b499ce4b026493a13774bcf0f4c33849 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.5,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 666600 + timestamp: 1756834976695 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda + sha256: 3b3f19ced060013c2dd99d9d46403be6d319d4601814c772a3472fe2955612b0 + md5: 7c7927b404672409d9917d49bff5f2d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + purls: [] + size: 33418 + timestamp: 1734670021371 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda + sha256: 1b51d1f96e751dc945cc06f79caa91833b0c3326efe24e9b506bd64ef49fc9b0 + md5: dfc5aae7b043d9f56ba99514d5e60625 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5938936 + timestamp: 1755474342204 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + sha256: 215086c108d80349e96051ad14131b751d17af3ed2cb5a34edd62fa89bfe8ead + md5: 7df50d44d4a14d6c31a2c54f2cd92157 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 50757 + timestamp: 1731330993524 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hb9b0907_1.conda + sha256: ba9b09066f9abae9b4c98ffedef444bbbf4c068a094f6c77d70ef6f006574563 + md5: 1c0320794855f457dea27d35c4c71e23 + depends: + - libabseil * cxx17* + - libabseil >=20250512.1,<20250513.0a0 + - libcurl >=8.14.1,<9.0a0 + - libgrpc >=1.73.1,<1.74.0a0 + - libopentelemetry-cpp-headers 1.21.0 ha770c72_1 + - libprotobuf >=6.31.1,<6.31.2.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.21.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 885397 + timestamp: 1751782709380 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_1.conda + sha256: b3a1b36d5f92fbbfd7b6426982a99561bdbd7e4adbafca1b7f127c9a5ab0a60f + md5: 9e298d76f543deb06eb0f3413675e13a + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 363444 + timestamp: 1751782679053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-21.0.0-h790f06f_6_cpu.conda + build_number: 6 + sha256: 82b988025c8cdcd4072be0807ccc0b84294d7d4b8d16b69fe76fc852defe8c4c + md5: 16de5af1beb344de520b60f84bb1d75b + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 21.0.0 h73424eb_6_cpu + - libgcc >=14 + - libstdcxx >=14 + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.3,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 1367828 + timestamp: 1758728455551 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2 + md5: 70e3400cbbfa03e96dcde7fc13e38c7b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 28424 + timestamp: 1749901812541 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda + sha256: e75a2723000ce3a4b9fd9b9b9ce77553556c93e475a4657db6ed01abc02ea347 + md5: 7af8e91b0deb5f8e25d1a595dea79614 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 317390 + timestamp: 1753879899951 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.0-h3675c94_0.conda + sha256: 81d9ac5c23257745eb73b81103b3c42442ac13c5d38226916debbf55573540dd + md5: 064887eafa473cbfae9ee8bedd3b7432 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=14 + - openldap >=2.6.10,<2.7.0a0 + - openssl >=3.5.3,<4.0a0 + license: PostgreSQL + purls: [] + size: 2849367 + timestamp: 1758820440469 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h9ef548d_1.conda + sha256: b2a62237203a9f4d98bedb2dfc87b548cc7cede151f65589ced1e687a1c3f3b1 + md5: b92e2a26764fcadb4304add7e698ccf2 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20250512.1,<20250513.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4015243 + timestamp: 1751690262221 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.08.12-h7b12aa8_1.conda + sha256: 6940b44710fd571440c9795daf5bed6a56a1db6ff9ad52dcd5b8b2f8b123a635 + md5: 0a801dabf8776bb86b12091d2f99377e + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20250512.1,<20250513.0a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - re2 2025.08.12.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 210955 + timestamp: 1757447478835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 932581 + timestamp: 1753948484112 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 + md5: eecce068c7e4eddeb169591baac20ac4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 304790 + timestamp: 1745608545575 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + sha256: 0f5f61cab229b6043541c13538d75ce11bd96fb2db76f94ecf81997b1fde6408 + md5: 4e02a49aaa9d5190cb630fa43528fbe6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.1.0 h767d61c_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3896432 + timestamp: 1757042571458 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + sha256: 7b8cabbf0ab4fe3581ca28fe8ca319f964078578a51dd2ca3f703c1d21ba23ff + md5: 8bba50c7f4679f08c861b597ad2bda6b + depends: + - libstdcxx 15.1.0 h8f9b012_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29233 + timestamp: 1757042603319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda + sha256: 4888b9ea2593c36ca587a5ebe38d0a56a0e6d6a9e4bb7da7d9a326aaaca7c336 + md5: 8ed82d90e6b1686f5e98f8b7825a15ef + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.1,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 424208 + timestamp: 1753277183984 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h8261f1e_0.conda + sha256: ddda0d7ee67e71e904a452010c73e32da416806f5cb9145fb62c322f97e717fb + md5: 72b531694ebe4e8aa6f5745d1015c1b4 + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.24,<1.25.0a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + size: 437211 + timestamp: 1758278398952 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.0-hb04c3b8_0.conda + sha256: f8977233dc19cb8530f3bc71db87124695db076e077db429c3231acfa980c4ac + md5: 34fb73fd2d5a613d8f17ce2eaa15a8a5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 85741 + timestamp: 1757742873826 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + sha256: e5ec6d2ad7eef538ddcb9ea62ad4346fde70a4736342c4ad87bd713641eb9808 + md5: 80c07c68d2f6870250959dcc95b209d1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 37135 + timestamp: 1758626800002 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.313.0-h5279c79_1.conda + sha256: 7ad95a14fdba9eee94aa4c6891d538a4346b17287660a2d6211eb8b59cbcd563 + md5: 7625a536f72395ff86a17f96a92ce6b2 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxrandr >=1.5.4,<2.0a0 + constrains: + - libvulkan-headers 1.4.313.0.* + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 189419 + timestamp: 1758045056997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b + md5: aea31d2e5b1091feca96fcfe945c3cf9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 429011 + timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.11.0-hca5e8e5_1.conda + sha256: 2febd0cdea153a97737df3cfb900c312b012c0af3cc5a62f2968bd398d25b6b6 + md5: 9abb1e8cbc0039155a8ed2aa149b1067 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + purls: [] + size: 800138 + timestamp: 1757977095650 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda + sha256: 4310577d7eea817d35a1c05e1e54575b06ce085d73e6dd59aa38523adf50168f + md5: 8337b675e0cad517fbcb3daf7588087a + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.0 ha9997c6_1 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 45363 + timestamp: 1758640621036 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda + sha256: 5420ea77505a8d5ca7b5351ddb2da7e8a178052fccf8fca00189af7877608e89 + md5: b24dd2bd61cd8e4f8a13ee2a945a723c + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.0 + license: MIT + license_family: MIT + purls: [] + size: 556276 + timestamp: 1758640612398 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + sha256: 0694760a3e62bdc659d90a14ae9c6e132b525a7900e59785b18a08bb52a5d7e5 + md5: 87e6096ec6d542d1c1f8b33245fe8300 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxml2 + - libxml2-16 >=2.14.6 + license: MIT + license_family: MIT + purls: [] + size: 245434 + timestamp: 1757963724977 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.6-py313h78bf25f_1.conda + sha256: 623df2b707ce7978f2dd310156a882c1291c4694b315c25277aaa26f57216bda + md5: a2644c545b6afde06f4847defc1a2b27 + depends: + - matplotlib-base >=3.10.6,<3.10.7.0a0 + - pyside6 >=6.7.2 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 17424 + timestamp: 1756869926485 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py313h683a580_1.conda + sha256: c85c8135865a2608c52423d28c8bac064cfd95af69f3ff5c0d84e821695d868b + md5: 0483ab1c5b6956442195742a5df64196 + depends: + - __glibc >=2.17,<3.0.a0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.23 + - numpy >=1.23,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.13,<3.14.0a0 + - python-dateutil >=2.7 + - python_abi 3.13.* *_cp313 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + size: 8446545 + timestamp: 1756869894657 +- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 + md5: 37293a85a0f4f77bbd9cf7aaefc62609 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/munkres?source=hash-mapping + size: 15851 + timestamp: 1749895533014 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + sha256: fd2cbd8dfc006c72f45843672664a8e4b99b2f8137654eaae8c3d46dca776f63 + md5: 16c2a0e9c4a166e53632cfca4f68d020 + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + purls: [] + size: 136216 + timestamp: 1758194284857 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py313hf6604e3_0.conda + sha256: 88d45c6dbedabbc8ebb19555bb3d04b5e2846ae8a7dfc2c0204b54f5f6efaef7 + md5: 3122d20dc438287e125fb5acff1df170 + depends: + - python + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 8888776 + timestamp: 1757505485589 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d + md5: 11b3379b191f63139e29c0d19dee24cd + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.50,<1.7.0a0 + - libstdcxx >=14 + - libtiff >=4.7.1,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 355400 + timestamp: 1758489294972 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda + sha256: cb0b07db15e303e6f0a19646807715d28f1264c6350309a559702f4f34f37892 + md5: 2e5bf4f1da39c0b32778561c3c4e5878 + depends: + - __glibc >=2.17,<3.0.a0 + - cyrus-sasl >=2.1.27,<3.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.5.0,<4.0a0 + license: OLDAP-2.8 + license_family: BSD + purls: [] + size: 780253 + timestamp: 1748010165522 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_1.conda + sha256: 0572be1b7d3c4f4c288bb8ab1cb6007b5b8b9523985b34b862b5222dea3c45f5 + md5: 4fc6c4c88da64c0219c0c6c0408cedd4 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3128517 + timestamp: 1758597915858 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.2.0-h1bc01a4_0.conda + sha256: 9a64535b36ae6776334a7923e91e2dc8d7ce164ee71d2d5075d7867dbd68e7a8 + md5: 53ab33c0b0ba995d2546e54b2160f3fd + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libprotobuf >=6.31.1,<6.31.2.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.2,<1.3.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1277190 + timestamp: 1754216415878 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 + md5: 58335b26c38bf4a20f399384c33cbcf9 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 62477 + timestamp: 1745345660407 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + sha256: 5c7380c8fd3ad5fc0f8039069a45586aa452cf165264bc5a437ad80397b32934 + md5: 7fa07cb0fb1b625a089ccc01218ee5b1 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 1209177 + timestamp: 1756742976157 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py313ha492abd_3.conda + sha256: b5d03d663d73c682fb88b4f71b9431a79362eca4a6201650a44f1ca9d467a7cf + md5: 3354141a95eee5d29000147578dbc13f + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - openjpeg >=2.5.3,<3.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - tk >=8.6.13,<8.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libxcb >=1.17.0,<2.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libzlib >=1.3.1,<2.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - lcms2 >=2.17,<3.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=compressed-mapping + size: 1040551 + timestamp: 1758208668856 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a + md5: c01af13bdc553d1a8fbfff6e8db075f0 + depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + size: 450960 + timestamp: 1754665235234 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + license: MIT + license_family: MIT + purls: [] + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-21.0.0-py313h78bf25f_0.conda + sha256: 5d0f17c0fbf8d5b78458bc616d5bfaf9812aa9cc81e9e38b21e61787a5060199 + md5: 1580ddd94606ccb60270877cb8838562 + depends: + - libarrow-acero 21.0.0.* + - libarrow-dataset 21.0.0.* + - libarrow-substrait 21.0.0.* + - libparquet 21.0.0.* + - pyarrow-core 21.0.0 *_0_* + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 26103 + timestamp: 1753372222314 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-21.0.0-py313he109ebe_0_cpu.conda + sha256: 900374d98691caf4c9fffec8713b5ee2fc70040bd2dddbe1c91d660714bc89b5 + md5: 3018b7f30825c21c47a7a1e061459f96 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 21.0.0.* *cpu + - libarrow-compute 21.0.0.* *cpu + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + constrains: + - apache-arrow-proc * cpu + - numpy >=1.21,<3 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + size: 5345643 + timestamp: 1753371833528 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda + sha256: 6814b61b94e95ffc45ec539a6424d8447895fef75b0fec7e1be31f5beee883fb + md5: 6c8979be6d7a17692793114fa26916e8 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyparsing?source=compressed-mapping + size: 104044 + timestamp: 1758436411254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.9.2-py313h85046ba_2.conda + sha256: 07eae771aa4009005cbca45a085c55e76821814d3c48145d3f77e34c0518a70b + md5: 4a3f70144226fd982d8fff666f36b022 + depends: + - __glibc >=2.17,<3.0.a0 + - libclang13 >=21.1.2 + - libegl >=1.7.0,<2.0a0 + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libopengl >=1.7.0,<2.0a0 + - libstdcxx >=14 + - libvulkan-loader >=1.4.313.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libxslt >=1.1.43,<2.0a0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - qt6-main 6.9.2.* + - qt6-main >=6.9.2,<6.10.0a0 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/pyside6?source=hash-mapping + - pkg:pypi/shiboken6?source=hash-mapping + size: 10111155 + timestamp: 1758935937185 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.7-h2b335a9_100_cp313.conda + build_number: 100 + sha256: 16cc30a5854f31ca6c3688337d34e37a79cdc518a06375fe3482ea8e2d6b34c8 + md5: 724dcf9960e933838247971da07fe5cf + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.2,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + size: 33583088 + timestamp: 1756911465277 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 233310 + timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-duckdb-1.3.2-py313h7033f15_0.conda + sha256: 7bf8b0d04c7a13fdec84f349a63d857a7655b1cf0c350d0390722a472d28b018 + md5: 2675d531dcba6deeb2338dbdf4cda7ad + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/duckdb?source=hash-mapping + size: 24452451 + timestamp: 1752086879946 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + build_number: 8 + sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 + md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7002 + timestamp: 1752805902938 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc + md5: 353823361b1d27eb3960efb076dfcaf6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LicenseRef-Qhull + purls: [] + size: 552937 + timestamp: 1720813982144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.9.2-h5c1c036_3.conda + sha256: 99b394cb9091949f21a90b44128000c4a887fd37f381043824a0fcf34e9dc1ff + md5: 74c4e82cb1356262f9ce0f39e9f7b045 + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.14,<1.3.0a0 + - dbus >=1.16.2,<2.0a0 + - double-conversion >=3.3.1,<3.4.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - harfbuzz >=11.5.1 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libclang-cpp21.1 >=21.1.1,<21.2.0a0 + - libclang13 >=21.1.1 + - libcups >=2.3.3,<2.4.0a0 + - libdrm >=2.4.125,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libglib >=2.86.0,<3.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libllvm21 >=21.1.1,<21.2.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libpq >=18.0,<19.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=14 + - libtiff >=4.7.1,<4.8.0a0 + - libvulkan-loader >=1.4.313.0,<2.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libxkbcommon >=1.11.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.3,<4.0a0 + - pcre2 >=10.46,<10.47.0a0 + - wayland >=1.24.0,<2.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + - xcb-util-cursor >=0.1.5,<0.2.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - xcb-util-keysyms >=0.4.1,<0.5.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + - xcb-util-wm >=0.4.2,<0.5.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxcomposite >=0.4.6,<1.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrandr >=1.5.4,<2.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 + - xorg-libxxf86vm >=1.1.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - qt 6.9.2 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 52464414 + timestamp: 1758870923324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.08.12-h5301d42_1.conda + sha256: 9b9e736254d2794e557be60569f67e416a494d3a55c13b21398fd0346bcf2d8b + md5: 4637c13ff87424af0f6a981ab6f5ffa5 + depends: + - libre2-11 2025.08.12 h7b12aa8_1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 27303 + timestamp: 1757447492040 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- pypi: ./ + name: rudolfjs-github-io + version: 0.1.0 + sha256: 2a67d4d4af40f7e021868d2c5797913882b58a03c5d201117b89eec42b32e826 + requires_python: '>=3.11' + editable: true +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.26-h5ac9029_0.conda + sha256: 14acdf5685f457988dba0053b9d29f1861b1c8fff6da13ec863d6a2b6ac75bff + md5: 0cfd80e699ae130623c0f42c6c6cf798 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.2,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 390887 + timestamp: 1758013933691 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 18455 + timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda + sha256: 8b8acbde6814d1643da509e11afeb6bb30eb1e3004cf04a7c9ae43e9b097f063 + md5: 3d8da0248bdae970b4ade636a104b7f5 + depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 45805 + timestamp: 1753083455352 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + md5: a0116df4f4ed05c303811a837d5b39d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3285204 + timestamp: 1748387766691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda + sha256: c8bfe883aa2d5b59cb1d962729a12b3191518f7decbe9e3505c2aacccb218692 + md5: 45821154b9cb2fb63c2b354c76086954 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 877215 + timestamp: 1756855010312 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + purls: [] + size: 122968 + timestamp: 1742727099393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda + sha256: ba673427dcd480cfa9bbc262fd04a9b1ad2ed59a159bd8f7e750d4c52282f34c + md5: 0f2ca7906bf166247d1d760c3422cb8a + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + purls: [] + size: 330474 + timestamp: 1751817998141 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda + sha256: ad8cab7e07e2af268449c2ce855cbb51f43f4664936eff679b1f3862e6e4b01d + md5: fdc27cb255a7a2cc73b7919a968b48f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 20772 + timestamp: 1750436796633 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda + sha256: c7b35db96f6e32a9e5346f97adc968ef2f33948e3d7084295baebc0e33abdd5b + md5: eb44b3b6deb1cab08d72cb61686fe64c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.13 + - libxcb >=1.16,<2.0.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 20296 + timestamp: 1726125844850 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + sha256: 94b12ff8b30260d9de4fd7a28cca12e028e572cbc504fd42aa2646ec4a5bded7 + md5: a0901183f08b6c7107aab109733a3c91 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + license: MIT + license_family: MIT + purls: [] + size: 24551 + timestamp: 1718880534789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + sha256: 546e3ee01e95a4c884b6401284bb22da449a2f4daf508d038fdfa0712fe4cc69 + md5: ad748ccca349aec3e91743e08b5e2b50 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 14314 + timestamp: 1718846569232 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + sha256: 2d401dadc43855971ce008344a4b5bd804aca9487d8ebd83328592217daca3df + md5: 0e0cbe0564d03a99afd5fd7b362feecd + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 16978 + timestamp: 1718848865819 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + sha256: 31d44f297ad87a1e6510895740325a635dd204556aa7e079194a0034cdd7e66a + md5: 608e0ef8256b81d04456e8d211eee3e8 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 51689 + timestamp: 1718844051451 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda + sha256: a5d4af601f71805ec67403406e147c48d6bad7aaeae92b0622b7e2396842d3fe + md5: 397a013c2dc5145a70737871aaa87e98 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 392406 + timestamp: 1749375847832 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b + md5: fb901ff28063514abb6046c9ec2c4a45 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 58628 + timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 + md5: 1c74ff8c35dcadf952a16f752ca5aa49 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 27590 + timestamp: 1741896361728 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + sha256: 51909270b1a6c5474ed3978628b341b4d4472cd22610e5f22b506855a5e20f67 + md5: db038ce880f100acc74dba10302b5630 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 835896 + timestamp: 1741901112627 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + sha256: 753f73e990c33366a91fd42cc17a3d19bb9444b9ca5ff983605fa9e953baf57f + md5: d3c295b50f092ab525ffe3c2aa4b7413 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 13603 + timestamp: 1727884600744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a + md5: 2ccd714aa2242315acaf0a67faea780b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + purls: [] + size: 32533 + timestamp: 1730908305254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + sha256: 43b9772fd6582bf401846642c4635c47a9b0e36ca08116b3ec3df36ab96e0ec0 + md5: b5fcc7172d22516e1f965490e65e33a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 13217 + timestamp: 1727891438799 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 50060 + timestamp: 1727752228921 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 + md5: ba231da7fccf9ea1e768caf5c7099b84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 20071 + timestamp: 1759282564045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a + md5: 17dcc85db3c7886650b8908b183d6876 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 47179 + timestamp: 1727799254088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + sha256: ac0f037e0791a620a69980914a77cb6bb40308e26db11698029d6708f5aa8e0d + md5: 2de7f99d6581a4a7adbff607b5c278ca + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + purls: [] + size: 29599 + timestamp: 1727794874300 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 33005 + timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a + md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxi >=1.7.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 32808 + timestamp: 1727964811275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + sha256: 8a4e2ee642f884e6b78c20c0892b85dd9b2a6e64a6044e903297e616be6ca35b + md5: 5efa5fa6243a622445fdfd72aee15efa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 17819 + timestamp: 1734214575628 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 567578 + timestamp: 1742433379869 diff --git a/playwright.config.js b/playwright.config.js new file mode 100644 index 0000000..03bc824 --- /dev/null +++ b/playwright.config.js @@ -0,0 +1,82 @@ +// @ts-check +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// import path from 'path'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * @see https://playwright.dev/docs/test-configuration + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://localhost:1313', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'hugo server -D --port 1313', + url: 'http://localhost:1313', + reuseExistingServer: !process.env.CI, + timeout: 120000, + }, +}); + diff --git a/plos-latex-template/plos2025.bst b/plos-latex-template/plos2025.bst new file mode 100644 index 0000000..62a5b5e --- /dev/null +++ b/plos-latex-template/plos2025.bst @@ -0,0 +1,1996 @@ +%% The plos2025.bst file is intended for use in PLOS submissions. +%% It is a copy of the Vancouver BibTeX style (https://ctan.org/pkg/vancouver) +%% with "eprints", "doi", and "hyperref" enabled (see init.config.constants below). +%% +%% +%% This `vancouver.bst' bibliographic style file (for LaTeX/BibTeX) is +%% generated with the docstrip utility and modified manually to meet the +%% ``Uniform Requirements for Manuscripts Submitted to Biomedical Journals'' +%% as published in N Engl J Med 1997;336:309-315. +%% (also known as the Vancouver style) +%% The standards are summarized in: +%% https://www.nlm.nih.gov/bsd/uniform_requirements.html +%% and detailed in: +%% https://www.ncbi.nlm.nih.gov/books/NBK7256/ +%% +%%------------------------------------------------------------------- +%% +%% Author: Folkert van der Beek +%% Version: 1.0 +%% URL: https://gitlab.com/fvdbeek/vancouver.bst +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%%------------------------------------------------------------------- +%% +%% This bibliography style file is intended for texts in ENGLISH +%% This is a numerical citation style, and as such is standard LaTeX. +%% It requires no extra package to interface to the main text. +%% The form of the \bibitem entries is +%% \bibitem{key}... +%% Usage of \cite is as follows: +%% \cite{key} ==>> [#] +%% \cite[chap. 2]{key} ==>> [#, chap. 2] +%% where # is a number determined by the ordering in the reference list. +%% The order in the reference list is that by which the works were originally +%% cited in the text, or that in the database. + % +%% To change the reference numbering system from [1] to 1, +%% put the following code in the preamble: +%% \makeatletter % Reference list option change +%% \renewcommand\@biblabel[1]{#1} % from [1] to 1 +%% \makeatother % +%% +%%--------------------------------------------------------------------- + +%% List of all possible fields +ENTRY + { address + assignee % for patents + author + booktitle % for articles in books + chapter % for incollection, esp. internet documents + cartographer % for maps + day + edition + editor + howpublished + institution % for technical reports + inventor % for patents + journal + key + month + note + number + organization + pages + part + publisher + school + series + title + type + volume + word + year + eprint % urlbst + doi % urlbst + url % urlbst + lastchecked % urlbst + updated % urlbst + } + {} + { label } +%% Declaration of integer variables +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +STRINGS { urlintro eprinturl eprintprefix doiprefix doiurl } % urlbst... +INTEGERS { hrefform addeprints adddoiresolver } +% Following constants may be adjusted by hand, if desired +FUNCTION {init.config.constants} +{ + "Available from: " 'urlintro := % prefix before URL + "http://arxiv.org/abs/" 'eprinturl := % prefix to make URL from eprint ref + "arXiv:" 'eprintprefix := % text prefix printed before eprint ref + "http://dx.doi.org/" 'doiurl := % prefix to make URL from DOI + "doi:" 'doiprefix := % text prefix printed before DOI ref + #1 'addeprints := % 0=no eprints; 1=include eprints + #1 'adddoiresolver := % 0=no DOI resolver; 1=include it + #2 'hrefform := % 0=no crossrefs; 1=hypertex xrefs; 2=hyperref refs +} +INTEGERS { + bracket.state + outside.brackets + open.brackets + within.brackets + close.brackets +} +% ...urlbst to here +FUNCTION {init.state.consts} +{ #0 'outside.brackets := % urlbst + #1 'open.brackets := + #2 'within.brackets := + #3 'close.brackets := + + #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +%% Declaration of string variables +STRINGS { s t} + +% urlbst +FUNCTION {output.nonnull.original} +{ 's := + output.state mid.sentence = + { ". " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +% urlbst... +FUNCTION {output.nonnull} +{ % Save the thing we've been asked to output + 's := + % If the bracket-state is close.brackets, then add a close-bracket to + % what is currently at the top of the stack, and set bracket.state + % to outside.brackets + bracket.state close.brackets = + { "]" * + outside.brackets 'bracket.state := + } + 'skip$ + if$ + bracket.state outside.brackets = + { % We're outside all brackets -- this is the normal situation. + % Write out what's currently at the top of the stack, using the + % original output.nonnull function. + s + output.nonnull.original + } + { % Still in brackets. Add open-bracket or (continuation) comma, add the + % new text (in s) to the top of the stack, and move to the close-brackets + % state, ready for next time (unless inbrackets resets it). If we come + % into this branch, then output.state is carefully undisturbed. + bracket.state open.brackets = + { " [" * } + { ", " * } % bracket.state will be within.brackets + if$ + s * + close.brackets 'bracket.state := + } + if$ +} + +% Call this function just before adding something which should be presented in +% brackets. bracket.state is handled specially within output.nonnull. +FUNCTION {inbrackets} +{ bracket.state close.brackets = + { within.brackets 'bracket.state := } % reset the state: not open nor closed + { open.brackets 'bracket.state := } + if$ +} + +FUNCTION {format.lastchecked} +{ lastchecked empty$ + { "" } + { updated empty$ + { inbrackets "cited " lastchecked * } + { inbrackets "updated " updated * "; cited " * lastchecked * } + if$ + } + if$ +} +% ...urlbst to here + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {fin.entry} +{ + bracket.state close.brackets = % urlbst + { "]" * } + 'skip$ + if$ + add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {no.blank.or.punct} +{ "" * before.all 'output.state := +} + +FUNCTION {add.semicolon} +{ + ";" * + no.blank.or.punct +} + +FUNCTION {add.colon} +{ + ":" * + no.blank.or.punct +} + +FUNCTION {date.block} +{ + "." * + no.blank.or.punct +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% LOGICAL `NOT', `AND', AND `OR' % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Logical 'not': +% If the first element on the stack is A then this function +% does the following: +% push { #0 } +% push { #1 } +% So now the first 3 elements of the stack are +% { #1 } { #0 } A +% The first 3 are popped and subjected to 'if': +% If A > 0 then { #0 } is executed, else { #1 } is executed: +% if A > 0 +% then 0 +% else 1 +% So consider integers as logicals, where 1 = true and 0 = false, +% then this does +% (if A then false else true) +% which is a logical 'not'. + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Logical 'and': +% If the first 2 elements on the stack are A B +% then this function does the following: +% push 'skip$ +% push { pop$ #0 } +% So now first 4 elements are +% { pop$ #0 } 'skip$ A B +% The first 3 are popped and subjected to 'if' (B is on top of +% the stack): +% If A > 0 then 'skip$ is executed, else { pop$ #0 } is executed: +% if A > 0 +% then (B stays on top of stack) +% else (B is popped and #0 is pushed) +% So consider integers as logicals, where 1 = true and 0 = false, +% then this does +% (if A then B else false) +% which is a logical 'and'. + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Logical 'or': +% If the first 2 elements on the stack are A B +% then this function does the following: +% push { pop$ #1 } +% push 'skip$ +% So now first 4 elements are +% 'skip$ { pop$ #1 } A B +% The first 3 are popped and subjected to 'if' (B is on top of +% the stack): +% If A > 0 then { pop$ #1 } is executed, else 'skip$ is executed: +% if A > 0 +% then (B is popped and #1 is pushed) +% else (B stays on top of stack) +% So consider integers as logicals, where 1 = true and 0 = false, +% then this does +% (if A then true else B) +% which is a logical 'or'. + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% GENERAL PURPOSE FUNCTIONS FOR FORMATTING % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% issues warning if field is empty +% call with +% "field" field warning.if.empty +% Note that the first field must be between quotes +% because it is the fieldname for use in the warning message. +% + +FUNCTION {warning.if.empty} +{ empty$ + { "No " swap$ * " in " * cite$ * warning$ } + { pop$ } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % encloses string in pre- and postfix string + % call with + % prefix postfix S enclose.check + % delivers empty string if S empty + % +FUNCTION {enclose.check} +{ duplicate$ empty$ + { pop$ pop$ pop$ + "" + } + { swap$ * * } + if$ +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% emphasizes top of stack +% call with +% string" emphasize.check +% + +FUNCTION {emphasize.check} +{ "\Bem{" swap$ + "}" swap$ + enclose.check +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % brackets top of stack + % call with + % "string" bracket.check + % +FUNCTION {bracket.check} +{ "[" swap$ + "]" swap$ + enclose.check +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % parenthesizes top of stack + % call with + % "string" parenthesize + % +FUNCTION {parenthesize.check} +{ "(" swap$ + ")" swap$ + enclose.check +} + +STRINGS {z} + +FUNCTION {remove.dots} +{ 'z := % expects string on top of the stack, pops the string and assigns it to variable z + "" % push empty string + { z empty$ not } % returns 0 if variable z is empty + { z #1 #1 substring$ % push the first character of variable z + z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z + duplicate$ "\" = % pushes 1 if the last character is "\", otherwise 0 + { * % concatenates the last 2 literals + z #1 #1 substring$ % push the first character of variable z + z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z + * % concatenates the last 2 literals, i.e. every character, even a dot, following a "\" will be printed + } + { duplicate$ "." = % pushes 1 if the last character is ".", otherwise 0 + 'pop$ % pushes the pop$ function + { * } % concatenates the last 2 literals + if$ % pops the last character if it is a dot, otherwise concatenates it with the string on top of the stack + } + if$ + } + while$ +} + +INTEGERS {l} +FUNCTION{string.length} +{ + #1 'l := + { duplicate$ duplicate$ #1 l substring$ = not } + { l #1 + 'l := } + while$ + pop$ l +} + +STRINGS {replace find text} +INTEGERS {find_length} +FUNCTION {find.replace} +{ + 'replace := + 'find := + 'text := + find string.length 'find_length := + "" + { text empty$ not } + { text #1 find_length substring$ find = + { + replace * + text #1 find_length + global.max$ substring$ 'text := + } + { text #1 #1 substring$ * + text #2 global.max$ substring$ 'text := + } + if$ + } + while$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ skip$ } + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH + +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {bbl.editors} +{ "editors" } + +FUNCTION {bbl.editor} +{ "editor" } + +FUNCTION {bbl.cartographers} +{ "cartographers" } + +FUNCTION {bbl.cartographer} +{ "cartographer" } + +FUNCTION {bbl.inventors} +{ "inventors" } + +FUNCTION {bbl.inventor} +{ "inventor" } + +FUNCTION {bbl.assignees} +{ "assignees" } + +FUNCTION {bbl.assignee} +{ "assignee" } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "ed." } + +FUNCTION {bbl.volume} +{ "vol." } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "p." } + +FUNCTION {bbl.page} +{ "p." } + +FUNCTION {bbl.chapter} +{ "chap." } + +FUNCTION {bbl.techrep} +{ "Tech. Rep." } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +FUNCTION {bbl.first} +{ "1st" } + +FUNCTION {bbl.second} +{ "2nd" } + +FUNCTION {bbl.third} +{ "3rd" } + +FUNCTION {bbl.fourth} +{ "4th" } + +FUNCTION {bbl.fifth} +{ "5th" } + +FUNCTION {bbl.st} +{ "st" } + +FUNCTION {bbl.nd} +{ "nd" } + +FUNCTION {bbl.rd} +{ "rd" } + +FUNCTION {bbl.th} +{ "th" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +FUNCTION {eng.ord} +{ duplicate$ "1" swap$ * + #-2 #1 substring$ "1" = + { bbl.th * } + { duplicate$ #-1 #1 substring$ + duplicate$ "1" = + { pop$ bbl.st * } + { duplicate$ "2" = + { pop$ bbl.nd * } + { "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ + } + if$ +} + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + pop$ + } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + pop$ + } + if$ + } + if$ +} + +STRINGS { bibinfo} +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + "." ". " find.replace 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}{ f{}}{ jj}" + format.name$ + remove.dots + bibinfo bibinfo.check + 't := + nameptr #1 > + { + nameptr #6 + #1 + = + numnames #6 + > and + { "others" 't := + #1 'namesleft := } + 'skip$ + if$ + namesleft #1 > + { ", " * t * } + { + "," * + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} + +FUNCTION {format.names.org} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ff~}{vv~}{ll}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { "; " * t * } + { + ";" * + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} + +FUNCTION {format.names.ed} +{ + format.names +} + +FUNCTION {format.authors} +{ + author "author" format.names + %%"." " " "author" find.replace format.names +} + +FUNCTION {format.organizations} +{ organization "organization" format.names.org +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {get.bbl.cartographer} +{ cartographer num.names$ #1 > 'bbl.cartographers 'bbl.cartographer if$ } + +FUNCTION {get.bbl.inventor} +{ inventor num.names$ #1 > 'bbl.inventors 'bbl.inventor if$ } + +FUNCTION {get.bbl.assignee} +{ assignee num.names$ #1 > 'bbl.assignees 'bbl.assignee if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.editor + * + } + if$ +} + +FUNCTION {format.assignees} +{ assignee "assignee" format.names.org duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.assignee + * + } + if$ +} + +FUNCTION {format.cartographers} +{ cartographer "cartographer" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.cartographer + * + } + if$ +} + +FUNCTION {format.inventors} +{ inventor "inventor" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.inventor + * + } + if$ +} + +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title +%%duplicate$ empty$ 'skip$ +%% { "t" change.case$ } +%%if$ + "title" bibinfo.check +} + +FUNCTION {format.type} +{ type empty$ + 'skip$ + { inbrackets type } + %%{ add.blank "[" type * "]" * } + if$ +} + +FUNCTION {output.bibitem} +{ outside.brackets 'bracket.state := % urlbst + newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {hyphenate} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { "-" * + { t #1 #1 substring$ "-" = } + { t #2 global.max$ substring$ 't := } + while$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in capitalize + ":" * + " " * } + +FUNCTION {format.journal.date} +{ + month "month" bibinfo.check + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { + swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + " " * swap$ + } + if$ + * + remove.dots + } + if$ + duplicate$ empty$ + 'skip$ + { + before.all 'output.state := + after.sentence 'output.state := + } + if$ +} + +FUNCTION {format.date} +{ + no.blank.or.punct + ";" + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ +} + +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ bbl.of space.word * swap$ + emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { series empty$ + { number "number" bibinfo.check } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +FUNCTION {convert.edition} +{ extract.num "l" change.case$ 's := + s "first" = s "1" = or + { bbl.first 't := } + { s "second" = s "2" = or + { bbl.second 't := } + { s "third" = s "3" = or + { bbl.third 't := } + { s "fourth" = s "4" = or + { bbl.fourth 't := } + { s "fifth" = s "5" = or + { bbl.fifth 't := } + { s #1 #1 substring$ is.num + { s eng.ord 't := } + { edition 't := } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + t +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + convert.edition + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {is.letter} +{ duplicate$ empty$ + { pop$ #0 } + { chr.to.int$ + duplicate$ "A" chr.to.int$ < + { pop$ #0 } + { duplicate$ "Z" chr.to.int$ > + { duplicate$ "a" chr.to.int$ < + { pop$ #0 } + { duplicate$ "z" chr.to.int$ > + { pop$ #0 } + { pop$ #1 } + if$ + } + if$ + } + { pop$ #1 } + if$ + } + if$ + } + if$ +} + +FUNCTION {is.digit} +{ duplicate$ empty$ + { pop$ #0 } + { chr.to.int$ + duplicate$ "0" chr.to.int$ < + { pop$ #0 } + { "9" chr.to.int$ > + { #0 } + { #1 } + if$ + } + if$ + } + if$ +} + +FUNCTION {is.letter.digit} +{ duplicate$ is.letter + swap$ is.digit or +} + +INTEGERS { charptr len } + +STRINGS { start.number end.number range.separator } + +FUNCTION {abbreviate.range.numbers} +{ end.number end.number text.length$ #1 substring$ is.letter + { start.number range.separator * end.number * } + { end.number text.length$ 'len := + start.number text.length$ len < + 'skip$ + { start.number text.length$ len - #1 + 'charptr := + { end.number text.length$ #1 > + start.number charptr #1 substring$ + end.number #1 #1 substring$ = and + } + { charptr #1 + 'charptr := + end.number #2 global.max$ substring$ 'end.number := + } + while$ + } + if$ + start.number range.separator * end.number * + } + if$ +} + +% This a helper function for use in format.page.numbers +FUNCTION {append.pages.part} +{ duplicate$ duplicate$ text.length$ #1 substring$ "," = + { " " * } + 'skip$ + if$ + end.number empty$ + { start.number empty$ + 'skip$ + { start.number * } + if$ + } + { abbreviate.range.numbers * } + if$ + "" 'start.number := + "" 'end.number := + "" 'range.separator := +} + +FUNCTION {format.page.numbers} +{ 's := + "" 't := + "" 'start.number := + "" 'end.number := + "" 'range.separator := + "" + { s empty$ not } + { s #1 #1 substring$ 't := + t is.letter.digit + { range.separator empty$ + { start.number t * 'start.number := } + { end.number t * 'end.number := } + if$ + } + { s #1 #2 substring$ "--" = + { "--" 'range.separator := } + { t "-" = + { "-" 'range.separator := } + { append.pages.part + t * + } + if$ + } + if$ + } + if$ + s #2 global.max$ substring$ 's := + } + while$ + append.pages.part +} + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + format.page.numbers + bbl.pages swap$ + hyphenate + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} + +FUNCTION {format.journal.pages} +{ pages empty$ 'skip$ + { add.colon } + if$ + pages duplicate$ empty$ 'pop$ + { + format.page.numbers + hyphenate + "pages" bibinfo.check + * + } + if$ +} + +FUNCTION {format.vol.num} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * +} + +FUNCTION {format.vol.num.pages} +{ volume empty$ number empty$ and + 'skip$ + { add.semicolon } + if$ + volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * + format.journal.pages +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ + } + + FUNCTION {format.booktitle} + { + booktitle "booktitle" bibinfo.check + } + + FUNCTION {format.in.ed.booktitle} + { format.booktitle duplicate$ empty$ 'skip$ + { + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + "," * + " " * + get.bbl.editor + ". " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ + } + + FUNCTION {format.in.ed.title} + { format.title duplicate$ empty$ 'skip$ + { + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + "," * + " " * + get.bbl.editor + ". " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ + } + + FUNCTION {empty.misc.check} + { author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ + } + FUNCTION {format.thesis.type} + { type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ + number "number" bibinfo.check + %%type duplicate$ empty$ + %%{ pop$ bbl.techrep } + %%'skip$ + %%if$ + %%"type" bibinfo.check + %%swap$ duplicate$ empty$ + %%{ pop$ "t" change.case$ } + %%{ tie.or.space.prefix * * } + %%if$ +} + +FUNCTION {format.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + address "address" bibinfo.check * + t empty$ + 'skip$ + { address empty$ + 'skip$ + { ": " * } + if$ + t * + } + if$ + } + if$ +} + +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {format.institution.address} +{ institution "institution" bibinfo.check format.org.or.pub +} + +FUNCTION {format.school.address} +{ school "school" bibinfo.check format.org.or.pub +} + + +% urlbst... +% Functions for making hypertext links. +% In all cases, the stack has (link-text href-url) +% +% make 'null' specials +FUNCTION {make.href.null} +{ + pop$ +} +% make hypertex specials +FUNCTION {make.href.hypertex} +{ + "\special {html: }" * swap$ * + "\special {html:}" * +} +% make hyperref specials +FUNCTION {make.href.hyperref} +{ + "\href {" swap$ * "} {" * swap$ * "}" * +} +FUNCTION {make.href} +{ hrefform #2 = + 'make.href.hyperref % hrefform = 2 + { hrefform #1 = + 'make.href.hypertex % hrefform = 1 + 'make.href.null % hrefform = 0 (or anything else) + if$ + } + if$ +} + +FUNCTION {format.url} +{ url empty$ + { "" } + { hrefform #1 = + { % special case -- add HyperTeX specials + urlintro "\url{" url * "}" * url make.href.hypertex * } + { urlintro "\url{" * url * "}" * } + if$ + } + if$ +} + +FUNCTION {format.eprint} +{ eprint empty$ + { "" } + { eprintprefix eprint * eprinturl eprint * make.href } + if$ +} + +FUNCTION {format.doi} +{ doi empty$ + { "" } + { doiprefix doi * doiurl doi * make.href } + if$ +} + +% Output a URL. We can't use the more normal idiom (something like +% `format.url output'), because the `inbrackets' within +% format.lastchecked applies to everything between calls to `output', +% so that `format.url format.lastchecked * output' ends up with both +% the URL and the lastchecked in brackets. +FUNCTION {output.url} +{ url empty$ + 'skip$ + { new.block + format.url output + format.lastchecked output + } + if$ +} + +FUNCTION {output.web.refs} +{ + new.block + output.url + addeprints eprint empty$ not and + { format.eprint output.nonnull } + 'skip$ + if$ + adddoiresolver doi empty$ not and + { format.doi output.nonnull } + 'skip$ + if$ +% addeprints +% { eprint empty$ +% 'skip$ +% { format.eprint output.nonnull } +% if$ +% } +% 'skip$ +% if$ +} + +% Webpage entry type. +% Title and url fields required; +% author, note, year, month, and lastchecked fields optional +STRINGS {database} +FUNCTION {webpage} +{ output.bibitem + author empty$ + { editor empty$ + 'skip$ % author and editor both optional + { format.editors output.nonnull } + if$ + } + { editor empty$ + { format.authors output.nonnull } + { "can't use both author and editor fields in " cite$ * warning$ } + if$ + } + if$ +% author empty$ +% 'skip$ +% { format.authors output.nonnull } +% if$ + new.block + format.title "title" output.check + journal empty$ + { + format.type "type" output.check + publisher empty$ + 'skip$ + { format.publisher.address output } + if$ + "database on the Internet" 'database := + type database = + { format.journal.date "year" output.check } + { format.date "year" output.check } + if$ + lastchecked empty$ + 'skip$ + { format.lastchecked output } + if$ + new.block + part empty$ + 'skip$ + { part output } + if$ + pages empty$ + 'skip$ + { pages bracket.check output } + if$ + } + { journal + remove.dots + "journal" bibinfo.check + "journal" output.check + format.type "type" output.check + format.journal.date "year" output.check + lastchecked empty$ + 'skip$ + { format.lastchecked output + ";" no.blank.or.punct output + } + if$ + no.blank.or.punct format.vol.num output + pages empty$ + 'skip$ + { ":" no.blank.or.punct output + no.blank.or.punct pages bracket.check output + } + if$ + new.block + } + if$ + format.url "url" output.check + new.block + note output + fin.entry +} +% ...urlbst to here + +FUNCTION {misc} +{ output.bibitem + format.authors "author" output.check + format.editors "author and editor" output.check + format.title "title" output.check + type missing$ + { skip$ } + { format.type "type" output.check } + %%{ inbrackets type output } + if$ + format.publisher.address output + format.date "year" output.check + new.block + format.note output + new.block + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + output.web.refs % urlbst + fin.entry + empty.misc.check +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + organization empty$ + 'skip$ + { author empty$ + { + format.organizations "organization" output.check + } + { + "; " * + no.blank.or.punct + format.organizations "organization" output.check + } + if$ + } + if$ + new.block + format.title "title" output.check + type missing$ + { skip$ } + { format.type "type" output.check } + if$ + new.block + journal + remove.dots + "journal" bibinfo.check + "journal" output.check + format.journal.date "year" output.check + format.vol.num.pages output + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { editor empty$ + { format.organizations "organization" output.check } + { format.editors "author and editor" output.check } + if$ + } + { format.authors output.nonnull + "author and editor" editor either.or.check + } + if$ + new.block + format.btitle "title" output.check + format.bvolume output + new.block + format.edition output + new.sentence + author empty$ not + editor empty$ not + and + { format.editors "author and editor" output.check } + 'skip$ + if$ + format.number.series output + format.publisher.address output + format.date "year" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {booklet} +{ misc } + +FUNCTION {dictionary} +{ output.bibitem + format.booktitle "booktitle" output.check + format.bvolume output + new.block + format.edition output + new.sentence + format.publisher.address output + format.date "year" output.check + format.btitle "title" output.check + add.semicolon + add.blank + format.pages "pages" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + format.authors "author" output.check + new.block + chapter "chapter" output.check + new.block + format.in.ed.title "title" output.check + format.bvolume output + format.edition output + new.sentence + format.number.series output + format.publisher.address output + format.date "year" output.check + date.block + add.blank + format.pages "pages" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.edition output + new.sentence + format.number.series output + format.publisher.address output + format.date "year" output.check + date.block + add.blank + format.pages "pages" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + format.in.ed.booktitle "booktitle" output.check + format.bvolume output + new.sentence + format.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.date "year" output.check + date.block + add.blank + format.pages "pages" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {conference} +{inproceedings} + +FUNCTION {manual} +{misc} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.btitle + "title" output.check + format.type "type" output.check + new.block + format.school.address output + format.date "year" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {mastersthesis} +{phdthesis} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization "organization" bibinfo.check output + } + { format.editors output.nonnull } + if$ + new.block + format.btitle "title" output.check + format.bvolume output + editor empty$ + { publisher empty$ + 'skip$ + { + new.sentence + format.number.series output + format.publisher.address output + } + if$ + } + { publisher empty$ + { + new.sentence + format.organization.address output } + { + new.sentence + organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + } + if$ + format.date "year" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + new.block + format.title + "title" output.check + new.block + format.institution.address output + format.date "year" output.check + format.tr.number output.nonnull + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {map} +{ output.bibitem + format.cartographers "cartographer" output.check + new.block + format.title + "title" output.check + format.type "type" output.check + new.block + format.publisher.address output + format.date "year" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {patent} +{ output.bibitem + format.inventors "inventor" output.check + "; " * + no.blank.or.punct + format.assignees "assignee" output.check + new.block + format.title + "title" output.check + new.block + format.tr.number output.nonnull + format.date "year" output.check + new.block + format.note output + output.web.refs % urlbst + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + format.date output + new.block + format.note "note" output.check + output.web.refs % urlbst + fin.entry +} + +FUNCTION {default.type} { misc } +READ +STRINGS { longest.label } +INTEGERS { number.label longest.label.width } +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.config.constants} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `plos2025.bst'. diff --git a/plos-latex-template/plos_bibtex_sample.bib b/plos-latex-template/plos_bibtex_sample.bib new file mode 100644 index 0000000..182d8ca --- /dev/null +++ b/plos-latex-template/plos_bibtex_sample.bib @@ -0,0 +1,163 @@ +@Article{bib1, + author = {Conant, Gavin C. and Wolfe, Kenneth H.}, + title = {Turning a hobby into a job: How duplicated genes find new + functions}, + journal = {Nat Rev Genet}, + year = 2008, + month = {Dec}, + volume = 9, + number = 12, + pages = {938--950}, + doi = {10.1038/nrg2482}, +} + +@Book{bib2, + author = {Ohno, Susumu}, + title = {Evolution by Gene Duplication}, + year = 1970, + publisher = {Springer-Verlag}, + address = {Berlin, Heidelberg}, + doi = {10.1007/978-3-642-86659-3}, +} + +@Article{bib3, + author = {Magwire, Michael M. and Bayer, Florian and Webster, Claire + L. and Cao, Chuan and Jiggins, Francis M.}, + title = {Successive increases in the resistance of Drosophila to viral + infection through a Transposon Insertion followed by a + Duplication}, + journal = {PLOS Genet}, + year = 2011, + month = {Oct}, + volume = 7, + number = 10, + pages = {1--11}, + doi = {10.1371/journal.pgen.1002337}, +} + +%% Published article +@Article{bib4, + author = {Hou, W. R. and Hou, Y. L. and Wu, G. F. and Song, Y. and Su, + X. L. and Sun, B. and Li, J.}, + title = {cDNA, genomic sequence cloning and overexpression of ribosomal + protein gene L9 (rpL9) of the giant panda (Ailuropoda + melanoleuca)}, + journal = {Genet Mol Res}, + year = 2011, + volume = 10, + pages = {1576--1588}, + doi = {10.4238/vol10-3gmr1159}, +} + +%% Published article +@article{bib5, + author = {Devaraju, Panneer and Gulati, Reena and Antony, Paul T. and + Mithun, C. B. and Negi, Vir S.}, + title = {Susceptibility to SLE in South Indian Tamils may be + influenced by genetic selection pressure on TLR2 and TLR9 + genes}, + journal = {Mol Immunol}, + year = 2015, + month = {Mar}, + pages = {123--126}, + doi = {10.1016/j.molimm.2014.11.005} +} + +% Online articles +@Article{bib6, + author = {Huynen, Maud M. T. E. and Martens, Pim and Hilderink, Henk + B. M.}, + title = {The health impacts of globalisation: a conceptual framework}, + journal = {Global Health}, + year = 2005, + volume = 1, + number = 1, + pages = 14, + doi = {10.1186/1744-8603-1-14}, + url = {http://www.globalizationandhealth.com/content/1/1/14}, +} + +% Books +@book{bib7, + author = {Bates, Barbara}, + title = {Bargaining for life: A social history of tuberculosis}, + edition = {1st}, + publisher = {University of Pennsylvania Press}, + address = {Philadelphia}, + year = 1992, + doi = {10.9783/9781512800296}, +} + +% Book chapters +@incollection{bib8, + author = {Hansen, Bert}, + title = {New York City epidemics and history for the public}, + booktitle = {AIDS and the historian}, + editor = {Harden, Victoria A. and Risse, Guenter B.}, + publisher = {National Institutes of Health}, + address = {Bethesda}, + year = 1991, + pages = {21--28} +} + +% Deposited articles (preprints, e-prints, or arXiv) +@Webpage{bib9, + author = {Krick, Teresa and Shub, David A. and Verstraete, Nina and + Ferreiro, Diego U. and Alonso, Leonardo G. and Shub, Michael + and Sánchez, Ignacio E.}, + title = {Amino acid metabolism conflicts with protein diversity}, + type = {Preprint}, + year = 2014, + publisher = {arXiv:1403.3301}, + doi = {10.1093/molbev/msu228}, + lastchecked = {2014 March 17}, + url = {https://128.84.21.199/abs/1403.3301v1}, +} + +% Published media (print or online newspapers and magazine articles) +@Webpage{bib10, + author = {Fountain, Henry}, + title = {For Already Vulnerable Penguins, Study Finds + Climate Change Is Another Danger}, + type = {Internet}, + year = 2014, + month = {Jan 29}, + journal = {The New York Times}, + lastchecked = {2014 March 17}, + url = {http://www.nytimes.com/2014/01/30/science/earth/climate-change-taking-toll-on-penguins-study-finds.html}, +} + +% New media (blogs, web sites, or other written works) +@Webpage{bib11, + author = {Allen, Liz}, + title = {Announcing PLOS Blogs}, + type = {Internet}, + part = {PLOS Blogs [about 2 screens]}, + publisher = {PLOS}, + address = {San Francisco}, + year = {2010 Sep 1}, + lastchecked = {17 March 2014}, + url = {http://blogs.plos.org/plos/2010/09/announcing-plos-blogs/} +} + +% Masters' theses or doctoral dissertations +@PhDThesis{bib12, + author = {Wells, Andrew}, + title = {Exploring the development of the independent, electronic, + scholarly journal}, + type = {M.Sc. Thesis}, + school = {The University of Sheffield}, + year = 1999, + url = {http://cumincad.scix.net/cgi-bin/works/Show?2e09} +} + +% Databases and repositories (Figshare, arXiv) +@Webpage{bib13, + author = {Roberts, Steven B.}, + title = {QPX Genome Browser Feature Tracks}, + part = {Database: figshare}, + type = {Internet}, + year = 2013, + lastchecked = {2013 Oct 5}, + url = {http://figshare.com/articles/QPX_Genome_Browser_Feature_Tracks/701214} +} diff --git a/plos-latex-template/plos_latex_template.tex b/plos-latex-template/plos_latex_template.tex new file mode 100644 index 0000000..b5468a1 --- /dev/null +++ b/plos-latex-template/plos_latex_template.tex @@ -0,0 +1,382 @@ +% Template for PLoS +% Version 3.7 Aug 2025 +% +% % % % % % % % % % % % % % % % % % % % % % +% +% -- IMPORTANT NOTE +% +% This template contains comments intended +% to minimize problems and delays during our production +% process. Please follow the template instructions +% whenever possible. +% +% % % % % % % % % % % % % % % % % % % % % % % +% +% Once your paper is accepted for publication, +% PLEASE REMOVE ALL TRACKED CHANGES in this file +% and leave only the final text of your manuscript. +% PLOS recommends the use of latexdiff to track changes during review, as this will help to maintain a clean tex file. +% Visit https://www.ctan.org/pkg/latexdiff?lang=en for info or contact us at latex@plos.org. +% +% +% There are no restrictions on package use within the LaTeX files except that no packages listed in the template may be deleted. +% +% Please do not include colors or graphics in the text. +% +% The manuscript LaTeX source should be contained within a single file (do not use \input, \externaldocument, or similar commands). +% +% % % % % % % % % % % % % % % % % % % % % % % +% +% -- FIGURES AND TABLES +% +% Please include tables/figure captions directly after the paragraph where they are first cited in the text. +% +% DO NOT INCLUDE GRAPHICS IN YOUR MANUSCRIPT +% - Figures should be uploaded separately from your manuscript file. +% - Figures generated using LaTeX should be extracted and removed from the PDF before submission. +% - Figures containing multiple panels/subfigures must be combined into one image file before submission. +% For figure citations, please use "Fig" instead of "Figure". +% See http://journals.plos.org/plosone/s/figures for PLOS figure guidelines. +% +% Tables should be cell-based and may not contain: +% - spacing/line breaks within cells to alter layout or alignment +% - do not nest tabular environments (no tabular environments within tabular environments) +% - no graphics or colored text (cell background color/shading OK) +% See http://journals.plos.org/plosone/s/tables for table guidelines. +% +% For tables that exceed the width of the text column, use the adjustwidth environment as illustrated in the example table in text below. +% +% % % % % % % % % % % % % % % % % % % % % % % % +% +% -- EQUATIONS, MATH SYMBOLS, SUBSCRIPTS, AND SUPERSCRIPTS +% +% IMPORTANT +% Below are a few tips to help format your equations and other special characters according to our specifications. For more tips to help reduce the possibility of formatting errors during conversion, please see our LaTeX guidelines at http://journals.plos.org/plosone/s/latex +% +% For inline equations, please be sure to include all portions of an equation in the math environment. For example, x$^2$ is incorrect; this should be formatted as $x^2$ (or $\mathrm{x}^2$ if the romanized font is desired). +% +% Do not include text that is not math in the math environment. For example, CO2 should be written as CO\textsubscript{2} instead of CO$_2$. +% +% Please add line breaks to long display equations when possible in order to fit size of the column. +% +% For inline equations, please do not include punctuation (commas, etc) within the math environment unless this is part of the equation. +% +% When adding superscript or subscripts outside of brackets/braces, please group using {}. For example, change "[U(D,E,\gamma)]^2" to "{[U(D,E,\gamma)]}^2". +% +% Do not use \cal for caligraphic font. Instead, use \mathcal{} +% +% % % % % % % % % % % % % % % % % % % % % % % % +% +% Please contact latex@plos.org with any questions. +% +% % % % % % % % % % % % % % % % % % % % % % % % + +\documentclass[10pt,letterpaper]{article} +\usepackage[top=0.85in,left=2.75in,footskip=0.75in]{geometry} + +% amsmath and amssymb packages, useful for mathematical formulas and symbols +\usepackage{amsmath,amssymb} + +% Use adjustwidth environment to exceed column width (see example table in text) +\usepackage{changepage} + +% textcomp package and marvosym package for additional characters +\usepackage{textcomp,marvosym} + +% cite package, to clean up citations in the main text. Do not remove. +\usepackage{cite} + +% Use nameref to cite supporting information files (see Supporting Information section for more info) +\usepackage{nameref,hyperref} + +% line numbers +\usepackage[right]{lineno} + +% ligatures disabled +\usepackage[nopatch=eqnum]{microtype} +\DisableLigatures[f]{encoding = *, family = * } + +% color can be used to apply background shading to table cells only +\usepackage[table]{xcolor} + +% array package and thick rules for tables +\usepackage{array} + +% create "+" rule type for thick vertical lines +\newcolumntype{+}{!{\vrule width 2pt}} + +% create \thickcline for thick horizontal lines of variable length +\newlength\savedwidth +\newcommand\thickcline[1]{% + \noalign{\global\savedwidth\arrayrulewidth\global\arrayrulewidth 2pt}% + \cline{#1}% + \noalign{\vskip\arrayrulewidth}% + \noalign{\global\arrayrulewidth\savedwidth}% +} + +% \thickhline command for thick horizontal lines that span the table +\newcommand\thickhline{\noalign{\global\savedwidth\arrayrulewidth\global\arrayrulewidth 2pt}% +\hline +\noalign{\global\arrayrulewidth\savedwidth}} + + +% Remove comment for double spacing +%\usepackage{setspace} +%\doublespacing + +% Text layout +\raggedright +\setlength{\parindent}{0.5cm} +\textwidth 5.25in +\textheight 8.75in + +% Bold the 'Figure #' in the caption and separate it from the title/caption with a period +% Captions will be left justified +\usepackage[aboveskip=1pt,labelfont=bf,labelsep=period,justification=raggedright,singlelinecheck=off]{caption} +\renewcommand{\figurename}{Fig} + +% Please use the included `plos2025.bst` as your BibTeX style +\bibliographystyle{plos2025} + +% Remove brackets from numbering in List of References +\makeatletter +\renewcommand{\@biblabel}[1]{\quad#1.} +\makeatother + + + +% Header and Footer with logo +\usepackage{lastpage,fancyhdr,graphicx} +\usepackage{epstopdf} +%\pagestyle{myheadings} +\pagestyle{fancy} +\fancyhf{} +%\setlength{\headheight}{27.023pt} +%\lhead{\includegraphics[width=2.0in]{PLOS-submission.eps}} +\rfoot{\thepage/\pageref{LastPage}} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrule}{\hrule height 2pt \vspace{2mm}} +\fancyheadoffset[L]{2.25in} +\fancyfootoffset[L]{2.25in} +\lfoot{\today} + +%% Include all user-defined macros below + +\newcommand{\lorem}{\textbf{LOREM}} +\newcommand{\ipsum}{\textbf{IPSUM}} + +%% END MACROS SECTION + + +\begin{document} +\vspace*{0.2in} + +% Title must be 250 characters or less. +\begin{flushleft} +{\Large +\textbf{Title of submission to PLOS journals} % Please use "sentence case" for title and headings (capitalize only the first word in a title (or heading), the first word in a subtitle (or subheading), and any proper nouns). +} +\newline +% Insert author names, affiliations and corresponding author email (do not include titles, positions, or degrees). +\\ +Name1 Surname\textsuperscript{1,2\Yinyang}, +Name2 Surname\textsuperscript{2\Yinyang}, +Name3 Surname\textsuperscript{2,3\textcurrency}, +Name4 Surname\textsuperscript{2}, +Name5 Surname\textsuperscript{2\ddag}, +Name6 Surname\textsuperscript{2\ddag}, +Name7 Surname\textsuperscript{1,2,3*}, +with the Lorem Ipsum Consortium\textsuperscript{\textpilcrow} +\\ +\bigskip +\textbf{1} Affiliation Dept/Program/Center, Institution Name, City, State, Country +\\ +\textbf{2} Affiliation Dept/Program/Center, Institution Name, City, State, Country +\\ +\textbf{3} Affiliation Dept/Program/Center, Institution Name, City, State, Country +\\ +\bigskip + +% Insert additional author notes using the symbols described below. Insert symbol callouts after author names as necessary. +% +% Remove or comment out the author notes below if they aren't used. +% +% Primary Equal Contribution Note +\Yinyang These authors contributed equally to this work. + +% Additional Equal Contribution Note +% Also use this double-dagger symbol for special authorship notes, such as senior authorship. +\ddag These authors also contributed equally to this work. + +% Current address notes +\textcurrency Current Address: Dept/Program/Center, Institution Name, City, State, Country % change symbol to "\textcurrency a" if more than one current address note +% \textcurrency b Insert second current address +% \textcurrency c Insert third current address + +% Deceased author note +\dag Deceased + +% Group/Consortium Author Note +\textpilcrow Membership list can be found in the Acknowledgments section. + +% Use the asterisk to denote corresponding authorship and provide email address in note below. +* correspondingauthor@institute.edu + +\end{flushleft} +% Please keep the abstract below 300 words + +% For PLOS Medicine research article authors, please structure your abstract +% with "Background", "Method and Findings" and "Conclusion" sections per +% journal requirements. + +% For PLOS Neglected Tropical Diseases research article authors, please +% structure your abstract with "Background", "Methodology", "Findings", and +% "Conclusion" sections per journal requirements. +% +\section*{Abstract} +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur eget porta erat. Morbi consectetur est vel gravida pretium. Suspendisse ut dui eu ante cursus gravida non sed sem. Nullam sapien tellus, commodo id velit id, eleifend volutpat quam. Phasellus mauris velit, dapibus finibus elementum vel, pulvinar non tellus. Nunc pellentesque pretium diam, quis maximus dolor faucibus id. Nunc convallis sodales ante, ut ullamcorper est egestas vitae. Nam sit amet enim ultrices, ultrices elit pulvinar, volutpat risus. + + +% Please keep the Author Summary between 150 and 200 words. Use first person. +% PLOS ONE, PLOS Biology, PLOS Global Public Health, PLOS Mental Health, and PLOS Water authors please skip this step. Author Summary is not valid for submissions to these journals. + +% For PLOS Medicine authors, please structure your author summary with answers to the following questions: +% Why was this study done? +% What did the researchers do and find? +% What do these findings mean? +% +\section*{Author summary} +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur eget porta erat. Morbi consectetur est vel gravida pretium. Suspendisse ut dui eu ante cursus gravida non sed sem. Nullam sapien tellus, commodo id velit id, eleifend volutpat quam. Phasellus mauris velit, dapibus finibus elementum vel, pulvinar non tellus. Nunc pellentesque pretium diam, quis maximus dolor faucibus id. Nunc convallis sodales ante, ut ullamcorper est egestas vitae. Nam sit amet enim ultrices, ultrices elit pulvinar, volutpat risus. + +\linenumbers + +% Use "Eq" instead of "Equation" for equation citations. +\section*{Introduction} +Lorem ipsum dolor sit~\cite{bib1} amet, consectetur adipiscing elit. Curabitur eget porta erat. Morbi consectetur est vel gravida pretium. Suspendisse ut dui eu ante cursus gravida non sed sem. Nullam Eq~(\ref{eq:schemeP}) sapien tellus, commodo id velit id, eleifend volutpat quam. Phasellus mauris velit, dapibus finibus elementum vel, pulvinar non tellus. Nunc pellentesque pretium diam, quis maximus dolor faucibus id.~\cite{bib2} Nunc convallis sodales ante, ut ullamcorper est egestas vitae~\cite{bib3}. Nam sit amet enim ultrices, ultrices elit pulvinar, volutpat risus~\cite{bib4}. + +\begin{eqnarray} +\label{eq:schemeP} + \mathrm{P_Y} = \underbrace{H(Y_n) - H(Y_n|\mathbf{V}^{Y}_{n})}_{S_Y} + \underbrace{H(Y_n|\mathbf{V}^{Y}_{n})- H(Y_n|\mathbf{V}^{X,Y}_{n})}_{T_{X\rightarrow Y}}, +\end{eqnarray} + +\section*{Materials and methods} +\subsection*{Etiam eget sapien nibh} + +% For figure citations, please use "Fig" instead of "Figure". +Nulla mi mi, Fig~\ref{fig1} venenatis sed ipsum varius, volutpat euismod diam. Proin rutrum vel massa non gravida. Quisque tempor sem et dignissim rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi at justo vitae nulla elementum commodo eu id massa. In vitae diam ac augue semper tincidunt eu ut eros. Fusce fringilla erat porttitor lectus cursus, \nameref{S1_Video} vel sagittis arcu lobortis. Aliquam in enim semper, aliquam massa id, cursus neque. Praesent faucibus semper libero. + +% Place figure captions after the first paragraph in which they are cited. +\begin{figure}[!h] +\caption{\textbf{Bold the figure title.} +Figure caption text here, please use this space for the figure panel descriptions instead of using subfigure commands. A: Lorem ipsum dolor sit amet. B: Consectetur adipiscing elit.} +\label{fig1} +\end{figure} + +% Results and Discussion can be combined. +\section*{Results} +Nulla mi mi, venenatis sed ipsum varius, Table~\ref{table1} volutpat euismod diam. Proin rutrum vel massa non gravida. Quisque tempor sem et dignissim rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi at justo vitae nulla elementum commodo eu id massa. In vitae diam ac augue semper tincidunt eu ut eros. Fusce fringilla erat porttitor lectus cursus, vel sagittis arcu lobortis. Aliquam in enim semper, aliquam massa id, cursus neque. Praesent faucibus semper libero. + +% Place tables after the first paragraph in which they are cited. +\begin{table}[!ht] +\begin{adjustwidth}{-2.25in}{0in} % Comment out/remove adjustwidth environment if table fits in text column. +\centering +\caption{\textbf{Table caption Nulla mi mi, venenatis sed ipsum varius, volutpat euismod diam.}} +\begin{tabular}{|l+l|l|l|l|l|l|l|} +\hline +\multicolumn{4}{|l|}{\textbf{Heading1}} & \multicolumn{4}{|l|}{\textbf{Heading2}}\\ \thickhline +$cell1 row1$ & cell2 row 1 & cell3 row 1 & cell4 row 1 & cell5 row 1 & cell6 row 1 & cell7 row 1 & cell8 row 1\\ \hline +$cell1 row2$ & cell2 row 2 & cell3 row 2 & cell4 row 2 & cell5 row 2 & cell6 row 2 & cell7 row 2 & cell8 row 2\\ \hline +$cell1 row3$ & cell2 row 3 & cell3 row 3 & cell4 row 3 & cell5 row 3 & cell6 row 3 & cell7 row 3 & cell8 row 3\\ \hline +\end{tabular} +\begin{flushleft} Table notes Phasellus venenatis, tortor nec vestibulum mattis, massa tortor interdum felis, nec pellentesque metus tortor nec nisl. Ut ornare mauris tellus, vel dapibus arcu suscipit sed. +\end{flushleft} +\label{table1} +\end{adjustwidth} +\end{table} + + +%PLOS does not support heading levels beyond the 3rd (no 4th level headings). +\subsection*{\lorem\ and \ipsum\ nunc blandit a tortor} +\subsubsection*{3rd level heading} +Maecenas convallis mauris sit amet sem ultrices gravida~\cite{bib5}. Etiam eget sapien nibh. Sed ac ipsum eget enim egestas ullamcorper nec euismod ligula. Curabitur fringilla pulvinar lectus consectetur pellentesque. Quisque augue sem, tincidunt sit amet feugiat eget, ullamcorper sed velit~\cite{bib6}. Sed non aliquet felis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris commodo justo ac dui pretium imperdiet. Sed suscipit iaculis mi at feugiat. + +\begin{enumerate} + \item react + \item diffuse free particles + \item increment time by dt and go to 1 +\end{enumerate} + + +\subsection*{Sed ac quam id nisi malesuada congue} + +Nulla mi mi, venenatis sed ipsum varius, volutpat euismod diam. Proin rutrum vel massa non gravida. Quisque tempor sem et dignissim rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit~\cite{bib7}. Morbi at justo vitae nulla elementum commodo eu id massa~\cite{bib8}. In vitae diam ac augue semper tincidunt eu ut eros. Fusce fringilla erat porttitor lectus cursus, vel sagittis arcu lobortis~\cite{bib9}. Aliquam in enim semper, aliquam massa id, cursus neque. Praesent faucibus semper libero. + +\begin{itemize} + \item First bulleted item. + \item Second bulleted item. + \item Third bulleted item. +\end{itemize} + +\section*{Discussion} +Nulla mi mi, venenatis sed ipsum varius, Table~\ref{table1} volutpat euismod diam~\cite{bib10}. Proin rutrum vel massa non gravida. Quisque tempor sem et dignissim rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi at justo vitae nulla elementum commodo eu id massa~\cite{bib11}. In vitae diam ac augue semper tincidunt eu ut eros. Fusce fringilla erat porttitor lectus cursus, vel sagittis arcu lobortis. Aliquam in enim semper, aliquam massa id, cursus neque. Praesent faucibus semper libero~\cite{bib12}. + +\section*{Conclusion} + +CO\textsubscript{2} Maecenas convallis mauris sit amet sem ultrices gravida. Etiam eget sapien nibh. Sed ac ipsum eget enim egestas ullamcorper nec euismod ligula. Curabitur fringilla pulvinar lectus consectetur pellentesque. Quisque augue sem, tincidunt sit amet feugiat eget, ullamcorper sed velit~\cite{bib13}. + +Sed non aliquet felis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris commodo justo ac dui pretium imperdiet. Sed suscipit iaculis mi at feugiat. Ut neque ipsum, luctus id lacus ut, laoreet scelerisque urna. Phasellus venenatis, tortor nec vestibulum mattis, massa tortor interdum felis, nec pellentesque metus tortor nec nisl. Ut ornare mauris tellus, vel dapibus arcu suscipit sed. Nam condimentum sem eget mollis euismod. Nullam dui urna, gravida venenatis dui et, tincidunt sodales ex. Nunc est dui, sodales sed mauris nec, auctor sagittis leo. Aliquam tincidunt, ex in facilisis elementum, libero lectus luctus est, non vulputate nisl augue at dolor. For more information, see \nameref{S1_Appendix}. + +\section*{Supporting information} + +% Include only the SI item label in the paragraph heading. Use the \nameref{label} command to cite SI items in the text. +\paragraph*{S1 Fig.} +\label{S1_Fig} +\textbf{Bold the title sentence.} Add descriptive text after the title of the item (optional). + +\paragraph*{S2 Fig.} +\label{S2_Fig} +\textbf{Lorem ipsum.} Maecenas convallis mauris sit amet sem ultrices gravida. Etiam eget sapien nibh. Sed ac ipsum eget enim egestas ullamcorper nec euismod ligula. Curabitur fringilla pulvinar lectus consectetur pellentesque. + +\paragraph*{S1 File.} +\label{S1_File} +\textbf{Lorem ipsum.} Maecenas convallis mauris sit amet sem ultrices gravida. Etiam eget sapien nibh. Sed ac ipsum eget enim egestas ullamcorper nec euismod ligula. Curabitur fringilla pulvinar lectus consectetur pellentesque. + +\paragraph*{S1 Video.} +\label{S1_Video} +\textbf{Lorem ipsum.} Maecenas convallis mauris sit amet sem ultrices gravida. Etiam eget sapien nibh. Sed ac ipsum eget enim egestas ullamcorper nec euismod ligula. Curabitur fringilla pulvinar lectus consectetur pellentesque. + +\paragraph*{S1 Appendix.} +\label{S1_Appendix} +\textbf{Lorem ipsum.} Maecenas convallis mauris sit amet sem ultrices gravida. Etiam eget sapien nibh. Sed ac ipsum eget enim egestas ullamcorper nec euismod ligula. Curabitur fringilla pulvinar lectus consectetur pellentesque. + +\paragraph*{S1 Table.} +\label{S1_Table} +\textbf{Lorem ipsum.} Maecenas convallis mauris sit amet sem ultrices gravida. Etiam eget sapien nibh. Sed ac ipsum eget enim egestas ullamcorper nec euismod ligula. Curabitur fringilla pulvinar lectus consectetur pellentesque. + +\section*{Acknowledgments} + +This section is intended only for general acknowledgements and thanks. Any +information related to funding, data availability, author contributions, etc. +should be entered directly into their dedicated fields in the PLOS Editorial +Manager submission system, which will then be incorporated into the appropriate +section in your article during the production process. + +\nolinenumbers + +% Please compile your BiBTeX database using the "plos2025.bst" BibTeX style. +% This file is part of the current package. +% A sample BibTeX file is also included as "plos_bibtex_sample.bib". +% +% or +% +% Type in your references following Vancouver style and reference formatting instructions +% available at https://journals.plos.org/plosone/s/submission-guidelines#loc-references +% \begin{thebibliography}{} +% \bibitem{} +% Text +% \end{thebibliography} + +\bibliography{plos_bibtex_sample} + +\end{document} + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..f162a86 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,26 @@ +[project] +authors = [{name = "Rudolf J Schnetler", email = "r.schnetler@uq.edu.au"}] +dependencies = [] +name = "rudolfjs.github.io" +requires-python = ">= 3.11" +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.pixi.workspace] +channels = ["conda-forge"] +platforms = ["linux-64"] + +[tool.pixi.pypi-dependencies] +rudolfjs_github_io = { path = ".", editable = true } + +[tool.pixi.tasks] + +[tool.pixi.dependencies] +python = ">=3.13.7,<3.14" +matplotlib = ">=3.10.6,<4" +numpy = ">=2.3.3,<3" +duckdb = ">=1.3.2,<2" +pyarrow = ">=21.0.0,<22" diff --git a/references.bib b/references.bib new file mode 100644 index 0000000..5de1424 --- /dev/null +++ b/references.bib @@ -0,0 +1,7 @@ +@misc{crates_io, + author = {{Rust Foundation}}, + title = {The Rust community's crate registry}, + howpublished = {Crates.io}, + note = {Accessed October 1, 2025}, + url = {https://crates.io/} +} \ No newline at end of file diff --git a/scripts/fnv32a.py b/scripts/fnv32a.py new file mode 100755 index 0000000..76ec2b6 --- /dev/null +++ b/scripts/fnv32a.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +""" +FNV-1a 32-bit hash implementation +Matches Hugo's hash.FNV32a function +""" +import sys + +def fnv32a(data): + """Compute FNV-1a 32-bit hash""" + if isinstance(data, str): + data = data.encode('utf-8') + + # FNV-1a parameters for 32 bits + FNV_32_PRIME = 0x01000193 + FNV_32_OFFSET_BASIS = 0x811c9dc5 + + hash_value = FNV_32_OFFSET_BASIS + for byte in data: + hash_value ^= byte + hash_value = (hash_value * FNV_32_PRIME) & 0xffffffff + + return hash_value + +if __name__ == "__main__": + if len(sys.argv) > 1: + # Read from argument + text = sys.argv[1] + else: + # Read from stdin + text = sys.stdin.read() + + print(fnv32a(text)) \ No newline at end of file diff --git a/scripts/render-typst.sh b/scripts/render-typst.sh new file mode 100755 index 0000000..9067693 --- /dev/null +++ b/scripts/render-typst.sh @@ -0,0 +1,171 @@ +#!/bin/bash + +# Typst renderer for Hugo +# This script processes Typst code blocks in markdown files and generates PNG outputs + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Configuration +CONTENT_DIR="${1:-content}" +OUTPUT_DIR="${2:-static/rendered/typst}" +TEMP_DIR=".typst-temp-$$" + +# Create temp directory +mkdir -p "$TEMP_DIR" + +# Cleanup on exit +trap "rm -rf $TEMP_DIR" EXIT + +echo -e "${GREEN}Starting Typst rendering...${NC}" + +# Create output directory structure +mkdir -p "$OUTPUT_DIR" + +# Find all markdown files +find "$CONTENT_DIR" -name "*.md" -type f | while read -r file; do + # Get the slug from the file path + slug=$(basename "$file" .md) + dir_name=$(dirname "$file") + + # Check if file contains typst code blocks with render or side-by-side attributes + if grep -q '```typst.*{.*render.*}' "$file" || grep -q '```typst.*{.*side-by-side.*}' "$file"; then + echo -e "${YELLOW}Processing: $file${NC}" + + # Create output directory for this post + post_output_dir="$OUTPUT_DIR/$slug" + mkdir -p "$post_output_dir" + + # Track needed hashes for this post + needed_hashes_file="$TEMP_DIR/needed-$slug.txt" + > "$needed_hashes_file" + + # Extract typst code blocks that need rendering + awk ' + /```typst.*{.*(render|side-by-side).*}/ { + in_block=1 + block_content="" + next + } + /```$/ && in_block { + in_block=0 + # Remove trailing newline to match Hugo .Inner behavior + sub(/\n$/, "", block_content) + + # Write content to temp file + temp_file="'$TEMP_DIR'/temp-block-" NR ".typ" + printf "%s", block_content > temp_file + close(temp_file) + + # Generate FNV32a hash for this content (matches Hugo hash.FNV32a) + hash_cmd="python3 scripts/fnv32a.py < " temp_file + hash_cmd | getline hash + close(hash_cmd) + + # Rename to final name with hash + final_file="'$TEMP_DIR'/typst-" hash ".typ" + system("mv " temp_file " " final_file) + + # Print the hash and filename for processing + print "typst-" hash + next + } + in_block { + if (block_content != "") block_content = block_content "\n" + block_content = block_content $0 + } + ' "$file" | while read -r hash_name; do + + if [ -n "$hash_name" ]; then + # Record this hash as needed + echo "$hash_name" >> "$needed_hashes_file" + + temp_typst_file="$TEMP_DIR/${hash_name}.typ" + output_png="$post_output_dir/${hash_name}.png" + + # Check if output already exists (caching) + if [ -f "$output_png" ]; then + echo " Cached: ${hash_name}.png" + else + # Compile Typst to PNG + echo " Compiling: ${hash_name}.typ -> ${hash_name}.png" + + # Copy any referenced assets from project root to temp dir + # This allows relative paths in Typst code to work + for ext in png jpg jpeg bib svg; do + for asset in *."$ext"; do + [ -f "$asset" ] && cp "$asset" "$TEMP_DIR/" 2>/dev/null || true + done + done + + # Try PNG first (for simple single-page docs) + if typst compile "$temp_typst_file" "$output_png" 2>/dev/null; then + echo -e " ${GREEN}✓${NC} Generated: ${hash_name}.png" + else + # Multi-page document - use PDF instead + output_pdf="${output_png%.png}.pdf" + if typst compile "$temp_typst_file" "$output_pdf"; then + echo -e " ${GREEN}✓${NC} Generated: ${hash_name}.pdf" + else + echo -e " ${RED}✗${NC} Failed to compile: ${hash_name}.typ" + fi + fi + fi + fi + done + + # Cleanup orphaned PNGs (files no longer referenced in the markdown) + if [ -d "$post_output_dir" ] && [ -f "$needed_hashes_file" ]; then + for png_file in "$post_output_dir"/*.png; do + if [ -f "$png_file" ]; then + png_basename=$(basename "$png_file" .png) + if ! grep -q "^${png_basename}$" "$needed_hashes_file"; then + echo -e " ${RED}Removing orphaned:${NC} ${png_basename}.png" + rm "$png_file" + fi + fi + done + fi + else + # No typst render blocks found - remove entire directory if it exists + post_output_dir="$OUTPUT_DIR/$slug" + if [ -d "$post_output_dir" ]; then + echo -e "${YELLOW}No render blocks in: $file${NC}" + echo -e " ${RED}Removing directory:${NC} $slug/" + rm -rf "$post_output_dir" + fi + fi +done + +echo -e "${GREEN}Typst rendering complete!${NC}" + +# Cleanup directories for deleted markdown files +echo -e "${YELLOW}Checking for orphaned directories...${NC}" +for post_dir in "$OUTPUT_DIR"/*; do + if [ -d "$post_dir" ]; then + slug=$(basename "$post_dir") + # Check if corresponding markdown file exists + md_found=false + while IFS= read -r md_file; do + md_slug=$(basename "$md_file" .md) + if [ "$md_slug" = "$slug" ]; then + md_found=true + break + fi + done < <(find "$CONTENT_DIR" -name "*.md" -type f) + + if [ "$md_found" = false ]; then + echo -e " ${RED}Removing directory for deleted post:${NC} $slug/" + rm -rf "$post_dir" + fi + fi +done + +# Count total rendered files +total_files=$(find "$OUTPUT_DIR" -name "*.png" -type f 2>/dev/null | wc -l) +echo -e "${GREEN}Total rendered files: $total_files${NC}" \ No newline at end of file diff --git a/scripts/xkcd_sine.py b/scripts/xkcd_sine.py new file mode 100644 index 0000000..fe844bd --- /dev/null +++ b/scripts/xkcd_sine.py @@ -0,0 +1,51 @@ +import matplotlib.pyplot as plt +import numpy as np + +annotations = [ + "a new day, yay!", + "work starts", + "lunch", + "afternoon low", + "work ends", + "dinner!", + "gaming &\nprivate projects", + "games too hard,\nprojects too long,\ngo to sleep" +] +annotation_pts = [(x, np.sin(x)) for x in (6, 8, 12, 15, 17, 19, 20, 22)] +text_positions = [(6, -1), (8, 1.5), (12, -1.5), (13, 1.7), + (16,-2), (17, 1.25), (19, 1.5), (19, -1)] +SINE_FORMULA = r"$sin(x) = \sum_{n=0}^\infty\frac{(-1)^n}{(2n+1)!}x^{2n+1}$" + + +def sine_is_life(output_path='sine_is_life.png'): + fig, ax = plt.subplots(figsize=(12,6)) + fig.suptitle(f"THE FUNCTION OF LIFE: {SINE_FORMULA}") + + ax.set_ylim(-3, 3) + ax.spines['right'].set_color('none') + ax.spines['top'].set_color('none') + + x = np.linspace(6, 22, 200) + y = np.sin(x) + + plt.xticks([6, 8, 12, 17, 22], ["6am", "8am", "12pm", "5pm", "10pm"]) + plt.yticks([-1, 1], ["not happy", "happy"]) + + for text, point, text_pos in zip(annotations, annotation_pts, text_positions): + ax.annotate( + text.upper(), + xy=point, + size=10, + xytext=text_pos, + arrowprops=dict(arrowstyle='fancy') + ) + + ax.plot(x, y, linewidth=3) + plt.savefig(output_path, dpi=300, bbox_inches='tight') + print(f"Graph saved to {output_path}") + #plt.show() + + +if __name__ == "__main__": + with plt.xkcd(): + sine_is_life() \ No newline at end of file diff --git a/sine_is_life.png b/sine_is_life.png new file mode 100644 index 0000000..086f745 Binary files /dev/null and b/sine_is_life.png differ diff --git a/src/rudolfjs_github_io/__init__.py b/src/rudolfjs_github_io/__init__.py new file mode 100644 index 0000000..dc2c5ca --- /dev/null +++ b/src/rudolfjs_github_io/__init__.py @@ -0,0 +1 @@ +# this was auto generated by pixi - unsure if I will keep it \ No newline at end of file diff --git a/static/css/blockquote.css b/static/css/blockquote.css new file mode 100644 index 0000000..0dcc087 --- /dev/null +++ b/static/css/blockquote.css @@ -0,0 +1,64 @@ +/* Blockquote styling */ +blockquote { + margin: 1.5rem 0; + padding: 1.25rem 1.5rem; + /* Dark blue-gray gradient background matching typst render boxes */ + background: linear-gradient(135deg, #334155 0%, #1e293b 100%) !important; + /* Pale yellow border matching hyperlink highlight - signals "important" */ + border-left: 4px solid rgba(254, 240, 138, 0.7); + border-radius: 8px; + color: #f8fafc !important; + font-style: italic; + position: relative; +} + +blockquote p { + margin: 0; + line-height: 1.7; + color: #f8fafc !important; +} + +blockquote p:not(:last-child) { + margin-bottom: 0.75rem; +} + +/* Nested blockquotes */ +blockquote blockquote { + margin: 1rem 0 0 0; + /* Lighter yellow for nested quotes */ + border-left-color: rgba(254, 240, 138, 0.9); + background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%) !important; + color: #f8fafc !important; +} + +/* Code blocks inside blockquotes */ +blockquote code { + background: rgba(0, 0, 0, 0.3); + color: #fbbf24; + padding: 0.2em 0.4em; + border-radius: 3px; + font-style: normal; +} + +blockquote pre { + background: rgba(0, 0, 0, 0.3); + border-radius: 6px; + font-style: normal; +} + +/* Links inside blockquotes */ +blockquote a { + color: #60a5fa; + text-decoration: underline; +} + +blockquote a:hover { + color: #93c5fd; +} + +/* Strong/bold text in blockquotes */ +blockquote strong { + color: #f1f5f9; + font-style: normal; +} + diff --git a/static/css/highlighter.css b/static/css/highlighter.css index 13d7dfd..e7f7a3c 100644 --- a/static/css/highlighter.css +++ b/static/css/highlighter.css @@ -8,13 +8,14 @@ article.prose a { padding: 0.05em 0.25em !important; margin: 0 -0.05em; border-radius: 0.2em; + font-weight: 600 !important; transition: all 0.15s ease; background-image: linear-gradient( to bottom, transparent 0%, transparent 50%, - rgba(254, 240, 138, 0.7) 50%, - rgba(254, 240, 138, 0.7) 100% + rgba(255, 234, 0, 0.5) 50%, + rgba(255, 234, 0, 0.5) 100% ) !important; background-position: 0 0; background-size: 100% 100%; diff --git a/static/css/typst-render.css b/static/css/typst-render.css new file mode 100644 index 0000000..d78330e --- /dev/null +++ b/static/css/typst-render.css @@ -0,0 +1,180 @@ +/* Typst rendering styles */ + +/* Container for side-by-side display */ +.typst-container.side-by-side { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0; + margin: 1.5rem 0; + border: 1px solid #313244; + border-radius: 8px; + overflow: hidden; + background: #1e1e2e; + align-items: stretch; +} + +/* Code section */ +.typst-code { + background: #282c34; + border-right: 1px solid #313244; + overflow-x: auto; + display: flex; + flex-direction: column; +} + +.typst-code pre { + margin: 0 !important; + border-radius: 0; + box-shadow: none !important; + position: relative; + flex: 1; +} + +.typst-code pre code { + padding: 1em !important; + padding-top: 1em !important; + margin: 0 !important; + display: block; +} + +.typst-code pre code.hljs { + padding: 1em !important; + margin: 0 !important; + box-shadow: none !important; +} + +.typst-container.side-by-side .typst-code pre code.hljs { + box-shadow: none !important; +} + +/* Ensure copy button works in side-by-side */ +.typst-code .copy-code-button { + top: 0.5rem; + right: 0.5rem; +} + +/* Output section */ +.typst-output { + /* Blue-gray gradient background for the "desk" */ + background: linear-gradient(135deg, #334155 0%, #1e293b 100%); + padding: 2rem; + display: flex; + align-items: flex-start; + justify-content: center; + min-height: 100%; + position: relative; +} + +.typst-output img { + max-width: 100%; + height: auto; + display: block; + border-radius: 8px; + /* White background and elevated shadow for paper effect */ + background: #ffffff; + padding: 1rem; + box-shadow: + 0 4px 6px -1px rgba(0, 0, 0, 0.3), + 0 2px 4px -1px rgba(0, 0, 0, 0.2), + 0 10px 15px -3px rgba(0, 0, 0, 0.4), + 0 0 0 1px rgba(255, 255, 255, 0.05); +} + +/* Placeholder when image is not yet generated */ +.typst-placeholder { + display: none; + text-align: center; + color: #6c7086; + padding: 2rem; +} + +.typst-output img[src=""] + .typst-placeholder, +.typst-output img:not([src]) + .typst-placeholder, +.typst-output img[src*="404"] + .typst-placeholder { + display: block; +} + +.typst-output img[src=""]:not([src*="404"]), +.typst-output img:not([src]), +.typst-output img[src*="404"] { + display: none; +} + +.typst-note { + font-size: 0.875rem; + color: #6c7086; + font-style: italic; + margin-top: 1rem; +} + +/* Render-only display */ +.typst-render { + margin: 1.5rem 0; + /* Blue-gray surface to simulate a desk/background */ + background: linear-gradient(135deg, #334155 0%, #1e293b 100%); + padding: 2rem; + border-radius: 12px; +} + +.typst-render .typst-output { + /* Remove double background/padding - parent .typst-render already provides it */ + background: transparent; + padding: 0; +} + +/* Hide code in render mode placeholder */ +.typst-render .typst-placeholder pre { + display: none; +} + +/* Mobile responsive design */ +@media (max-width: 768px) { + .typst-container.side-by-side { + grid-template-columns: 1fr; + grid-template-rows: auto auto; + } + + /* Ensure code appears first (top) */ + .typst-code { + order: 1; + border-right: none; + border-bottom: 1px solid #313244; + } + + /* Render appears second (bottom) */ + .typst-output { + order: 2; + } +} + +/* Dark mode adjustments */ +@media (prefers-color-scheme: dark) { + .typst-output { + background: #f4f4f4; + } +} + +/* Loading state */ +.typst-loading { + position: relative; +} + +.typst-loading::after { + content: ""; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 40px; + height: 40px; + border: 4px solid #89b4fa; + border-top-color: transparent; + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +@keyframes spin { + to { + transform: translate(-50%, -50%) rotate(360deg); + } +} \ No newline at end of file diff --git a/static/rendered/typst/typst-env-management/typst-1220667901.png b/static/rendered/typst/typst-env-management/typst-1220667901.png new file mode 100644 index 0000000..dc668a2 Binary files /dev/null and b/static/rendered/typst/typst-env-management/typst-1220667901.png differ diff --git a/static/rendered/typst/typst-env-management/typst-1905494711.png b/static/rendered/typst/typst-env-management/typst-1905494711.png new file mode 100644 index 0000000..06a1f05 Binary files /dev/null and b/static/rendered/typst/typst-env-management/typst-1905494711.png differ diff --git a/static/rendered/typst/typst-env-management/typst-2798805235.png b/static/rendered/typst/typst-env-management/typst-2798805235.png new file mode 100644 index 0000000..c07f38f Binary files /dev/null and b/static/rendered/typst/typst-env-management/typst-2798805235.png differ diff --git a/static/rendered/typst/typst-env-management/typst-673833989.png b/static/rendered/typst/typst-env-management/typst-673833989.png new file mode 100644 index 0000000..bba400c Binary files /dev/null and b/static/rendered/typst/typst-env-management/typst-673833989.png differ diff --git a/static/rendered/typst/typst-env-management/typst-877334568.png b/static/rendered/typst/typst-env-management/typst-877334568.png new file mode 100644 index 0000000..05b313a Binary files /dev/null and b/static/rendered/typst/typst-env-management/typst-877334568.png differ diff --git a/static/rendered/typst/typst-env-management/typst-993561090.png b/static/rendered/typst/typst-env-management/typst-993561090.png new file mode 100644 index 0000000..ab68484 Binary files /dev/null and b/static/rendered/typst/typst-env-management/typst-993561090.png differ diff --git a/tests/.gitkeep b/tests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/code-highlighting.spec.js b/tests/code-highlighting.spec.js new file mode 100644 index 0000000..d0a4689 --- /dev/null +++ b/tests/code-highlighting.spec.js @@ -0,0 +1,200 @@ +// @ts-check +import { test, expect } from '@playwright/test'; + +/** + * Test suite for code block syntax highlighting + * + * This test suite verifies that: + * 1. Standard languages (Python, Bash, Julia) have proper syntax highlighting + * 2. Custom Typst language has proper syntax highlighting + * 3. Custom Mermaid raw code has proper syntax highlighting + * 4. Rendered diagrams (Mermaid, Typst) are not highlighted as code + */ + +test.describe('Code Block Syntax Highlighting', () => { + + test.beforeEach(async ({ page }) => { + // Navigate to the debug page that contains all test code blocks + await page.goto('/notes/posts/debug-code-blocks/'); + + // Wait for Highlight.js to finish processing + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(1000); // Give extra time for JS to execute + }); + + test('Python code block has syntax highlighting', async ({ page }) => { + // Find the Python code block + const pythonBlock = page.locator('pre code.language-python').first(); + + // Verify the code block exists + await expect(pythonBlock).toBeVisible(); + + // Verify it has been processed by Highlight.js (has hljs class) + await expect(pythonBlock).toHaveClass(/hljs/); + + // Verify it contains highlighted elements (span tags with classes) + const highlightedElements = pythonBlock.locator('span[class*="hljs-"]'); + await expect(highlightedElements).not.toHaveCount(0); + + // Take a screenshot for visual verification + await pythonBlock.screenshot({ path: 'test-results/python-highlighting.png' }); + }); + + test('Bash code block has syntax highlighting', async ({ page }) => { + const bashBlock = page.locator('pre code.language-bash').first(); + + await expect(bashBlock).toBeVisible(); + await expect(bashBlock).toHaveClass(/hljs/); + + const highlightedElements = bashBlock.locator('span[class*="hljs-"]'); + await expect(highlightedElements).not.toHaveCount(0); + }); + + test('Julia code block has syntax highlighting', async ({ page }) => { + const juliaBlock = page.locator('pre code.language-julia').first(); + + await expect(juliaBlock).toBeVisible(); + await expect(juliaBlock).toHaveClass(/hljs/); + + const highlightedElements = juliaBlock.locator('span[class*="hljs-"]'); + await expect(highlightedElements).not.toHaveCount(0); + }); + + test('Typst raw code block has syntax highlighting', async ({ page }) => { + // Find the default Typst code block (should show raw code) + const typstBlock = page.locator('pre code.language-typst').first(); + + await expect(typstBlock).toBeVisible(); + + // Verify it has been processed by Highlight.js + await expect(typstBlock).toHaveClass(/hljs/); + + // Verify it contains highlighted elements + const highlightedElements = typstBlock.locator('span[class*="hljs-"]'); + await expect(highlightedElements).not.toHaveCount(0); + + // Verify the content includes Typst syntax + const content = await typstBlock.textContent(); + expect(content).toContain('#set'); + + // Take a screenshot for visual verification + await typstBlock.screenshot({ path: 'test-results/typst-highlighting.png' }); + }); + + test('Mermaid raw code block has syntax highlighting', async ({ page }) => { + // Find the Mermaid raw code block (with {.raw} attribute) + const mermaidRawBlock = page.locator('pre code.language-mermaid[data-lang="mermaid"]').first(); + + await expect(mermaidRawBlock).toBeVisible(); + + // Verify it has been processed by Highlight.js + await expect(mermaidRawBlock).toHaveClass(/hljs/); + + // Verify it contains highlighted elements + const highlightedElements = mermaidRawBlock.locator('span[class*="hljs-"]'); + await expect(highlightedElements).not.toHaveCount(0); + + // Verify the content includes Mermaid syntax + const content = await mermaidRawBlock.textContent(); + expect(content).toMatch(/graph|flowchart/); + + // Take a screenshot for visual verification + await mermaidRawBlock.screenshot({ path: 'test-results/mermaid-raw-highlighting.png' }); + }); + + test('Rendered Mermaid diagram is not highlighted as code', async ({ page }) => { + // Find rendered Mermaid diagram (without .raw class) + const renderedMermaid = page.locator('pre.mermaid').first(); + + await expect(renderedMermaid).toBeVisible(); + + // Verify it does NOT have hljs class (should not be highlighted) + await expect(renderedMermaid).not.toHaveClass(/hljs/); + + // Verify it contains SVG (rendered diagram) + const svg = renderedMermaid.locator('svg'); + await expect(svg).toBeVisible(); + }); + + test('Unknown language code block appears plain without errors', async ({ page }) => { + // Find the unknown language block + const unknownBlock = page.locator('pre code.language-unknown-lang').first(); + + await expect(unknownBlock).toBeVisible(); + + // It may or may not have hljs class, but should not throw errors + const content = await unknownBlock.textContent(); + expect(content).toContain('function test()'); + }); + + + test('Visual comparison: Typst vs Python highlighting quality', async ({ page }) => { + // Take screenshots of both for side-by-side comparison + const pythonBlock = page.locator('pre code.language-python').first(); + const typstBlock = page.locator('pre code.language-typst').first(); + + await pythonBlock.screenshot({ path: 'test-results/comparison-python.png' }); + await typstBlock.screenshot({ path: 'test-results/comparison-typst.png' }); + + // Both should have similar structure + const pythonHighlights = await pythonBlock.locator('span[class*="hljs-"]').count(); + const typstHighlights = await typstBlock.locator('span[class*="hljs-"]').count(); + + // Both should have some highlighting (exact count doesn't matter) + expect(pythonHighlights).toBeGreaterThan(0); + expect(typstHighlights).toBeGreaterThan(0); + }); +}); + +test.describe('Test Rendering Page', () => { + + test('Navigate to test rendering page', async ({ page }) => { + await page.goto('/notes/posts/test-rendering/'); + await page.waitForLoadState('networkidle'); + + // Verify page loaded + const heading = page.locator('h1, h2').first(); + await expect(heading).toBeVisible(); + }); + + test('Typst side-by-side view shows both code and output', async ({ page }) => { + await page.goto('/notes/posts/test-rendering/'); + await page.waitForLoadState('networkidle'); + + // Find the side-by-side container + const sideBySide = page.locator('.typst-container.side-by-side').first(); + + if (await sideBySide.isVisible()) { + // Verify it has both code and output sections + const codeSection = sideBySide.locator('.typst-code'); + const outputSection = sideBySide.locator('.typst-output'); + + await expect(codeSection).toBeVisible(); + await expect(outputSection).toBeVisible(); + + // Code section should have highlighted Typst code + const codeBlock = codeSection.locator('code.language-typst'); + await expect(codeBlock).toHaveClass(/hljs/); + } + }); + + test('Typst render-only view shows image output', async ({ page }) => { + await page.goto('/notes/posts/test-rendering/'); + await page.waitForLoadState('networkidle'); + + // Find the render-only container + const renderOnly = page.locator('.typst-render').first(); + + if (await renderOnly.isVisible()) { + // Should have an output section with image + const outputSection = renderOnly.locator('.typst-output'); + await expect(outputSection).toBeVisible(); + + // Check for image or placeholder + const hasImage = await outputSection.locator('img').count() > 0; + const hasPlaceholder = await outputSection.locator('.typst-placeholder').count() > 0; + + expect(hasImage || hasPlaceholder).toBeTruthy(); + } + }); +}); \ No newline at end of file diff --git a/tests/example.spec.js b/tests/example.spec.js new file mode 100644 index 0000000..26ed206 --- /dev/null +++ b/tests/example.spec.js @@ -0,0 +1,19 @@ +// @ts-check +import { test, expect } from '@playwright/test'; + +test('has title', async ({ page }) => { + await page.goto('https://playwright.dev/'); + + // Expect a title "to contain" a substring. + await expect(page).toHaveTitle(/Playwright/); +}); + +test('get started link', async ({ page }) => { + await page.goto('https://playwright.dev/'); + + // Click the get started link. + await page.getByRole('link', { name: 'Get started' }).click(); + + // Expects page to have a heading with the name of Installation. + await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible(); +}); diff --git a/tree.jpg b/tree.jpg new file mode 100644 index 0000000..0d384c0 Binary files /dev/null and b/tree.jpg differ