MASTER PROMPT: COMPREHENSIVE MEDICAL POWERPOINT WITH ADVANCED MORPH TRANSITIONS Act as a senior professor of Paediatrics, ENT specialist, medical textbook author, undergraduate medical educator, medical illustrator, and expert Microsoft PowerPoint presentation designer. Create an exceptionally comprehensive, academically rigorous, visually sophisticated PowerPoint presentation on: EPIGLOTTITIS AND ACUTE LARYNGOTRACHEOBRONCHITIS (CROUP) Audience: Final-year MBBS students Presentation type: Detailed undergraduate medical seminar Duration: Approximately 25–35 minutes, with sufficient depth for independent study Format: Editable Microsoft PowerPoint (.pptx), 16:9 widescreen Academic standard: Standard medical textbook level, supplemented by current evidence-based clinical guidelines. 1. CORE REQUIREMENT: DO NOT OMIT IMPORTANT TEXTBOOK CONTENT This must be an elaborate teaching presentation, not a superficial summary. Cover the important concepts, classifications, aetiology, epidemiology, microbiology, pathogenesis, pathological changes, clinical manifestations, complications, differential diagnoses, investigations, treatment, prognosis, prevention and follow-up relevant to both conditions. Use relevant editions of the following standard references as the academic foundation: - Ghai Essential Pediatrics. - Nelson Textbook of Pediatrics. - Dhingra's Diseases of Ear, Nose and Throat, or another standard ENT textbook. - Other authoritative paediatric emergency medicine and infectious disease references where relevant. Use current clinical guidelines to verify time-sensitive treatment recommendations. Do not invent textbook statements, quotations, chapter numbers, page numbers, reference details or drug doses. Where textbook editions differ or current guidelines have changed practice, explain the difference and identify the applicable source. If you do not have access to the complete text of a reference, do not claim to have exhaustively reproduced or verified that book. Clearly distinguish verified textbook content from guideline-based updates. 2. PRESENTATION LENGTH AND STRUCTURE Create approximately 28–35 content-rich slides, plus a title slide and references. Expand the slide count if required to cover important material properly. Do not squeeze complex material into overcrowded slides. Divide extensive topics into consecutive slides and maintain a logical narrative. SECTION A — INTRODUCTION AND ANATOMICAL FOUNDATION Slide 1: Title - Epiglottitis and Acute Laryngotracheobronchitis (Croup). - Professional medical illustration of the upper airway. - Presenter, department and institution placeholders. Slide 2: Learning objectives - Aetiology and epidemiology. - Pathogenesis and anatomical pathology. - Clinical recognition and differential diagnosis. - Investigations and evidence-based management. - Complications, prevention and prognosis. Slide 3: Introduction and definitions - Define epiglottitis and acute laryngotracheobronchitis. - Explain the relationship between these conditions and acute upper airway obstruction. - Discuss their clinical significance and potential severity. Slide 4: Detailed upper airway anatomy - Epiglottis, vallecula, aryepiglottic folds, arytenoids, supraglottis, glottis, subglottis, cricoid cartilage and trachea. - Explain the relevant paediatric airway anatomy. - Include a large, clearly labelled sagittal anatomical illustration. Slide 5: Anatomical comparison - Show a normal airway, epiglottitis and croup side by side. - Highlight supraglottic inflammation versus subglottic narrowing. - Explain how anatomical location produces the characteristic symptoms. SECTION B — EPIGLOTTITIS Slide 6: Definition, terminology and epidemiology - Acute epiglottitis and the broader concept of supraglottitis. - Age distribution and epidemiological patterns. - Changes in incidence following Hib vaccination. - Disease occurrence in vaccinated children and adults. Slide 7: Aetiology and microbiology - Haemophilus influenzae type b. - Other relevant bacterial pathogens, including streptococci and staphylococci. - Relevant noninfectious causes or mimics where appropriate. - Explain the role of vaccination and host factors. Include a pathogen table where useful, and distinguish common causes from less frequent possibilities. Slide 8: Pathogenesis - Entry of the pathogen and local infection. - Inflammatory response and oedema. - Involvement of the epiglottis and surrounding supraglottic structures. - Progressive reduction of airway calibre. - Potential for rapid deterioration. Use a labelled pathogenesis flowchart. Slide 9: Pathology and anatomical changes - Macroscopic inflammatory changes. - Oedema and erythema. - Effects on the supraglottic airway. - Correlation between pathological changes and clinical manifestations. Use an accurate educational illustration, not a misleading decorative image. Slide 10: Clinical features — history - Rapid onset. - Fever and severe sore throat. - Dysphagia and odynophagia. - Drooling and inability to handle secretions. - Muffled or altered voice. - Respiratory distress and relevant preceding symptoms. Slide 11: Clinical features — examination - Toxic appearance. - Tripod or sniffing posture. - Drooling. - Stridor and increased work of breathing. - Signs of impending respiratory failure. - Important differences between children and adults. Explain which findings are particularly concerning and why. Slide 12: Clinical course and complications - Potentially rapid progression. - Complete airway obstruction. - Hypoxaemia and respiratory arrest. - Other clinically relevant complications supported by authoritative sources. - Factors associated with severe disease. Avoid implying that every patient follows the same progression. Slide 13: Diagnosis and differential diagnosis - Clinical recognition. - Airway assessment. - Appropriate role and limitations of laboratory investigations and imaging. - Important differentials: croup, bacterial tracheitis, retropharyngeal abscess, peritonsillar infection, foreign body and other causes of upper airway obstruction. Include a comparison table showing distinguishing features. Slide 14: Airway precautions - Suspected epiglottitis is an airway emergency. - Keep the patient calm and in the position they find most comfortable. - Avoid forcing the patient supine. - Avoid tongue-depressor examination or other distressing manoeuvres in an unstable child. - Do not delay airway management for imaging or laboratory testing. - Explain that airway examination and intervention must be planned by experienced clinicians in an appropriately equipped setting. Make this slide visually prominent. Slide 15: Emergency management of epiglottitis Create a stepwise management flowchart: 1. Recognise suspected epiglottitis. 2. Call experienced anaesthesia, ENT and paediatric teams immediately. 3. Minimise agitation and maintain a position of comfort. 4. Provide monitoring and oxygen as tolerated. 5. Plan and secure the airway when indicated in a controlled, appropriately equipped environment. 6. Start appropriate intravenous antimicrobial therapy. 7. Provide supportive care and intensive care monitoring as required. Explain the rationale for each step. Make clear that airway stabilisation takes priority and that diagnostic procedures must not delay essential treatment. Slide 16: Antibiotics and supportive treatment - Empirical intravenous antibiotic principles. - Appropriate coverage for likely pathogens. - Selection according to current guidelines, allergy status, local resistance and microbiology results. - Adjustment according to cultures when appropriate. - Supportive treatment, monitoring and escalation of care. - Duration of treatment and transition to oral therapy where appropriate, verified against the selected guideline. Present drug names and doses only when verified from an authoritative source. Slide 17: Prevention, prognosis and follow-up - Hib vaccination. - Prevention of Hib disease. - Prognosis with timely airway management and antimicrobial therapy. - Relevant infection-control and public-health considerations. - Contact prophylaxis where indicated by current public-health guidance; clearly explain that indications depend on the identified pathogen and applicable recommendations. SECTION C — ACUTE LARYNGOTRACHEOBRONCHITIS (CROUP) Slide 18: Definition and terminology - Define viral croup. - Explain acute laryngotracheobronchitis. - Differentiate typical viral croup from alternative causes of stridor. Slide 19: Epidemiology and aetiology - Typical age group. - Seasonal patterns. - Common causative viruses, particularly parainfluenza viruses. - Other relevant respiratory viruses. - Transmission and clinical context. Include a concise table of causative viruses and relevant characteristics. Slide 20: Paediatric airway anatomy and pathogenesis - Relatively narrow paediatric airway. - Subglottic mucosal inflammation and oedema. - Changes in airway resistance. - Development of turbulent airflow, barking cough and inspiratory stridor. Use a clear cross-sectional illustration of a normal and narrowed subglottic airway. Slide 21: Pathology and clinical correlation - Inflammation of the larynx and trachea, with possible bronchial involvement. - Subglottic narrowing. - Relationship between pathology and symptoms. - Explain why relatively small reductions in airway radius can have substantial physiological effects in young children. Use an anatomical illustration and a simple explanatory diagram. Slide 22: Clinical features - Viral prodrome. - Barking or seal-like cough. - Hoarseness. - Inspiratory stridor. - Fever. - Chest wall retractions and respiratory distress. - Symptoms that may worsen at night. Explain the typical course and important atypical features. Slide 23: Clinical severity assessment - Mild, moderate and severe croup. - Stridor at rest versus stridor only with agitation. - Retractions, air entry, mental status and cyanosis. - Features suggesting impending respiratory failure. - Explain that cyanosis and altered consciousness are late, concerning findings. Include a severity comparison table. Slide 24: Westley croup score Provide the complete validated scoring table with all five components: - Level of consciousness. - Cyanosis. - Stridor. - Air entry. - Chest wall retractions. Show the score assigned to every component, the total possible score and commonly used severity categories. Verify the exact score values and category boundaries against an authoritative source. Do not rely on memory or invent thresholds. Explain the score's clinical use and limitations. Clarify that treatment must not be delayed while calculating a score. Slide 25: Diagnosis and investigations - Clinical diagnosis. - When investigations are unnecessary. - Indications for further assessment in atypical or severe presentations. - Role and limitations of radiography and laboratory investigations. - Safety considerations in a child with significant respiratory distress. Explain the limited role of investigations in typical uncomplicated croup. Slide 26: Differential diagnosis of croup Include: - Epiglottitis. - Bacterial tracheitis. - Foreign body aspiration. - Retropharyngeal abscess. - Other relevant causes of stridor. Use a detailed comparison table covering onset, fever, cough, voice, drooling, appearance, airway findings and distinguishing features. Slide 27: Evidence-based treatment - Keep the child calm and minimise distress. - Corticosteroids, particularly dexamethasone. - Nebulised epinephrine for moderate-to-severe croup when indicated. - Oxygen for hypoxaemia. - Appropriate observation after nebulised epinephrine. - Supportive care. - Avoid ineffective or unnecessary treatments, including routine antibiotics for uncomplicated viral croup and unproven interventions. Include treatment indications and relevant precautions. Slide 28: Medication table Provide a clinically verified table covering: - Medication. - Indication. - Route. - Dose and maximum dose where applicable. - Onset and duration where clinically relevant. - Important precautions and adverse effects. Include dexamethasone and nebulised epinephrine. Include other medications only where justified by authoritative guidance. Explicitly distinguish recommended treatments from therapies that are not routinely recommended. Identify the guideline used for doses and observation protocols. Slide 29: Disposition, admission and discharge - Criteria supporting safe discharge. - Indications for hospital admission. - Persistent stridor at rest or significant work of breathing. - Observation after nebulised epinephrine. - Poor oral intake, hypoxaemia, atypical presentation or other clinical concerns. - Indications for senior review, intensive care or airway support. Make clear that disposition depends on clinical assessment and the applicable local guideline. Slide 30: Complications and prognosis - Respiratory deterioration. - Respiratory failure and the need for airway support in severe cases. - Expected clinical course and recovery. - Indicators that suggest an alternative diagnosis or complicated disease. - Prognostic considerations. SECTION D — COMPARISON AND CLINICAL SYNTHESIS Slide 31: Epiglottitis versus croup — comprehensive comparison Create a detailed, readable table comparing: - Definition. - Aetiology. - Typical age and epidemiology. - Onset. - Fever. - General appearance. - Cough. - Voice. - Drooling. - Dysphagia. - Stridor. - Respiratory effort. - Anatomical location. - Diagnostic approach. - Initial management. - Specific airway precautions. - Treatment. - Complications. - Prevention. Use consistent anatomical illustrations and restrained colour coding to reinforce the differences. Slide 32: Integrated approach to a child presenting with stridor Create a clinical decision flowchart: - Initial assessment of airway, breathing and circulation. - Recognition of respiratory distress and impending failure. - Identification of characteristic features. - Consideration of epiglottitis, croup and alternative diagnoses. - Immediate management priorities. - Escalation and disposition. Make airway safety the first priority. Do not create an algorithm that encourages potentially dangerous throat examination or delays emergency airway support. Slide 33: Summary and high-yield clinical pearls Provide a concise synthesis of: - Anatomical differences. - Key distinguishing clinical features. - Red flags. - Essential emergency management principles. - Important prevention and treatment points. Final slides: References Use one or more slides if necessary. List complete, accurate references for textbooks, guidelines, figures and data used. Do not invent sources, page numbers, editions or DOI details. 3. TEXTBOOK FIGURES, PICTURES, TABLES AND FLOWCHARTS Visual learning is a mandatory part of this presentation.

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.

Is it over

Not over. Your credits appear to have reset, so I'm starting the presentation now. First I'll read the medical library and PowerPoint skill instructions.
Reading File
Reading File
Reading File
Finding Sources
Finding Sources
Searching Images

croup steeple sign subglottic narrowing

Anteroposterior (AP) portable radiograph of the neck and upper thorax showing the cervical spine and proximal airway. The image displays a clear 'steeple sign,' characterized by subglottic narrowing of the tracheal air column, indicated by a horizontal red arrow. This finding is classically associated with croup (laryngotracheobronchitis) or other causes of subglottic edema. Anatomical structures visible include the cervical vertebrae, clavicles, upper ribs, and the radiolucent tracheal column. A 'PORTABLE' label is present in the bottom left, and a right-side marker 'R' is located in the upper left corner. The cervical spine shows normal alignment, while the focal narrowing is centered in the proximal subglottic region below the level of the larynx.

Anteroposterior (AP) portable radiograph of the neck and upper thorax showing the cervical spine and proximal airway. The image displays a clear 'steeple sign,' characterized by subglottic narrowing of the tracheal air column, indicated by a horizontal red arrow. This finding is classically associated with croup (laryngotracheobronchitis) or other causes of subglottic edema. Anatomical structures visible include the cervical vertebrae, clavicles, upper ribs, and the radiolucent tracheal column. A 'PORTABLE' label is present in the bottom left, and a right-side marker 'R' is located in the upper left corner. The cervical spine shows normal alignment, while the focal narrowing is centered in the proximal subglottic region below the level of the larynx.

This diagnostic image consists of two side-by-side frontal (anteroposterior) soft tissue neck radiographs focusing on the upper airway and cervical spine. The imaging shows a pediatric patient exhibiting the 'steeple sign,' a classic radiological finding characterized by subglottic tracheal narrowing. In the right-hand panel, an overlay demonstrates the objective measurement of the 'steeple shaped angle,' recorded here as 18.2 degrees. The angle is formed by tracing the tapering lateral borders of the subglottic air column toward an apex at the level of the larynx. Anatomical structures visible include the cervical vertebrae, the radiolucent tracheal air column, the clavicles, and the upper ribs. This finding is clinically significant for diagnosing croup (laryngotracheobronchitis), where inflammatory edema causes the characteristic narrowing of the airway below the vocal cords. The image serves as a teaching tool for quantitative assessment of airway constriction in emergency medicine and pediatrics.

This diagnostic image consists of two side-by-side frontal (anteroposterior) soft tissue neck radiographs focusing on the upper airway and cervical spine. The imaging shows a pediatric patient exhibiting the 'steeple sign,' a classic radiological finding characterized by subglottic tracheal narrowing. In the right-hand panel, an overlay demonstrates the objective measurement of the 'steeple shaped angle,' recorded here as 18.2 degrees. The angle is formed by tracing the tapering lateral borders of the subglottic air column toward an apex at the level of the larynx. Anatomical structures visible include the cervical vertebrae, the radiolucent tracheal air column, the clavicles, and the upper ribs. This finding is clinically significant for diagnosing croup (laryngotracheobronchitis), where inflammatory edema causes the characteristic narrowing of the airway below the vocal cords. The image serves as a teaching tool for quantitative assessment of airway constriction in emergency medicine and pediatrics.

Anteroposterior (AP) pediatric chest radiograph demonstrating findings of subglottic stenosis. The image displays the thoracic cage, including the ribs, clavicles, and mediastinum. A prominent yellow arrow indicates a localized narrowing of the air column in the subglottic region and upper trachea, characteristic of the 'steeple sign' frequently associated with croup (laryngotracheobronchitis) or structural subglottic narrowing. Inferior to the level of narrowing, the mid-to-lower distal trachea appears to maintain a more normalized caliber. The visualized lung fields are relatively clear, without evidence of consolidation, significant opacities, or pleural effusions. This diagnostic image illustrates the radiological assessment of airway diameter in a pediatric patient following critical care for respiratory distress, serving as a teaching tool for identifying upper airway obstruction and evaluating clinical improvement or persistence of tracheal stenosis.

Anteroposterior (AP) pediatric chest radiograph demonstrating findings of subglottic stenosis. The image displays the thoracic cage, including the ribs, clavicles, and mediastinum. A prominent yellow arrow indicates a localized narrowing of the air column in the subglottic region and upper trachea, characteristic of the 'steeple sign' frequently associated with croup (laryngotracheobronchitis) or structural subglottic narrowing. Inferior to the level of narrowing, the mid-to-lower distal trachea appears to maintain a more normalized caliber. The visualized lung fields are relatively clear, without evidence of consolidation, significant opacities, or pleural effusions. This diagnostic image illustrates the radiological assessment of airway diameter in a pediatric patient following critical care for respiratory distress, serving as a teaching tool for identifying upper airway obstruction and evaluating clinical improvement or persistence of tracheal stenosis.

This posterior-anterior (PA) neck radiograph of a pediatric patient demonstrates significant airway pathology. The imaging highlights the classic 'steeple sign,' characterized by subglottic narrowing where the airway tapers as it approaches the larynx, indicated by the yellow arrow. Furthermore, there is evidence of diffuse tracheal narrowing throughout the visible cervical and upper thoracic trachea. The anatomical landmarks include the mandible superiorly, the cervical vertebrae centrally, and the clavicles and upper ribs inferiorly. This diagnostic image is representative of clinical findings associated with severe croup (laryngotracheobronchitis) or recurrent subglottic stenosis. The radiograph is intended for medical education to teach the visual identification of obstructive upper airway processes in pediatric emergency medicine and intensive care settings.

This posterior-anterior (PA) neck radiograph of a pediatric patient demonstrates significant airway pathology. The imaging highlights the classic 'steeple sign,' characterized by subglottic narrowing where the airway tapers as it approaches the larynx, indicated by the yellow arrow. Furthermore, there is evidence of diffuse tracheal narrowing throughout the visible cervical and upper thoracic trachea. The anatomical landmarks include the mandible superiorly, the cervical vertebrae centrally, and the clavicles and upper ribs inferiorly. This diagnostic image is representative of clinical findings associated with severe croup (laryngotracheobronchitis) or recurrent subglottic stenosis. The radiograph is intended for medical education to teach the visual identification of obstructive upper airway processes in pediatric emergency medicine and intensive care settings.

Searching the Web

Westley croup score components scoring mild moderate severe dexamethasone 0.15 mg/kg nebulised epinephrine guideline

Reading File
Reading File
Reading File
Searching PubMed

"croup"[MeSH Terms] AND "dexamethasone"

Searching Images

sagittal view larynx anatomy epiglottis vallecula vocal cords subglottic cricoid labelled

Searching Content

"Westley" in /textbooks/9781260019933

Reading File
Reading File
Reading File
Finding Sources
Reading File
Reading File
Searching the Web

acute epiglottitis children management ceftriaxone dose airway intubation Hib rifampin prophylaxis household contacts

Running Command

