/* ===========================================================================
   RAPPORTS D'HEURES — feuille de présence individuelle, et cumul du périmètre
   Écrans : /app/feuille-presence et /app/cumul-heures
   Passations « feuille de présence » et « cumul des heures » (Design 2 et 3).

   ── UNE FEUILLE POUR DEUX ÉCRANS, ET LA RÈGLE DE LA CHARTE ────────────────
   La convention (CLAUDE.md) veut qu'une classe employée par deux écrans monte
   dans le gabarit, pour qu'aucun écran ne dépende de la feuille d'un autre. Le
   motif de la règle est celui-là, et il est respecté ici autrement : ces deux
   écrans sont UNE FAMILLE — même socle de génération, mêmes mesures, mêmes
   exports, même bloc « génération manquante » — et cette feuille est celle de
   la famille, chargée pour les deux, la propriété d'aucun. Aucun des deux ne
   dépend donc de l'autre : ils dépendent tous deux du même fichier, nommé pour
   ce qu'il sert.
   Monter .rh-* dans modele-erp.css aurait au contraire versé au gabarit
   commun — celui de QUARANTE écrans — un tableau de rapport ardoise, un bloc
   d'anomalies et une grille de visas que personne d'autre n'emploie.
   Le jour où un TROISIÈME rapport d'heures arrive, il lit cette feuille ; le
   jour où une de ces classes sert hors de la famille, elle monte au gabarit.

   ── AUCUNE COULEUR EN DUR ─────────────────────────────────────────────────
   La maquette écrit ses teintes en hexadécimal (#0A6ED1, #354A5F, #BB0000…).
   Elles sont ici remplacées par les jetons --et-* de la charte, aux mêmes
   valeurs en thème clair, mais qui suivent la bascule de thème : une valeur en
   dur afficherait un tableau ardoise sur fond ardoise en thème sombre.

   Ce qui n'est PAS ici, et vient du gabarit chargé plus haut :
     · l'en-tête d'écran (.ecran-tete, .ecran-fil, .ecran-resume, .ecran-cta) ;
     · les boutons de barre d'outils (.mx-btn, .mx-btn-blanc, .mx-outils) ;
     · la carte (.mx-carte, .mx-carte-tete, .mx-carte-pied) ;
     · le sélecteur segmenté (.mx-seg) ;
     · le panneau de filtres latéral (.flt-*).
   =========================================================================== */

/* --- 1. Trame : filtre collant à gauche, rapport à droite ------------------
   268 px : la mesure de la passation. La colonne est `sticky` parce qu'on
   change de salarié ou de service en lisant le tableau — un filtre qui remonte
   avec la page obligerait à faire l'aller-retour à chaque changement. */
.rh-grille {
    display: grid;
    grid-template-columns: 268px minmax(0, 1fr);
    gap: 16px;
    align-items: start;
}
.rh-colg { position: sticky; top: 12px; display: flex; flex-direction: column; gap: 14px; }
.rh-cold { min-width: 0; display: flex; flex-direction: column; gap: 14px; }

@media (max-width: 1100px) {
    .rh-grille { grid-template-columns: minmax(0, 1fr); }
    .rh-colg { position: static; }
}

/* --- 2. Sélection de la génération ---------------------------------------- */
.rh-gen { display: flex; flex-direction: column; gap: 8px; padding: 12px 14px; }
.rh-gen-lbl {
    font-family: var(--et-font-mono); font-size: 12px; font-weight: 700;
    text-transform: uppercase; letter-spacing: .14em; color: var(--et-table-head-encre);
}
.rh-gen-num { font-family: var(--et-font-mono); font-size: 13px; color: var(--et-form-blue-d); }
/* La période est IMPOSÉE par la génération retenue, elle ne se saisit pas : le
   filtre ne propose pas des bornes pour lesquelles aucun calcul n'existe. */
.rh-gen-bornes { font-family: var(--et-font-mono); font-size: 13px; color: var(--et-ink); }
.rh-gen-note { font-size: 12px; line-height: 1.5; color: var(--et-faint); text-wrap: pretty; }

