- store() persisted uploads under Laravel's MIME-guessed extension,
turning a .probundle (a ZIP) into .zip; embedExportProFile then
branched on the stored path, missed the bundle branch and embedded
the raw ZIP as a broken .pro (ProPresenter showed an empty slide).
Store with the real client extension and derive the bundle type from
the original filename, treating .zip as a bundle for legacy uploads.
- Skip export .pro/.probundle files that parse to zero content slides,
recording a German warning instead of injecting an empty slide.
- Attach position macros (first_slide/last_slide/all_slides) per slide
for information/moderation/sermon parts in the agenda and legacy paths.
- Cover both with ExportProFileProbundleEmbedTest and PlaylistSermonMacroTest.