mkdir -p /tmp/workspace/epiglottitis-croup/{assets,output,src} && cd /tmp/workspace/epiglottitis-croup && cat > src/figs.py <<'EOF' import numpy as np, matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt from matplotlib.patches import Polygon, Ellipse, Rectangle, Circle, FancyArrowPatch try: from scipy.interpolate import PchipInterpolator as P except Exception: P=None TISSUE='#F6E7D8'; MUC='#B5836B'; AIR='#DCEEFA'; CART='#C3D3E4'; PINK='#E9A3A3'; RED='#C0392B'; NAVY='#1F3A5F' ys=np.array([12,8.6,7.4,6.0,5.0,4.4,3.0,2.0,0]) def sm(y,v): yy=np.linspace(0,12,120) if P is not None: f=P(ys[::-1],np.array(v)[::-1]); return yy[::-1],f(yy[::-1]) return yy[::-1],np.interp(yy,ys[::-1],np.array(v)[::-1])[::-1] ANT=[3.6,3.9,4.1,4.3,4.8,4.7,4.6,4.6,4.6]; POST=[6.8,6.6,6.4,6.2,5.9,6.0,6.1,6.1,6.1] CANT=[3.6,3.9,4.1,4.3,4.9,5.05,4.95,4.75,4.6]; CPOST=[6.8,6.6,6.4,6.2,5.8,5.65,5.75,5.95,6.1] def draw(ax,mode='normal',labels=True,fs=9,notes=None): ax.set_xlim(0,11.5); ax.set_ylim(-0.3,12.3); ax.axis('off'); ax.set_aspect('equal') ax.add_patch(Rectangle((2.4,0),5.4,12,fc=TISSUE,ec='none')) ax.add_patch(Ellipse((3.0,10.7),3.6,2.6,fc='#E58E8E',ec=MUC,lw=1)) a=CANT if mode=='croup' else ANT; p=CPOST if mode=='croup' else POST y1,xa=sm(ys,a); y2,xp=sm(ys,p) pts=list(zip(xa,y1))+list(zip(xp[::-1],y2[::-1])) ax.add_patch(Polygon(pts,fc=AIR,ec=MUC,lw=2.2,zorder=3)) if mode=='croup': sy=[5.0,4.4,3.0,2.0] for n,c in ((([4.8,4.7,4.6,4.6]),[4.9,5.05,4.95,4.75]),(([5.9,6.0,6.1,6.1]),[5.8,5.65,5.75,5.95])): ax.add_patch(Polygon(list(zip(n,sy))+list(zip(c[::-1],sy[::-1])),fc=RED,ec='none',zorder=4)) # cartilages ax.add_patch(Ellipse((3.35,8.1),0.55,1.0,fc=CART,ec=MUC,lw=1)); ax.add_patch(Polygon([(3.3,7.2),(4.0,7.0),(4.15,5.4),(3.7,5.0),(3.35,5.6)],fc=CART,ec=MUC,lw=1)) ax.add_patch(Polygon([(4.1,4.85),(4.65,4.75),(4.65,3.9),(4.15,3.9)],fc=CART,ec=MUC,lw=1)) ax.add_patch(Polygon([(6.1,5.5),(6.75,5.5),(6.75,3.8),(6.15,3.8)],fc=CART,ec=MUC,lw=1)) for y in [3.2,2.5,1.8,1.1,0.4]: ax.add_patch(Rectangle((4.0,y-0.15),0.5,0.3,fc=CART,ec=MUC,lw=0.8)) # vocal cords ax.add_patch(Polygon([(4.8,5.18),(5.3,5.0),(4.8,4.82)],fc='#F2F2F2',ec=MUC,lw=1,zorder=5)) ax.add_patch(Polygon([(5.9,5.18),(5.45,5.0),(5.9,4.82)],fc='#F2F2F2',ec=MUC,lw=1,zorder=5)) # arytenoid / AE fold if mode=='epi': ax.add_patch(Ellipse((5.85,6.3),0.9,1.1,fc=RED,ec='#7B241C',lw=1,zorder=6)) else: ax.add_patch(Ellipse((6.05,6.2),0.35,0.55,fc=PINK,ec=MUC,lw=1,zorder=6)) # epiglottis cx=np.array([4.35,4.2,4.3,4.75]); cy=np.array([6.0,6.8,7.6,8.25]) w=1.15 if mode=='epi' else 0.26; sh=0.3 if mode=='epi' else 0 yy=np.linspace(6.0,8.25,30); xx=np.interp(yy,cy,cx)+sh*np.sin(np.linspace(0,np.pi,30)) pol=list(zip(xx-w/2,yy))+list(zip((xx+w/2)[::-1],yy[::-1])) col=RED if mode=='epi' else PINK ax.add_patch(Polygon(pol,fc=col,ec='#7B241C' if mode=='epi' else MUC,lw=1.2,zorder=6)) if mode=='epi': ax.add_patch(Circle((xx[-1],yy[-1]),w/2,fc=col,ec='#7B241C',lw=1.2,zorder=6)) ax.text(2.55,0.1,'ANTERIOR',fontsize=fs-2,color='#555',rotation=90,va='bottom') ax.text(7.6,0.1,'POSTERIOR',fontsize=fs-2,color='#555',rotation=90,va='bottom',ha='right') if labels: L=[('Tongue base',(2.6,10.9),0.1,10.9),('Hyoid bone',(3.2,8.1),0.1,8.9),('Vallecula',(3.95,8.5),0.1,7.9), ('Thyroid cartilage',(3.6,6.2),0.1,6.4),('Cricoid cartilage',(4.4,4.3),0.1,4.3),('Tracheal rings',(4.25,2.5),0.1,2.5)] R=[('Oropharynx',(5.3,10.5),8.2,10.5),('Epiglottis',(4.85,8.0),8.2,8.6),('Aryepiglottic fold /\narytenoid',(6.1,6.3),8.2,6.9), ('Glottis\n(vocal cords)',(5.5,5.0),8.2,5.2),('Subglottis',(5.35,4.0),8.2,3.8),('Trachea',(5.4,1.2),8.2,1.4)] for t,xy,tx,ty in L: ax.annotate(t,xy=xy,xytext=(tx,ty),fontsize=fs,color=NAVY,va='center',ha='left',arrowprops=dict(arrowstyle='-',color='#555',lw=0.8),zorder=9) for t,xy,tx,ty in R: ax.annotate(t,xy=xy,xytext=(tx,ty),fontsize=fs,color=NAVY,va='center',ha='left',arrowprops=dict(arrowstyle='-',color='#555',lw=0.8),zorder=9) if notes: for t,xy,tx,ty in notes: ax.annotate(t,xy=xy,xytext=(tx,ty),fontsize=fs,color='#7B241C',fontweight='bold',va='center',ha='left',arrowprops=dict(arrowstyle='->',color='#7B241C',lw=1.4),zorder=9) def save(fn,mode,size,fs,labels=True,notes=None,title=None): fig,ax=plt.subplots(figsize=size); draw(ax,mode,labels,fs,notes) if title: ax.set_title(title,fontsize=fs+3,color=NAVY,fontweight='bold') fig.savefig(fn,dpi=200,bbox_inches='tight',transparent=False,facecolor='white'); plt.close(fig) A='assets/' save(A+'sag_normal.png','normal',(6.4,7.4),10) save(A+'sag_epi.png','epi',(6.0,6.9),9.5,True,[('Swollen, cherry-red\nepiglottis (thumb shape)',(4.9,8.2),8.2,9.6),('Oedematous AE folds\nnarrow the inlet',(6.0,6.4),8.2,7.4)]) save(A+'sag_croup.png','croup',(6.0,6.9),9.5,True,[('Subglottic oedema\n(steeple narrowing)',(5.0,3.9),8.2,2.6)]) fig,axs=plt.subplots(1,3,figsize=(12.3,5.3)) specs=[('NORMAL AIRWAY','normal',None),('EPIGLOTTITIS: supraglottic','epi',[('Swollen\nepiglottis',(4.9,8.2),8.0,9.8),('Inlet narrowed',(5.9,6.4),8.0,7.2)]),('CROUP: subglottic','croup',[('Subglottic\nnarrowing',(5.0,3.9),8.0,2.4)])] for ax,(t,m,n) in zip(axs,specs): draw(ax,m,False,9,n); ax.set_title(t,fontsize=12,color={'normal':NAVY,'epi':'#B3261E','croup':'#2A6FBB'}[m],fontweight='bold') fig.tight_layout(); fig.savefig(A+'three.png',dpi=200,facecolor='white'); plt.close(fig) # cross-section fig,axs=plt.subplots(1,2,figsize=(8.2,4.4)) for ax,t,lum in zip(axs,['Normal subglottis\n(about 6.5 mm diameter, 18-month-old)','Croup: 1 mm circumferential oedema\n(lumen about 4.5 mm)'],[3.25,2.25]): ax.set_xlim(-5,5); ax.set_ylim(-5,5); ax.set_aspect('equal'); ax.axis('off') ax.add_patch(Circle((0,0),4.4,fc=CART,ec=MUC,lw=1.5)); ax.add_patch(Circle((0,0),3.25,fc='#F0B8B0' if lum<3 else PINK,ec=MUC,lw=1)) if lum<3: ax.add_patch(Circle((0,0),3.25,fc=RED,ec='none',alpha=0.85)) ax.add_patch(Circle((0,0),lum,fc=AIR,ec=MUC,lw=1.5)); ax.set_title(t,fontsize=10,color=NAVY) ax.text(0,0,'air' if lum>3 else 'air\n(area -52%)',ha='center',va='center',fontsize=10,color=NAVY) axs[0].text(0,-4.9,'cricoid ring (rigid) surrounds mucosa',ha='center',fontsize=8,color='#555') fig.tight_layout(); fig.savefig(A+'cross.png',dpi=200,facecolor='white'); plt.close(fig) fig,ax=plt.subplots(figsize=(5.6,3.6)) rr=['0%','10%','25%','50%']; v=[(1-float(x.strip('%'))/100)**-4 for x in rr] b=ax.bar(rr,v,color=['#7FB3D5','#5499C7','#2A6FBB','#B3261E']) for r,val in zip(b,v): ax.text(r.get_x()+r.get_width()/2,val+0.3,f'x{val:.1f}',ha='center',fontsize=10,color=NAVY) ax.set_xlabel('Reduction in airway radius'); ax.set_ylabel('Relative resistance (laminar, 1/r^4)'); ax.spines[['top','right']].set_visible(False) ax.set_title('Small radius loss, large resistance rise',fontsize=11,color=NAVY) fig.tight_layout(); fig.savefig(A+'resist.png',dpi=200,facecolor='white'); plt.close(fig) print('ok') EOF python src/figs.py && python /tmp/skills/shared/scripts/fetch_images.py "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_59f4fa939e89f94d53a67916d488aa01a326681cb52b7a7b2f105a68f116c00a.jpg" "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_57e97979f2d04d6e4b617bd8771263ec99967c0987e0fa40c242ba213bc4ca9b.jpg" "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_623fd8b4b065c691b510c6204aa6bd1ad25e4b4d7bc2cae4dbfe27c0519ec262.jpg" "https://cdn.orris.care/cdss_images/492628ef8cc3d72b6c1a84aa6ccf4d6312d9a9a460e02cfde64bd4385e1d5fa6.png" > assets/imgs.json && python - <<'EOF' import json,base64 d=json.load(open('assets/imgs.json')) names=['epi_xray.jpg','steeple_pmc.jpg','epi_laryngo.jpg','steeple_sb.png'] for n,i in zip(names,d): print(n,i['error']) if i['base64']: open('assets/'+n,'wb').write(base64.b64decode(i['base64'].split('base64,')[1])) EOF ls -la assets

Quick answer

No, it isn't over, but I haven't built the PowerPoint yet. The research phase was cut short, so there is no .pptx file. Below is what I gathered. Say "build the deck" and I'll produce the full 30+ slide file from it.

Verified so far

Not verified: Ghai, Nelson and Dhingra aren't in the library, and I haven't read them. I won't attribute any statements, page numbers or chapters to them. Each slide will cite the source I actually read (Scott-Brown, Tintinalli, Rosen, Harriet Lane, or a named guideline).
Westley croup score (slide 24)
  • Components and points:
    • Stridor: none 0, with agitation 1 (audible with a stethoscope in the original), at rest 2 (audible without a stethoscope in the original).
    • Retractions: none 0, mild 1, moderate 2, severe 3.
    • Air entry: normal 0, decreased 1, severely decreased 2.
    • Cyanosis: none 0, with agitation 4, at rest 5.
    • Consciousness: normal 0, altered 5.
  • The maximum total is 17.
  • Severity cut-offs differ between sources, and the slide will show the discrepancy:
    • Scott-Brown: 2-3 mild, 4-7 moderate, 8 or more severe.
    • Tintinalli's modified score: under 4 mild, 4-6 moderate, over 6 severe.
    • AMBOSS: 2 or less mild, 3-7 moderate, 8-11 severe, 12 or more impending respiratory failure.
  • Limitations: the score has interobserver variability, and treatment must not wait while you calculate it (Scott-Brown).
Croup facts (Scott-Brown, Tintinalli)
  • Most common in children aged 6 months to 3 years, peaking at 2 years, and more common in boys.
  • Parainfluenza is the commonest cause, followed by RSV, rhinovirus, metapneumovirus, coronavirus and others.
  • The diagnosis is clinical. Imaging is only for diagnostic doubt, and the AP film may show the steeple sign.
  • Oedema is subglottic. In an 18-month-old with a 6.5 mm subglottic diameter, 1 mm of oedema cuts the cross-sectional area by about 50%. Flow resistance rises roughly with the fourth power of the radius reduction (Poiseuille).
  • Mortality is about 1 in 30,000. About 50% improve within 24 hours.
  • Consider subglottic stenosis in "recurrent croup".
  • Humidified air has no proven benefit.
  • Sedation is not advised.
Croup drugs (slide 28)
  • Dexamethasone:
    • Scott-Brown prefers 0.6 mg/kg orally as a single dose. Harriet Lane gives 0.6 mg/kg PO/IV/IM once, with a usual maximum of 16 mg.
    • NHS Highland uses 0.15 mg/kg orally.
    • A 2026 meta-analysis compares 0.15 with 0.6 mg/kg (PMID 42698708). I haven't read its result, so the slide will flag the dose as an area of ongoing evidence.
    • Intramuscular dosing is not first line.
  • Budesonide 2 mg nebulised can be used if the child is vomiting or too unwell for oral medication.
  • Nebulised adrenaline:
    • NHS Highland gives 1:1000 at 400 micrograms/kg (maximum 5 mg), repeated after 30 minutes if needed.
    • AMBOSS says to observe for 2-4 hours for symptom return.
  • Antibiotics are not indicated for uncomplicated viral croup.
Epiglottitis (Rosen)
  • Hib is still the commonest infectious cause in children, and it can occur in fully immunised children.
  • Other causes: non-b H. influenzae, streptococci, S. aureus (including MRSA), N. meningitidis, and in immunocompromised patients Pseudomonas and Candida.
  • Noninfectious causes: thermal injury, caustic ingestion, allergy, foreign body.
  • Incidence has fallen since Hib vaccination, and the disease is now relatively more common in older patients.
  • Clinical picture:
    • Acute onset with high fever, severe sore throat, toxicity and drooling.
    • Tripod or sniffing posture, absent cough and a muffled voice.
    • Adolescents and adults may have sore throat out of proportion to the examination and anterior neck tenderness.
  • A lateral neck film shows the thumbprint sign and thickened aryepiglottic folds, but up to 70% of films are normal. Imaging must never delay airway management.
  • Management:
    • Airway control comes before diagnostic work-up.
    • Do not move or reposition a stable child for tests.
    • Secure the airway in a controlled setting, usually the operating room, with anaesthesia and ENT.
    • Bag-mask ventilation is the first rescue. Needle cricothyroidotomy or tracheostomy are the last resorts.
    • Intubation often lasts 3-5 days.
    • Give a second- or third-generation cephalosporin. Web sources also list ceftriaxone, cefotaxime or ampicillin-sulbactam.
  • Rifampin prophylaxis for contacts is 20 mg/kg/day (maximum 600 mg) for 4 days, when invasive Hib is isolated and the household criteria are met. This comes from Medscape and ScienceDirect, so I'd check it against your national guideline.
  • I didn't verify specific IV antibiotic doses or treatment duration, so the slide will say "per local guideline" instead of giving numbers.

Images found for the deck

Epiglottitis lateral neck X-ray, thumbprint sign
Croup steeple sign on AP neck film
Laryngoscopy showing cherry-red swollen epiglottis
I found no labelled sagittal larynx diagram in the image library. I would draw the anatomy, comparison and flowchart figures myself as editable slide graphics.

Plan for the build

  1. Build the deck in python-pptx at 16:9, with about 33 content slides plus a title slide and references.
  2. Add the three real images above, my own drawn airway diagrams, flowcharts and comparison tables, and speaker notes.
  3. Include a note on slide 28 that doses are source-specific and must be checked against your local guideline.
  4. Morph transitions: python-pptx can't author them natively, so I would inject the transition XML, and they will only work properly where consecutive slides share named objects.
Do you want me to proceed on that basis?Let me check the drawn anatomy figures before building the deck.
Reading File
Reading File
Running Command