.rh-champ {
    width: 100%; height: 32px; padding: 0 9px;
    border: 1px solid var(--et-form-border); border-radius: 0;
    background: var(--et-surface); color: var(--et-ink);
    font-family: inherit; font-size: 13px; outline: none;
}
.rh-champ:focus { border-color: var(--et-form-blue); box-shadow: 0 0 0 3px var(--et-focus); }

/* --- 3. Popovers : mesures affichées, formats d'édition ------------------- */
.rh-pop-hote { position: relative; }
.rh-pop {
    position: absolute; z-index: 30; top: calc(100% + 6px); right: 0;
    background: var(--et-surface); border: 1px solid var(--et-hairline);
    box-shadow: var(--et-ombre-menu);
    padding: 6px; text-align: left;
}
.rh-pop-hdr {
    padding: 7px 9px 8px;
    font-family: var(--et-font-mono); font-size: 12px; font-weight: 700;
    text-transform: uppercase; letter-spacing: .14em; color: var(--et-table-head-encre);
}
.rh-pop-portee { padding: 7px 9px 8px; font-size: 12px; color: var(--et-muted); }
.rh-pop-item {
    display: flex; align-items: center; gap: 9px; width: 100%; padding: 8px 9px;
    border: none; background: transparent; cursor: pointer;
    font-family: inherit; text-align: left;
}
.rh-pop-item:hover { background: var(--et-rang); }
.rh-pop-item .lb { flex: 1; min-width: 0; font-size: 13px; color: var(--et-ink); }
/* La DERNIÈRE mesure cochée ne se décoche pas : une table sans mesure ne porte
   plus que des identités. Inerte ET curseur interdit — la couleur seule laisse
   essayer, puis se demander pourquoi rien ne se passe. */
.rh-pop-item.est-inerte { cursor: not-allowed; }
.rh-pop-item.est-inerte .lb { color: var(--et-inerte); }
.rh-pop-pied { padding: 7px 9px 4px; border-top: 1px solid var(--et-rang); margin-top: 4px; }

/* La case des mesures est .mx-case (modele-erp.css) sans un seul écart : elle
   n'avait ici que sa taille — 15 px, qui n'était pas une décision — et une classe
   d'état écrite `est-coche` là où le gabarit dit `est-cochee`. Les deux ont
   convergé, il ne reste donc rien à écrire. */

.rh-pop-fmt {
    display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px;
    border: none; background: transparent; cursor: pointer;
    font-family: inherit; text-align: left;
}
.rh-pop-fmt:hover { background: var(--et-rang); }
.rh-pop-fmt:disabled { cursor: wait; opacity: .55; }
.rh-pop-fmt .ext {
    flex: none; width: 34px; padding: 3px 0; text-align: center;
    font-family: var(--et-font-mono); font-size: 12px; font-weight: 500; letter-spacing: .08em;
}
.rh-pop-fmt .ext.est-pdf { background: var(--et-danger-badge-bg); color: var(--et-danger-ink); }
.rh-pop-fmt .ext.est-xls { background: var(--et-tint); color: var(--et-form-blue-encre); }
.rh-pop-fmt .ext.est-csv { background: var(--et-succes-bg); color: var(--et-succes-ink); }
.rh-pop-fmt b { display: block; font-size: 13px; font-weight: 600; color: var(--et-ink); }
.rh-pop-fmt i { display: block; margin-top: 1px; font-size: 12px; font-style: normal; color: var(--et-muted); }

.rh-compte { font-family: var(--et-font-mono); font-size: 12px; font-weight: 400; color: var(--et-faint); }