cd /tmp/workspace/epiglottitis-croup && cat > src/build.py <<'EOF' import math, copy from PIL import Image from lxml import etree from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR from pptx.enum.shapes import MSO_SHAPE def C(h): return RGBColor.from_string(h.lstrip('#')) NAVY='1F3A5F'; TEAL='0E7C86'; RED='B3261E'; BLUE='2A6FBB'; PURPLE='5B3F8C'; GREY='5F6B7A'; LIGHT='F2F5F9'; AMBER='B26A00'; WHITE='FFFFFF'; DARK='222B36' SEC={'A':(TEAL,'A INTRODUCTION'),'B':(RED,'B EPIGLOTTITIS'),'C':(BLUE,'C CROUP'),'D':(PURPLE,'D SYNTHESIS'),'R':(GREY,'REFERENCES')} prs=Presentation(); prs.slide_width=Inches(13.333); prs.slide_height=Inches(7.5) BL=prs.slide_layouts[6]; A='assets/'; WARN=[]; N=[0] def run_fmt(r,size,color=DARK,bold=False,italic=False): r.font.name='Calibri'; r.font.size=Pt(size); r.font.bold=bold; r.font.italic=italic; r.font.color.rgb=C(color) def est_lines(text,w,size): cpl=max(1,int(w*72/(size*0.50))) return sum(max(1,math.ceil(len(l)/cpl)) for l in text.split('\n')) def text(slide,x,y,w,h,t,size=16,color=DARK,bold=False,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP,name=None,italic=False,check=True): tb=slide.shapes.add_textbox(Inches(x),Inches(y),Inches(w),Inches(h)); tf=tb.text_frame; tf.word_wrap=True tf.margin_left=tf.margin_right=Inches(0.05); tf.margin_top=tf.margin_bottom=Inches(0.03); tf.vertical_anchor=anchor for i,line in enumerate(t.split('\n')): p=tf.paragraphs[0] if i==0 else tf.add_paragraph(); p.alignment=align r=p.add_run(); r.text=line; run_fmt(r,size,color,bold,italic) if name: tb.name=name if check: need=est_lines(t,w-0.1,size)*size*1.2/72+0.06 if need>h+0.15: WARN.append((N[0],t[:30],round(need,2),h)) return tb def bullets(slide,items,x,y,w,h,size=16,color=DARK,gap=5): tb=slide.shapes.add_textbox(Inches(x),Inches(y),Inches(w),Inches(h)); tf=tb.text_frame; tf.word_wrap=True tf.margin_left=tf.margin_right=Inches(0.05); tf.margin_top=Inches(0.03) need=0.1 for i,it in enumerate(items): lvl=0 if isinstance(it,tuple): it,lvl=it p=tf.paragraphs[0] if i==0 else tf.add_paragraph() p.space_after=Pt(gap) sz=size-(2 if lvl else 0) mark='\u2022 ' if lvl==0 else '- ' indent=' '*lvl if '||' in it: a,b=it.split('||',1) r=p.add_run(); r.text=indent+mark+a; run_fmt(r,sz,NAVY,True) r=p.add_run(); r.text=b; run_fmt(r,sz,color) full=indent+mark+a+b else: r=p.add_run(); r.text=indent+mark+it; run_fmt(r,sz,color); full=indent+mark+it need+=est_lines(full,w-0.1,sz)*sz*1.2/72+gap/72 if need>h+0.15: WARN.append((N[0],'bullets '+str(items[0])[:25],round(need,2),h)) return tb def box(slide,x,y,w,h,t,fill=LIGHT,fg=DARK,size=14,bold=False,shape=MSO_SHAPE.ROUNDED_RECTANGLE,align=PP_ALIGN.LEFT,line=None,anchor=MSO_ANCHOR.MIDDLE,name=None): s=slide.shapes.add_shape(shape,Inches(x),Inches(y),Inches(w),Inches(h)) s.fill.solid(); s.fill.fore_color.rgb=C(fill) if line: s.line.color.rgb=C(line); s.line.width=Pt(1.5) else: s.line.fill.background() s.shadow.inherit=False if shape==MSO_SHAPE.ROUNDED_RECTANGLE: s.adjustments[0]=0.08 tf=s.text_frame; tf.word_wrap=True; tf.vertical_anchor=anchor tf.margin_left=tf.margin_right=Inches(0.1); tf.margin_top=tf.margin_bottom=Inches(0.04) for i,l in enumerate(t.split('\n')): p=tf.paragraphs[0] if i==0 else tf.add_paragraph(); p.alignment=align if '||' in l: a,b=l.split('||',1); r=p.add_run(); r.text=a; run_fmt(r,size,fg,True); r=p.add_run(); r.text=b; run_fmt(r,size,fg,bold) else: r=p.add_run(); r.text=l; run_fmt(r,size,fg,bold) need=est_lines(t.replace('||',''),w-0.25,size)*size*1.2/72+0.1 if need>h+0.1: WARN.append((N[0],'box '+t[:25],round(need,2),h)) if name: s.name=name return s def arrow(slide,x,y,w,h,kind='down',color=GREY): shp={'down':MSO_SHAPE.DOWN_ARROW,'right':MSO_SHAPE.RIGHT_ARROW}[kind] s=slide.shapes.add_shape(shp,Inches(x),Inches(y),Inches(w),Inches(h)); s.fill.solid(); s.fill.fore_color.rgb=C(color); s.line.fill.background(); return s def pic(slide,path,x,y,w,h,name=None,caption=None,capsize=10): im=Image.open(path); ar=im.width/im.height if w/h>ar: nh=h; nw=h*ar else: nw=w; nh=w/ar px=x+(w-nw)/2; py=y+(h-nh)/2 p=slide.shapes.add_picture(path,Inches(px),Inches(py),Inches(nw),Inches(nh)) if name: p.name=name if caption: text(slide,x,py+nh+0.02,w,0.5,caption,capsize,GREY,italic=True,align=PP_ALIGN.CENTER,check=False) return p def table(slide,rows,x,y,w,colw,fs=11,hfill=NAVY,hfills=None,firstcol=True,maxh=5.6,zebra=True): nr=len(rows); nc=len(rows[0]); tot=sum(colw); cw=[w*c/tot for c in colw] heights=[] for ri,row in enumerate(rows): m=max(est_lines(c,cw[ci]-0.15,fs) for ci,c in enumerate(row)); heights.append(m*fs*1.18/72+0.1) H=sum(heights) if H>maxh: WARN.append((N[0],'TABLE',round(H,2),maxh)) gs=slide.shapes.add_table(nr,nc,Inches(x),Inches(y),Inches(w),Inches(H)); tb=gs.table tblPr=gs._element.graphic.graphicData.tbl.tblPr; tblPr.set('bandRow','0'); tblPr.set('firstRow','0') for ci in range(nc): tb.columns[ci].width=Inches(cw[ci]) for ri,row in enumerate(rows): tb.rows[ri].height=Inches(heights[ri]) for ci,c in enumerate(row): cell=tb.cell(ri,ci); cell.margin_left=cell.margin_right=Inches(0.06); cell.margin_top=cell.margin_bottom=Inches(0.03) cell.vertical_anchor=MSO_ANCHOR.MIDDLE tf=cell.text_frame; tf.word_wrap=True for li,l in enumerate(c.split('\n')): p=tf.paragraphs[0] if li==0 else tf.add_paragraph(); r=p.add_run(); r.text=l if ri==0: run_fmt(r,fs,WHITE,True) else: run_fmt(r,fs,DARK,bold=(ci==0 and firstcol)) cell.fill.solid() if ri==0: cell.fill.fore_color.rgb=C(hfills[ci] if hfills else hfill) elif ci==0 and firstcol: cell.fill.fore_color.rgb=C('E3EAF2') else: cell.fill.fore_color.rgb=C('FFFFFF' if (ri%2 or not zebra) else 'F5F7FA') return gs def morph(slide): xml=('<mc:AlternateContent xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ' 'xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">' '<mc:Choice xmlns:p159="http://schemas.microsoft.com/office/powerpoint/2015/09/main" ' 'xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" Requires="p159">' '<p:transition spd="slow" p14:dur="1200"><p159:morph option="byObject"/></p:transition></mc:Choice>' '<mc:Fallback><p:transition spd="med"><p:fade/></p:transition></mc:Fallback></mc:AlternateContent>') el=etree.fromstring(xml); sld=slide._element cm=sld.find('{http://schemas.openxmlformats.org/presentationml/2006/main}clrMapOvr') if cm is not None: cm.addnext(el) else: sld.append(el) def new(title,sec,source='',notes='',dark=False): N[0]+=1; s=prs.slides.add_slide(BL); col,lab=SEC[sec] if dark: bg=s.background.fill; bg.solid(); bg.fore_color.rgb=C(NAVY) else: ab=s.shapes.add_shape(MSO_SHAPE.RECTANGLE,0,0,Inches(0.22),Inches(7.5)); ab.fill.solid(); ab.fill.fore_color.rgb=C(col); ab.line.fill.background(); ab.name='SideBar' text(s,0.5,0.25,10.2,0.85,title,28,NAVY,True,anchor=MSO_ANCHOR.MIDDLE,name='Title') b=box(s,10.9,0.4,2.15,0.42,lab,col,WHITE,11,True,align=PP_ALIGN.CENTER,name='Badge') ln=s.shapes.add_shape(MSO_SHAPE.RECTANGLE,Inches(0.5),Inches(1.12),Inches(12.4),Inches(0.04)); ln.fill.solid(); ln.fill.fore_color.rgb=C(col); ln.line.fill.background(); ln.name='TitleRule' text(s,0.5,7.08,11.6,0.3,source,9,GREY,name='Footer',check=False) text(s,12.3,7.08,0.7,0.3,str(N[0]),10,GREY,align=PP_ALIGN.RIGHT,name='SlideNo',check=False) if notes: s.notes_slide.notes_text_frame.text=notes morph(s); return s TB='Verified in library textbooks: ' # ---------------- S1 title s=new('', 'A', dark=True, notes='Title slide. Presenter, department and institution placeholders to be completed. Content is built from library textbooks (Scott-Brown, Tintinalli, Rosen, Harriet Lane) plus web-checked guidelines; Ghai, Nelson and Dhingra were not available for verification.') box(s,0.7,1.2,0.12,2.6,'',TEAL,shape=MSO_SHAPE.RECTANGLE) text(s,1.0,1.1,7.4,2.2,'Epiglottitis and Acute Laryngotracheobronchitis (Croup)',40,WHITE,True,name='Title',anchor=MSO_ANCHOR.TOP) text(s,1.0,3.35,7.2,0.9,'Acute upper airway obstruction in children: anatomy, pathology, recognition and management',18,'BFD4EA') text(s,1.0,4.6,7.2,1.6,'Presenter: [Name, designation]\nDepartment: [Department of Paediatrics / ENT]\nInstitution: [Institution name]\nFinal-year MBBS seminar | [Date]',15,WHITE) box(s,8.6,0.5,4.3,6.5,'',WHITE,shape=MSO_SHAPE.ROUNDED_RECTANGLE,name='Panel') pic(s,A+'sag_normal.png',8.7,0.6,4.1,6.3,name='AirwayFigure') # ---------------- S2 objectives s=new('Learning objectives','A','Structure follows the requested syllabus. Sources are tagged on each slide.','Objectives. Emphasise that both conditions are causes of acute upper airway obstruction but have opposite management philosophies at the bedside.') objs=[('1','Aetiology and epidemiology','Hib and non-Hib bacteria, parainfluenza and other viruses; age and seasonal patterns',TEAL), ('2','Pathogenesis and anatomical pathology','Supraglottic cellulitis versus subglottic mucosal oedema; why small changes matter in children',RED), ('3','Clinical recognition and differential diagnosis','Toxic child with drooling versus barking cough; severity scoring; mimics',BLUE), ('4','Investigations and evidence-based management','Airway-first approach in epiglottitis; steroids and epinephrine in croup',TEAL), ('5','Complications, prevention and prognosis','Hib immunisation, contact prophylaxis, disposition and outcomes',PURPLE)] for i,(n,h,d,c) in enumerate(objs): y=1.45+i*1.05 box(s,0.6,y,0.8,0.85,n,c,WHITE,28,True,align=PP_ALIGN.CENTER,shape=MSO_SHAPE.OVAL) box(s,1.6,y,11.2,0.9,h+'||\n'+d,LIGHT,DARK,15,False) # ---------------- S3 intro s=new('Introduction and definitions','A',TB+'Rosen (Ch. 162), Scott-Brown Vol 2 (croup), Tintinalli (Ch. 126).','Define each condition, then link them through acute upper airway obstruction. Highlight that croup is common and mostly mild whereas epiglottitis is rare but can kill within hours.') box(s,0.6,1.45,6.0,2.35,'Acute epiglottitis||\nInvasive bacterial infection causing inflammation and oedema of the epiglottis, aryepiglottic folds, arytenoids and surrounding supraglottic tissues (Rosen). Often called supraglottitis.', 'FBE9E7',DARK,15,anchor=MSO_ANCHOR.TOP,line=RED) box(s,6.8,1.45,6.0,2.35,'Acute laryngotracheobronchitis (viral croup)||\nViral syndrome of hoarse voice, barking cough and inspiratory or biphasic stridor from mucosal oedema of the larynx and trachea (Scott-Brown). Bronchi may be involved.','E8F1FB',DARK,15,anchor=MSO_ANCHOR.TOP,line=BLUE) text(s,0.6,4.0,12,0.4,'How they relate and why they matter',18,NAVY,True) bullets(s,['Both narrow the upper airway: inspiratory stridor and retractions are the common final pathway.', 'Site of narrowing differs: supraglottic (epiglottitis) versus subglottic (croup); this explains the voice, cough and swallowing differences.', 'Croup is the most common cause of stridor outside the neonatal period (Tintinalli); epiglottitis is now rare but remains a time-critical emergency.', 'Children are predisposed to respiratory failure: small compressible airway, low FRC, high oxygen consumption, short safe apnoea time (Rosen).'],0.6,4.45,12.2,2.5,15) # ---------------- S4 anatomy s=new('Upper airway anatomy','A','Schematic drawn for this seminar (not to scale). Anatomy per standard texts; subglottis narrowest in children: Scott-Brown Vol 2.','Walk top to bottom: pharynx, vallecula, epiglottis, aryepiglottic folds, glottis, subglottis within cricoid, trachea. Stress cricoid = narrowest point in young children.') pic(s,A+'sag_normal.png',0.5,1.3,6.2,5.7,name='AirwayFigure') text(s,7.0,1.3,5.9,0.4,'Regions of the larynx',18,NAVY,True) bullets(s,['Supraglottis||: epiglottis, vallecula (mucosal pocket between tongue base and epiglottis), aryepiglottic folds, arytenoids, false cords', 'Glottis||: true vocal cords; narrowest part of the adult airway', 'Subglottis||: below the cords to the lower border of the cricoid, the only complete cartilaginous ring', 'Trachea||: C-shaped rings with posterior membrane'],7.0,1.75,5.9,2.7,14,gap=4) box(s,7.0,4.55,5.9,2.4,'Paediatric differences||\nLarynx sits higher; epiglottis is relatively long and floppy.\nSubglottis (cricoid level) is the narrowest segment, about 6.5 mm in an 18-month-old (Scott-Brown).\nLoose submucosa in the supraglottis and subglottis allows rapid oedema.', 'FFF4DD',DARK,13.5,anchor=MSO_ANCHOR.TOP,line=AMBER) # ---------------- S5 comparison anatomy s=new('Anatomical comparison: normal, epiglottitis, croup','A','Schematic for teaching. Site of obstruction per Rosen (epiglottitis) and Scott-Brown (croup).','Compare three panels. Supraglottic swelling = muffled voice, drooling, no barking cough. Subglottic swelling = barking cough, hoarse voice, steeple sign.') pic(s,A+'three.png',0.4,1.25,8.3,5.7,name='AirwayFigure') box(s,8.9,1.35,4.0,1.75,'Epiglottitis (supraglottic)||\nMuffled voice, drooling, dysphagia, soft stridor; cough usually absent; toxic','FBE9E7',DARK,13,anchor=MSO_ANCHOR.TOP,line=RED) box(s,8.9,3.2,4.0,1.75,'Croup (subglottic)||\nHoarse voice, barking cough, harsh inspiratory stridor; swallowing preserved; non-toxic','E8F1FB',DARK,13,anchor=MSO_ANCHOR.TOP,line=BLUE) box(s,8.9,5.05,4.0,1.85,'Why the difference?||\nStructures above the cords handle swallowing and resonance. The cords and subglottis generate voice and cough. Disease at each level disturbs that level\'s function.','F2F5F9',DARK,13,anchor=MSO_ANCHOR.TOP,line=GREY) # ---------------- S6 epiglottitis epidemiology s=new('Epiglottitis: definition, terminology and epidemiology','B',TB+'Rosen Ch. 162. Age range in pre-vaccine era from NWT Health guideline (web). Incidence trend: Rosen.','Terminology: epiglottitis vs supraglottitis. Post vaccine shift to older patients. Hib can still cause disease in fully immunised children.') bullets(s,['Acute epiglottitis||: cellulitis of the epiglottis; supraglottitis is the broader term as aryepiglottic folds, arytenoids and adjacent tissues are inflamed (Rosen)', 'Pre-vaccine era||: classically children about 2 to 7 years; onset to respiratory distress in under 12 hours', 'After Hib vaccination (introduced 1980s)||: incidence has declined markedly; epiglottitis is now relatively more common in older children and adults (Rosen)', 'Vaccinated patients||: Hib remains the most common infectious cause in children and can occur in fully immunised children (Rosen)', 'Adults||: present less dramatically because the airway is wider; sore throat out of proportion to findings and anterior neck tenderness (Rosen)'],0.6,1.4,8.2,5.4,15,gap=7) box(s,9.1,1.5,3.8,1.6,'Peak risk, pre-vaccine||\n2 to 7 years\nunvaccinated or incompletely vaccinated','FBE9E7',DARK,14,anchor=MSO_ANCHOR.TOP,line=RED) box(s,9.1,3.3,3.8,1.6,'Current pattern||\nRare in children\nOlder children and adults a larger share','F2F5F9',DARK,14,anchor=MSO_ANCHOR.TOP,line=GREY) box(s,9.1,5.1,3.8,1.7,'Teaching point||\nNot having seen a case does not make it impossible; keep the diagnosis in mind for any toxic child with drooling.','FFF4DD',DARK,13,anchor=MSO_ANCHOR.TOP,line=AMBER) # ---------------- S7 aetiology s=new('Epiglottitis: aetiology and microbiology','B',TB+'Rosen Ch. 162 (organisms, noninfectious causes). Less common causes are reported rather than quantified.','Hib classic. Others: non-b H influenzae, streptococci, S aureus incl MRSA, meningococcus. Immunocompromised: Pseudomonas, Candida. Non infectious mimics matter: thermal, caustic, allergic.') rows=[['Cause','Context','Teaching note'], ['Haemophilus influenzae type b','Classic; still the most common infectious cause in children','Unvaccinated or incompletely vaccinated; can occur despite full immunisation'], ['Other H. influenzae (types A, F, non-typeable)','Reported','Not prevented by the Hib conjugate vaccine'], ['Streptococci (S. pneumoniae, beta-haemolytic)','Reported, more in older patients','Non-Hib bacteria tend to have slower onset and less airway compromise'], ['Staphylococcus aureus including MRSA','Reported','Consider local MRSA prevalence when choosing empirical cover'], ['Neisseria meningitidis','Uncommon','Systemic features; invasive disease'], ['Pseudomonas aeruginosa, Candida','Immunocompromised','Necrotising epiglottitis described in immunodeficiency'], ['Noninfectious: hot liquids or steam, caustic ingestion, allergic reaction, foreign body, irritant injury, lymphoproliferative disease','Rare','Mimics: no fever or toxicity may be present; steroids not recommended for thermal airway burns (Rosen)']] table(s,rows,0.6,1.4,12.2,[3.4,3.0,5.0],12,RED,maxh=5.0) box(s,0.6,6.2,12.2,0.7,'Host factors and vaccination: immunocompromise, incomplete Hib immunisation and vaccine failure are the main host factors; the Hib conjugate vaccine does not protect against other organisms.','F2F5F9',DARK,12.5,line=GREY) # ---------------- S8 pathogenesis s=new('Epiglottitis: pathogenesis','B',TB+'Rosen Ch. 162 (protrusion over glottis, ball-valve). Submucosal anatomy: standard teaching.','Walk the flowchart left to right, top row then bottom row. Stress ball-valve effect and the risk of sudden complete obstruction.') steps=[('1 Entry','Respiratory droplets; nasopharyngeal colonisation by Hib or other bacteria'), ('2 Local invasion','Bacteria invade supraglottic mucosa; bacteraemia may accompany'), ('3 Inflammation','Neutrophilic cellulitis with vascular leak and cytokine release'), ('4 Oedema','Loose submucosa of epiglottis, aryepiglottic folds and arytenoids swells'), ('5 Inlet narrowing','Swollen structures protrude downward over the glottic opening; ball-valve effect on inspiration (Rosen)'), ('6 Obstruction','Turbulent flow and stridor; hypoxaemia; sudden complete obstruction possible')] cols=[TEAL,TEAL,AMBER,AMBER,RED,RED] for i,(h,d) in enumerate(steps): r=i//3; c=i%3; x=0.6+c*4.2; y=1.5+r*2.55 box(s,x,y,3.6,0.55,h,cols[i],WHITE,16,True,shape=MSO_SHAPE.RECTANGLE) box(s,x,y+0.55,3.6,1.5,d,LIGHT,DARK,14,shape=MSO_SHAPE.RECTANGLE,anchor=MSO_ANCHOR.TOP) if c<2: arrow(s,x+3.65,y+0.7,0.5,0.4,'right') arrow(s,12.1,3.4,0.5,0.6,'down'); box(s,0.6,6.55,12.2,0.45,'Agitation, crying and examination increase flow demand and secretions and can precipitate complete obstruction.','FFF4DD',DARK,13,bold=True,line=AMBER) # ---------------- S9 pathology s=new('Epiglottitis: pathology and anatomical changes','B','Schematic drawn for this seminar. Clinical images from the Orris medical image library (original publication not identified). Thumb sign and normal-film caveat: Rosen Ch. 162.','Correlate: swollen epiglottis and AE folds -> inlet narrowing; loss of vallecula air on X ray; cherry red oedematous epiglottis on laryngoscopy performed only in controlled setting.') pic(s,A+'sag_epi.png',0.4,1.3,4.9,5.6,name='AirwayFigure') bullets(s,['Macroscopic||: bright red (cherry red), markedly swollen, rounded epiglottis', 'Oedema||: aryepiglottic folds and arytenoids thickened, narrowing the laryngeal inlet', 'Airway effect||: swollen mass drapes over the glottis; ball-valve obstruction', 'Correlation||: dysphagia and drooling from pharyngeal pain and oedema; muffled voice from supraglottic swelling; cough absent because the subglottis is spared', 'Abscess or necrosis||: epiglottic abscess (adolescents), necrotising change (immunodeficiency)'],5.4,1.4,4.4,5.5,13,gap=5) pic(s,A+'epi_laryngo.jpg',9.9,1.3,3.1,2.6,caption='Laryngoscopy: oedematous, erythematous supraglottis',capsize=9) pic(s,A+'epi_xray.jpg',9.9,4.35,3.1,2.4,caption='Lateral neck film: thumb sign',capsize=9) # ---------------- S10 history s=new('Epiglottitis: clinical features, history','B',TB+'Rosen Ch. 162, Tintinalli Ch. 126, NWT Health guideline (web).','Take history only while keeping the child calm, on parent lap. Cough absence and drooling are the key discriminators from croup.') items=[('Onset','Rapid: hours, often under 12 h'),('Fever','High; sudden'),('Sore throat','Severe; odynophagia'),('Swallowing','Dysphagia, refuses fluids'),('Secretions','Drooling; cannot handle saliva'),('Voice and cough','Muffled voice; cough usually absent'),('Breathing','Noisy breathing, distress as it progresses'),('Preceding illness','Often none or minimal URI (contrast with croup)')] for i,(a,b) in enumerate(items): c=i%2; r=i//2; x=0.6+c*6.2; y=1.45+r*1.1 box(s,x,y,1.9,0.95,a,RED,WHITE,15,True,shape=MSO_SHAPE.RECTANGLE,align=PP_ALIGN.CENTER) box(s,x+1.9,y,4.1,0.95,b,'FBE9E7',DARK,14,shape=MSO_SHAPE.RECTANGLE) box(s,0.6,5.95,12.2,0.95,'Older children and adults: sore throat out of proportion to examination, voice change and anterior neck tenderness may be the only clues; stridor appears late (Rosen).','FFF4DD',DARK,14,line=AMBER) # ---------------- S11 exam s=new('Epiglottitis: clinical features, examination','B',TB+'Rosen Ch. 162, Tintinalli Ch. 126.','Observe from a distance. Do not open the mouth. Concerning: tripod, inability to swallow, silent child, stridor with fatigue, cyanosis, altered consciousness.') bullets(s,['Toxic, anxious appearance||: high fever, flushed, sits very still', 'Posture||: sniffing or tripod position, neck extended, chin and jaw forward to maximise airway patency (Rosen, Tintinalli)', 'Drooling||: prominent because swallowing is painful or impossible', 'Voice||: muffled ("hot potato"); cough and phonation often absent as symptoms worsen (Rosen)', 'Breathing||: tachypnoea, soft inspiratory stridor, retractions; effort may look deceptively quiet', 'Children versus adults||: young children appear dramatically ill; adults have larger airways, subtler signs and need greater swelling before symptoms'],0.6,1.4,7.6,5.5,15,gap=7) box(s,8.5,1.5,4.4,5.3,'Particularly concerning findings||\n\nInability to lie flat or leave tripod posture\nDrooling with refusal to swallow\nProgressive stridor, fatigue, falling effort\nAgitation changing to drowsiness\nCyanosis, bradycardia, low SpO2\n\nWhy: these indicate critical narrowing and exhaustion. Hypoxaemia and bradycardia are pre-arrest signs.','FBE9E7',DARK,14,anchor=MSO_ANCHOR.TOP,line=RED) # ---------------- S12 course s=new('Epiglottitis: clinical course and complications','B',TB+'Rosen Ch. 162 (abscess, necrotising epiglottitis, delayed diagnosis, intubation 3 to 5 days). Systemic spread: standard teaching.','Not every patient follows the same course; non-Hib bacteria and adults often progress more slowly.') text(s,0.6,1.35,6,0.4,'Course',18,RED,True) bullets(s,['Classically abrupt and fast in young children: hours from fever to obstruction', 'Slower in non-Hib causes and in adults (Rosen)', 'Delay in diagnosis is associated with increased mortality (Rosen)', 'With airway secured, patients often remain intubated 3 to 5 days while antibiotics reduce oedema (Rosen)'],0.6,1.8,6.0,3.4,14.5,gap=6) text(s,6.9,1.35,6,0.4,'Complications',18,RED,True) bullets(s,['Complete airway obstruction, hypoxaemia, respiratory arrest, hypoxic brain injury', 'Epiglottic abscess, particularly in adolescents (Rosen)', 'Necrotising epiglottitis in immunodeficiency (Rosen)', 'Bacteraemia and sepsis; spread to lung, pericardium, meninges or joints described with Hib (standard teaching)', 'Post-obstructive pulmonary oedema after relief of obstruction (standard teaching)'],6.9,1.8,6.0,3.6,14.5,gap=6) box(s,0.6,5.5,12.2,1.3,'Factors associated with severe disease||\nYounger age with small airway, Hib aetiology, delayed recognition, agitation or distressing examination, immunocompromise, thermal or caustic injury (rapid oedema).','F2F5F9',DARK,14,line=GREY,anchor=MSO_ANCHOR.TOP) # ---------------- S13 diagnosis & DDx s=new('Epiglottitis: diagnosis and differential diagnosis','B',TB+'Tintinalli Table 126-2 and Ch. 126, Rosen Ch. 162. Table condensed; features are typical, not absolute.','Diagnosis is clinical. Imaging only if stable and diagnosis uncertain and never at the expense of the airway.') rows=[['','Epiglottitis','Croup','Bacterial tracheitis','Retropharyngeal abscess','Foreign body'], ['Onset','Hours','1 to 3 days','URI then rapid toxicity','Days','Sudden, choking'], ['Fever / look','High, toxic','Low-grade, non-toxic','High, toxic','Fever, irritable','Afebrile'], ['Cough / voice','No cough, muffled','Barking cough, hoarse','Croupy cough','Neck stiffness, muffled','Cough, variable'], ['Drooling','Marked','Absent','Absent','Often','Variable'], ['Key point','Tripod, thumb sign','Steeple sign','Poor response to croup treatment','Prevertebral swelling on lateral film','Radiograph may be normal']] table(s,rows,0.6,1.35,12.2,[1.4,2.0,2.0,2.2,2.4,2.2],11.5,RED,maxh=3.3) bullets(s,['Airway assessment first||; senior anaesthesia and ENT early', 'Laboratory tests||: blood cultures and FBC support diagnosis but must wait until the airway is safe', 'Lateral neck radiograph||: thumb sign, thick aryepiglottic folds, absent vallecular air, dilated hypopharynx; but a substantial proportion of films are normal (Rosen quotes up to 70%) and moving the child is risky', 'Gold standard||: direct visualisation by an experienced operator during controlled airway management'],0.6,4.75,12.2,2.3,13.5,gap=4) # ---------------- S14 airway precautions s=new('Airway precautions: suspected epiglottitis is an airway emergency','B','Rosen Ch. 162 (stable patient not moved or repositioned for tests; controlled setting); Tintinalli Ch. 126.','Make this slide the emotional centre of the epiglottitis section. DO versus DO NOT.') box(s,0.6,1.35,12.2,0.85,'A child who is maintaining an airway must not be provoked into obstructing it. Plan airway management with experienced clinicians in a controlled, fully equipped setting.',RED,WHITE,17,True,align=PP_ALIGN.CENTER) box(s,0.6,2.45,5.9,0.5,'DO',TEAL,WHITE,18,True,align=PP_ALIGN.CENTER,shape=MSO_SHAPE.RECTANGLE) box(s,0.6,2.95,5.9,3.95,'Keep the child calm, on the parent\'s lap\nLet them stay in the position of comfort\nCall senior anaesthetist, ENT and paediatrician now\nGive oxygen only if tolerated (blow-by, held by parent)\nPrepare airway equipment: small tubes, laryngoscopes, rigid bronchoscope, surgical airway kit\nTransfer with an airway-skilled clinician (operating theatre is the usual venue)','E3F4F4',DARK,14.5,shape=MSO_SHAPE.RECTANGLE,anchor=MSO_ANCHOR.TOP) box(s,6.9,2.45,5.9,0.5,'DO NOT',RED,WHITE,18,True,align=PP_ALIGN.CENTER,shape=MSO_SHAPE.RECTANGLE) box(s,6.9,2.95,5.9,3.95,'Do not use a tongue depressor or examine the throat\nDo not force the child supine\nDo not take blood, cannulate or send to radiology if it distresses the child or delays the airway\nDo not separate child from parent\nDo not give sedatives without airway control\nDo not delay airway management for imaging or laboratory tests','FBE9E7',DARK,14.5,shape=MSO_SHAPE.RECTANGLE,anchor=MSO_ANCHOR.TOP) # ---------------- S15 emergency management s=new('Emergency management of epiglottitis: stepwise flowchart','B',TB+'Rosen Ch. 162 (airway before diagnostics; fiberoptic or surgical airway; second or third-generation cephalosporin).','Read each step with rationale. Airway stabilisation has priority over every diagnostic procedure.') st=[('1 Recognise','Fever, drooling, toxic, tripod, muffled voice','Early recognition prevents distressing manoeuvres'), ('2 Call for help','Senior anaesthesia, ENT, paediatrics','Difficult airway: needs best operator and surgical backup'), ('3 Keep calm','Parent lap, position of comfort','Agitation raises demand and can tip into obstruction'), ('4 Monitor and oxygen','SpO2, ECG; blow-by oxygen if tolerated','Detect deterioration without touching the child'), ('5 Secure airway','Controlled setting, usually theatre; inhalational induction by expert; ENT ready for rescue','Planned intubation or surgical airway is safest (Rosen)'), ('6 IV antibiotics','Start after airway control or when not distressing','Treat bacteraemia and shorten oedema'), ('7 ICU care','Sedation, ventilation, antibiotics; extubate when oedema settles','Often intubated 3 to 5 days (Rosen)')] for i,(a,b,c) in enumerate(st): y=1.3+i*0.78 box(s,0.6,y,3.0,0.62,a,RED if i==4 else NAVY,WHITE,14,True,shape=MSO_SHAPE.RECTANGLE) box(s,3.7,y,4.9,0.62,b,LIGHT,DARK,12.5,shape=MSO_SHAPE.RECTANGLE) box(s,8.7,y,4.2,0.62,c,'FFF4DD',DARK,12,shape=MSO_SHAPE.RECTANGLE) if i<6: arrow(s,1.9,y+0.62,0.3,0.16,'down',RED) text(s,3.7,6.77,4.9,0.3,'WHAT TO DO',10,GREY,True,check=False); text(s,8.7,6.77,4.2,0.3,'RATIONALE',10,GREY,True,check=False) # ---------------- S16 antibiotics s=new('Epiglottitis: antibiotics and supportive treatment','B','Antibiotic classes: Rosen Ch. 162 and overviews (ScienceDirect, Medscape); doses: NWT Health guideline and Sawyer 1994 RCT (PMID 8129435). Duration not verified: use local guideline.','Emphasise that doses must be checked against local formulary. Mention allergy alternatives from reviews.') rows=[['Principle','Detail (source)'], ['Empirical IV therapy','Second or third-generation cephalosporin recommended (Rosen). Reasonable options: ceftriaxone, cefotaxime, ampicillin-sulbactam (reviews)'], ['Coverage','Hib (including beta-lactamase producers), streptococci, S. aureus; add MRSA cover if locally prevalent'], ['Example doses','Ceftriaxone 100 mg/kg IV then 50 mg/kg after 24 h (RCT protocol, Sawyer 1994); cefuroxime 150 mg/kg/day IV in 3 doses (NWT guideline). Verify with local formulary'], ['Beta-lactam allergy','Carbapenem or fluoroquinolone alternatives suggested in reviews; discuss with microbiology'], ['Tailor','Blood and epiglottic cultures when safe; narrow to sensitivities'], ['Duration, oral switch','Not verified in a single authoritative source here; follow local guideline after clinical improvement'], ['Supportive','IV fluids, antipyretics, humidified oxygen after intubation, ICU monitoring, extubation when oedema reduced (leak, direct view)']] table(s,rows,0.6,1.4,12.2,[2.4,9.8],12.5,RED,maxh=5.4) # ---------------- S17 prevention s=new('Epiglottitis: prevention, prognosis and follow-up','B','Rifampin regimen: ScienceDirect overview and Medscape (web); delay and mortality: Rosen. India schedule: standard teaching, verify against current UIP/IAP schedule.','Contact prophylaxis depends on confirmed invasive Hib and household composition. Mention pentavalent vaccine.') box(s,0.6,1.4,4.0,2.6,'Prevention||\nHib conjugate vaccine (in India given within the pentavalent vaccine; check the current schedule). Complete primary series and booster. Vaccine does not cover non-b or non-H. influenzae causes.','E3F4F4',DARK,13,anchor=MSO_ANCHOR.TOP,line=TEAL) box(s,4.8,1.4,4.0,2.6,'Contact prophylaxis||\nRifampin 20 mg/kg once daily (max 600 mg) for 4 days when Hib is isolated and the household has an infant under 12 months, under-vaccinated child under 4 years, or immunocompromised child; includes the index case.','FFF4DD',DARK,12.5,anchor=MSO_ANCHOR.TOP,line=AMBER) box(s,9.0,1.4,3.9,2.6,'Prognosis||\nExcellent with timely airway control and antibiotics. Mortality is increased with delayed diagnosis (Rosen). Full recovery expected.','F2F5F9',DARK,13,anchor=MSO_ANCHOR.TOP,line=GREY) text(s,0.6,4.2,12,0.4,'Public health and follow-up',18,NAVY,True) bullets(s,['Notify invasive Hib disease per local public-health rules; droplet precautions for 24 hours of effective therapy (standard practice)', 'Check immunisation status of the child and complete the schedule', 'Recurrent epiglottitis, especially in adults, warrants immune evaluation (Medscape)', 'Prophylaxis indications depend on the organism isolated: not needed for non-Hib causes'],0.6,4.65,12.2,2.4,14.5,gap=5) # ---------------- S18 croup definition s=new('Croup: definition and terminology','C',TB+'Scott-Brown Vol 2 (Croup), Tintinalli Ch. 126, Rosen Ch. 162.','Define croup clinically. Terms: laryngotracheitis, LTB, viral croup. Spasmodic croup is a related recurrent form; not addressed in sources I verified.') box(s,0.6,1.4,12.2,1.5,'Viral croup (acute laryngotracheobronchitis)||\nA clinical syndrome of hoarseness, a distinctive barking cough and inspiratory or biphasic stridor, usually after upper respiratory symptoms, due to mucosal oedema of the larynx and trachea after a viral illness (Scott-Brown).','E8F1FB',DARK,15.5,anchor=MSO_ANCHOR.TOP,line=BLUE) bullets(s,['Terminology||: croup, laryngotracheitis, laryngotracheobronchitis (LTB) are used interchangeably; the bronchi are involved in some children', 'Typical features||: 6 months to 3 years, URI prodrome, barking cough, hoarseness, stridor worse at night; no drooling and not toxic (Scott-Brown)', 'Not typical croup||: drooling, toxic look, high fever, abrupt onset, no URI, age outside 6 months to 6 years, poor response to steroids', 'Alternative causes of stridor||: epiglottitis, bacterial tracheitis, foreign body, retropharyngeal abscess, laryngomalacia, subglottic stenosis (consider with recurrent croup, Scott-Brown), angioedema, burns'],0.6,3.15,12.2,3.8,15,gap=8) # ---------------- S19 epi & aetiology croup s=new('Croup: epidemiology and aetiology','C',TB+'Tintinalli Ch. 126, Scott-Brown Vol 2. Relative frequencies not quantified in these sources.','Peak 2 years, boys more, autumn, biennial PIV1. Coinfection can occur.') rows=[['Virus','Notes (source)'], ['Parainfluenza virus type 1','Classic cause; biennial autumn epidemics in odd years in USA and Canada (Scott-Brown)'], ['Parainfluenza virus type 2 and 3','Also cause croup (type 3 listed as parainfluenza in Tintinalli); more variable'], ['Rhinovirus','Among the most common viruses with parainfluenza (Tintinalli)'], ['Respiratory syncytial virus','Recognised cause (Scott-Brown)'], ['Influenza, metapneumovirus, enterovirus, coronavirus, bocavirus','Reported; detection methods increase list (Tintinalli, Scott-Brown)'], ['Measles','Important where measles remains prevalent (Tintinalli)']] table(s,rows,0.6,1.4,7.9,[3.0,4.9],12,BLUE,maxh=4.4) box(s,8.8,1.4,4.1,5.4,'Epidemiology||\nAge: 6 months to 3 years; peak 2 years\nBoys > girls\nIncidence 1.5% to 6% per year in under 6s (Scott-Brown)\nSeason: autumn and early winter, sporadic all year\nTransmission: droplets, contact; coinfection is not uncommon; bacterial superinfection rare (Tintinalli)\nRisk of severe course: pre-existing subglottic narrowing, chronic lung disease, airway reactivity (Scott-Brown)','E8F1FB',DARK,13.5,anchor=MSO_ANCHOR.TOP,line=BLUE) text(s,0.6,5.9,7.9,0.9,'The pre-existing narrowing, such as subglottic stenosis, should be suspected in children with recurrent croup; endoscopy is advised in persistent cases (Scott-Brown).',12.5,GREY,italic=True) # ---------------- S20 pathogenesis croup s=new('Croup: paediatric airway anatomy and pathogenesis','C',TB+'Scott-Brown Vol 2 (1 mm oedema in 6.5 mm subglottis reduces area by about 50%). Schematic drawn for this seminar.','Subglottis narrowest, cricoid is rigid ring so oedema must encroach inwards.') pic(s,A+'cross.png',0.4,1.3,7.2,3.9) pic(s,A+'sag_croup.png',7.8,1.25,5.2,4.4,name='AirwayFigure') bullets(s,['Virus infects laryngeal and tracheal epithelium; mucosal inflammation and oedema in the subglottis (narrowest, enclosed by cricoid)', 'Narrowed lumen: higher resistance, turbulent airflow; vocal cord swelling gives hoarseness; barking cough and inspiratory stridor'],0.6,5.4,7.2,1.6,13.5,gap=4) box(s,7.9,5.75,5.0,1.2,'Result||\nSubglottic narrowing: "steeple" on AP radiograph','E8F1FB',DARK,13,line=BLUE) # ---------------- S21 pathology croup s=new('Croup: pathology and clinical correlation','C','Flow-resistance chart computed for this seminar (Poiseuille, laminar model). Scott-Brown Vol 2 for the 6.5 mm example.','Radius to the 4th power. Turbulent flow makes it worse. Why infants decompensate.') pic(s,A+'resist.png',7.3,1.35,5.6,3.7) bullets(s,['Inflammation of larynx and trachea; bronchi may be involved', 'Subglottic mucosa and submucosa oedematous; epithelium sloughs; hyperaemic and infiltrated by inflammatory cells (standard teaching)', 'Worked example (Scott-Brown): 1 mm of oedema in an 18-month-old with a 6.5 mm subglottis cuts cross-sectional area by about 50%', 'Laminar resistance rises as 1/r^4; turbulence worsens the effect', 'Infants have less reserve, fatigue sooner, and crying increases flow and turbulence'],0.6,1.4,6.5,5.5,14.5,gap=7) box(s,7.3,5.25,5.6,1.6,'Correlation||\nHoarse voice: cords swollen. Barking cough: subglottic oedema. Inspiratory stridor: turbulent flow in extrathoracic airway. Worse when crying or at night.','F2F5F9',DARK,12.5,anchor=MSO_ANCHOR.TOP,line=GREY) # ---------------- S22 croup clinical s=new('Croup: clinical features','C',TB+'Tintinalli Ch. 126 (prodrome, course), Scott-Brown Vol 2 (course, mortality).','Typical course 3 to 4 days. Atypical features should prompt reconsideration.') bullets(s,['Prodrome||: 1 to 3 days of coryza, cough and low-grade fever (Tintinalli)', 'Barking, seal-like cough||, hoarse voice', 'Inspiratory stridor||, initially on crying then at rest; biphasic in more severe disease', 'Fever||: usually low grade; child non-toxic, swallows saliva', 'Distress||: tachypnoea, suprasternal and intercostal retractions, nasal flaring', 'Night worsening||: symptoms often worse at night (Tintinalli)'],0.6,1.4,7.4,5.5,15,gap=7) box(s,8.3,1.5,4.6,2.45,'Typical course||\nSelf-limited; most resolve within 3 days (Tintinalli); 50% improve within 24 h and most recover within 4 days without treatment (Scott-Brown). Mortality about 1 in 30 000.','E8F1FB',DARK,13,anchor=MSO_ANCHOR.TOP,line=BLUE) box(s,8.3,4.15,4.6,2.7,'Atypical features: reconsider diagnosis||\nDrooling, toxic appearance, high fever, abrupt onset, recurrent episodes, poor response to steroids, stridor lasting beyond a week, age under 6 months.','FFF4DD',DARK,13,anchor=MSO_ANCHOR.TOP,line=AMBER) # ---------------- S23 severity s=new('Croup: clinical severity assessment','C','Severity categories synthesised from Westley components, Tintinalli, NHS Highland guideline (web), and standard teaching. Use local scoring conventions.','Cyanosis and drowsiness are late. Do not wait.') rows=[['Feature','Mild','Moderate','Severe / impending failure'], ['Stridor','Only when agitated or crying','At rest, audible','At rest, may diminish if exhausted'], ['Retractions','None or mild','Moderate','Severe, tiring'], ['Air entry','Normal','Normal or mildly decreased','Markedly decreased'], ['Mental state','Alert, playful','Anxious, agitated','Lethargic, drowsy, altered (late)'], ['Cyanosis / SpO2','None, normal','None','Cyanosis, hypoxaemia (late)'], ['Typical action','Dexamethasone, home if stridor-free','Dexamethasone plus nebulised epinephrine','Epinephrine, steroid, senior help, ICU']] table(s,rows,0.6,1.4,12.2,[2.0,3.0,3.3,3.9],12.5,BLUE,hfills=[NAVY,'2E8B57',AMBER,RED],maxh=4.4) box(s,0.6,5.65,12.2,1.2,'Late and concerning||\nCyanosis, altered consciousness, silent chest and fatigue indicate impending respiratory failure. Stridor may paradoxically quieten as the child tires. Treat immediately and call senior help.', 'FBE9E7',DARK,14,anchor=MSO_ANCHOR.TOP,line=RED) # ---------------- S24 Westley s=new('Westley croup score','C',TB+'Scott-Brown Vol 2 Table 29.1 (from Westley 1978) and Tintinalli Table 126-3 (modified). Cut-offs differ between sources: see right.','Component scores identical across sources. Max 17. Do not delay treatment while scoring.') rows=[['Component','0','1','2','3','4','5'], ['Level of consciousness','Normal','','','','','Altered'], ['Cyanosis','None','','','','With agitation','At rest'], ['Stridor','None','With agitation / by stethoscope','At rest / without stethoscope','','',''], ['Air entry','Normal','Decreased','Severely decreased','','',''], ['Chest wall retractions','None','Mild','Moderate','Severe','','']] table(s,rows,0.5,1.4,8.6,[2.2,0.9,1.5,1.5,0.9,1.1,0.9],11,BLUE,maxh=3.6) text(s,0.5,4.55,8.6,0.4,'Total 0 to 17. Stridor wording: Westley original uses "audible with stethoscope"; modified versions use "with agitation".',11,GREY,italic=True) rows=[['Source','Mild','Moderate','Severe'], ['Scott-Brown (Westley)','2 to 3','4 to 7','8 or more'], ['Tintinalli (modified)','under 4','4 to 6','over 6'], ['AMBOSS summary (web)','2 or less','3 to 7','8 to 11; 12 or more impending failure']] table(s,rows,9.3,1.4,3.7,[1.6,0.7,0.8,1.2],10,NAVY,maxh=3.3) box(s,0.5,5.1,12.5,1.8,'Use and limits||\nValidated research tool; score correlates with tracheal lumen (Scott-Brown). Inter-observer variability; less used in daily practice. Cut-offs vary: adopt the one in your local guideline. Never delay dexamethasone, epinephrine or airway help while calculating a score.','E8F1FB',DARK,13.5,anchor=MSO_ANCHOR.TOP,line=BLUE) # ---------------- S25 diagnosis croup s=new('Croup: diagnosis and investigations','C',TB+'Scott-Brown Vol 2 (radiograph, Fig 29.1), Tintinalli Ch. 126. Second image from Orris library (original publication not identified).','Clinical diagnosis. Avoid radiology in distressed child.') bullets(s,['Diagnosis is clinical||; laboratory and viral tests are unnecessary in typical croup', 'Radiograph (AP neck)||: steeple or pencil-tip sign only if diagnostic dilemma in severe cases (Scott-Brown); can be normal and does not predict severity', 'Further assessment||: atypical features, poor response to treatment, toxic child, suspected foreign body, epiglottitis or tracheitis (Tintinalli)', 'Endoscopy||: persistent or recurrent croup to look for subglottic stenosis or other lesions', 'Safety||: do not send a distressed child to radiology unaccompanied; no throat examination; keep with parent'],0.6,1.4,6.6,5.5,14.5,gap=7) pic(s,A+'steeple_sb.png',7.5,1.35,2.7,3.3,caption='Steeple sign (Scott-Brown Fig 29.1)',capsize=9) pic(s,A+'steeple_pmc.jpg',10.3,1.35,2.7,3.3,caption='Steeple sign, AP neck',capsize=9) box(s,7.5,5.0,5.4,1.85,'Limited role of tests||\nNo test is needed in typical uncomplicated croup. Testing should never delay steroid or epinephrine treatment, and must never involve distressing the child.','FFF4DD',DARK,13,anchor=MSO_ANCHOR.TOP,line=AMBER) # ---------------- S26 DDx croup s=new('Differential diagnosis of croup','C',TB+'Tintinalli Table 126-2, Rosen Ch. 162 (tracheitis, foreign body). RPA features: standard teaching.','Compare. Key triggers for alternative diagnosis.') rows=[['','Croup','Epiglottitis','Bacterial tracheitis','Foreign body','Retropharyngeal abscess'], ['Onset','1 to 3 days after URI','Hours','URI then acute worsening','Sudden, choking','Days; sore throat'], ['Fever','Low grade','High','High','None','Present'], ['Cough','Barking','Absent','Croupy, productive','Cough/wheeze','Variable'], ['Voice','Hoarse','Muffled','Hoarse','Variable','Muffled'], ['Drooling','No','Yes','No','Variable','Often, neck stiff'], ['Appearance','Non-toxic','Toxic','Toxic','Distressed, well','Toxic, torticollis'], ['Airway finding','Subglottic narrowing','Swollen epiglottis','Irregular tracheal wall, purulent secretions','Radiopaque or air-trapping (may be normal)','Widened prevertebral space'], ['Distinguisher','Responds to steroid, epinephrine','Airway emergency','Fails croup treatment; bronchoscopy','Bronchoscopy','CT; drainage']] table(s,rows,0.6,1.35,12.2,[1.4,2.1,2.0,2.4,2.2,2.1],10.5,BLUE,maxh=5.6) # ---------------- S27 treatment s=new('Croup: evidence-based treatment','C',TB+'Scott-Brown Vol 2, Rosen Ch. 162, Tintinalli; NHS Highland guideline (web); Cochrane 2011 glucocorticoids. Doses on next slide.','Steroid for everyone. Epinephrine for moderate/severe. Observe after epinephrine. Avoid sedation, mist, antibiotics.') cards=[('Calm','Keep with parent, minimal disturbance; no throat exam; sedation not advised (Scott-Brown)',NAVY), ('Corticosteroid','Mainstay; single oral dexamethasone, all severities incl. mild (Cochrane: benefit by 6 h, to 12 h)',TEAL), ('Nebulised epinephrine','Moderate to severe, in addition to steroid; effect brief so observe (Rosen)',BLUE), ('Oxygen','For hypoxaemia or severe croup, delivered with parent assistance',PURPLE)] for i,(h,d,c) in enumerate(cards): x=0.6+i*3.1 box(s,x,1.4,2.95,0.55,h,c,WHITE,15,True,shape=MSO_SHAPE.RECTANGLE,align=PP_ALIGN.CENTER) box(s,x,1.95,2.95,1.9,d,LIGHT,DARK,12.5,shape=MSO_SHAPE.RECTANGLE,anchor=MSO_ANCHOR.TOP) text(s,0.6,4.0,6,0.4,'Precautions',17,NAVY,True) bullets(s,['Observe 2 to 4 h after nebulised epinephrine for symptom return (AMBOSS)', 'Intramuscular dexamethasone is not first line (Scott-Brown)','Dexamethasone effect begins within hours and lasts up to about 72 h'],0.6,4.4,6.2,2.5,13.5,gap=5) box(s,7.0,4.0,5.9,2.9,'Avoid / not routinely recommended||\nRoutine antibiotics for uncomplicated viral croup\nSedatives (respiratory depression, Scott-Brown)\nMist tents or humidification: no demonstrated clinical benefit (Scott-Brown)\nUnproven interventions as substitute for steroid','FBE9E7',DARK,13.5,anchor=MSO_ANCHOR.TOP,line=RED) # ---------------- S28 med table s=new('Croup: medication table','C','Doses: NHS Highland croup guideline (web, accessed 2026); Scott-Brown Vol 2; Harriet Lane 23e (dexamethasone); onset/observation: AMBOSS (secondary). Verify with local guideline.','Dose ranges differ. Newer meta-analysis (Front Pediatr 2026, PMID 42698708) compares 0.15 vs 0.6 mg/kg; I did not review its conclusions in detail. Epinephrine dose given from NHS Highland; racemic dosing not verified.') rows=[['Medication','Indication','Route','Dose / maximum','Onset / duration','Precautions'], ['Dexamethasone','All severities (recommended)','Oral; IV if needed','Single dose 0.15 mg/kg (NHS Highland); 0.6 mg/kg (Scott-Brown, Harriet Lane, usual max 16 mg); can repeat after 6 to 12 h per NHS Highland','Within about 6 h; benefit to about 12 h (Cochrane), up to 72 h (AMBOSS)','IM not first line (muscle necrosis); vomiting: use budesonide'], ['Budesonide (nebulised)','If too unwell or vomiting','Nebulised','2 mg single dose (NHS Highland, Scott-Brown)','Similar steroid effect','Alternative only'], ['Epinephrine (nebulised)','Moderate to severe croup','Nebulised','1:1000 at 400 micrograms/kg, max 5 mg; repeat after 30 min if needed (NHS Highland)','Within about 30 min; observe 2 to 4 h for return (AMBOSS)','Tachycardia, pallor; repeated need = admit; always give steroid'], ['Oxygen','Hypoxaemia, severe croup','Mask / blow-by, parent-assisted','Titrate to SpO2 (high flow in severe)','Immediate','Do not distress child'], ['Not routinely recommended','Antibiotics (viral), sedatives, mist/humidification','-','-','-','No benefit or harm (Scott-Brown)']] table(s,rows,0.5,1.35,12.4,[1.5,1.7,1.3,3.5,2.3,2.1],10,BLUE,maxh=5.6) # ---------------- S29 disposition s=new('Croup: disposition, admission and discharge','C','Rosen Ch. 162 (discharge after observation), NHS Highland guideline (1 to 2 h stridor review), AMBOSS (age under 6 months, observation 2 to 4 h). Local protocols apply.','Disposition depends on assessment and local guideline.') box(s,0.6,1.4,6.0,0.5,'Safe for discharge',TEAL,WHITE,16,True,shape=MSO_SHAPE.RECTANGLE,align=PP_ALIGN.CENTER) box(s,0.6,1.9,6.0,3.3,'No stridor at rest and no significant distress after observation (Rosen)\nPeriod of observation after epinephrine completed without recurrence\nNormal SpO2, drinking well\nReliable carers, can return quickly; access to follow-up\nSafety-net advice given','E3F4F4',DARK,14,shape=MSO_SHAPE.RECTANGLE,anchor=MSO_ANCHOR.TOP) box(s,6.8,1.4,6.0,0.5,'Admit',RED,WHITE,16,True,shape=MSO_SHAPE.RECTANGLE,align=PP_ALIGN.CENTER) box(s,6.8,1.9,6.0,3.3,'Persistent stridor at rest or work of breathing\nReturn of symptoms after epinephrine; repeated doses\nHypoxaemia, poor intake, dehydration\nAge under 6 months (AMBOSS); atypical or toxic presentation\nSocial or access concerns','FBE9E7',DARK,14,shape=MSO_SHAPE.RECTANGLE,anchor=MSO_ANCHOR.TOP) box(s,0.6,5.4,12.2,1.45,'Senior review / PICU / airway support||\nSevere croup, fatigue, falling air entry, cyanosis or altered consciousness, poor response to epinephrine and steroid: senior anaesthetist and ICU. Intubation needed in about 1 to 3% of those with impending failure (NHS Highland).','FFF4DD',DARK,13.5,anchor=MSO_ANCHOR.TOP,line=AMBER) # ---------------- S30 complications prognosis s=new('Croup: complications and prognosis','C',TB+'Scott-Brown Vol 2 (course, mortality, recurrent croup), NHS Highland (prognosis), Tintinalli (superinfection). Other complications: standard teaching.','Mostly benign.') text(s,0.6,1.35,6,0.4,'Complications',18,BLUE,True) bullets(s,['Respiratory deterioration and failure needing airway support in a small minority', 'Bacterial superinfection: tracheitis, pneumonia (Tintinalli)', 'Dehydration from poor intake', 'Rare: post-obstructive pulmonary oedema, hypoxic injury', 'Rare death: about 1 in 30 000 (Scott-Brown)'],0.6,1.8,6.0,3.8,14.5,gap=6) text(s,6.9,1.35,6,0.4,'Prognosis and course',18,BLUE,True) bullets(s,['Mild croup self-limiting; steroid shortens time to resolution (NHS Highland)', 'Most children recover within about 3 to 4 days', 'Severe croup: excellent prognosis with dexamethasone plus nebulised epinephrine (NHS Highland)', 'Cough may persist a few days'],6.9,1.8,6.0,3.2,14.5,gap=6) box(s,0.6,5.3,12.2,1.55,'Suspect an alternative or complicated disease if||\nToxic or high fever, no response to steroid and epinephrine, symptoms beyond a week, drooling, purulent secretions, recurrent episodes (subglottic stenosis, allergy, reflux).','FFF4DD',DARK,14,anchor=MSO_ANCHOR.TOP,line=AMBER) # ---------------- S31 comparison tables hd=['','Epiglottitis','Croup'] rowsA=[hd,['Definition','Supraglottic bacterial cellulitis','Viral laryngotracheobronchitis'], ['Aetiology','Hib; strep, S. aureus, others','Parainfluenza, RSV, rhinovirus'], ['Age / epidemiology','Rare now; any age; pre-vaccine 2 to 7 y','6 mo to 3 y; autumn'], ['Onset','Hours','1 to 3 days after URI'], ['Fever / appearance','High; toxic','Low; non-toxic'], ['Cough / voice','No cough; muffled','Barking; hoarse'], ['Drooling / dysphagia','Marked','Absent'], ['Stridor / effort','Soft, late; tripod','Harsh inspiratory; retractions'], ['Anatomical site','Supraglottis','Subglottis']] s=new('Epiglottitis versus croup: comprehensive comparison (1 of 2)','D','Synthesis of slides 6 to 30. Tintinalli Table 126-2; Rosen; Scott-Brown.','Colour: red epiglottitis, blue croup.') table(s,rowsA,0.6,1.4,12.2,[2.4,4.9,4.9],13,NAVY,hfills=[NAVY,RED,BLUE],maxh=5.5) rowsB=[hd,['Diagnostic approach','Clinical; airway visualisation in OR; X-ray optional','Clinical; X-ray rarely'], ['Initial management','Airway team; keep calm; no throat exam','Calm; assess severity; steroid'], ['Airway precautions','Controlled intubation; no distress','Avoid agitation; no throat exam'], ['Treatment','Secure airway; IV cephalosporin; ICU','Dexamethasone; nebulised epinephrine; oxygen'], ['Complications','Obstruction, sepsis, abscess','Respiratory failure rare; tracheitis'], ['Prevention','Hib vaccine; rifampin contacts','No specific; hygiene']] s=new('Epiglottitis versus croup: comprehensive comparison (2 of 2)','D','Synthesis. Tintinalli Table 126-2; Rosen; Scott-Brown; guidelines per slides 16 and 28.','Management differences.') table(s,rowsB,0.6,1.4,12.2,[2.4,4.9,4.9],13.5,NAVY,hfills=[NAVY,RED,BLUE],maxh=5.5) # ---------------- S32 integrated flow s=new('Integrated approach to a child with stridor','D','Algorithm synthesised for teaching from Rosen Ch. 162, Tintinalli Ch. 126, Scott-Brown; follow local protocol.','Airway safety is first. No throat exam.') box(s,3.2,1.3,6.9,0.8,'Child with stridor: airway, breathing, circulation, SpO2, work of breathing. Keep calm on parent lap.',NAVY,WHITE,14,True,align=PP_ALIGN.CENTER) box(s,0.6,2.3,12.2,0.55,'Impending failure (cyanosis, drowsy, exhausted)? Oxygen as tolerated, call senior airway team and ICU now.',RED,WHITE,13.5,True,align=PP_ALIGN.CENTER) arrow(s,6.4,2.1,0.5,0.2,'down') cols=[('Toxic, drooling, tripod, muffled, abrupt','Epiglottitis','Airway team; theatre; IV antibiotics',RED), ('Barking cough, hoarse, URI, non-toxic','Croup','Severity; dexamethasone; epinephrine if moderate to severe',BLUE), ('Sudden choking, no fever','Foreign body','Urgent bronchoscopy',AMBER), ('Toxic, purulent secretions, no croup response','Bacterial tracheitis','Bronchoscopy; IV antibiotics',PURPLE), ('Neck stiffness, torticollis, fever','Retropharyngeal abscess','CT; antibiotics; drainage',GREY)] for i,(a,b,c,col) in enumerate(cols): x=0.6+i*2.48 box(s,x,3.1,2.35,1.15,a,LIGHT,DARK,11.5,line=col) arrow(s,x+1.0,4.27,0.35,0.22,'down',col) box(s,x,4.5,2.35,0.5,b,col,WHITE,13,True,align=PP_ALIGN.CENTER) box(s,x,5.0,2.35,1.0,c,LIGHT,DARK,11.5,anchor=MSO_ANCHOR.TOP) box(s,0.6,6.2,12.2,0.75,'Reassess repeatedly; escalate if worsening. Disposition by response, local protocol and carer reliability. Never examine the throat or delay airway support.','FFF4DD',DARK,13,True,line=AMBER) # ---------------- S33 summary s=new('Summary and high-yield clinical pearls','D','Synthesis of

Build the full 33-slide PowerPoint now

Running Command

cd /tmp/workspace/epiglottitis-croup && cat > src/build.py <<'EOF' import math, copy from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR from pptx.oxml.ns import qn from pptx.oxml import parse_xml from lxml import etree from PIL import Image A='assets/' NAVY='1F3A5F'; TEAL='0E7C86'; RED='B3261E'; BLUE='2A6FBB'; GREY='5F6B7A'; LRED='FBE9E7'; LBLUE='E3F0FB'; LGREY='F3F5F8'; AMB='F2A900'; GREEN='2E7D32'; LGREEN='E8F5E9'; LAMB='FFF4D6' def rgb(h): return RGBColor.from_string(h) prs=Presentation(); prs.slide_width=Inches(13.333); prs.slide_height=Inches(7.5) BL=prs.slide_layouts[6] WARN=[] CNT=[0] def est_h(text,w,pt,spacing=1.2): cpl=max(1,(w-0.15)/(0.0078*pt)); lines=sum(max(1,math.ceil(len(p)/cpl)) for p in text.split('\n')) return lines*pt*spacing/72+0.1 def add_morph(sl): ns='xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" xmlns:p159="http://schemas.microsoft.com/office/powerpoint/2015/09/main"' x=f'<mc:AlternateContent {ns}><mc:Choice Requires="p159"><p:transition spd="slow" p14:dur="1200"><p159:morph option="byObject"/></p:transition></mc:Choice><mc:Fallback><p:transition spd="slow"><p:fade/></p:transition></mc:Fallback></mc:AlternateContent>' sl._element.append(etree.fromstring(x)) def tx(sl,text,x,y,w,h,size=14,bold=False,color='222222',align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP,name=None,italic=False): tb=sl.shapes.add_textbox(Inches(x),Inches(y),Inches(w),Inches(h)); tf=tb.text_frame; tf.word_wrap=True tf.margin_left=tf.margin_right=Inches(0.05); tf.margin_top=tf.margin_bottom=Inches(0.03); tf.vertical_anchor=anchor if name: tb.name=name for i,line in enumerate(text.split('\n')): p=tf.paragraphs[0] if i==0 else tf.add_paragraph(); p.alignment=align r=p.add_run(); r.text=line; f=r.font; f.size=Pt(size); f.bold=bold; f.italic=italic; f.name='Calibri'; f.color.rgb=rgb(color) if est_h(text,w,size)>h+0.15: WARN.append(f'slide {CNT[0]} textbox overflow? "{text[:30]}" est {est_h(text,w,size):.2f} > {h}') return tb def box(sl,text,x,y,w,h,fill=NAVY,fc='FFFFFF',size=13,bold=False,align=PP_ALIGN.CENTER,shape=MSO_SHAPE.ROUNDED_RECTANGLE,line=None,anchor=MSO_ANCHOR.MIDDLE,name=None): s=sl.shapes.add_shape(shape,Inches(x),Inches(y),Inches(w),Inches(h)) if name: s.name=name s.fill.solid(); s.fill.fore_color.rgb=rgb(fill) if line: s.line.color.rgb=rgb(line); s.line.width=Pt(1.5) else: s.line.fill.background() s.shadow.inherit=False if shape==MSO_SHAPE.ROUNDED_RECTANGLE: try: s.adjustments[0]=0.12 except: pass tf=s.text_frame; tf.word_wrap=True; tf.vertical_anchor=anchor tf.margin_left=tf.margin_right=Inches(0.08); tf.margin_top=tf.margin_bottom=Inches(0.04) for i,line_ in enumerate(text.split('\n')): p=tf.paragraphs[0] if i==0 else tf.add_paragraph(); p.alignment=align if '::' in line_: a,b=line_.split('::',1); r=p.add_run(); r.text=a; r.font.bold=True; r.font.size=Pt(size); r.font.color.rgb=rgb(fc); r.font.name='Calibri' r=p.add_run(); r.text=b; r.font.size=Pt(size); r.font.color.rgb=rgb(fc); r.font.name='Calibri' else: r=p.add_run(); r.text=line_; r.font.bold=bold; r.font.size=Pt(size); r.font.color.rgb=rgb(fc); r.font.name='Calibri' if est_h(text,w,size)>h+0.1: WARN.append(f'slide {CNT[0]} box overflow? "{text[:30]}" est {est_h(text,w,size):.2f} > {h}') return s def bullets(sl,items,x,y,w,h,size=14,color='222222',gap=4): tb=sl.shapes.add_textbox(Inches(x),Inches(y),Inches(w),Inches(h)); tf=tb.text_frame; tf.word_wrap=True tf.margin_left=tf.margin_right=Inches(0.05); tf.margin_top=Inches(0.03) tot=0; first=True for it in items: t,lvl=(it,0) if isinstance(it,str) else it p=tf.paragraphs[0] if first else tf.add_paragraph(); first=False p.space_after=Pt(gap); sz=size-(1.5 if lvl else 0) if '::' in t: a,b=t.split('::',1); r=p.add_run(); r.text=a; r.font.bold=True; r.font.size=Pt(sz); r.font.color.rgb=rgb(NAVY); r.font.name='Calibri' r=p.add_run(); r.text=b; r.font.size=Pt(sz); r.font.color.rgb=rgb(color); r.font.name='Calibri' else: r=p.add_run(); r.text=t; r.font.size=Pt(sz); r.font.color.rgb=rgb(color); r.font.name='Calibri' pPr=p._p.get_or_add_pPr(); pPr.set('marL',str(int(Inches(0.22+0.25*lvl)))); pPr.set('indent',str(-int(Inches(0.2)))) bu=etree.SubElement(pPr,qn('a:buChar')); bu.set('char','•' if lvl==0 else '–') tot+=est_h(t.replace('::',''),w-0.25*(1+lvl),sz)+gap/72-0.05 if tot>h+0.1: WARN.append(f'slide {CNT[0]} bullets overflow? est {tot:.2f} > {h} ({items[0] if isinstance(items[0],str) else items[0][0]})'[:140]) return tb def arrow(sl,x1,y1,x2,y2,color=GREY,wd=2.25): c=sl.shapes.add_connector(MSO_CONNECTOR.STRAIGHT,Inches(x1),Inches(y1),Inches(x2),Inches(y2)) c.line.color.rgb=rgb(color); c.line.width=Pt(wd) ln=c.line._get_or_add_ln(); t=etree.SubElement(ln,qn('a:tailEnd')); t.set('type','triangle'); t.set('w','med'); t.set('len','med') return c def pic(sl,path,x,y,mw,mh,center=True,name=None): im=Image.open(path); w,h=im.size; r=min(mw/w,mh/h); pw,ph=w*r,h*r px=x+(mw-pw)/2 if center else x; py=y+(mh-ph)/2 if center else y p=sl.shapes.add_picture(path,Inches(px),Inches(py),Inches(pw),Inches(ph)) if name: p.name=name return p,px,py,pw,ph def table(sl,rows,x,y,colw,fs=11,hdr=NAVY,col_fills=None,first_bold=True,hdr_fills=None,hfs=None): nr,nc=len(rows),len(rows[0]); hfs=hfs or fs heights=[] for i,r in enumerate(rows): pt=hfs if i==0 else fs heights.append(max(est_h(c,colw[j],pt,1.18)+0.04 for j,c in enumerate(r))) shp=sl.shapes.add_table(nr,nc,Inches(x),Inches(y),Inches(sum(colw)),Inches(sum(heights))) t=shp.table tblPr=t._tbl.tblPr for a in ('bandRow','firstRow'): tblPr.set(a,'0') sid=tblPr.find(qn('a:tableStyleId')) if sid is not None: sid.text='{5940675A-B579-460E-94D1-54222C63F5DA}' for j,wd in enumerate(colw): t.columns[j].width=Inches(wd) for i,r in enumerate(rows): t.rows[i].height=Inches(heights[i]) for j,c in enumerate(r): cell=t.cell(i,j); cell.margin_left=cell.margin_right=Inches(0.06); cell.margin_top=cell.margin_bottom=Inches(0.02) cell.vertical_anchor=MSO_ANCHOR.MIDDLE tf=cell.text_frame; tf.word_wrap=True for k,line in enumerate(c.split('\n')): p=tf.paragraphs[0] if k==0 else tf.add_paragraph() rr=p.add_run(); rr.text=line; rr.font.name='Calibri'; rr.font.size=Pt(hfs if i==0 else fs) if i==0: rr.font.bold=True; rr.font.color.rgb=rgb('FFFFFF') else: rr.font.color.rgb=rgb('222222'); rr.font.bold=(j==0 and first_bold) if j==0 and first_bold: rr.font.color.rgb=rgb(NAVY) cell.fill.solid() if i==0: cell.fill.fore_color.rgb=rgb((hdr_fills or {}).get(j,hdr)) elif col_fills and j in col_fills: cell.fill.fore_color.rgb=rgb(col_fills[j]) else: cell.fill.fore_color.rgb=rgb(LGREY if i%2==0 else 'FFFFFF') tot=sum(heights) if y+tot>7.0: WARN.append(f'slide {CNT[0]} table bottom {y+tot:.2f} > 7.0') return shp,y+tot SEC={'A':(TEAL,'A Foundations'),'B':(RED,'B Epiglottitis'),'C':(BLUE,'C Croup'),'D':(NAVY,'D Synthesis')} def new(title,sec,src,notes=''): CNT[0]+=1 sl=prs.slides.add_slide(BL); col,lab=SEC[sec] b=sl.shapes.add_shape(MSO_SHAPE.RECTANGLE,0,0,Inches(0.2),Inches(7.5)); b.name='!!Band'; b.fill.solid(); b.fill.fore_color.rgb=rgb(col); b.line.fill.background() tx(sl,title,0.5,0.25,10.5,0.8,size=27,bold=True,color=NAVY,anchor=MSO_ANCHOR.MIDDLE,name='!!Title') bd=box(sl,lab,11.0,0.4,2.1,0.42,fill=col,size=13,bold=True,name='!!Badge') r=sl.shapes.add_shape(MSO_SHAPE.RECTANGLE,Inches(0.5),Inches(1.08),Inches(12.4),Inches(0.04)); r.name='!!Rule'; r.fill.solid(); r.fill.fore_color.rgb=rgb(col); r.line.fill.background() tx(sl,src,0.5,7.08,11.6,0.3,size=9,color=GREY,name='!!Source',italic=True) tx(sl,str(CNT[0]),12.3,7.08,0.7,0.3,size=10,color=GREY,align=PP_ALIGN.RIGHT,name='!!SlideNo') if notes: sl.notes_slide.notes_text_frame.text=notes add_morph(sl) return sl SBs='Scott-Brown Otorhinolaryngology HNS (Vol 2, croup chapter)' # ---------------- 1 TITLE CNT[0]+=1 s=prs.slides.add_slide(BL) bg=s.shapes.add_shape(MSO_SHAPE.RECTANGLE,0,0,prs.slide_width,prs.slide_height); bg.name='!!Band'; bg.fill.solid(); bg.fill.fore_color.rgb=rgb(NAVY); bg.line.fill.background() tx(s,'PAEDIATRIC UPPER AIRWAY EMERGENCIES',0.8,0.9,7.2,0.4,size=14,bold=True,color='8FD3DA',name='!!Badge') tx(s,'Epiglottitis and Acute Laryngotracheobronchitis (Croup)',0.8,1.4,7.2,2.2,size=38,bold=True,color='FFFFFF',name='!!Title') tx(s,'Final-year MBBS seminar: anatomy, pathogenesis, recognition, emergency management, prevention',0.8,3.7,7.0,0.9,size=17,color='D6E4F0') box(s,'Presenter: [Name]\nDepartment of [Paediatrics / ENT]\n[Institution] | [Date]',0.8,5.0,5.6,1.2,fill='2B4F7E',size=15,align=PP_ALIGN.LEFT) box(s,'',8.3,0.7,4.5,6.1,fill='FFFFFF') pic(s,A+'sag_normal.png',8.4,0.8,4.3,5.5,name='!!Airway') tx(s,'Sagittal schematic of the upper airway (original teaching illustration)',8.4,6.3,4.3,0.45,size=10,color=GREY,italic=True,align=PP_ALIGN.CENTER) tx(s,'Textbook-verified content and guideline updates are labelled on each slide. Ghai, Nelson and Dhingra were not available as full text for this deck: cross-check chapter details in your own edition.',0.8,6.5,7.2,0.7,size=10,color='AFC4D8',italic=True) s.notes_slide.notes_text_frame.text='Title slide. Replace presenter placeholders. Transitions: Morph (falls back to Fade in older PowerPoint).' add_morph(s) # ---------------- 2 OBJECTIVES s=new('Learning objectives','A','Structure follows the brief; content sources are tagged slide by slide.','By the end, students should be able to...') objs=[('1','Aetiology and epidemiology','Hib and non-Hib causes of epiglottitis; viral causes, age and season of croup'), ('2','Pathogenesis and anatomical pathology','Supraglottic cellulitis versus subglottic mucosal oedema, and why small changes matter in children'), ('3','Clinical recognition and differential diagnosis','Distinguish epiglottitis, croup, bacterial tracheitis, foreign body, retropharyngeal abscess'), ('4','Investigations and evidence-based management','Airway-first approach to epiglottitis; steroid, epinephrine and Westley-guided care in croup'), ('5','Complications, prevention and prognosis','Hib vaccination, contact prophylaxis, disposition, red flags and outcomes')] for i,(n,t,d) in enumerate(objs): yy=1.35+i*1.1 box(s,n,0.6,yy,0.8,0.95,fill=TEAL,size=28,bold=True,shape=MSO_SHAPE.OVAL if False else MSO_SHAPE.ROUNDED_RECTANGLE) box(s,f'{t}::\n{d}',1.55,yy,7.3,0.95,fill=LGREY,fc='222222',size=14,align=PP_ALIGN.LEFT) box(s,'How to use this deck::\nTags: [TB] checked against a textbook in the library; [GL] guideline or review found online; [K] standard teaching not re-verified here.\n\nSeminar plan (about 30 min):\nFoundations 4 min | Epiglottitis 11 min | Croup 11 min | Synthesis 4 min',9.2,1.35,3.7,5.4,fill=LAMB,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP) # ---------------- 3 INTRO s=new('Introduction and definitions','A','[TB] Rosen\'s Emergency Medicine (epiglottitis, foundations); Tintinalli; Scott-Brown. Mortality figure: Scott-Brown citing a large review.','Both conditions cause acute upper airway obstruction. Emphasise tempo and level.') box(s,'ACUTE EPIGLOTTITIS (supraglottitis)',0.5,1.3,6.05,0.5,fill=RED,size=15,bold=True) box(s,'Invasive bacterial infection causing inflammation and oedema of the epiglottis, aryepiglottic folds, arytenoids and surrounding supraglottic tissue. The swollen tissue can fall over the glottic opening and obstruct the airway.',0.5,1.8,6.05,1.65,fill=LRED,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP) box(s,'ACUTE LARYNGOTRACHEOBRONCHITIS (viral croup)',6.85,1.3,6.05,0.5,fill=BLUE,size=15,bold=True) box(s,'Viral infection of the larynx and trachea (bronchi may be involved) with mucosal oedema, most marked in the subglottis. Syndrome: hoarse voice, barking cough, inspiratory or biphasic stridor, with variable respiratory distress.',6.85,1.8,6.05,1.65,fill=LBLUE,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP) tx(s,'Why they matter together',0.5,3.65,12.4,0.4,size=17,bold=True,color=NAVY) bullets(s,['Relationship:: both produce stridor from acute narrowing of the extrathoracic airway, but they differ in level (supraglottic v subglottic), cause (bacterial v viral), tempo (hours v days) and treatment.', 'Children are predisposed to respiratory failure:: small, compressible airway with high resistance, low functional residual capacity, high oxygen consumption and a short safe apnoea time [TB, Rosen].', 'Croup:: the commonest cause of stridor outside the neonatal period [TB, Tintinalli]; mortality is rare, about 1 in 30,000 cases [TB, Scott-Brown].', 'Epiglottitis:: rare since Hib vaccination, but delayed diagnosis is associated with significantly increased mortality [TB, Rosen]. Croup is a common misdiagnosis.'],0.5,4.05,12.4,2.9,size=14,gap=6) # ---------------- 4 ANATOMY s=new('Detailed upper airway anatomy','A','[TB] Scott-Brown (subglottis narrowest, 6.5 mm example); [K] vertebral levels and cartilage details. Illustration: original schematic.','Walk the airway from the vallecula down to the trachea.') pic(s,A+'sag_normal.png',0.4,1.2,5.6,5.8,name='!!Airway') bullets(s,['Supraglottis:: epiglottis, vallecula, aryepiglottic folds, arytenoids, false (vestibular) folds. Loose submucosa on the epiglottis and folds allows marked oedema [K].', 'Glottis:: true vocal cords and the narrow rima glottidis; the narrowest point in the adult airway [K].', 'Subglottis:: from below the cords to the lower border of the cricoid. The cricoid is the only complete cartilaginous ring, so oedema can only encroach inward.', 'Trachea:: C-shaped cartilage rings with a posterior membranous wall.', 'Paediatric differences::', ('Subglottis is the narrowest part of the child\'s airway [TB, Scott-Brown]; about 6.5 mm in diameter at 18 months',1), ('Larynx sits higher; epiglottis is relatively long and floppy; tongue is relatively large [K]',1), ('Airflow resistance rises with the 4th power of radius reduction (Poiseuille) [TB]',1)],6.2,1.25,6.7,5.7,size=14,gap=5) # ---------------- 5 COMPARISON ANATOMY s=new('Anatomical comparison: normal, epiglottitis, croup','A','Illustration: original schematic (same airway template in all three panels). Correlation of site and symptoms: [TB] Rosen, Scott-Brown; [K].','Supraglottic: muffled voice, drooling, no barking cough. Subglottic: barking cough, hoarseness.') pic(s,A+'three.png',0.4,1.25,8.7,3.8,name='!!Airway') box(s,'Site predicts symptoms::\nSupraglottic swelling blocks swallowing and muffles resonance. Subglottic swelling distorts the vocal cords\' airflow and tracheal mucosa.',9.3,1.3,3.6,3.7,fill=LAMB,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP) box(s,'EPIGLOTTITIS: supraglottic\nMuffled voice, drooling, dysphagia, soft inspiratory stridor, no barking cough. Epiglottis can act as a ball valve: obstructs inspiration, allows expiration [TB].',0.5,5.25,6.1,1.65,fill=LRED,fc='222222',size=13,align=PP_ALIGN.LEFT,line=RED) box(s,'CROUP: subglottic\nBarking cough, hoarseness, inspiratory stridor, no drooling. Narrowest segment, enclosed by the cricoid ring, so oedema narrows the lumen [TB].',6.8,5.25,6.1,1.65,fill=LBLUE,fc='222222',size=13,align=PP_ALIGN.LEFT,line=BLUE) # ---------------- 6 EPIGLOTTITIS DEF/EPI s=new('Epiglottitis: definition, terminology and epidemiology','B','[TB] Rosen\'s Emergency Medicine; [GL] NT Canada CPG "Epiglottitis" (age, onset); [K] Indian schedule: verify against current UIP.','Hib vaccine changed the epidemiology but did not abolish the disease.') bullets(s,['Acute epiglottitis:: acute, life-threatening inflammation of the epiglottis. "Supraglottitis" is the broader term because the aryepiglottic folds, arytenoids and adjacent tissue are involved [TB].', 'Pre-vaccine era:: classic disease of young children (a Canadian CPG states usually 3 to 7 years), with onset to respiratory distress often under 12 hours [GL].', 'After Hib vaccination (1980s onward):: paediatric incidence fell markedly; epiglottitis is now relatively more common in older children and adults [TB, Rosen].', 'Still occurs in vaccinated children:: Hib is still the commonest infectious cause in children and can affect fully immunised ones; non-Hib bacteria also contribute [TB].', 'Adults and adolescents:: often subtle: sore throat out of proportion to findings, anterior neck tenderness. A larger airway needs more swelling to obstruct, but obstruction can still occur [TB].', 'India [K]:: Hib is delivered through the pentavalent vaccine in the national schedule; confirm current schedule and coverage locally.'],0.5,1.3,8.2,5.7,size=14,gap=6) table(s,[['','Pre-Hib vaccine','Current era'],['Typical patient','Child 2 to 7 y','Older child, adolescent, adult'],['Main organism','Hib','Hib (breakthrough), streptococci, S. aureus'],['Onset','Hours','Hours (Hib) to days (others)'],['Airway risk','High','Lower in adults, still real']],9.0,1.4,[1.3,1.35,1.3],fs=11,hdr=RED) box(s,'Teaching point::\nA fully immunised child with drooling and stridor still needs the epiglottitis pathway.',9.0,4.6,3.95,1.5,fill=LAMB,fc='222222',size=13,align=PP_ALIGN.LEFT) # ---------------- 7 AETIOLOGY s=new('Aetiology and microbiology','B','[TB] Rosen\'s Emergency Medicine (organisms, noninfectious causes); [GL] review: S. pneumoniae, S. aureus and beta-haemolytic streptococci recognised in the vaccine era.','Vaccination removes Hib mainly; other organisms and mimics remain.') rows=[['Cause','Frequency / role','Teaching notes'], ['Haemophilus influenzae type b','Classic; still the commonest infectious cause in children [TB]','Encapsulated; invasive disease with bacteraemia [K]; occurs in unvaccinated and rarely in vaccinated children'], ['Other H. influenzae (A, F, non-typeable)','Less frequent [TB]','Not prevented by Hib vaccine'], ['Streptococci (S. pneumoniae, group A beta-haemolytic)','Recognised causes [TB, GL]','Non-Hib bacteria: slower onset, less airway compromise [TB]'], ['Staphylococcus aureus incl. MRSA','Less frequent [TB]','Relevant to empirical cover where MRSA is prevalent [K]'], ['Neisseria meningitidis','Rare [TB]','Consider with petechiae or meningism [K]'], ['Pseudomonas aeruginosa, Candida','Immunocompromised hosts [TB]','Necrotising epiglottitis can occur in immunodeficiency [TB]'], ['Noninfectious mimics','Rare [TB]','Thermal injury (hot liquids, steam), caustic ingestion, allergic reaction, foreign body, irritants, lymphoproliferative disease']] table(s,rows,0.5,1.3,[3.4,3.7,5.3],fs=12,hdr=RED) box(s,'Host factors:: incomplete or absent Hib immunisation, immunodeficiency. Recurrent epiglottitis in an adult warrants immune evaluation [GL].',0.5,6.15,12.4,0.75,fill=LAMB,fc='222222',size=13,align=PP_ALIGN.LEFT) # ---------------- 8 PATHOGENESIS FLOW s=new('Pathogenesis: from colonisation to airway obstruction','B','[TB] Rosen\'s Emergency Medicine (inflammation, ball-valve mechanism); [K] colonisation and bacteraemia steps.','Follow the arrows; each step maps to a symptom.') steps=[('1 Entry','Droplet spread; nasopharyngeal colonisation by Hib [K]'), ('2 Invasion','Mucosal invasion, local infection, often bacteraemia [K]'), ('3 Cellulitis','Neutrophilic inflammation of epiglottis, AE folds, arytenoids [TB, K]'), ('4 Oedema','Supraglottic tissues swell and distend [TB]')] steps2=[('5 Displacement','Swollen epiglottis and folds protrude over the glottic opening; ball-valve effect [TB]'), ('6 Narrowing','Turbulent inspiratory airflow: stridor. Pooled secretions: drooling [TB, K]'), ('7 Fatigue','Rising work of breathing, hypoxaemia, hypercarbia [K]'), ('8 Obstruction','Sudden complete obstruction, respiratory arrest [TB, K]')] for i,(a,b) in enumerate(steps): xx=0.5+i*3.15; box(s,f'{a}::\n{b}',xx,1.45,2.75,1.75,fill=LRED,fc='222222',size=13,line=RED,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP) if i<3: arrow(s,xx+2.78,2.3,xx+3.12,2.3,RED) arrow(s,12.1,3.25,12.1,3.55,RED); arrow(s,12.1,3.55,0.9,3.55,RED,1.5); arrow(s,0.9,3.55,0.9,3.85,RED) for i,(a,b) in enumerate(steps2): xx=0.5+i*3.15; box(s,f'{a}::\n{b}',xx,3.85,2.75,1.75,fill=('F8C9C4' if i<3 else RED),fc=('222222' if i<3 else 'FFFFFF'),size=13,line=RED,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP) if i<3: arrow(s,xx+2.78,4.7,xx+3.12,4.7,RED) box(s,'Clinical mapping:: fever and toxicity = infection/bacteraemia; sore throat and dysphagia = inflamed supraglottis; muffled voice and drooling = swollen epiglottis and folds; stridor and tripod posture = narrowed inlet. Deterioration can be abrupt.',0.5,5.85,12.4,1.05,fill=LAMB,fc='222222',size=13,align=PP_ALIGN.LEFT) # ---------------- 9 PATHOLOGY s=new('Pathology and anatomical changes','B','[TB] Rosen\'s Emergency Medicine (radiographic signs, Fig. 162.5). Images: PMC-derived clinical images via Orris image library (laryngoscopy, radiograph); original schematic at left.','Correlate the picture with the symptoms.') pic(s,A+'sag_epi.png',0.4,1.2,4.7,5.75,name='!!Airway') _,px,py,pw,ph=pic(s,A+'epi_laryngo.jpg',5.3,1.25,3.75,2.5) tx(s,'Laryngoscopy: diffuse erythema and oedema of epiglottis and AE folds',5.3,3.75,3.75,0.5,size=10,color=GREY,italic=True) pic(s,A+'epi_xray.jpg',9.3,1.25,3.6,2.5) tx(s,'Lateral neck: thumbprint sign, supraglottic narrowing',9.3,3.75,3.6,0.5,size=10,color=GREY,italic=True) bullets(s,['Macroscopic:: swollen, rounded, cherry-red epiglottis; thickened, oedematous AE folds and arytenoids; vallecula obliterated [TB, GL].', 'Microscopic:: neutrophilic infiltrate, vascular congestion, submucosal oedema [K].', 'Effect on airway:: reduced supraglottic calibre; tissue collapses over the glottis on inspiration [TB].', 'Radiograph (only if stable):: thumbprint epiglottis, thickened AE folds, absent vallecula air, dilated hypopharynx. Rosen notes a substantial proportion can have normal films, so a normal film never excludes it [TB].'],5.3,4.25,7.6,2.75,size=13,gap=4) # ---------------- 10 HISTORY s=new('Clinical features: history','B','[TB] Rosen\'s Emergency Medicine; Tintinalli; [K] mechanisms.','Classic triad in a young child: drooling, dysphagia, distress.') rows=[['Feature','Typical finding','Why it happens'], ['Onset','Abrupt, over hours; often little or no preceding cold [K]','Rapid bacterial cellulitis of supraglottis'], ['Fever','High, with toxicity [TB]','Invasive bacterial infection, bacteraemia'], ['Sore throat','Severe; in adults often out of proportion to findings [TB]','Inflamed, tender supraglottic mucosa'], ['Dysphagia and odynophagia','Refuses food and fluid','Swallowing across an inflamed, swollen inlet'], ['Drooling','Prominent; cannot handle secretions [TB]','Cannot swallow saliva'], ['Voice','Muffled ("hot potato") rather than hoarse [K]','Swollen supraglottic resonating space'], ['Cough','Usually absent [TB, Tintinalli]','Glottic and subglottic mucosa spared'], ['Respiratory distress','Progressive; may begin with stridor [TB]','Narrowing of the laryngeal inlet'], ['Preceding symptoms','Minimal URI at most; sudden change in a well child [K]','Contrast with croup\'s 1 to 3 day prodrome']] table(s,rows,0.5,1.3,[2.6,5.4,4.4],fs=12,hdr=RED) # ---------------- 11 EXAMINATION s=new('Clinical features: examination','B','[TB] Rosen\'s Emergency Medicine; Tintinalli (tripod/sniffing posture); [K] soft low-pitched stridor and late signs.','Observe from a distance. Do not examine the throat.') bullets(s,['General:: toxic, anxious, febrile child sitting still [TB].', 'Posture:: tripod or sniffing position, neck extended, chin forward and jaw jutting to maximise the airway [TB].', 'Drooling and silence:: no cough, little phonation, voice muffled [TB].', 'Breathing:: tachypnoea, soft inspiratory stridor (often quieter than in croup), suprasternal and subcostal retractions [K].', 'Perfusion and mentation:: tachycardia; restlessness progressing to lethargy.', 'Children v adults::', ('Young children: dramatic obstruction, drooling, toxicity',1), ('Adolescents and adults: sore throat out of proportion, anterior neck tenderness, often no stridor [TB]',1)],0.5,1.3,7.4,5.6,size=14,gap=5) box(s,'PARTICULARLY CONCERNING',8.2,1.3,4.7,0.5,fill=RED,size=15,bold=True) box(s,'Drooling with stridor:: inlet already critically narrowed.\nRefusal to lie down:: position keeps the epiglottis forward.\nFalling effort or quiet child:: exhaustion, not improvement.\nCyanosis, altered consciousness, bradycardia:: late, pre-arrest signs.\nAny agitation:: crying can precipitate complete obstruction.',8.2,1.8,4.7,5.0,fill=LRED,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP,line=RED) # ---------------- 12 COURSE s=new('Clinical course and complications','B','[TB] Rosen\'s Emergency Medicine (non-Hib slower, epiglottic abscess, necrotising form, delayed diagnosis); [K] systemic and iatrogenic complications.','Not every patient follows the same path.') tl=[('0 h','Sore throat, fever'),('2 to 6 h','Dysphagia, drooling, muffled voice'),('Hours','Stridor, tripod, retractions'),('Without airway','Hypoxaemia, exhaustion, arrest')] for i,(a,b) in enumerate(tl): xx=0.5+i*3.15; box(s,f'{a}\n{b}',xx,1.35,2.75,1.0,fill=[ '#'][0] and ['F8C9C4','F3A9A0','E57368',RED][i],fc=('222222' if i<2 else 'FFFFFF'),size=13,bold=False) if i<3: arrow(s,xx+2.78,1.85,xx+3.12,1.85,RED) tx(s,'Illustrative time course in a young child with Hib; tempo varies widely [K].',0.5,2.4,12.4,0.35,size=11,color=GREY,italic=True) tx(s,'Complications',0.5,2.8,6,0.4,size=17,bold=True,color=NAVY) bullets(s,['Complete airway obstruction, hypoxaemia, respiratory arrest, hypoxic brain injury or death [TB, K]', 'Epiglottic abscess (especially adolescents) [TB]', 'Necrotising epiglottitis in immunodeficiency [TB]', 'Bacteraemia and sepsis; pneumonia, meningitis, septic arthritis, cellulitis from invasive Hib [K]', 'Post-obstructive pulmonary oedema after relief of obstruction [K]', 'Airway-related: accidental extubation, subglottic injury [K]'],0.5,3.2,6.6,3.7,size=13,gap=4) tx(s,'Factors linked with severe disease',7.4,2.8,5.5,0.4,size=17,bold=True,color=NAVY) bullets(s,['Young age (small airway) [TB]','Delayed diagnosis: significantly increased mortality [TB]','Agitation or airway manipulation without a plan [K]','Hib as the pathogen: faster onset; non-Hib bacteria tend to be slower [TB]','Immunocompromise [TB]'],7.4,3.2,5.5,2.5,size=13,gap=4) box(s,'Avoid assuming a typical timeline: an adolescent can present with only a sore throat and still need ICU observation.',7.4,5.75,5.5,1.1,fill=LAMB,fc='222222',size=12,align=PP_ALIGN.LEFT) # ---------------- 13 DIAGNOSIS & DDx s=new('Diagnosis and differential diagnosis','B','[TB] Tintinalli Table 126-2 (common acquired causes of stridor), Rosen (bacterial tracheitis, foreign body, imaging limits); [K] retropharyngeal and peritonsillar details.','Diagnosis is clinical. Tests come after the airway is safe.') bullets(s,['Recognition:: abrupt fever, drooling, muffled voice, tripod posture, toxic appearance. Treat on suspicion.', 'Labs (after airway secured):: blood culture, FBC/CRP; epiglottic culture at intubation. They never justify delay [TB, K].', 'Imaging (only if stable, accompanied by an airway-skilled clinician):: lateral neck film may show thumbprint sign; a normal film does not exclude disease [TB].'],0.5,1.2,12.4,1.65,size=13,gap=3) rows=[['','Epiglottitis','Croup','Bacterial tracheitis','Retropharyngeal abscess','Peritonsillar abscess','Foreign body'], ['Onset','Hours','1 to 3 days','URI then rapid toxicity','Days','Days','Sudden choking'], ['Fever','High','None or low','High','Yes','Yes','No'], ['Cough','Absent','Barking','Croupy, productive','Variable','Absent','Sudden, paroxysmal'], ['Drooling / posture','Drooling, tripod','None','None','Drooling, torticollis, neck stiffness','Drooling, trismus','Variable'], ['Key clue','Thumbprint; toxic','Steeple sign; non-toxic','Poor response to croup therapy; S. aureus','Prevertebral widening / CT','Uvula deviation','History; bronchoscopy; film may be normal']] table(s,rows,0.5,2.95,[1.5,1.7,1.5,1.9,2.0,1.8,2.0],fs=11,hdr=RED,hdr_fills={2:BLUE}) # ---------------- 14 PRECAUTIONS s=new('Airway precautions in suspected epiglottitis','B','[TB] Rosen\'s Emergency Medicine (do not reposition or move a stable patient for tests; controlled setting; consult airway experts early); [K] equipment list.','Make this the slide students remember.') box(s,'SUSPECTED EPIGLOTTITIS IS AN AIRWAY EMERGENCY',0.5,1.3,12.4,0.85,fill=RED,size=26,bold=True) box(s,'DO',0.5,2.35,6.05,0.5,fill=GREEN,size=16,bold=True) box(s,'Keep the child calm, in the parent\'s arms, in the position of comfort\nCall the most experienced anaesthetist, ENT surgeon and paediatrician now\nGive oxygen only in a way the child tolerates; monitor non-invasively\nTransfer with an airway-skilled clinician to a controlled, equipped setting (usually theatre) [TB]\nPrepare a difficult-airway set: smaller tubes, bougie, rigid bronchoscope, surgical airway tray [K]',0.5,2.85,6.05,3.45,fill=LGREEN,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP) box(s,'DO NOT',6.85,2.35,6.05,0.5,fill=RED,size=16,bold=True) box(s,'Lay the child supine or force a position\nUse a tongue depressor or examine the throat in an unstable child\nDistress the child: cannulation, bloods, separation from parent, before the airway is secured\nSend to radiology or ward unaccompanied\nSedate without the airway team present\nDelay the airway for imaging or laboratory results [TB]',6.85,2.85,6.05,3.45,fill=LRED,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP) box(s,'Airway examination and intervention must be planned by experienced clinicians in an appropriately equipped setting.',0.5,6.4,12.4,0.55,fill=LAMB,fc='222222',size=13,bold=True) # ---------------- 15 EMERGENCY MGMT s=new('Emergency management of epiglottitis: stepwise flowchart','B','[TB] Rosen\'s Emergency Medicine (airway first; bag-mask then intubation, needle cricothyroidotomy or tracheostomy; intubated 3 to 5 days; cephalosporin); [K] details of induction.','Airway stabilisation has priority over every diagnostic procedure.') st=[('1 Recognise suspected epiglottitis','Treat on clinical suspicion: abrupt fever, drooling, muffled voice, tripod posture. Waiting for proof risks sudden obstruction.'), ('2 Call anaesthesia, ENT, paediatrics now','The airway may be difficult; it needs the most experienced operators and a surgical back-up plan [TB].'), ('3 Minimise agitation; position of comfort','Crying and struggling increase effort and can precipitate complete obstruction. Keep the child with the parent.'), ('4 Monitor; oxygen as tolerated','Pulse oximetry and observation. Blow-by oxygen held by the parent; do not force a mask on a distressed child.'), ('5 Secure the airway in a controlled setting','Usually theatre: anaesthetist-led induction with ENT ready for rigid bronchoscopy or tracheostomy. If unstable: bag-mask ventilation, then intubation, then needle cricothyroidotomy or tracheostomy [TB].'), ('6 Start IV antimicrobials','Cover Hib and other pathogens (next slide). Give once airway is secure, or earlier if it causes no distress; take cultures after the airway is safe.'), ('7 Supportive care and intensive monitoring','Patients often remain intubated 3 to 5 days while antibiotics settle the oedema [TB]; fluids, antipyretics, planned extubation.')] for i,(a,b) in enumerate(st): yy=1.28+i*0.8 box(s,a,0.5,yy,4.2,0.72,fill=(RED if i==4 else '8E2B24' if i<4 else NAVY),size=14,bold=True,align=PP_ALIGN.LEFT) box(s,b,4.85,yy,8.05,0.72,fill=LRED if i!=4 else 'F8C9C4',fc='222222',size=12,align=PP_ALIGN.LEFT) if i<6: arrow(s,2.6,yy+0.72,2.6,yy+0.8,RED,2) # ---------------- 16 ANTIBIOTICS s=new('Antibiotics and supportive treatment','B','[TB] Rosen (second- or third-generation cephalosporin); [GL] review (ceftriaxone, cefotaxime, ampicillin-sulbactam; alternatives in beta-lactam allergy); [GL] NT CPG (cefuroxime); [GL] Sawyer 1994 RCT (ceftriaxone). Doses are examples: verify against your local guideline.','Duration was not verified against a named guideline: check local protocol.') rows=[['Option','Rationale','Dose reported in source'], ['Ceftriaxone or cefotaxime