/* --- 4. Bandeau du rapport ------------------------------------------------ */
.rh-bandeau {
    display: flex; align-items: flex-start; gap: 14px; row-gap: 10px; flex-wrap: wrap;
    padding: 14px 18px; border-bottom: 1px solid var(--et-hairline);
}
.rh-bandeau-titre { flex: 1 1 260px; min-width: 200px; }
.rh-bandeau-titre .t { font-size: 16px; font-weight: 700; color: var(--et-ink); }
.rh-bandeau-titre .s { margin-top: 3px; font-size: 13px; line-height: 1.55; color: var(--et-muted); }
.rh-bandeau-outils { flex: none; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.rh-bandeau-bornes { flex: none; text-align: right; }
.rh-bandeau-bornes .b { font-family: var(--et-font-mono); font-size: 13px; color: var(--et-ink); }
.rh-bandeau-bornes .e { margin-top: 3px; font-family: var(--et-font-mono); font-size: 12px; color: var(--et-faint); }

.rh-select {
    height: 31px; padding: 0 28px 0 10px;
    border: 1px solid var(--et-form-border); border-radius: 0;
    background: var(--et-surface); color: var(--et-ink);
    font-family: inherit; font-size: 13px; outline: none; cursor: pointer;
    max-width: 260px;
}
.rh-select:focus { border-color: var(--et-form-blue); }
.rh-nav {
    width: 31px; height: 31px; padding: 0; display: grid; place-items: center;
    background: var(--et-surface); border: 1px solid var(--et-form-border);
    color: var(--et-form-blue-encre); cursor: pointer;
}
.rh-nav:hover:enabled { border-color: var(--et-form-blue); }
.rh-nav:disabled { color: var(--et-inerte); cursor: not-allowed; }

/* --- 5. Génération manquante ----------------------------------------------
   Bordure destructrice : ce bloc REMPLACE tout le contenu chiffré. Il ne
   signale pas un défaut d'affichage, il dit qu'il n'y a rien à afficher — et
   mieux vaut aucun chiffre qu'un chiffre non tracé. */
.rh-manque { background: var(--et-surface); border: 1px solid var(--et-danger-bord); }
.rh-manque .hdr {
    display: flex; align-items: flex-start; gap: 12px; padding: 16px 18px;
    background: var(--et-danger-badge-bg); border-bottom: 1px solid var(--et-danger-bord);
}
.rh-manque .hdr > i { flex: none; margin-top: 1px; font-size: 18px; color: var(--et-danger-ink); }
.rh-manque .t { font-size: 14px; font-weight: 700; color: var(--et-danger-ink); }
.rh-manque .x { margin-top: 4px; font-size: 13px; line-height: 1.6; color: var(--et-ink); text-wrap: pretty; }
.rh-manque .corps { padding: 6px 18px 14px; }
.rh-manque .lg {
    display: flex; align-items: center; gap: 12px; row-gap: 6px; flex-wrap: wrap;
    padding: 9px 0; border-bottom: 1px solid var(--et-rang);
}
.rh-manque .num { flex: none; width: 148px; font-family: var(--et-font-mono); font-size: 12px; color: var(--et-table-head-encre); }
.rh-manque .bor { flex: 1; min-width: 160px; font-size: 13px; color: var(--et-ink); }
.rh-manque .ed { flex: none; font-size: 12px; color: var(--et-faint); }
.rh-manque .st { flex: none; padding: 2px 10px; font-size: 12px; font-weight: 600; }
.rh-manque .st.est-generee { background: var(--et-succes-bg); color: var(--et-succes-ink); }
.rh-manque .st.est-cloturee { background: var(--et-neutre-bg); color: var(--et-neutre); }
.rh-manque .lien {
    flex: none; padding: 0; border: none; background: transparent;
    font-family: inherit; font-size: 13px; font-weight: 600;
    color: var(--et-form-blue-encre); cursor: pointer; white-space: nowrap;
}
.rh-manque .lien:hover { color: var(--et-form-blue-d); }
.rh-manque .sortie { display: flex; align-items: center; gap: 10px; margin-top: 14px; flex-wrap: wrap; }
.rh-manque .sortie span { flex: 1; min-width: 200px; font-size: 12px; line-height: 1.5; color: var(--et-faint); }

.rh-grp {
    padding: 12px 0 8px;
    font-family: var(--et-font-mono); font-size: 12px; font-weight: 700;
    text-transform: uppercase; letter-spacing: .16em; color: var(--et-table-head-encre);
}

/* --- 6. En-tête de fiche salarié ------------------------------------------ */
.rh-fiche { background: var(--et-surface); border: 1px solid var(--et-hairline); overflow: hidden; }
.rh-fiche > .hdr {
    display: flex; align-items: center; gap: 12px; row-gap: 6px; flex-wrap: wrap;
    padding: 11px 18px; background: var(--et-tint); border-bottom: 1px solid var(--et-filet-fort);
}
.rh-fiche .mat { flex: none; font-family: var(--et-font-mono); font-size: 12px; color: var(--et-table-head-encre); }
.rh-fiche .nom { flex: 1; min-width: 0; font-size: 14px; font-weight: 700; color: var(--et-table-head-encre); }
.rh-fiche .rat { flex: none; font-size: 12px; color: var(--et-muted); }

/* --- 7. Indicateurs -------------------------------------------------------
   DEUX RANGÉES, ET LA SÉPARATION EST LE PROPOS : la première se somme pour
   reconstituer le total payé, la seconde NE LE COMPOSE PAS — elle en a été
   retranchée. Une grille de dix ferait croire à un total de dix termes. */
.rh-ind {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    border-bottom: 1px solid var(--et-hairline);
}
.rh-ind > * {
    display: flex; align-items: baseline; gap: 8px;
    padding: 6px 18px; border-right: 1px solid var(--et-rang);
}
.rh-ind .l {
    flex: 1; min-width: 0; font-size: 12px; color: var(--et-muted);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.rh-ind .v { flex: none; font-family: var(--et-font-mono); font-size: 14px; font-weight: 500; color: var(--et-ink); }

/* Un total sans sa formule est une affirmation ; un écart se vérifie. La note
   nomme le nombre d'heures retranchées ET la base. */
.rh-methode-ligne {
    padding: 8px 18px; background: var(--et-surface-3);
    border-bottom: 1px solid var(--et-hairline);
    font-size: 12px; line-height: 1.5; color: var(--et-faint); text-wrap: pretty;
}
.rh-methode {
    background: var(--et-surface); border: 1px solid var(--et-hairline); padding: 12px 18px;
    font-size: 12px; line-height: 1.6; color: var(--et-faint); text-wrap: pretty;
}

/* --- 8. Table du rapport -------------------------------------------------- */
.rh-table-hote { overflow-x: auto; }
.rh-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.rh-table thead th {
    padding: 6px 13px;
    background: var(--et-table-head); border-bottom: 1px solid var(--et-table-head-fonce);
    font-family: var(--et-font-mono); font-size: 12px; font-weight: 500;
    text-transform: uppercase; letter-spacing: .14em; color: var(--et-sur-ardoise);
    white-space: nowrap; text-align: left;
}
.rh-table th.d, .rh-table td.d { text-align: right; }
.rh-table .sep { border-right: 1px solid var(--et-rang); }
.rh-table tbody td {
    padding: 4px 13px; border-bottom: 1px solid var(--et-rang);
    white-space: nowrap; color: var(--et-ink);
}
.rh-table .mono { font-family: var(--et-font-mono); font-size: 13px; }
.rh-table .gris { color: var(--et-muted); }
.rh-table .obs { font-size: 12px; color: var(--et-faint); white-space: normal; }
.rh-table .obs.est-critique { color: var(--et-danger-ink); }

/* Repos : rangée neutralisée — elle est là pour qu'aucun jour ne manque, pas
   pour être lue. Férié : teinte positive, c'est un jour qui compte. */
.rh-table tr.est-repos td { background: var(--et-surface-3); }
.rh-table tr.est-repos .jour, .rh-table tr.est-repos .nature { color: var(--et-faint); }
.rh-table tr.est-ferie td { background: var(--et-succes-bg); }
.rh-table tr.est-anomalie td { background: var(--et-danger-badge-bg); }

/* LA CELLULE ANCRÉE REPREND LA TEINTE DE SA RANGÉE.
   Depuis que ce tableau porte « tbl-ancree » (lot 03), sa première cellule est
   figée à gauche et le lot la peint en --et-surface pour qu'elle soit opaque —
   sinon les colonnes passeraient au travers en défilant. Mais son sélecteur,
   .tbl-ancree[data-ancre="1"] > tbody > tr > :nth-child(1):not([colspan]),
   pèse (0,4,2) : plus que les trois règles ci-dessus, à (0,2,2). La colonne des
   DATES perdait donc la teinte de son jour — un repos, un férié et une anomalie
   se lisaient blancs à l'endroit précis qui les nomme.

   Le lot ne peut pas régler ça de son côté : ces teintes sont posées sur les
   CELLULES, pas sur la rangée, donc un « background: inherit » ne remonterait
   rien et rendrait la cellule transparente. C'est donc à la feuille de l'écran
   de rendre à la cellule ancrée ce qui appartient à sa rangée.

   :nth-child(1) ET NON td : viser « td » ne suffirait pas, il faut recouvrir le
   sélecteur du lot sur SA cible. Ajouter .rh-table et la classe d'état porte
   celui-ci à (0,5,2) — il gagne par spécificité, sans dépendre de l'ordre de
   chargement des feuilles.

   Les rangées de RUPTURE, de SOUS-TOTAL et de TOTAL n'ont pas besoin de cette
   règle : leur première cellule est fusionnée (colspan), donc le :not([colspan])
   du lot les laisse déjà tranquilles. */
/* --et-surface-3 est opaque dans les deux thèmes (#FAFAFA / #1B2739) : la teinte
   se pose telle quelle. */
.rh-table.tbl-ancree[data-ancre="1"] > tbody > tr.est-repos > :nth-child(1) { background: var(--et-surface-3); }

/* FÉRIÉ ET ANOMALIE DEMANDENT DEUX COUCHES, et c'est le thème sombre qui l'impose.
   En clair leurs jetons sont opaques (#F1FDF6, #FFEBEB) ; en sombre ce sont des
   teintes TRANSLUCIDES — rgba(74,222,128,.14) et rgba(248,113,113,.16) — parce
   qu'une couleur pleine y écraserait la surface. Posées telles quelles sur une
   cellule FIGÉE, les colonnes défilantes passeraient au travers : c'est
   exactement l'opacité que le lot 03 exige de la colonne d'ancrage.

   Le dégradé plat est le moyen d'empiler deux fonds sur un seul élément : la
   teinte translucide par-dessus, --et-surface dessous. Le composé reproduit au
   pixel ce que voit une cellule NON figée (translucide sur la carte, elle-même
   en --et-surface), tout en étant opaque. Mesuré dans les deux thèmes.

   Ne pas « simplifier » en une seule couleur : en clair on perdrait rien, en
   sombre on reperdrait la transparence voulue par la charte. */
.rh-table.tbl-ancree[data-ancre="1"] > tbody > tr.est-ferie > :nth-child(1) {
    background: linear-gradient(var(--et-succes-bg), var(--et-succes-bg)), var(--et-surface);
}
.rh-table.tbl-ancree[data-ancre="1"] > tbody > tr.est-anomalie > :nth-child(1) {
    background: linear-gradient(var(--et-danger-badge-bg), var(--et-danger-badge-bg)), var(--et-surface);
}

.rh-rupture {
    padding: 4px 13px !important; background: var(--et-surface-3);
    border-bottom: 1px solid var(--et-rang);
    font-family: var(--et-font-mono); font-size: 12px; font-weight: 500;
    text-transform: uppercase; letter-spacing: .14em; color: var(--et-muted);
}
.rh-soustotal td {
    padding: 5px 13px !important; background: var(--et-surface-2);
    border-bottom: 1px solid var(--et-filet-fort);
    font-size: 13px; font-weight: 600; color: var(--et-table-head-encre);
}
.rh-soustotal .note { font-size: 12px; font-weight: 400; color: var(--et-faint); }
.rh-total td {
    padding: 10px 13px !important; background: var(--et-table-head); border-bottom: none;
    font-size: 13px; font-weight: 700; color: var(--et-sur-ardoise-plein);
}
.rh-total .note { font-size: 12px; font-weight: 400; color: var(--et-sur-ardoise); }

/* --- 9. Teintes des mesures ----------------------------------------------
   Elles NOMMENT une nature d'heure, elles ne décorent pas : le bleu dit
   « majorée », l'orange « à contrôler », le rouge « retranchée ». Sur le
   bandeau ardoise du total, les mêmes mesures prennent leurs teintes claires,
   sans quoi elles seraient illisibles sur fond sombre. */
.m-neutre { color: var(--et-ink); }
.m-bleu   { color: var(--et-form-blue-d); }
.m-orange { color: var(--et-avertissement-ink); }
.m-vert   { color: var(--et-succes-ink); }
.m-rouge  { color: var(--et-danger-ink); }

/* Une valeur nulle est un TIRET, jamais un zéro — et le tiret est gris : un
   zéro se lit comme un résultat, un tiret comme une absence de matière. */
.est-nul { color: var(--et-inerte) !important; }

.rh-total .m-neutre { color: var(--et-sur-aplat); }
.rh-total .m-bleu   { color: var(--et-sur-ardoise); }
.rh-total .m-orange { color: var(--et-sur-marine-avertissement); }
.rh-total .m-vert   { color: var(--et-sur-marine-succes); }
.rh-total .m-rouge  { color: var(--et-sur-marine-danger); }
/* .rh-total .est-nul a été RETIRÉE : elle surchargeait la règle générale
   « .est-nul { color: var(--et-inerte) !important } » avec un gris PLUS SOMBRE,
   qui rendait 3,08:1 sur l'ardoise là où le jeton rend 4,49:1. Une surcharge
   redondante qui dégradait ce qu'elle recopiait. */

/* --- 10. Anomalies -------------------------------------------------------- */
.rh-anos { padding: 4px 18px 12px; }
.rh-anos .ano {
    display: flex; align-items: center; gap: 12px;
    padding: 10px 0; border-bottom: 1px solid var(--et-rang);
}
.rh-anos .dt { flex: none; width: 62px; font-family: var(--et-font-mono); font-size: 13px; color: var(--et-table-head-encre); }
.rh-anos .tx { flex: 1; min-width: 0; }
.rh-anos .tx .t { font-size: 13px; font-weight: 600; }
.rh-anos .tx .d { margin-top: 2px; font-size: 12px; color: var(--et-muted); }
/* L'INCIDENCE est nommée : « retenue sur salaire » se comprend, « anomalie » ne
   dit pas ce qui va se passer. */
.rh-anos .inc { flex: none; padding: 3px 10px; font-size: 12px; font-weight: 600; white-space: nowrap; }
.rh-anos .est-critique .t, .rh-anos .inc.est-critique { color: var(--et-danger-ink); }
.rh-anos .inc.est-critique { background: var(--et-danger-badge-bg); }
.rh-anos .est-alerte .t, .rh-anos .inc.est-alerte { color: var(--et-avertissement-ink); }
.rh-anos .inc.est-alerte { background: var(--et-avertissement-bg); }

/* Le plafond est DIT quand il mord : une liste tronquée sans le dire ment par
   omission. */
.rh-plafond { margin-left: 10px; font-size: 12px; font-weight: 400; color: var(--et-faint); }
.rh-plafond a { color: var(--et-form-blue-encre); }

/* --- 11. Visas ------------------------------------------------------------
   Des EMPLACEMENTS DE SIGNATURE MANUSCRITE, non un circuit d'approbation. */
.rh-visas { padding: 14px 18px 18px; }
.rh-visas .mention { font-size: 13px; line-height: 1.6; color: var(--et-ink); text-wrap: pretty; }
.rh-visas .grille {
    margin-top: 14px; display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px;
}
.rh-visas .l { font-size: 12px; color: var(--et-muted); }
.rh-visas .x { margin-top: 4px; font-size: 13px; font-weight: 600; color: var(--et-ink); }
.rh-visas .x.est-gris { color: var(--et-muted); font-weight: 400; }
.rh-visas .trait { margin-top: 26px; border-bottom: 1px solid var(--et-inerte); }
.rh-visas .a { margin-top: 5px; font-size: 12px; color: var(--et-faint); }

/* --- 12. Impression ------------------------------------------------------
   Un FILET DE SÉCURITÉ, rien de plus : l'édition passe par le PDF mis en page,
   qui porte l'en-tête de société et les zones de signature. Ces règles servent
   à celui qui imprime la vue écran directement, pour qu'il n'obtienne pas le
   menu et le panneau de filtres autour d'un demi-tableau. */
@media print {
    .rh-colg, .rh-bandeau-outils, .rh-pop, .rh-pop-hote { display: none !important; }
    .rh-grille { grid-template-columns: minmax(0, 1fr); }
    .rh-fiche, .rh-manque { break-inside: avoid; }
    .rh-table { font-size: 10pt; }
    .rh-table thead { display: table-header-group; }
    .rh-table tr { break-inside: avoid; }
    .rh-visas { break-inside: avoid; }
}