Running Command

cd /tmp/workspace/epiglottitis-croup && python - <<'PY' t=open('src/build.py').read() i=t.index("s=new('Summary and high-yield clinical pearls'") open('src/build.py','w').write(t[:i]) print(len(t[:i].splitlines())) PY cat >> src/build.py <<'EOF' s=new('Summary and high-yield clinical pearls','D','Synthesis of slides 1 to 33.','Close with the two-sentence rule: calm child with barking cough gets steroid; toxic drooling child gets the airway team.') cards=[('Anatomy','Epiglottitis: supraglottic.\nCroup: subglottic (cricoid, narrowest in children).',NAVY), ('Distinguish','Epiglottitis: abrupt, toxic, drooling, muffled, no cough.\nCroup: URI, barking cough, hoarse, non-toxic.',TEAL), ('Red flags','Tripod posture, drooling, cyanosis, drowsiness, fatigue, stridor at rest, quiet chest, poor response to treatment.',RED), ('Emergency principles','Airway first. Calm child. Senior airway team. No throat exam, no supine, no delay for tests.',AMBER), ('Treatment','Epiglottitis: secure airway, IV cephalosporin, ICU.\nCroup: dexamethasone, nebulised epinephrine if moderate to severe, observe, oxygen.',BLUE), ('Prevention and outcome','Hib vaccine and contact prophylaxis when Hib isolated. Croup is mostly self-limited; death is rare.',PURPLE)] for i,(h,d,c) in enumerate(cards): x=0.6+(i%3)*4.1; y=1.4+(i//3)*2.8 box(s,x,y,3.9,0.55,h,c,WHITE,16,True,shape=MSO_SHAPE.RECTANGLE) box(s,x,y+0.55,3.9,2.0,d,LIGHT,DARK,13.5,shape=MSO_SHAPE.RECTANGLE,anchor=MSO_ANCHOR.TOP) # ---------------- refs s=new('References (1 of 2)','R','Source-verification statement on the next slide.','Textbooks verified in library text are listed first.') bullets(s,['Scott-Brown\'s Otorhinolaryngology Head & Neck Surgery, Vol 2 (ISBN 9781138094634). Croup (acute laryngotracheobronchitis), Table 29.1 and Figure 29.1.', 'Tintinalli\'s Emergency Medicine: A Comprehensive Study Guide (ISBN 9781260019933). Croup; Tables 126-2 and 126-3.', 'Rosen\'s Emergency Medicine: Concepts and Clinical Practice (ISBN 9780323757898). Upper airway infections in children, including epiglottitis; Figures 162.5 and 162.6.', 'The Harriet Lane Handbook, 23rd ed (ISBN 9780323876988). Dexamethasone dosing entry.', 'Westley CR, Cotton EK, Brooks JG. Nebulized racemic epinephrine by IPPB for the treatment of croup: a double-blind study. Am J Dis Child 1978;132:484-7.', 'Russell KF, Liang Y, O\'Gorman K, Johnson DW, Klassen TP. Glucocorticoids for croup. Cochrane Database Syst Rev 2011;(1):CD001955.', 'Bjornson C, Russell KF, Vandermeer B, et al. Nebulized epinephrine for croup in children. Cochrane Database Syst Rev 2011;(2):CD006619.', 'Bjornson CL, Klassen TP, Williamson J, et al. A randomized trial of a single dose of oral dexamethasone for mild croup. N Engl J Med 2004;351:1306-13.'],0.6,1.35,12.2,5.6,13.5,gap=6) s=new('References (2 of 2) and source verification','R','Figures: schematic diagrams created for this seminar; clinical images from Orris medical image library.','Be transparent about what was and was not verified.') bullets(s,['Sawyer SM, et al. Successful treatment of epiglottitis with two doses of ceftriaxone. PubMed PMID 8129435 (1994).', 'NHS Highland. Croup (paediatric guidelines), Right Decisions website (web, accessed Nov 2026). Dexamethasone, budesonide and epinephrine doses.', 'Northwest Territories Health and Social Services. Epiglottitis, pediatric clinical practice guideline (web). Age range, cefuroxime dose, rifampin.', 'Medscape (emedicine). Epiglottitis treatment and management; ScienceDirect Topics, Acute epiglottitis (secondary overviews: antibiotic options, rifampin criteria).', 'AMBOSS. Croup (secondary summary: Westley cut-offs, observation after epinephrine).', 'Khalid A, et al. Low-dose (0.15 mg/kg) versus high-dose (0.6 mg/kg) dexamethasone for paediatric croup. Front Pediatr 2026, PMID 42698708 (identified in a recent-evidence search; full text not reviewed).'],0.6,1.35,12.2,3.4,12.5,gap=5) box(s,0.6,4.85,12.2,2.1,'Source-verification statement||\nGhai Essential Pediatrics, Nelson Textbook of Pediatrics and Dhingra\'s Diseases of Ear, Nose and Throat were not accessible in full text for this presentation and have not been quoted or verified. Content tagged "verified" comes from the library textbooks above; web guideline content is labelled as such. Statements marked "standard teaching" are general knowledge not checked against a named text. Cross-check chapters and doses in your own editions and local guideline. Doses are for teaching only.','FFF4DD',DARK,12.5,anchor=MSO_ANCHOR.TOP,line=AMBER) prs.save('output/Epiglottitis_and_Croup_Seminar.pptx') print('slides',len(prs.slides)) for w in WARN: print('WARN',w) EOF python src/build.py

Running Command

cd /tmp/workspace/epiglottitis-croup && python - <<'EOF' from pptx import Presentation from pptx.util import Emu p=Presentation('output/Epiglottitis_and_Croup_Seminar.pptx') for i,s in enumerate(p.slides,1): for sh in s.shapes: b=(sh.top+sh.height)/914400; r=(sh.left+sh.width)/914400 if sh.name in('Footer','SlideNo','SideBar'): continue if b>7.05 or r>13.2: print(i,sh.name,sh.shape_type,round(b,2),round(r,2)) print(len(p.slides)) import zipfile; z=zipfile.ZipFile('output/Epiglottitis_and_Croup_Seminar.pptx'); x=z.read('ppt/slides/slide5.xml').decode(); print(x[-700:]) EOF

Running Command

cd /tmp/workspace/epiglottitis-croup/src && python - <<'EOF' s=open('build.py').read() i=s.rfind("rows=[['Option','Rationale'") print(len(s),i) open('part1.py','w').write(s[:i]) EOF tail -c 600 part1.py; python -c "import ast;ast.parse(open('/tmp/workspace/epiglottitis-croup/src/part1.py').read());print('syntax ok')"

Writing File

~/epiglottitis-croup/src/part2.py

rows=[['Option','Rationale','Dose reported in source'],
['Ceftriaxone or cefotaxime IV','Activity against Hib (including beta-lactamase producers), pneumococci and streptococci; a second- or third-generation cephalosporin is recommended [TB, GL]','Ceftriaxone 100 mg/kg IV, then 50 mg/kg at 24 h, in one published RCT (Sawyer 1994) [GL]'],
['Cefuroxime IV','Second-generation cephalosporin; option in a remote-care guideline [GL]','150 mg/kg/day divided 8-hourly (NT Canada CPG) [GL]'],
['Ampicillin-sulbactam IV','Reasonable alternative empirical option [GL]','Not verified here: use local formulary'],
['Beta-lactam hypersensitivity','Carbapenem or fluoroquinolone alternatives suggested [GL]','Specialist advice; not verified'],
['Anti-staphylococcal cover','Consider if MRSA is prevalent locally or illness is severe [K]','Per local antibiogram']]
table(s,rows,0.5,1.25,[2.7,5.5,4.2],fs=12,hdr=RED)
box(s,'Supportive care and monitoring::\nPICU or HDU care; secured airway; IV fluids while unable to swallow; antipyretics; analgesia; avoid sedation without airway control. Extubate when oedema has settled (clinical and leak assessment) [K]. Intubation of 3 to 5 days is typical [TB].',0.5,4.85,6.1,2.1,fill=LRED,fc='222222',size=12.5,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'Cultures, adjustment, duration::\nTake blood culture (and epiglottic culture at intubation) once the airway is safe; narrow therapy to the result. Total duration and the switch from IV to oral therapy were not verified against a named guideline: follow your local protocol. Steroids are not a standard part of treatment (limited evidence).',6.8,4.85,6.1,2.1,fill=LAMB,fc='222222',size=12.5,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)

# ---------------- 17 PREVENTION
s=new('Prevention, prognosis and follow-up','B','[GL] Rifampin regimen and indications: Medscape and ScienceDirect overviews (Hib contacts); [TB] Rosen (mortality with delay); [K] droplet precautions, vaccine schedule.','Prophylaxis depends on the pathogen: it is for Hib only.')
box(s,'PREVENTION',0.5,1.3,4.0,0.5,fill=TEAL,size=15,bold=True)
box(s,'Hib conjugate vaccine: primary series and booster per the national schedule [K]\nPrevents invasive Hib disease, including epiglottitis; does not protect against other bacteria\nComplete or catch up vaccination in incompletely immunised children\nDroplet precautions until 24 h of effective therapy [K]',0.5,1.8,4.0,4.2,fill=LGREY,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'PROGNOSIS AND FOLLOW-UP',4.7,1.3,4.0,0.5,fill=TEAL,size=15,bold=True)
box(s,'Excellent with timely airway control and antibiotics\nMortality is increased when diagnosis is delayed [TB]\nFull recovery usual; long-term sequelae uncommon [K]\nFollow-up: confirm vaccination status; immune evaluation if recurrent disease or unusual organism [GL]',4.7,1.8,4.0,4.2,fill=LGREY,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'CONTACT PROPHYLAXIS (Hib only)',8.9,1.3,4.0,0.5,fill=RED,size=15,bold=True)
box(s,'Rifampicin 20 mg/kg once daily (maximum 600 mg) for 4 days [GL]\nGive to the index patient and household contacts where the household includes an infant under 12 months, an incompletely vaccinated child under 4 years, or an immunocompromised child [GL]\nNotify public health; follow current local guidance',8.9,1.8,4.0,4.2,fill=LRED,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'If a non-Hib organism is identified (e.g. pneumococcus, S. aureus), Hib prophylaxis is not indicated.',0.5,6.2,12.4,0.7,fill=LAMB,fc='222222',size=13,bold=True)

# ---------------- 18 CROUP DEFINITION
s=new('Croup: definition and terminology','C','[TB] Scott-Brown (clinical syndrome, recurrent croup and subglottic stenosis), Tintinalli (commonest cause of stridor after the neonatal period); [K] other stridor causes.','Croup is a syndrome; the usual cause is viral.')
bullets(s,['Viral croup::  clinical syndrome of hoarseness and a distinctive barking cough, progressing to inspiratory or biphasic stridor, usually after upper respiratory symptoms [TB].',
'Acute laryngotracheobronchitis::  the same illness named for the structures involved: larynx, trachea, with possible bronchial extension. Terms used interchangeably in practice: croup, laryngotracheitis, LTB.',
'Mechanism::  mucosal oedema of the larynx and trachea after a viral infection [TB].',
'Typical v atypical::  children with croup do not typically drool or look toxic [TB].',
'Spasmodic croup [K]::  recurrent sudden night-time croup without much prodrome or fever; managed similarly.',
'Recurrent croup::  consider congenital or acquired subglottic stenosis; endoscopy is mandatory in persistent cases [TB].'],0.5,1.3,7.0,5.6,size=14,gap=6)
rows=[['Stridor pattern','Think of'],
['Prodrome, barking cough, non-toxic','Viral croup'],
['Abrupt, toxic, drooling','Epiglottitis'],
['Toxic after URI, poor response','Bacterial tracheitis'],
['Sudden choking, afebrile','Foreign body'],
['Neck stiffness, torticollis','Retropharyngeal abscess'],
['Urticaria, swelling, exposure','Anaphylaxis, angio-oedema'],
['Since birth or recurrent','Laryngomalacia, subglottic stenosis, haemangioma']]
table(s,rows,7.7,1.4,[2.9,2.3],fs=12,hdr=BLUE)

# ---------------- 19 CROUP EPI/AETIOLOGY
s=new('Croup: epidemiology and aetiology','C','[TB] Tintinalli (age, season, viruses, coinfection, measles); Scott-Brown (peak age, sex, incidence, parainfluenza biennial pattern); [K] parainfluenza 3, influenza severity, adenovirus, droplet spread.','Parainfluenza dominates; many viruses can produce the same syndrome.')
bullets(s,['Age::  6 months to 3 years, peak at 2 years [TB].',
'Sex::  boys more than girls [TB].',
'Season::  highest in autumn and early winter, sporadic cases all year; autumn peaks in odd-numbered years in North America reflect parainfluenza 1 epidemics [TB].',
'Burden::  annual incidence 1.5% to 6% in children under 6 years [TB].',
'Transmission::  respiratory droplets and contact [K].',
'Coinfection::  common; bacterial superinfection is rare [TB].'],0.5,1.3,5.8,5.6,size=13.5,gap=6)
rows=[['Virus','Characteristics'],
['Parainfluenza 1','Classic cause; biennial autumn epidemics [TB]'],
['Parainfluenza 2','Also classic [TB]'],
['Parainfluenza 3','Common cause [K]'],
['RSV A and B','Recognised cause [TB]'],
['Rhinovirus','Among the commonest [TB]'],
['Influenza A and B','Can cause more severe croup [K]'],
['hMPV, coronavirus, enterovirus, bocavirus','Increasingly detected [TB]'],
['Adenovirus','Recognised cause [K]'],
['Measles','Important where prevalent [TB]']]
table(s,rows,6.5,1.35,[3.2,3.2],fs=12,hdr=BLUE)

# ---------------- 20 ANATOMY & PATHOGENESIS
s=new('Croup: paediatric airway anatomy and pathogenesis','C','[TB] Scott-Brown (subglottis narrowest; 1 mm oedema in 6.5 mm airway); [K] mechanism of stridor and barking cough. Illustrations: original schematics.','Cross-section: a rigid ring means oedema can only narrow the lumen.')
pic(s,A+'cross.png',0.4,1.2,7.7,3.5)
pic(s,A+'sag_croup.png',8.4,1.2,4.5,5.75,name='!!Airway')
bullets(s,['Virus infects respiratory epithelium of larynx and trachea; inflammatory infiltrate and submucosal oedema follow [K].',
'Oedema is greatest in the subglottis, the narrowest segment, enclosed by the cricoid ring [TB].',
'Narrowed lumen: faster, turbulent airflow, producing inspiratory stridor; vocal cord and mucosal oedema produce hoarseness and a barking cough [K].',
'Negative intrathoracic pressure on inspiration pulls the narrowed extrathoracic airway inward, so stridor is mainly inspiratory; biphasic as obstruction worsens [K].'],0.5,4.75,7.8,2.25,size=12.5,gap=3)

# ---------------- 21 PATHOLOGY & CORRELATION
s=new('Croup: pathology and clinical correlation','C','[TB] Scott-Brown (6.5 mm subglottic diameter, 1 mm oedema, about 50% area loss; Poiseuille; predisposing factors); [K] sign-by-sign correlation. Chart: original, laminar-flow model.','Radius matters to the fourth power.')
pic(s,A+'resist.png',0.4,1.25,5.4,3.5)
box(s,'Worked example [TB]::\n1 mm of oedema in an 18-month-old with a 6.5 mm subglottic diameter cuts cross-sectional area by about 50%. Laminar flow falls with the 4th power of radius; real obstruction is turbulent and worse.',0.5,4.9,5.3,2.0,fill=LAMB,fc='222222',size=12.5,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
rows=[['Pathological change','Clinical sign'],
['Subglottic mucosal oedema','Inspiratory stridor'],
['Narrow lumen, turbulent flow','Stridor, increased work of breathing'],
['Vocal cord and laryngeal inflammation','Hoarse voice'],
['Tracheal mucosal oedema','Barking, seal-like cough [K]'],
['Inspiratory collapse of extrathoracic airway','Suprasternal, intercostal retractions'],
['Bronchial or lower tract spread','Wheeze, hypoxaemia [K]'],
['Fatigue','Falling stridor, drowsiness, cyanosis (ominous)']]
table(s,rows,6.1,1.35,[3.6,3.2],fs=12,hdr=BLUE)
box(s,'More at risk of severe croup [TB]::  pre-existing subglottic or tracheal narrowing, chronic lung disease, airway reactivity (atopy).',6.1,5.2,6.8,1.1,fill=LBLUE,fc='222222',size=12.5,align=PP_ALIGN.LEFT)

# ---------------- 22 CLINICAL FEATURES
s=new('Croup: clinical features','C','[TB] Tintinalli (prodrome, night-time worsening, resolution within 3 days); Scott-Brown (50% improve within 24 h, most recover within 4 days); [K] atypical features.','Worse at night; calm child, better outcome.')
bullets(s,['Viral prodrome::  1 to 3 days of nasal congestion, rhinorrhoea, cough, low-grade fever [TB].',
'Barking (seal-like) cough, hoarseness::  classic [TB].',
'Inspiratory stridor::  first with agitation, then at rest as severity increases.',
'Chest wall retractions, tachypnoea, nasal flaring::  signs of distress [TB].',
'Fever::  absent or low grade.',
'Night-time worsening::  symptoms are often worse at night [TB].',
'Course::  usually self-limited; resolves within about 3 days, 50% better within 24 h of onset of symptoms [TB].'],0.5,1.3,7.2,4.0,size=13.5,gap=5)
box(s,'Atypical features: think again',8.0,1.3,4.9,0.5,fill=RED,size=15,bold=True)
box(s,'High fever, toxic look [K]\nDrooling or dysphagia\nAbrupt onset with no prodrome (foreign body)\nAge under 6 months or school age [K]\nPoor response to steroid plus epinephrine (tracheitis)\nRecurrent or prolonged episodes (subglottic stenosis) [TB]',8.0,1.8,4.9,3.5,fill=LRED,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP,line=RED)
d=[('Day 0 to 3','Coryza, low-grade fever'),('Day 2 to 3','Barking cough, stridor, worse at night'),('Day 3 to 4','Improving in most children')]
for i,(a,b) in enumerate(d):
    xx=0.5+i*4.2; box(s,f'{a}\n{b}',xx,5.6,3.8,1.2,fill=[ 'C9DFF5','8CBAEA',BLUE][i],fc=('222222' if i<2 else 'FFFFFF'),size=13)
    if i<2: arrow(s,xx+3.82,6.2,xx+4.18,6.2,BLUE)

# ---------------- 23 SEVERITY
s=new('Clinical severity assessment','C','[TB] Tintinalli (assess tachypnoea, stridor at rest, nasal flaring, retractions, lethargy or agitation, desaturation); [K] category descriptions. Align with your local guideline.','Cyanosis and altered consciousness are late signs.')
rows=[['Severity','Stridor','Retractions / work of breathing','Air entry and mental state','Cyanosis / SpO2'],
['Mild','Barking cough, hoarse; stridor absent at rest (only with agitation)','None or mild','Normal; alert, playful','None; SpO2 normal'],
['Moderate','Stridor at rest','Mild to moderate retractions, tachypnoea','Normal or slightly decreased; may be restless','Usually none; SpO2 may fall'],
['Severe','Marked stridor at rest','Severe retractions, nasal flaring','Decreased air entry; agitated or lethargic','Hypoxaemia possible'],
['Impending respiratory failure','Stridor may decrease as the child tires','Exhaustion; retractions may lessen','Markedly decreased air entry; drowsy or altered consciousness','Cyanosis, low SpO2: late']]
table(s,rows,0.5,1.3,[2.0,2.9,2.7,2.9,1.9],fs=12,hdr=BLUE,col_fills={0:LBLUE})
box(s,'Late and concerning::  cyanosis and altered consciousness mean the child is near respiratory failure. A child who has become quiet with less stridor may be tiring, not improving.',0.5,5.2,6.1,1.7,fill=LRED,fc='222222',size=13,align=PP_ALIGN.LEFT,line=RED)
box(s,'Key discriminator::  stridor at rest versus only on agitation separates mild from moderate croup and guides steroid-only versus epinephrine treatment.',6.8,5.2,6.1,1.7,fill=LAMB,fc='222222',size=13,align=PP_ALIGN.LEFT)

# ---------------- 24 WESTLEY
s=new('Westley croup score','C','[TB] Scott-Brown Table 29.1 (original Westley, maximum 17; 5 components); Tintinalli Table 126-3 (modified); [GL] AMBOSS thresholds. Original: Westley CR, Cotton EK, Brooks JG. Am J Dis Child 1978;132:484-7.','Do not delay treatment to calculate the score.')
rows=[['Component','0','1','2','3','4','5'],
['Level of consciousness','Normal','','','','','Altered'],
['Cyanosis','None','','','','With agitation','At rest'],
['Stridor','None','Audible with stethoscope (modified: with agitation only)','Audible without stethoscope (modified: at rest)','','',''],
['Air entry','Normal','Decreased','Severely decreased','','',''],
['Chest wall retractions','None','Mild','Moderate','Severe','','']]
table(s,rows,0.5,1.25,[1.9,0.9,1.9,1.9,0.9,1.2,0.9],fs=11.5,hdr=BLUE,col_fills={0:LBLUE})
rows=[['Source for cut-offs','Mild','Moderate','Severe','Comment'],
['Tintinalli (modified Westley)','under 4','4 to 6','over 6','Total 0 to 17'],
['Scott-Brown','2 to 3','4 to 7','8 or more','Maximum 17'],
['AMBOSS','2 or less','3 to 7','8 to 11','12 or more: impending respiratory failure']]
table(s,rows,0.5,4.1,[2.9,1.0,1.1,1.2,2.5],fs=11.5,hdr=NAVY)
box(s,'Use and limits',9.5,1.3,3.4,0.5,fill=NAVY,size=15,bold=True)
box(s,'Use: standardise severity, track response, compare studies.\nLimits: inter-observer variability; mostly research use [TB]; no SpO2 or respiratory rate; cut-offs differ between sources.\nAdopt the thresholds in your local guideline.',9.5,1.8,3.4,4.0,fill=LGREY,fc='222222',size=12.5,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'Treatment must not be delayed while a score is calculated. Maximum score 17 (consciousness 5 + cyanosis 5 + stridor 2 + air entry 2 + retractions 3).',0.5,6.05,12.4,0.85,fill=LAMB,fc='222222',size=13,bold=True)

# ---------------- 25 DIAGNOSIS
s=new('Croup: diagnosis and investigations','C','[TB] Scott-Brown (clinical diagnosis; steeple or pencil-tip sign, Fig. 29.1, courtesy Ben Hartley); Tintinalli (investigations only if poor response or alternative diagnosis); Rosen; PMC-derived image via Orris library.','No tests in typical croup.')
bullets(s,['Diagnosis is clinical::  laboratory tests and radiographs are generally not needed [TB].',
'When to look further::  poor response to conventional therapy, or another diagnosis is considered (epiglottitis, retropharyngeal abscess, foreign body) [TB].',
'AP neck film::  subglottic narrowing, steeple or pencil-tip sign. A normal film does not exclude croup; the sign is not specific [TB, K].',
'Viral studies::  seldom change management [K].',
'Endoscopy::  recurrent, persistent or atypical disease: exclude subglottic stenosis or other lesions [TB].',
'Safety::  a child in significant distress should not be sent for imaging unmonitored; agitation can worsen obstruction. Treat first.'],0.5,1.3,6.9,5.6,size=13.5,gap=6)
pic(s,A+'steeple_sb.png',7.6,1.3,2.6,3.6)
pic(s,A+'steeple_pmc.jpg',10.3,1.3,2.6,3.6)
tx(s,'Steeple (pencil-tip) sign: subglottic narrowing on AP film (left: textbook figure; right: clinical image)',7.6,4.95,5.3,0.6,size=10,color=GREY,italic=True)
box(s,'Typical, uncomplicated croup: examine, grade severity, treat. No bloods, no X-ray.',7.6,5.65,5.3,1.2,fill=LBLUE,fc='222222',size=13,bold=True,line=BLUE)

# ---------------- 26 DDx
s=new('Croup: differential diagnosis','C','[TB] Tintinalli Table 126-2; Rosen (bacterial tracheitis, foreign body, anaphylaxis); Scott-Brown (subglottic stenosis); [K] retropharyngeal abscess details.','Use the table to rehearse red flags.')
rows=[['','Onset','Fever','Cough','Voice','Drooling','Appearance','Airway findings','Distinguishing feature'],
['Viral croup','1 to 3 days','None or low','Barking','Hoarse','No','Non-toxic','Inspiratory stridor, subglottic narrowing','Responds to steroid and epinephrine'],
['Epiglottitis','Hours','High','Absent','Muffled','Yes','Toxic','Soft stridor, tripod','Thumbprint sign; airway emergency'],
['Bacterial tracheitis','URI then rapid worsening','High','Croupy, purulent','Hoarse','No','Toxic','Stridor, thick secretions','Poor response to croup therapy; S. aureus; bronchoscopy'],
['Foreign body','Sudden','No','Choking, paroxysmal','Variable','Variable','Well until event','Stridor or wheeze, may be unilateral','History; film may be normal; bronchoscopy'],
['Retropharyngeal abscess','Days','Yes','Variable','Muffled','Yes','Ill','Neck stiffness, torticollis','Prevertebral widening or CT'],
['Angio-oedema, anaphylaxis','Minutes','No','Variable','Variable','May drool','Anxious','Swelling, urticaria','Exposure; IM epinephrine'],
['Subglottic stenosis','Recurrent','Mild','Barking','Hoarse','No','Well','Recurrent croup','Endoscopy [TB]']]
table(s,rows,0.5,1.3,[1.55,1.1,0.85,1.2,0.85,0.85,1.0,2.2,2.8],fs=10.5,hdr=BLUE,hfs=11)

# ---------------- 27 TREATMENT
s=new('Croup: evidence-based treatment','C','[TB] Scott-Brown (steroid mechanism, Cochrane 2011, 41 studies; humidification, sedation, IM dexamethasone); Rosen (epinephrine then discharge after observation); [GL] AMBOSS (onset and monitoring).','Steroid for all; epinephrine for moderate to severe; nothing unnecessary.')
box(s,'FOR ALL CHILDREN',0.5,1.3,4.0,0.5,fill=BLUE,size=15,bold=True)
box(s,'Keep calm, in the parent\'s lap; minimal handling\nNo throat examination\nOral fluids; antipyretic if febrile\nOxygen if hypoxaemic\nSedation is not advised: risk of respiratory depression [TB]',0.5,1.8,4.0,3.6,fill=LBLUE,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'BY SEVERITY',4.7,1.3,4.0,0.5,fill=NAVY,size=15,bold=True)
box(s,'Mild:: dexamethasone, single dose; reassure\nModerate to severe:: dexamethasone plus nebulised epinephrine; oxygen if needed; observe\nImpending failure:: high-flow oxygen, epinephrine (repeat), call senior and PICU, prepare airway',4.7,1.8,4.0,3.6,fill=LGREY,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'AVOID / NOT ROUTINE',8.9,1.3,4.0,0.5,fill=RED,size=15,bold=True)
box(s,'Antibiotics for uncomplicated viral croup\nHumidified or mist therapy: no evidence of clinical benefit [TB]\nSedatives\nIM dexamethasone as first line: risk of muscle necrosis [TB]\nHeliox: not routine [K]\nCough suppressants [K]',8.9,1.8,4.0,3.6,fill=LRED,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'Evidence::  Cochrane 2011 (41 studies): glucocorticoids improved croup within 6 h, maintained at 12 h, not significant by 24 h; shorter ED stay [TB]. Dexamethasone effect lasts up to 72 h; nebulised epinephrine acts within 30 min but wears off, so observe 2 to 4 h for return of symptoms [GL].',0.5,5.55,12.4,1.4,fill=LAMB,fc='222222',size=13,align=PP_ALIGN.LEFT)

# ---------------- 28 MEDICATION TABLE
s=new('Croup: medication table','C','Doses: [GL] NHS Highland paediatric guideline (Right Decisions); [TB] Scott-Brown; [TB] Harriet Lane Handbook 23e; onset/observation [GL] AMBOSS. Doses vary by guideline: verify against your local protocol and formulary.','Guideline used for doses: NHS Highland (0.15 mg/kg dexamethasone, adrenaline 400 micrograms/kg).')
rows=[['Medication','Indication','Route','Dose and maximum','Onset / duration','Precautions'],
['Dexamethasone (recommended)','All croup severities','Oral preferred; IV if unable; IM not first line [TB]','0.15 mg/kg single dose (NHS Highland) up to 0.6 mg/kg (Scott-Brown, Harriet Lane); Harriet Lane usual maximum 16 mg/dose. May repeat after 6 to 12 h if needed (NHS Highland)','Effect within about 6 h; lasts up to 72 h [GL]','Single dose is well tolerated; dose differs between guidelines'],
['Budesonide, nebulised (alternative)','Child vomiting or too unwell for oral dose','Nebulised','2 mg single dose [TB, GL]','Similar to oral steroid','Alternative, not preferred'],
['Epinephrine (adrenaline), nebulised (recommended)','Moderate to severe croup; impending failure','Nebulised','1:1000 (1 mg/mL): 400 micrograms/kg, maximum 5 mg; repeat after 30 min if needed (NHS Highland). Racemic epinephrine is used in some regions: follow local formulary','Onset within 30 min; short-lived [GL]','Observe 2 to 4 h for recurrence [GL]; tachycardia, pallor; child needing it should be discussed for admission (NHS Highland)'],
['Oxygen','Hypoxaemia, severe croup','Blow-by or high-flow, held by parent','Titrate to SpO2','Immediate','Avoid distressing the child'],
['Not recommended routinely','Antibiotics (viral illness), sedatives, humidified air, routine heliox','','','','Antibiotics only if bacterial tracheitis or other bacterial infection suspected']]
table(s,rows,0.5,1.3,[1.9,1.9,1.8,3.4,1.6,1.8],fs=10.5,hdr=BLUE,hfs=11)
box(s,'Recent evidence alert::  a 2026 systematic review (PMID 42698708) compares 0.15 v 0.6 mg/kg dexamethasone; its conclusions were not reviewed here. Use the dose in your local guideline.',0.5,6.25,12.4,0.7,fill=LAMB,fc='222222',size=12,align=PP_ALIGN.LEFT)

# ---------------- 29 DISPOSITION
s=new('Disposition: admission and discharge','C','[TB] Rosen (discharge after observation if free of resting stridor and distress with follow-up); [GL] NHS Highland (admit if stridor at rest persists after 1 to 2 h; discuss children given epinephrine); AMBOSS (age under 6 months; observe 2 to 4 h). Local guideline governs.','Disposition is a clinical decision.')
box(s,'SAFE FOR DISCHARGE',0.5,1.3,4.0,0.5,fill=GREEN,size=15,bold=True)
box(s,'No stridor at rest, no significant distress after observation [TB]\nNormal SpO2 in air [K]\nDrinking adequately\nIf epinephrine given: observed 2 to 4 h without recurrence [GL]\nReliable carers, access to return and follow-up; safety-net advice given [TB, K]',0.5,1.8,4.0,3.7,fill=LGREEN,fc='222222',size=12.5,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'ADMIT',4.7,1.3,4.0,0.5,fill=AMB,fc='222222',size=15,bold=True)
box(s,'Persistent stridor at rest or significant work of breathing, e.g. stridor at rest not resolved after 1 to 2 h [GL]\nRecurrence after epinephrine; repeated doses\nHypoxaemia\nPoor oral intake or dehydration\nAge under 6 months [GL]; atypical presentation; social concern',4.7,1.8,4.0,3.7,fill=LAMB,fc='222222',size=12.5,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'SENIOR REVIEW / PICU',8.9,1.3,4.0,0.5,fill=RED,size=15,bold=True)
box(s,'Severe croup or impending respiratory failure\nNo response to epinephrine\nExhaustion, drowsiness, cyanosis\nNeed for airway support or intubation\nDoubt about the diagnosis (epiglottitis, tracheitis)',8.9,1.8,4.0,3.7,fill=LRED,fc='222222',size=12.5,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)
box(s,'Discharge advice: return urgently for noisy breathing at rest, rapid or laboured breathing, drooling, drowsiness, blue lips or poor drinking. Disposition rests on clinical assessment and the applicable local guideline.',0.5,5.7,12.4,1.2,fill=LGREY,fc='222222',size=13,align=PP_ALIGN.LEFT)

# ---------------- 30 COMPLICATIONS & PROGNOSIS
s=new('Croup: complications and prognosis','C','[GL] NHS Highland (intubation 1% to 3% of children with impending respiratory failure; death no more than 1 in 30,000); [TB] Scott-Brown (50% improve in 24 h; mortality 1 in 30,000; predisposing factors; recurrent croup); [K] other complications.','Prognosis is excellent.')
box(s,'Complications',0.5,1.3,6.05,0.5,fill=BLUE,size=15,bold=True)
bullets(s,['Respiratory deterioration; respiratory failure in severe cases, rarely requiring airway support [GL]',
'Intubation needed in about 1% to 3% of children with impending respiratory failure [GL]',
'Post-obstructive (negative pressure) pulmonary oedema [K]',
'Secondary bacterial infection: tracheitis, pneumonia, otitis media [K]',
'Dehydration from poor intake [K]',
'Death: rare, no more than about 1 in 30,000 cases [TB, GL]'],0.5,1.85,6.05,4.0,size=13.5,gap=5)
box(s,'Course and prognosis',6.85,1.3,6.05,0.5,fill=NAVY,size=15,bold=True)
bullets(s,['Most children recover within 4 days without treatment; about 50% improve within 24 h [TB]',
'Steroids shorten illness and reduce return visits and admissions [TB]',
'Severe croup treated with dexamethasone plus epinephrine has an excellent prognosis [GL]',
'Higher risk of severe disease: pre-existing airway narrowing, chronic lung disease, atopy [TB]'],6.85,1.85,6.05,2.5,size=13.5,gap=5)
box(s,'Suggests alternative or complicated disease::  high fever and toxicity, drooling, age outside 6 months to 3 years, poor response to steroid plus epinephrine, symptoms beyond about a week, recurrent episodes (consider subglottic stenosis; endoscopy) [TB, K].',6.85,4.45,6.05,1.45,fill=LRED,fc='222222',size=12.5,align=PP_ALIGN.LEFT,line=RED)
box(s,'Prognostic message for parents: usually self-limited, worst at night in days 2 to 3, with clear return advice.',0.5,6.1,12.4,0.8,fill=LAMB,fc='222222',size=13,bold=True)

# ---------------- 31-32 COMPARISON
def comp(title,rows,srcs):
    s=new(title,'D',srcs,'Consistent colours: red = epiglottitis, blue = croup.')
    table(s,[['Feature','Epiglottitis (supraglottic)','Croup (subglottic)']]+rows,0.5,1.25,[2.3,5.05,5.05],fs=11.5,hdr=NAVY,col_fills={1:LRED,2:LBLUE},hdr_fills={1:RED,2:BLUE})
    return s
comp('Epiglottitis versus croup: comprehensive comparison (1 of 2)',[
['Definition','Bacterial cellulitis of epiglottis and supraglottis [TB]','Viral inflammation of larynx and trachea, bronchi sometimes [TB]'],
['Aetiology','Hib (classic); other H. influenzae, streptococci, S. aureus [TB]','Parainfluenza 1 and 2 classic; RSV, rhinovirus, influenza, hMPV and others [TB]'],
['Age / epidemiology','Formerly 2 to 7 y; now relatively more older children and adults [TB, GL]','6 months to 3 y, peak 2 y; autumn and early winter; boys more [TB]'],
['Onset','Abrupt, hours [TB]','1 to 3 day prodrome, then barking cough [TB]'],
['Fever','High','Absent or low grade'],
['General appearance','Toxic, anxious, sitting forward [TB]','Usually non-toxic; agitated when distressed'],
['Cough','Absent or minimal [TB]','Harsh barking, seal-like [TB]'],
['Voice','Muffled','Hoarse'],
['Drooling and dysphagia','Prominent drooling, severe odynophagia [TB]','Absent or mild'],
['Stridor and effort','Soft inspiratory stridor; tripod; rapid decline','Inspiratory (biphasic if severe); worse at night and with crying']],'[TB] Rosen, Tintinalli, Scott-Brown; [GL] overviews; [K] soft stridor, voice qualities.')
comp('Epiglottitis versus croup: comprehensive comparison (2 of 2)',[
['Anatomical location','Supraglottis: epiglottis, AE folds, arytenoids','Subglottis, trachea (larynx)'],
['Diagnostic approach','Clinical; airway first; lateral film only if stable (thumbprint sign); labs after airway secured [TB]','Clinical; Westley score; film rarely (steeple sign) [TB]'],
['Initial management','Airway emergency: senior team, controlled airway, IV antibiotics [TB]','Calm; dexamethasone; nebulised epinephrine if moderate to severe; oxygen if hypoxaemic'],
['Specific airway precautions','No supine position, no throat examination, no distressing tests [TB]','Minimise distress; avoid throat examination'],
['Treatment','IV cephalosporin; ICU; often intubated 3 to 5 days [TB]','Steroid; epinephrine; supportive; no routine antibiotics [TB, GL]'],
['Complications','Obstruction, arrest, sepsis, epiglottic abscess [TB, K]','Respiratory failure (rare); intubation in 1% to 3% of impending failure; death about 1 in 30,000 [GL, TB]'],
['Prevention','Hib vaccination; rifampicin for Hib contacts in defined households [GL]','No specific vaccine; hygiene; measles and influenza vaccination reduce some causes [K]'],
['Prognosis','Excellent if airway secured early; mortality up if delayed [TB]','Excellent; most recover within 4 days [TB]']],'[TB] Rosen, Tintinalli, Scott-Brown; [GL] NHS Highland, overviews; [K] prevention of viral causes.')

# ---------------- 33 FLOWCHART
s=new('Integrated approach to a child presenting with stridor','D','Synthesis of slides 13 to 29. [TB] Rosen, Tintinalli, Scott-Brown; [GL] NHS Highland, AMBOSS. Local protocols take precedence.','Airway safety first; no throat examination.')
box(s,'CHILD WITH STRIDOR\nAssess airway, breathing, circulation, SpO2, mental state. Keep calm, in the parent\'s arms. NO throat examination.',4.1,1.25,5.2,1.05,fill=NAVY,size=13)
arrow(s,6.7,2.3,6.7,2.55,NAVY)
box(s,'Impending respiratory failure?\nCyanosis, drowsy or altered, exhaustion, silent chest, low SpO2',4.1,2.55,5.2,1.0,fill=AMB,fc='222222',size=13,bold=True)
arrow(s,9.3,3.05,9.8,3.05,RED)
tx(s,'YES',9.35,2.7,0.5,0.3,size=11,bold=True,color=RED)
box(s,'Call anaesthesia, ENT, PICU now. Oxygen; nebulised epinephrine. Prepare the airway. Treat first, classify later.',9.8,2.35,3.1,1.45,fill=RED,size=12.5,bold=True)
tx(s,'NO',6.8,3.6,0.5,0.3,size=11,bold=True,color=NAVY)
for xc,xb in ((6.7,2.5),(6.7,6.7),(6.7,10.9)): arrow(s,xc,3.55,xb,4.05,NAVY)
box(s,'EPIGLOTTITIS suspected\nAbrupt, toxic, drooling, tripod, no cough.\nAirway emergency pathway: no examination, controlled airway, IV antibiotics (slides 14 to 16).',0.5,4.05,4.0,2.0,fill=LRED,fc='222222',size=12.5,line=RED,align=PP_ALIGN.LEFT)
box(s,'CROUP\nProdrome, barking cough, hoarse, non-toxic.\nGrade severity (Westley). Dexamethasone; add nebulised epinephrine if moderate to severe; observe 2 to 4 h after epinephrine.',4.7,4.05,4.0,2.0,fill=LBLUE,fc='222222',size=12.5,line=BLUE,align=PP_ALIGN.LEFT)
box(s,'ALTERNATIVES\nToxic after URI and poor croup response: bacterial tracheitis. Sudden choking: foreign body. Neck stiffness or torticollis: retropharyngeal abscess. Swelling or urticaria: anaphylaxis. Recurrent: subglottic stenosis.',8.9,4.05,4.0,2.0,fill=LGREY,fc='222222',size=12,line=GREY,align=PP_ALIGN.LEFT)
box(s,'Reassess often. Disposition: home, ward or PICU. Seek senior review for any doubt or deterioration.',0.5,6.25,12.4,0.65,fill=LAMB,fc='222222',size=13,bold=True)

# ---------------- 34 SUMMARY
s=new('Summary and high-yield clinical pearls','D','Synthesis. Sources as on preceding slides; see References.','Close with the red flags.')
cards=[('Anatomy',TEAL,'Epiglottitis = supraglottic; croup = subglottic (cricoid ring, narrowest in children). 1 mm oedema in a 6.5 mm airway halves the area.'),
('Distinguish',NAVY,'Epiglottitis: abrupt, toxic, drooling, tripod, muffled, no cough. Croup: prodrome, barking cough, hoarse, non-toxic, worse at night.'),
('Red flags',RED,'Drooling with stridor, refusal to lie down, quiet exhausted child, cyanosis, drowsiness, poor response to croup treatment.'),
('Emergency principles',RED,'Epiglottitis: calm, senior team, controlled airway first, then IV cephalosporin. No throat examination, no delay for tests.'),
('Croup treatment',BLUE,'Dexamethasone for all; nebulised epinephrine for moderate to severe, observe 2 to 4 h; no routine antibiotics, mist or sedatives.'),
('Prevention and outcome',TEAL,'Hib vaccine; rifampicin for defined Hib contacts only. Epiglottitis: excellent if airway secured early. Croup: most recover within 4 days.')]
for i,(t,c,b) in enumerate(cards):
    xx=0.5+(i%3)*4.2; yy=1.3+(i//3)*2.85
    box(s,t,xx,yy,3.95,0.5,fill=c,size=15,bold=True)
    box(s,b,xx,yy+0.5,3.95,2.1,fill=LGREY,fc='222222',size=13,align=PP_ALIGN.LEFT,anchor=MSO_ANCHOR.TOP)

# ---------------- 35-36 REFERENCES
s=new('References (1 of 2): textbooks, guidelines and evidence','D','Edition and publication years of indexed textbooks were not shown in the library index: confirm in your copy before citing.','Be transparent about what was and was not verified.')
bullets(s,['Textbooks with full text consulted:',
('Scott-Brown\'s Otorhinolaryngology, Head & Neck Surgery, Vol 2 (ISBN 9781138094634): croup chapter, Table 29.1, Fig. 29.1',1),
('Tintinalli\'s Emergency Medicine: A Comprehensive Study Guide (ISBN 9781260019933): Chapter 126, Tables 126-2 and 126-3',1),
('Rosen\'s Emergency Medicine: Concepts and Clinical Practice (ISBN 9780323757898): epiglottitis and croup sections, Fig. 162.5',1),
('The Harriet Lane Handbook, 23rd ed. (ISBN 9780323876988): dexamethasone monograph',1),
'Primary studies and reviews:',
('Westley CR, Cotton EK, Brooks JG. Nebulized racemic epinephrine by IPPB for the treatment of croup. Am J Dis Child 1978;132:484-487',1),
('Russell KF et al. Glucocorticoids for croup. Cochrane Database Syst Rev 2011;(1):CD001955',1),
('Bjornson C et al. Nebulized epinephrine for croup in children. Cochrane Database Syst Rev 2011;(2):CD006619',1),
('Sawyer SM et al. Successful treatment of epiglottitis with two doses of ceftriaxone. PubMed PMID 8129435 (1994)',1),
('Khalid A et al. Low-dose v high-dose dexamethasone for pediatric croup: meta-analysis. Front Pediatr 2026; PMID 42698708 (abstract not reviewed)',1)],0.5,1.3,12.4,5.6,size=13,gap=4)
s=new('References (2 of 2): guidelines, figures and verification status','D','Online sources accessed 4 November 2026.','')
bullets(s,['Guidelines and online clinical references:',
('NHS Highland / NHS Scotland Right Decisions: Croup (paediatric guideline): dexamethasone, budesonide, epinephrine doses',1),
('AMBOSS: Croup (Westley score thresholds, observation after epinephrine, admission criteria)',1),
('Northwest Territories Health, Canada: Clinical practice guideline, Pediatric epiglottitis (cefuroxime dose, rifampin prophylaxis)',1),
('Medscape: Epiglottitis treatment and management; ScienceDirect Topics: Acute epiglottitis overview (rifampin contact prophylaxis, empirical antibiotics)',1),
'Figures:',
('Airway schematics, cross-section and resistance chart: original illustrations for this deck',1),
('Steeple sign (Scott-Brown Fig. 29.1, courtesy Ben Hartley) and PMC-derived clinical images (laryngoscopy, neck radiographs) via the Orris image library: original articles not identified; credit and permissions to be confirmed before publication',1),
'Verification status:',
('Ghai Essential Pediatrics, Nelson Textbook of Pediatrics and Dhingra\'s Diseases of Ear, Nose and Throat were not available as full text: no content is attributed to them. Cross-check against your edition.',1),
('[K] items are standard teaching not re-verified against a named source here. Doses vary by guideline: confirm with local protocol before clinical use.',1)],0.5,1.3,12.4,5.6,size=13,gap=4)

prs.save('output/Epiglottitis_and_Croup_Seminar.pptx')
print('slides',len(prs.slides))
print('\n'.join(WARN) if WARN else 'no warnings')
Yes, I'm back and the deck is built. It's a 36-slide, 16:9 editable PowerPoint. I haven't seen it rendered, because there is no slide renderer in my sandbox. I checked for text overflow and off-slide shapes in code. Please flip through it in PowerPoint before using it.

Epiglottitis and Croup Seminar

Presentation · PPTX

What's in it
  • Slides: the title slide, 33 content slides and 2 reference slides. The two-page comparison table (slides 31 and 32) and the extra epiglottitis slides take it past your 28 to 35 range, as you allowed.
  • Structure: your slide plan A to D, each slide with speaker notes and a source line in the footer.
  • Figures: the sagittal airway diagrams and the normal / epiglottitis / croup comparison panel were drawn for this deck, so they are schematic. The subglottic cross-section and airway-resistance chart were also made for this deck. The real images are a thumb-sign neck film, a laryngoscopy view of epiglottitis, and two steeple-sign films. One of those is Scott-Brown Fig 29.1. The other three come from the Orris image library, and I couldn't identify their original publications.
  • Flowcharts and tables:
    • Flowcharts: pathogenesis, the 7-step emergency pathway, and the stridor decision algorithm.
    • Tables: pathogen, differential diagnosis, croup severity, Westley score, medication, and the epiglottitis-versus-croup comparison.
  • Airway slide: slide 14 is a red DO / DO NOT slide for airway precautions.
  • Transitions: Morph is applied to every slide, and the title, badge and airway figure share names so they morph between slides. Older PowerPoint versions fall back to a fade. I couldn't preview either.
What was and wasn't verified
  • Library textbooks I read: Scott-Brown Vol 2, Tintinalli, Rosen and the Harriet Lane Handbook. The slides say "(Scott-Brown)", "(Rosen)" and so on where the content comes from them. Where I used standard teaching I didn't check against a named text, I labelled it that way.
  • Not verified: Ghai, Nelson and Dhingra were not available to me in full text. I did not quote them, and no page numbers appear anywhere. The reference slide says so, and you should cross-check against your own editions.
  • Guidelines from the web: NHS Highland (croup) and Northwest Territories Health (epiglottitis), plus secondary summaries from AMBOSS, Medscape and ScienceDirect Topics.
Where sources disagree
  • Westley score: the component scores agree across sources, with a maximum of 17. The severity cut-offs don't, so slide 24 shows all three versions.
SourceMildModerateSevere
Scott-Brown2 to 34 to 78 or more
Tintinalli (modified)under 44 to 6over 6
AMBOSS summary2 or less3 to 78 to 11 (12 or more is impending failure)
  • Dexamethasone: 0.6 mg/kg (Scott-Brown and Harriet Lane, usual maximum 16 mg) versus 0.15 mg/kg (NHS Highland). A 2026 meta-analysis (PMID 42698708) compares the two doses. I did not read its conclusions, so check it before settling on a dose.
  • Epinephrine: I gave only the NHS Highland dose, 400 micrograms/kg of 1:1000, maximum 5 mg. I did not verify racemic epinephrine dosing.
  • Epiglottitis antibiotics: the doses shown are examples from a trial protocol (ceftriaxone) and the NWT guideline (cefuroxime), not a single verified guideline. I could not verify the antibiotic duration or the switch to oral treatment, so the slide says to follow your local guideline.
To do before presenting
  • Presenter details: fill in the presenter, department and institution placeholders on slide 1.
  • India immunisation schedule: confirm the Hib / pentavalent detail on slide 17.
  • Doses: all doses are for teaching only, so check them against your local formulary.
Running Command

cd /tmp/workspace/epiglottitis-croup && cat src/part1.py src/part2.py > src/full.py && python src/full.py 2>&1 | tail -40

Running Command

cd /tmp/workspace/epiglottitis-croup && sed -i "s/size=27,bold=True,color=NAVY,anchor=MSO_ANCHOR.MIDDLE,name='!!Title'/size=24,bold=True,color=NAVY,anchor=MSO_ANCHOR.MIDDLE,name='!!Title'/" src/part1.py && cat src/part1.py src/part2.py > src/full.py && python src/full.py 2>&1 | tail -8 && python - <<'EOF' from pptx import Presentation from pptx.util import Emu p=Presentation('output/Epiglottitis_and_Croup_Seminar.pptx') W,H=p.slide_width,p.slide_height; bad=0 for i,s in enumerate(p.slides,1): for sh in s.shapes: if sh.left is None: continue if sh.left<0 or sh.top<0 or sh.left+sh.width>W+10 or sh.top+sh.height>H+10: print('OUT',i,sh.name,round(sh.left/914400,2),round(sh.top/914400,2),round((sh.left+sh.width)/914400,2),round((sh.top+sh.height)/914400,2)); bad+=1 x=s._element.xml assert 'p159:morph' in x print('bounds issues',bad,'| morph on all',len(p.slides),'slides') EOF ls -la output

I've built the deck as an editable 16:9 PowerPoint with 36 slides. I haven't opened it in PowerPoint or seen any slide rendered, because the sandbox has no renderer. A script confirmed that no shape runs off a slide and that a Morph transition is set on every slide. Check the layout on screen before presenting.

Epiglottitis and Croup Seminar

Presentation · PPTX

Slide count. Your brief numbers 33 content slides. I split the 19-row epiglottitis versus croup table into two slides and used two reference slides, so the file has 36. Sections are A Foundations (slides 1 to 5), B Epiglottitis (6 to 17), C Croup (18 to 30) and D Synthesis (31 to 36).
Visuals
  • Original anatomy illustrations: a labelled sagittal airway, a normal / epiglottitis / croup side-by-side panel, and a subglottic cross-section. I also drew a radius-to-resistance chart.
  • Clinical images: a thumbprint-sign neck radiograph, a laryngoscopy of epiglottitis, and steeple-sign radiographs (one from Scott-Brown Fig. 29.1). Image credits and permissions need confirming before any wider sharing.
  • Flowcharts and tables: a pathogenesis flowchart, a 7-step emergency management flowchart and a stridor decision flowchart. Tables cover the differentials, severity grading, the Westley score, medications and the epiglottitis versus croup comparison. The airway-precautions slide (14) has a red banner and Do / Do not columns.
Morph transitions. Every slide has Morph, with a Fade fallback in older PowerPoint. The title, accent band, section badge and rule share names across slides so they morph. The band changes colour at each section, and the airway pictures on slides 4 and 5 also share a name.
Sources
  • Textbooks read: Scott-Brown (croup chapter), Tintinalli, Rosen and the Harriet Lane Handbook 23e.
  • Online guidelines: NHS Highland's croup guideline, AMBOSS and a Canadian (Northwest Territories) epiglottitis guideline.
  • Not available: Ghai, Nelson and Dhingra were not available to me. Nothing is attributed to them, and the slides say to cross-check your own editions.
  • Source tags: each statement is tagged [TB] for a textbook, [GL] for a guideline or online review, or [K] for standard teaching I did not re-verify.
Points to check before teaching
  • Westley cut-offs differ by source. Tintinalli gives under 4, 4 to 6 and over 6. Scott-Brown gives 2 to 3, 4 to 7 and 8 or more. AMBOSS gives 2 or less, 3 to 7, 8 to 11, with 12 or more as impending failure. The component scores match across sources (maximum 17), and slide 24 shows all three sets of cut-offs.
  • Croup doses differ. Dexamethasone is 0.15 mg/kg in NHS Highland and 0.6 mg/kg in Scott-Brown and Harriet Lane, with a usual maximum of 16 mg. Nebulised epinephrine is 400 micrograms/kg, maximum 5 mg, from NHS Highland. A 2026 meta-analysis comparing the two dexamethasone doses (PMID 42698708) is flagged, but I did not read its conclusions.
  • Epiglottitis antibiotic dose and duration. The ceftriaxone and cefuroxime doses come from a 1994 trial and a Canadian remote-care guideline. I could not verify total duration or the switch to oral therapy against a named guideline, so slide 16 tells students to use the local protocol.
  • Edition details. The library did not show editions or years for the textbooks, so I gave ISBNs and no page numbers.
  • Small items to confirm. The Indian Hib vaccine schedule (slide 6) and the exact reference list.
This is a shared conversation. Sign in to Orris to start your own chat.