{"id":2088,"date":"2025-11-21T10:35:31","date_gmt":"2025-11-21T15:35:31","guid":{"rendered":"https:\/\/amir.tag25.com\/?post_type=product&#038;p=2088"},"modified":"2026-10-22T13:35:22","modified_gmt":"2026-10-22T18:35:22","slug":"master-en-tricologia","status":"publish","type":"product","link":"https:\/\/qa.amirlatam.com\/colombia\/producto\/master-en-tricologia\/","title":{"rendered":"M\u00e1ster en Tricolog\u00eda y Microinjerto Capilar"},"content":{"rendered":"<h2>El camino hacia una pr\u00e1ctica capilar moderna, rentable y con demanda real de profesionales especializados.<\/h2>\n<p>Domina el \u00e1rea de tricolog\u00eda cl\u00ednica y cirug\u00eda capilar con el programa l\u00edder en Latinoam\u00e9rica. \u2028Aprende el diagn\u00f3stico, tratamiento y prevenci\u00f3n de las patolog\u00edas capilares, y convi\u00e9rtete en un referente en restauraci\u00f3n capilar m\u00e9dica y quir\u00fargica, el campo con mayor expansi\u00f3n y rentabilidad dentro de la Medicina Est\u00e9tica.<\/p>\n<p>Este es el \u00fanico M\u00e1ster con pr\u00e1cticas presenciales reales garantizadas, con certificaci\u00f3n europea y una metodolog\u00eda dise\u00f1ada para formarte como un experto en microinjerto capilar.<\/p>\n<ul>\n<li>H\u00cdBRIDO<\/li>\n<li>Pr\u00e1cticas obligatorias en pacientes reales<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/trichologist_doing_man_improve_hair_growth_procedure_dermapen_microneedling_vitamin_injections.webp\" sizes=\"auto, (max-width: 593px) 100vw, 593px\" srcset=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/trichologist_doing_man_improve_hair_growth_procedure_dermapen_microneedling_vitamin_injections.webp 593w, https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/trichologist_doing_man_improve_hair_growth_procedure_dermapen_microneedling_vitamin_injections-300x450.webp 300w, https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/trichologist_doing_man_improve_hair_growth_procedure_dermapen_microneedling_vitamin_injections-200x300.webp 200w\" alt=\"\" width=\"593\" height=\"889\" \/> <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/freepik_a_25yearold_white_latin_woman_with_a_headset_on_we_75338_1.webp\" sizes=\"auto, (max-width: 528px) 100vw, 528px\" srcset=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/freepik_a_25yearold_white_latin_woman_with_a_headset_on_we_75338_1.webp 528w, https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/freepik_a_25yearold_white_latin_woman_with_a_headset_on_we_75338_1-300x230.webp 300w\" alt=\"\" width=\"528\" height=\"404\" \/><\/p>\n<h2>Nuestros asesores expertos<\/h2>\n<h2>te guiar\u00e1n en cada paso&#8230;<\/h2>\n<style type=\"text\/css\">\n\/* Healthcademia Default Form CSS *\/\n\/* ===================================\n   VARIABLES CSS PERSONALIZABLES\n   =================================== *\/\n:root {\n    \/* Espaciados *\/\n    --hc-container-padding: 30px;\n    --hc-field-margin: 18px;\n    --hc-name-row-gap: 16px;\n    --hc-header-gap: 12px;\n    --hc-checkbox-gap: 8px;\n    --hc-phone-prefix-gap: 16px;\n    \n    \/* Bordes y radios *\/\n    --hc-container-radius: 16px;\n    --hc-input-radius: 8px;\n    --hc-input-border-width: 1px;\n    \n    \/* Colores *\/\n    --hc-bg-color: #fff;\n    --hc-border-color: #d6d6d6;\n    --hc-container-border-color: #e0e0e0;\n    --hc-primary-color: #1976d2;\n    --hc-error-color: #d32f2f;\n    --hc-error-color-bg: #fff5f7;\n    --hc-text-color: #333;\n    --hc-label-color: #999;\n    \n    \/* Tipograf\u00eda *\/\n    --hc-font-family: \"Inter\", Arial, sans-serif;\n    --hc-input-font-size: 15px;\n    --hc-label-font-size: 15px;\n    --hc-label-font-size-small: 12px;\n    --hc-checkbox-font-size: 14px;\n    \n    \/* Transiciones *\/\n    --hc-transition-duration: 0.2s;\n    --hc-transition-timing: ease;\n    \n    \/* Tama\u00f1os espec\u00edficos *\/\n    --hc-input-padding: 5px 10px 7px 10px;\n    --hc-textarea-min-height: 110px;\n    --hc-focus-shadow-size: 2px;\n    --hc-button-padding: 14px 24px;\n    --hc-phone-prefix-width: 120px;\n}\n\n\/* ===================================\n   ESTILOS DEL FORMULARIO\n   =================================== *\/\n\n\/* Healthcademia Default Form Styles *\/\n.hc-form-container {\n    background: var(--hc-bg-color);\n    border-radius: var(--hc-container-radius);\n    padding: var(--hc-container-padding);\n    border: var(--hc-input-border-width) solid var(--hc-container-border-color);\n    position: relative;\n    font-family: var(--hc-font-family);\n}\n\n.hc-form-header {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: var(--hc-header-gap);\n    margin-bottom: var(--hc-header-gap);\n}\n\n.hc-form {\n    display: flex;\n    flex-direction: column;\n}\n\n\/* Nombre y apellidos en horizontal *\/\n.hc-name-row {\n    display: flex;\n    gap: var(--hc-name-row-gap);\n    margin-bottom: var(--hc-field-margin);\n}\n\n.hc-name-row .hc-field {\n    flex: 1;\n    margin-bottom: 0;\n}\n\n\/* Responsive: en m\u00f3viles volver a vertical *\/\n@media (max-width: 640px) {\n    .hc-name-row {\n        flex-direction: column;\n        gap: 0;\n    }\n    \n    .hc-name-row .hc-field {\n        margin-bottom: var(--hc-field-margin);\n    }\n    .hc-name-row .hc-field:last-child {\n        margin-bottom: 0;\n    }\n}\n\n.hc-form-header h2,\n.hc-form-title {\n    margin: 0;\n}\n\n.hc-field {\n    margin-bottom: var(--hc-field-margin);\n    position: relative;\n    display: flex;\n    flex-direction: column;\n}\n\n.hc-input,\n.hc-textarea,\n.hc-select {\n    width: 100%;\n    border: var(--hc-input-border-width) solid var(--hc-border-color);\n    border-radius: var(--hc-input-radius);\n    padding: var(--hc-input-padding);\n    font-size: var(--hc-input-font-size);\n    transition: border-color var(--hc-transition-duration) var(--hc-transition-timing), \n                box-shadow var(--hc-transition-duration) var(--hc-transition-timing);\n    background: var(--hc-bg-color);\n    font-family: var(--hc-font-family);\n}\n\n.hc-input:focus,\n.hc-textarea:focus,\n.hc-select:focus {\n    border-color: var(--hc-primary-color);\n    box-shadow: 0 0 0 var(--hc-focus-shadow-size) rgba(25, 118, 210, 0.2);\n    outline: none;\n}\n\n.hc-input.hc-error,\n.hc-textarea.hc-error,\n.hc-select.hc-error {\n    border-color: var(--hc-error-color);\n    background-color: var(--hc-error-color-bg);\n}\n\n.hc-textarea {\n    min-height: var(--hc-textarea-min-height);\n    resize: vertical;\n}\n\n.hc-checkbox-group label {\n    display: flex;\n    align-items: center;\n    gap: var(--hc-checkbox-gap);\n    font-size: var(--hc-checkbox-font-size);\n}\n\n\/* Estilos para checkbox con error *\/\n.hc-checkbox-group label.hc-error {\n    color: var(--hc-error-color);\n}\n\n.hc-checkbox-group input[type=\"checkbox\"].hc-error {\n    accent-color: var(--hc-error-color);\n}\n\n.hc-checkbox-group input[type=\"checkbox\"].hc-error + span {\n    color: var(--hc-error-color);\n}\n\n.hc-submit {\n    width: 100%;\n    background: var(--hc-primary-color);\n    color: #fff;\n    border: none;\n    padding: var(--hc-button-padding);\n    border-radius: var(--hc-input-radius);\n    font-size: 16px;\n    font-weight: 600;\n    margin-top: var(--hc-name-row-gap);\n    cursor: pointer;\n    transition: background var(--hc-transition-duration) var(--hc-transition-timing);\n}\n\n.hc-submit:hover {\n    background: #135ba8;\n}\n\n.hc-form-spinner {\n    position: absolute;\n    inset: 0;\n    background: rgba(255, 255, 255, 0.85);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    opacity: 0;\n    pointer-events: none;\n    transition: opacity var(--hc-transition-duration) var(--hc-transition-timing);\n    border-radius: var(--hc-container-radius);\n}\n\n.hc-form-container.is-loading .hc-form-spinner {\n    opacity: 1;\n    pointer-events: all;\n}\n\n.hc-form-container.is-loading .hc-form {\n    opacity: 0.5;\n}\n\n.hc-spinner {\n    width: 48px;\n    height: 48px;\n    border: 4px solid rgba(25, 118, 210, 0.2);\n    border-top-color: #1976d2;\n    border-radius: 50%;\n    animation: hc-spin 0.8s linear infinite;\n}\n\n@keyframes hc-spin {\n    to {\n        transform: rotate(360deg);\n    }\n}\n\n.hc-field.floating .hc-floating-inner {\n    position: relative;\n    width: 100%;\n    display: flex;\n}\n\n.hc-field.floating .hc-floating-inner label {\n    position: absolute;\n    top: 50%;\n    left: 12px;\n    transform: translateY(-50%);\n    color: var(--hc-label-color);\n    pointer-events: none;\n    transition: var(--hc-transition-duration) var(--hc-transition-timing);\n    background: var(--hc-bg-color);\n    padding: 0 4px;\n    font-size: 14px;\n    font-weight: 400;\n}\n\n.hc-field.floating .hc-floating-inner .hc-input,\n.hc-field.floating .hc-floating-inner .hc-textarea {\n    padding: 10px 10px 6px;\n    width: 100%\n}\n\n.grecaptcha-badge{\n    display: none !important;\n}\n\n.hc-field.floating .hc-floating-inner .hc-input:focus+label,\n.hc-field.floating .hc-floating-inner .hc-textarea:focus+label,\n.hc-field.floating .hc-floating-inner .hc-input:not(:placeholder-shown)+label,\n.hc-field.floating .hc-floating-inner .hc-textarea:not(:placeholder-shown)+label {\n    top: 0px;\n    font-size: var(--hc-label-font-size-small);\n    color: var(--hc-text-color);\n    font-weight: 600;\n}\n\n\/* Label con fondo rojo cuando el input tiene error *\/\n.hc-field.floating .hc-floating-inner .hc-input.hc-error+label,\n.hc-field.floating .hc-floating-inner .hc-textarea.hc-error+label {\n    background-color: var(--hc-error-color-bg);\n    color: var(--hc-error-color);\n}\n\n.co-feedback-container{\n    display: none !important;\n}\n\n.hc-phone-field .hc-phone-wrapper {\n    display: flex;\n    gap: var(--hc-name-row-gap);\n    flex-direction: row;\n}\n\n.hc-phone-field.floating .hc-floating-inner label {\n    top: 0px !important;\n    z-index: 11 !important;\n}\n\n\/* Label del campo de tel\u00e9fono con fondo rojo cuando hay error *\/\n.hc-phone-field.floating .hc-floating-inner .hc-phone-input-wrapper input.hc-error+label {\n    background-color: var(--hc-error-color-bg) !important;\n    color: var(--hc-error-color) !important;\n}\n.hc-phone-wrapper .hc-select-block,\n.hc-phone-wrapper .hc-field {\n    flex: 1;\n    min-width: 160px;\n}\n\n.hc-select-block label {\n    display: block;\n    font-size: 12px;\n    font-weight: 600;\n    text-transform: uppercase;\n    letter-spacing: 0.04em;\n    color: #666;\n    margin-bottom: 6px;\n}\n\n.hc-form-default {\n    border: 1px dashed #bbb;\n    padding: 16px;\n    margin-bottom: 20px;\n    background: #fafafa;\n    font-style: italic;\n    color: #555;\n    text-align: center;\n}\n\n\/* Grid 2x2 para los selects de programa *\/\n.hc-selects-grid {\n    display: grid;\n    grid-template-columns: repeat(2, 1fr);\n    gap: 16px;\n}\n\n\/* Si el grid est\u00e1 vac\u00edo (sin selects), quitar el margin *\/\n.hc-selects-grid:empty {\n    margin-bottom: 0;\n    display: none;\n}\n\n\/* Skeleton Loading Styles - Barra horizontal \u00fanica *\/\n.hc-skeleton-field {\n    position: relative;\n    overflow: hidden;\n    margin-bottom: 18px;\n}\n\n.hc-skeleton {\n    width: 100%;\n    height: 35px;\n    background: #f0f0f0;\n    border-radius: 8px;\n    position: relative;\n    overflow: hidden;\n}\n\n.hc-skeleton-line {\n    width: 100%;\n    height: 100%;\n    background: linear-gradient(\n        90deg,\n        #f0f0f0 0%,\n        #e0e0e0 50%,\n        #f0f0f0 100%\n    );\n    background-size: 200% 100%;\n    animation: skeleton-loading 1.5s ease-in-out infinite;\n}\n\n@keyframes skeleton-loading {\n    0% {\n        background-position: 200% 0;\n    }\n    100% {\n        background-position: -200% 0;\n    }\n}\n\n\/* Si el grid tiene un \u00faltimo hijo, a\u00f1adir margin-bottom *\/\n.hc-selects-grid:has(:last-child) {\n    margin-bottom: 16px;\n}\n\n\/* Resetear margin-bottom de los campos dentro del grid *\/\n.hc-selects-grid .hc-field {\n    margin-bottom: 0;\n}\n\n\/* Si hay 1 select: 100% *\/\n.hc-selects-grid .hc-field:only-child {\n    grid-column: 1 \/ -1;\n}\n\n\/* Si hay 3 selects: el tercero ocupa 100% *\/\n.hc-selects-grid .hc-field:nth-child(3):nth-last-child(1) {\n    grid-column: 1 \/ -1;\n}\n\n.hc-form-status {\n    font-size: 14px;\n}\n\n.hc-form-status.success {\n    color: #2e7d32;\n}\n\n.hc-form-status.error {\n    color: #c62828;\n    text-align: center;\n    padding-top: 15px;\n}\n\n\/* Mensaje de \u00e9xito fuera del formulario (solo cuando no hay redirect) *\/\n.hc-form-success-message {\n    min-height: 20px;\n    font-size: 18px;\n    text-align: center;\n    padding: 15px;\n    margin-top: 20px;\n    margin-bottom: 20px;\n    border-radius: var(--hc-input-radius);\n    background-color: #f1f8f4;\n    color: #2e7d32;\n    font-weight: 500;\n}\n\n.hc-form-success-message.success {\n    color: #2e7d32;\n}\n\n\/* Cuando el formulario tiene \u00e9xito, ocultar el formulario y centrar el mensaje *\/\n.hc-form-container.hc-form-success {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    min-height: 300px;\n    padding: 40px 30px;\n}\n\n.hc-form-container.hc-form-success .hc-form-header {\n    display: none !important;\n}\n\n.hc-form-container.hc-form-success .hc-form {\n    display: none !important;\n}\n\n.hc-form-container.hc-form-success .hc-form-spinner {\n    display: none !important;\n}\n\n.hc-form-container.hc-form-success .hc-form-status {\n    display: block !important;\n    width: 90%;\n    max-width: 600px;\n    text-align: center;\n    font-size: 20px;\n    font-weight: 500;\n    line-height: 1.6;\n    padding: 30px;\n    margin: 0;\n    color: #2e7d32;\n    background-color: #f1f8f4;\n    border: 0px;\n}\n\n.hc-form-container.hc-form-success .hc-form-status.success {\n    color: #2e7d32;\n}\n\n\/* ===== Sistema adaptativo de tel\u00e9fono ===== *\/\n\n\/* Por defecto: selector de prefijos OCULTO (para Form Guard \/ None) *\/\n.hc-phone-field-simple .hc-phone-prefix {\n    display: none !important;\n}\n\n.hc-phone-field-simple .hc-floating-inner {\n    display: block;\n}\n\n.hc-phone-field-simple .hc-phone-input-wrapper {\n    width: 100%;\n    display: flex;\n}\n\n\/* Cuando se necesita selector (clearoutphone): mostrar en flex *\/\n.hc-phone-field-with-prefix .hc-phone-prefix {\n    display: block !important;\n    width: var(--hc-phone-prefix-width);\n    flex-shrink: 0;\n}\n\n.hc-phone-field-with-prefix .hc-floating-inner {\n    display: flex;\n    gap: var(--hc-phone-prefix-gap);\n    align-items: stretch;\n}\n\n.hc-phone-field-with-prefix .hc-phone-input-wrapper {\n    flex: 1;\n    position: relative;\n    display: flex;\n    flex-direction: row;\n}\n\n.hc-phone-input-wrapper > .co-input-container {\n    display: flex !important;\n}\n\n.hc-phone-input-wrapper input[type=\"tel\"] {\n    display: flex !important;\n}\n\n\/* Labels flotantes funcionan en ambos modos *\/\n.hc-phone-input-wrapper {\n    position: relative;\n}\n\n.hc-phone-input-wrapper label {\n    position: absolute;\n    left: 12px;\n    top: 50%;\n    transform: translateY(-50%);\n    transition: all var(--hc-transition-duration) var(--hc-transition-timing);\n    pointer-events: none;\n    color: var(--hc-label-color);\n    font-size: var(--hc-label-font-size);\n}\n\n.hc-phone-input-wrapper input:focus + label,\n.hc-phone-input-wrapper input:not(:placeholder-shown) + label {\n    top: -8px;\n    font-size: var(--hc-label-font-size-small);\n    background: var(--hc-bg-color);\n}\n\n.hc-phone-input-wrapper input.hc-error + label {\n    background-color: var(--hc-error-color-bg) !important;\n    color: var(--hc-error-color) !important;\n    padding: 0 4px;\n}\n\n\/* Estilos de error para campos de tel\u00e9fono *\/\n.hc-phone-prefix.hc-error {\n    border-color: var(--hc-error-color) !important;\n    background-color: var(--hc-error-color-bg) !important;\n    box-shadow: 0 0 0 var(--hc-focus-shadow-size) rgba(220, 53, 69, 0.25);\n}\n\n.hc-phone-input-wrapper input.hc-error {\n    border-color: var(--hc-error-color) !important;\n    background-color: var(--hc-error-color-bg) !important;\n}\n\n\/* ===================================\n   PERSONALIZACI\u00d3N\n   ===================================\n   \n   Para personalizar el formulario, puedes sobreescribir las variables CSS\n   en tu archivo de CSS personalizado (healthcademia-zoho-css.php):\n   \n   Ejemplo:\n   \n   :root {\n       --hc-primary-color: #ff5722;\n       --hc-container-radius: 24px;\n       --hc-name-row-gap: 20px;\n   }\n   \n   Variables disponibles:\n   \n   Espaciados:\n   - --hc-container-padding\n   - --hc-field-margin\n   - --hc-name-row-gap\n   - --hc-header-gap\n   - --hc-checkbox-gap\n   - --hc-phone-prefix-gap\n   \n   Bordes:\n   - --hc-container-radius\n   - --hc-input-radius\n   - --hc-input-border-width\n   \n   Colores:\n   - --hc-primary-color\n   - --hc-error-color\n   - --hc-bg-color\n   - --hc-border-color\n   - --hc-text-color\n   - --hc-label-color\n   \n   Tipograf\u00eda:\n   - --hc-font-family\n   - --hc-input-font-size\n   - --hc-label-font-size\n   - --hc-checkbox-font-size\n   \n   Otros:\n   - --hc-transition-duration\n   - --hc-button-padding\n   - --hc-phone-prefix-width\n   \n=================================== *\/\n<\/style>\n<style type=\"text\/css\">\n\/* Healthcademia Custom CSS *\/\n\/* ============================================\r\n   Healthcademia Form - CSS Personalizado\r\n   ============================================\r\n   Personaliza las clases principales del formulario.\r\n   Edita los valores seg\u00fan tus necesidades de dise\u00f1o.\r\n   ============================================ *\/\r\n\r\n:root {\r\n    \/* Color principal del formulario *\/\r\n    --hc-primary-color: #b8be15;\r\n    \r\n    \/* Hacer el formulario m\u00e1s compacto *\/\r\n    --hc-container-padding: 0px;\r\n    --hc-field-margin: 12px;\r\n    --hc-name-row-gap: 18px;\r\n    \r\n    \/* Bordes m\u00e1s redondeados *\/\r\n    --hc-container-radius: 24px;\r\n    --hc-input-radius: 12px;\r\n    \r\n    \/* Fuente m\u00e1s grande *\/\r\n    --hc-input-font-size: 16px;\r\n}\r\n\r\n\/* ============================================\r\n   CONTENEDOR PRINCIPAL\r\n   ============================================ *\/\r\n.hc-form-container {\r\n    background: transparent !important;\r\n    border-radius: 0px;\r\n    \/* padding: 30px; *\/\r\n    border: 0px solid #e0e0e0; \r\nmargin-top: 20px;\r\n    \/* font-family: \"Inter\", Arial, sans-serif; *\/\r\n}\r\n\r\n\/* ============================================\r\n   HEADER DEL FORMULARIO\r\n   ============================================ *\/\r\n.hc-form-header {\r\n\r\n}\r\n\r\n.hc-form-title {\r\n\r\n}\r\n\r\n\/* ============================================\r\n   FORMULARIO\r\n   ============================================ *\/\r\n.hc-form {\r\n\r\n}\r\n\r\n\/* ============================================\r\n   CAMPOS DEL FORMULARIO\r\n   ============================================ *\/\r\n.hc-field {\r\n\r\n}\r\n\r\n\/* ============================================\r\n   INPUTS, TEXTAREAS Y SELECTS\r\n   ============================================ *\/\r\n.hc-input,\r\n.hc-textarea,\r\n.hc-select {\r\n    border: 1px solid #acaeaf !important; \r\nborder-radius: 5px !important;\r\n    \/* background: #fff; *\/\r\nfont-size: 14px !important;\r\n\r\n}\r\n\r\n\/* Estados de focus *\/\r\n.hc-input:focus,\r\n.hc-textarea:focus,\r\n.hc-select:focus {\r\n    \/* border-color: #1976d2; *\/\r\n    \/* box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.2); *\/\r\n}\r\n\r\n\/* Estados de error *\/\r\n.hc-input.hc-error,\r\n.hc-textarea.hc-error,\r\n.hc-select.hc-error {\r\n    \/* border-color: #d32f2f; *\/\r\n}\r\n\r\n\/* Textarea espec\u00edfico *\/\r\n.hc-textarea {\r\n\r\n}\r\n\r\n\/* ============================================\r\n   CAMPOS FLOTANTES (Floating Labels)\r\n   ============================================ *\/\r\n\r\n.hc-phone-field.floating .hc-floating-inner label{\r\nfont-size: 12px;\r\nborder-radius: 5px;\r\n}\r\n\r\n.hc-field.floating .hc-floating-inner label {\r\nwidth: auto;\r\n\r\n\r\n}\r\n\r\n.hc-field.floating .hc-floating-inner .hc-input:focus + label,\r\n.hc-field.floating .hc-floating-inner .hc-textarea:focus + label,\r\n.hc-field.floating .hc-floating-inner .hc-input:not(:placeholder-shown) + label,\r\n.hc-field.floating .hc-floating-inner .hc-textarea:not(:placeholder-shown) + label {\r\nfont-size: 12px;\r\nborder-radius: 5px;\r\n}\r\n\r\n\/* ============================================\r\n   CAMPO DE TEL\u00c9FONO\r\n   ============================================ *\/\r\n.hc-phone-field .hc-phone-wrapper {\r\n\r\n}\r\n\r\n.hc-select-block label {\r\n    \/* color: #666; *\/\r\n}\r\n\r\n\r\n\/* ============================================\r\n   CHECKBOXES\r\n   ============================================ *\/\r\n.hc-checkbox-group label {\r\nfont-size: 12px; \r\nline-height: 1.1em;\r\nmargin-bottom: 5px;\r\n}\r\n\r\n.hc-checkbox-group label a{\r\ntext-decoration: underline !important;\r\n}\r\n.hc-checkbox-group label.hc-error {\r\n    \/* color: #d32f2f; *\/\r\n}\r\n\r\n\/* ============================================\r\n   BOT\u00d3N DE ENV\u00cdO\r\n   ============================================ *\/\r\n.hc-submit {\r\n    \/* background: #1976d2; *\/\r\n    \/* color: #fff; *\/\r\n}\r\n\r\n.hc-submit:hover {\r\n    background: #bcca30;\r\n}\r\n\r\n.hc-submit:active {\r\n    \/* transform: scale(0.98); *\/\r\n}\r\n\r\n\/* ============================================\r\n   SPINNER DE CARGA\r\n   ============================================ *\/\r\n.hc-form-spinner {\r\n    \/* background: rgba(255, 255, 255, 0.85); *\/\r\n}\r\n\r\n.hc-spinner {\r\n    \/* width: 48px; *\/\r\n    \/* height: 48px; *\/\r\n    \/* border: 4px solid rgba(25, 118, 210, 0.2); *\/\r\n    \/* border-top-color: #1976d2; *\/\r\n}\r\n\r\n\/* ============================================\r\n   MENSAJES DE ESTADO\r\n   ============================================ *\/\r\n.hc-form-status.success {\r\n    \/* color: #2e7d32; *\/\r\n}\r\n\r\n.hc-form-status.error {\r\n    \/* color: #c62828; *\/\r\n}\r\n\r\n\/* ============================================\r\n   ESTADO DE \u00c9XITO (Formulario oculto)\r\n   ============================================ *\/\r\n.hc-form-container.hc-form-success {\r\n\r\n}\r\n\r\n.hc-form-container.hc-form-success .hc-form-status {\r\n    \/* background-color: #f1f8f4; *\/\r\n    \/* color: #2e7d32; *\/\r\n}\r\n\r\n\/* ============================================\r\n   RESPONSIVE (Ejemplo)\r\n   ============================================ *\/\r\n@media screen and (max-width: 768px) {\r\n    .hc-form-container {\r\n\r\n    }\r\n    \r\n    .hc-phone-field .hc-phone-wrapper {\r\n\r\n    }\r\n    \r\n    .hc-selects-grid {\r\n\r\n    }\r\n}\r\n\r\n\/* ============================================\r\n   PERSONALIZACIONES ADICIONALES\r\n   ============================================ *\/\r\n\/* A\u00f1ade tus estilos personalizados aqu\u00ed *\/\n<\/style>\n<div class=\"healthcademia-form-wrapper\" data-form-id=\"formulario-base\" data-redirect=\"https:\/\/qa.amirlatam.com\/colombia\/gracias\/\" data-privacy-url=\"https:\/\/qa.amirlatam.com\/colombia\/privacy-policy\/\" data-success-message=\"\u00a1Hemos recibido tus datos! Nos pondremos en contacto contigo muy pronto.\" data-rest-nonce=\"ff18ce31e1\" data-region=\"LATAM\" data-recaptcha-key=\"6Lf_bScsAAAAAABqrIROKvoQD5XOzjoGTUmhKA-x\"><div class=\"hc-form-container\" id=\"hc_form_1\"\n     data-hc-validate=\"1\"\n     data-rest-leads=\"https:\/\/qa.amirlatam.com\/colombia\/wp-json\/healthcademia\/v1\/leads\"\n     data-rest-programs=\"https:\/\/qa.amirlatam.com\/colombia\/wp-json\/healthcademia\/v1\/programas\"\n     data-rest-nonce=\"ff18ce31e1\"\n     data-program-id=\"1854\"\n     data-redirect=\"https:\/\/qa.amirlatam.com\/colombia\/gracias\/\"\n     data-region=\"LATAM\"\n     data-country-prefixes=\"{&quot;Espa\u00f1a&quot;:&quot;+34&quot;,&quot;Argentina&quot;:&quot;+54&quot;,&quot;Chile&quot;:&quot;+56&quot;,&quot;Colombia&quot;:&quot;+57&quot;,&quot;M\u00e9xico&quot;:&quot;+52&quot;,&quot;Per\u00fa&quot;:&quot;+51&quot;,&quot;Venezuela&quot;:&quot;+58&quot;,&quot;Otro&quot;:&quot;&quot;}\"\n     data-clearout-key=\"6c7990b80c6b598123f804ec0066078d:bcd9da28edee065eb67bbf61caf6e128fcc207a8efd7a710acd0ce72542f716c\" data-display-config=\"{&quot;convocatoria&quot;:false,&quot;sede&quot;:false,&quot;modalidad&quot;:false,&quot;edicion&quot;:false}\">\n    <form class=\"hc-form hc-api-form\" id=\"form_dossier\" novalidate>\n        <input type=\"hidden\" name=\"program_id\" value=\"1854\">\n        <input type=\"hidden\" name=\"program_name\" value=\"\">\n        \n        <div class=\"hc-name-row\">\n            <div class=\"hc-field floating\">\n                <div class=\"hc-floating-inner\">\n                    <input type=\"text\" name=\"first_name\" class=\"hc-input\" placeholder=\" \" data-only-letters=\"true\" required>\n                    <label>Nombre *<\/label>\n                <\/div>\n            <\/div>\n            <div class=\"hc-field floating\">\n                <div class=\"hc-floating-inner\">\n                    <input type=\"text\" name=\"last_name\" class=\"hc-input\" placeholder=\" \" data-only-letters=\"true\" required>\n                    <label>Apellidos *<\/label>\n                <\/div>\n            <\/div>\n        <\/div>\n        <div class=\"hc-field floating\">\n            <div class=\"hc-floating-inner\">\n                <input type=\"email\" name=\"email\" class=\"hc-input\" placeholder=\" \" value=\"\" required>\n                <label>Correo electr\u00f3nico *<\/label>\n            <\/div>\n        <\/div>\n                <div class=\"hc-field hc-phone-field floating hc-phone-field-with-prefix\">\n            <div class=\"hc-floating-inner\">\n                <!-- Selector de prefijos (solo visible para clearoutphone) -->\n                <select name=\"phone_prefix\" class=\"hc-select hc-phone-prefix\">\n                    <option value=\"+34\" data-country=\"ES\">ES +34<\/option>\n                    <!-- Centroam\u00e9rica -->\n                    <option value=\"+52\" data-country=\"MX\">MX +52<\/option>\n                    <option value=\"+502\" data-country=\"GT\">GT +502<\/option>\n                    <option value=\"+503\" data-country=\"SV\">SV +503<\/option>\n                    <option value=\"+504\" data-country=\"HN\">HN +504<\/option>\n                    <option value=\"+505\" data-country=\"NI\">NI +505<\/option>\n                    <option value=\"+506\" data-country=\"CR\">CR +506<\/option>\n                    <option value=\"+507\" data-country=\"PA\">PA +507<\/option>\n                    <option value=\"+501\" data-country=\"BZ\">BZ +501<\/option>   \n                    <option value=\"+509\" data-country=\"HT\">HT +509<\/option>     \n\n                    <!-- Caribe LATAM (NANP con m\u00faltiples prefijos) -->\n                    <option value=\"+1809\" data-country=\"DO\">DO +1809<\/option>\n                    <option value=\"+1829\" data-country=\"DO\">DO +1829<\/option>\n                    <option value=\"+1849\" data-country=\"DO\">DO +1849<\/option>\n                    <option value=\"+1787\" data-country=\"PR\">PR +1787<\/option>\n                    <option value=\"+1939\" data-country=\"PR\">PR +1939<\/option>\n                    <option value=\"+53\"   data-country=\"CU\">CU +53<\/option>\n                    <option value=\"+1876\" data-country=\"JM\">JM +1876<\/option>\n\n                    <!-- Sudam\u00e9rica -->\n                    <option value=\"+57\"  data-country=\"CO\" selected>CO +57<\/option>\n                    <option value=\"+58\"  data-country=\"VE\">VE +58<\/option>\n                    <option value=\"+593\" data-country=\"EC\">EC +593<\/option>\n                    <option value=\"+51\"  data-country=\"PE\">PE +51<\/option>\n                    <option value=\"+591\" data-country=\"BO\">BO +591<\/option>\n                    <option value=\"+56\"  data-country=\"CL\">CL +56<\/option>\n                    <option value=\"+54\"  data-country=\"AR\">AR +54<\/option>\n                    <option value=\"+598\" data-country=\"UY\">UY +598<\/option>\n                    <option value=\"+595\" data-country=\"PY\">PY +595<\/option>\n                    <option value=\"+55\"  data-country=\"BR\">BR +55<\/option>\n                    <option value=\"+592\" data-country=\"GY\">GY +592<\/option>   \n                    <option value=\"+597\" data-country=\"SR\">SR +597<\/option> \n                    <option value=\"+594\" data-country=\"GF\">GF +594<\/option> \n                <\/select>\n                <div class=\"hc-phone-input-wrapper\">\n                                        <input type=\"tel\" name=\"phone\" class=\"hc-input\" placeholder=\"612 345 678\" data-clearout-phone-field value=\"\" required>\n                    <label>Tel\u00e9fono *<\/label>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        \n        <input type=\"hidden\" name=\"utm_campaign\">\n        <input type=\"hidden\" name=\"utm_source\">\n        <input type=\"hidden\" name=\"utm_medium\">\n        <input type=\"hidden\" name=\"utm_term\">\n        <input type=\"hidden\" name=\"utm_content\">\n        <input type=\"hidden\" name=\"traffic_source\" value=\"\">\n        <input type=\"hidden\" name=\"lead_source\" value=\"P\u00e1gina Web\">\n        <input type=\"hidden\" name=\"tipo_origen\" value=\"Digital\">\n        <input type=\"hidden\" name=\"lead_status\" value=\"Sin Gesti\u00f3n\">\n        <input type=\"hidden\" name=\"region\" value=\"LATAM\">\n        <!-- Campo oculto para capturar GCLID de Google Ads (Zoho CRM) -->\n        <input type=\"hidden\" id=\"zc_gad\" name=\"zc_gad\" value=\"\">\n        <input type=\"hidden\" name=\"FormURL\" value=\"\">\n\n\n        <div class=\"hc-checkbox-group hc-legal-checkboxes\">\n            <label>\n                <input type=\"checkbox\" name=\"privacy\" required>\n                <span>Acepto la <a href=\"https:\/\/qa.amirlatam.com\/colombia\/privacy-policy\/\" data-privacy-link=\"true\" target=\"_blank\" rel=\"noopener\">pol\u00edtica de privacidad<\/a> *<\/span>\n            <\/label>\n        <\/div>\n        <div class=\"hc-checkbox-group\">\n            <label>\n                <input type=\"checkbox\" name=\"marketing\">\n                <span>Acepto recibir comunicaciones comerciales<\/span>\n            <\/label>\n        <\/div>\n\n        <div class=\"hc-form-status\" aria-live=\"polite\"><\/div>\n        <button type=\"submit\" class=\"hc-submit\">ASESOR\u00cdA PERSONALIZADA<\/button>\n    <\/form>\n    <div class=\"hc-form-success-message\" aria-live=\"polite\" style=\"display: none;\"><\/div>\n    <div class=\"hc-form-spinner\" aria-hidden=\"true\">\n        <div class=\"hc-spinner\"><\/div>\n    <\/div>\n<\/div>\n<style>\n.hc-form-container[data-hc-validate] .hc-submit:disabled {\n    opacity: 0.45;\n    cursor: not-allowed;\n    pointer-events: none;\n}\n.hc-form-container .hc-field-error {\n    display: block;\n    color: #d32f2f;\n    font-size: 12px;\n    margin-top: 4px;\n    line-height: 1.3;\n}\n<\/style>\n<script>\n\/\/ GTM: disparar evento de lead solicitud con nombre del programa (o fallback)\ndocument.addEventListener('DOMContentLoaded', function() {\n    document.querySelectorAll('.hc-form-container[data-hc-validate] form').forEach(function(form) {\n        var urlInput = form.querySelector('input[name=\"FormURL\"]');\n        if (urlInput && !urlInput.value) {\n            urlInput.value = window.location.href;\n        }\n        form.addEventListener('submit', function() {\n            var programInput = form.querySelector('[name=\"program_name\"]');\n            var selectedProgramName = programInput ? (programInput.value || '').trim() : '';\n            window.dataLayer = window.dataLayer || [];\n            window.dataLayer.push({\n                event: 'generacion_lead_solicitud',\n                form_name: selectedProgramName || 'formulario_solicitud'\n            });\n        });\n    });\n});\n\nif (!window._hcValidateListening) {\n    window._hcValidateListening = true;\n    console.info('[HC][Solicitud] init: libphonenumber loaded =', !!(window.libphonenumber && window.libphonenumber.parsePhoneNumberFromString));\n\n    function _hcIsValidEmail(val) {\n        return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(val.trim());\n    }\n    function _hcIsValidPhone(val, form) {\n        var raw = (val || '').trim();\n        var digitsOnly = raw.replace(\/[\\s\\-().]+\/g, '');\n        var useLib = !!(window.libphonenumber && window.libphonenumber.parsePhoneNumberFromString);\n        if (!useLib) {\n            console.warn('[HC][Solicitud] libphonenumber no disponible, usando fallback simple');\n        }\n        var prefix = '';\n        if (form) {\n            var sel = form.querySelector('.hc-phone-prefix');\n            if (sel && sel.value) prefix = (sel.value || '').trim();\n        }\n        var full = digitsOnly;\n        if (digitsOnly && digitsOnly[0] !== '+' && prefix) {\n            full = prefix + digitsOnly;\n        } else if (digitsOnly && digitsOnly[0] === '+') {\n            full = digitsOnly;\n        }\n        if (useLib) {\n            try {\n                var phone = window.libphonenumber.parsePhoneNumberFromString(full);\n                if (!phone || !phone.isValid()) return false;\n            } catch (e) {\n                console.error('[HC][Solicitud] error parseando tel\u00e9fono con libphonenumber', e);\n                return false;\n            }\n        } else {\n            if (!\/^\\d{7,15}$\/.test(digitsOnly)) return false;\n        }\n        var checkSeq = digitsOnly.replace(\/^\\+\/, '');\n        if (\/^(\\d)\\1+$\/.test(checkSeq)) return false;\n        var asc = true, desc = true;\n        for (var i = 1; i < checkSeq.length; i++) {\n            var cur = parseInt(checkSeq[i], 10), prev = parseInt(checkSeq[i-1], 10);\n            if (isNaN(cur) || isNaN(prev)) { asc = false; desc = false; break; }\n            if (cur !== prev + 1) asc = false;\n            if (cur !== prev - 1) desc = false;\n        }\n        if (asc || desc) return false;\n        return true;\n    }\n    function _hcIsValidName(val) {\n        var normalized = val.replace(\/\\s+\/g, '');\n        if (normalized.length < 2) return false;\n        var firstChar = normalized.charAt(0).toLowerCase();\n        for (var i = 1; i < normalized.length; i++) {\n            if (normalized.charAt(i).toLowerCase() !== firstChar) {\n                return true;\n            }\n        }\n        return false;\n    }\n    function _hcGetSelectedPrefixInfo(form) {\n        var sel = form && form.querySelector('.hc-phone-prefix');\n        if (!sel) return { prefix: '', country: '' };\n        var opt = sel.options[sel.selectedIndex] || null;\n        return {\n            prefix: (sel.value || '').trim(),\n            country: opt ? (opt.getAttribute('data-country') || '') : ''\n        };\n    }\n    function _hcGuessCountryForDigits(digits, form) {\n        if (!(window.libphonenumber && window.libphonenumber.parsePhoneNumberFromString)) return null;\n        var sel = form && form.querySelector('.hc-phone-prefix');\n        if (!sel) return null;\n        for (var i = 0; i < sel.options.length; i++) {\n            var p = (sel.options[i].value || '').trim();\n            if (!p) continue;\n            try {\n                var phone = window.libphonenumber.parsePhoneNumberFromString(p + digits);\n                if (phone && phone.isValid()) {\n                    var cc = (phone.country || sel.options[i].getAttribute('data-country') || '');\n                    return { country: cc, prefix: p };\n                }\n            } catch (e) { \/* noop *\/ }\n        }\n        return null;\n    }\n    function _hcCountryLabel(code) {\n        var map = {\n            MX: 'M\u00e9xico', GT: 'Guatemala', ES: 'Espa\u00f1a', CO: 'Colombia', PE: 'Per\u00fa', EC: 'Ecuador',\n            CR: 'Costa Rica', BO: 'Bolivia', CL: 'Chile', AR: 'Argentina', UY: 'Uruguay', PY: 'Paraguay',\n            BR: 'Brasil', DO: 'Rep\u00fablica Dominicana', PR: 'Puerto Rico', CU: 'Cuba', JM: 'Jamaica',\n            PA: 'Panam\u00e1', NI: 'Nicaragua', HN: 'Honduras', SV: 'El Salvador', BZ: 'Belice',\n            GY: 'Guyana', SR: 'Surinam', GF: 'Guayana Francesa', HT: 'Hait\u00ed', VE: 'Venezuela'\n        };\n        return map[code] || code || '';\n    }\n    function _hcCheckValidity(form) {\n        return Array.from(form.querySelectorAll('[required]')).every(function(f) {\n            if (f.type === 'checkbox') return f.checked;\n            var v = (f.value || '').trim();\n            if (v === '') return false;\n            if (f.type === 'email') return _hcIsValidEmail(v);\n            if (f.type === 'tel') return _hcIsValidPhone(v, form);\n            if (f.name === 'first_name' || f.name === 'last_name') return _hcIsValidName(v);\n            return true;\n        });\n    }\n    function _hcUpdateBtn(container) {\n        var form = container.querySelector('form');\n        var btn = form && form.querySelector('.hc-submit');\n        if (btn) {\n            var newDisabled = !_hcCheckValidity(form);\n            if (btn._hcPrevDisabled !== newDisabled) {\n                console.info('[HC][Solicitud] submit ' + (newDisabled ? 'disabled' : 'enabled'));\n                btn._hcPrevDisabled = newDisabled;\n            }\n            btn.disabled = newDisabled;\n            if (!newDisabled) {\n                \/\/ Si el formulario completo es v\u00e1lido, limpiar mensajes residuales\n                container.querySelectorAll('.hc-field-error').forEach(function(n){ n.remove(); });\n            }\n        }\n    }\n    function _hcDisableBtn(container) {\n        var btn = container.querySelector('form .hc-submit');\n        if (btn) btn.disabled = true;\n    }\n\n    function _hcGetFieldError(f) {\n        var v = (f.value || '').trim();\n        if (f.type === 'checkbox') return f.checked ? '' : 'Este campo es obligatorio';\n        if (v === '') return 'Este campo es obligatorio';\n        if (f.type === 'email') return _hcIsValidEmail(v) ? '' : 'Correo electr\u00f3nico no v\u00e1lido';\n        if (f.type === 'tel') {\n            var digits = v.replace(\/[\\s\\-().]+\/g, '');\n            if (\/^(\\d)\\1+$\/.test(digits)) return 'El tel\u00e9fono no puede ser d\u00edgitos repetidos';\n            var asc = true, desc = true;\n            for (var i = 1; i < digits.length; i++) {\n                if (parseInt(digits[i]) !== parseInt(digits[i-1]) + 1) asc = false;\n                if (parseInt(digits[i]) !== parseInt(digits[i-1]) - 1) desc = false;\n            }\n            if (asc || desc) return 'El n\u00famero no puede ser una secuencia consecutiva';\n            if (window.libphonenumber && window.libphonenumber.parsePhoneNumberFromString) {\n                var ok = _hcIsValidPhone(v, f.form);\n                if (ok) return '';\n                var selInfo = _hcGetSelectedPrefixInfo(f.form);\n                var guess = _hcGuessCountryForDigits(digits, f.form);\n                if (guess && selInfo && guess.country && selInfo.country && guess.country !== selInfo.country) {\n                    return 'El tel\u00e9fono parece ser de ' + _hcCountryLabel(guess.country) + ' pero el prefijo seleccionado es ' + _hcCountryLabel(selInfo.country) + '. Corrige el prefijo o el n\u00famero.';\n                }\n                return 'Tel\u00e9fono no v\u00e1lido';\n            } else {\n                return \/^\\d{7,15}$\/.test(digits) ? '' : 'Ingresa entre 7 y 15 d\u00edgitos';\n            }\n            return '';\n        }\n        if (f.name === 'first_name' || f.name === 'last_name') {\n            if (v.replace(\/\\s+\/g, '').length < 2) return 'Debe tener al menos 2 letras';\n            if (_hcIsValidName(v) === false) return 'El nombre no puede repetir un solo caracter';\n            return '';\n        }\n        if (f.tagName === 'SELECT') {\n            return (f.value && f.value.trim() !== '') ? '' : 'Selecciona una opci\u00f3n';\n        }\n        return '';\n    }\n    function _hcShowError(field, msg) {\n        var wrapper = field.closest('.hc-field') || field.closest('.hc-checkbox-group') || field.parentElement;\n        var existing = wrapper.querySelector('.hc-field-error');\n        if (msg) {\n            if (!existing) {\n                existing = document.createElement('span');\n                existing.className = 'hc-field-error';\n                wrapper.appendChild(existing);\n            }\n            existing.textContent = msg;\n        } else if (existing) {\n            existing.remove();\n        }\n    }\n    function _hcValidateField(f) {\n        if (!f || !f.hasAttribute('required')) return;\n        var raw = (f.value || '').trim();\n        var isCheckbox = f.type === 'checkbox';\n        var hasValue = isCheckbox ? f.checked : raw !== '';\n        var shouldShow = !!f._hcTouched || hasValue;\n        if (!shouldShow) {\n            _hcShowError(f, '');\n            return;\n        }\n        var msg = _hcGetFieldError(f);\n        _hcShowError(f, msg);\n    }\n\n    document.addEventListener('blur', function(e) {\n        var c = e.target.closest && e.target.closest('.hc-form-container[data-hc-validate]');\n        if (c) {\n            if (e.isTrusted !== false) {\n                e.target._hcTouched = true;\n            }\n            _hcValidateField(e.target);\n            if (e.target && e.target.type === 'tel') {\n                var form = e.target.form;\n                var prefix = '';\n                var sel = form && form.querySelector('.hc-phone-prefix');\n                if (sel && sel.value) prefix = (sel.value || '').trim();\n                var valid = _hcIsValidPhone(e.target.value, form);\n                console.info('[HC][Solicitud] phone check', { prefix: prefix, raw: e.target.value, valid: valid, lib: !!(window.libphonenumber && window.libphonenumber.parsePhoneNumberFromString) });\n            }\n            _hcUpdateBtn(c);\n        }\n    }, true);\n    document.addEventListener('input', function(e) {\n        var c = e.target.closest && e.target.closest('.hc-form-container[data-hc-validate]');\n        if (c) {\n            if (e.isTrusted !== false) {\n                e.target._hcTouched = true;\n            }\n            _hcValidateField(e.target);\n            _hcUpdateBtn(c);\n        }\n    }, true);\n    document.addEventListener('change', function(e) {\n        var c = e.target.closest && e.target.closest('.hc-form-container[data-hc-validate]');\n        if (c) {\n            if (e.isTrusted !== false) {\n                e.target._hcTouched = true;\n            }\n            _hcValidateField(e.target);\n            \/\/ Si cambi\u00f3 el prefijo, revalida tambi\u00e9n el campo tel\u00e9fono para limpiar\/actualizar el error\n            if (e.target.matches && e.target.matches('.hc-phone-prefix')) {\n                var phone = e.target.form && e.target.form.querySelector('input[name=\"phone\"]');\n                if (phone) {\n                    phone._hcTouched = true;\n                    _hcValidateField(phone);\n                }\n            }\n            _hcUpdateBtn(c);\n        }\n    }, true);\n\n    \/\/ Si la librer\u00eda se carga globalmente m\u00e1s tarde, revalidar estados\n    window.addEventListener('hc:phone-lib-ready', function() {\n        document.querySelectorAll('.hc-form-container[data-hc-validate]').forEach(function(c) {\n            var form = c.querySelector('form');\n            if (!form) return;\n            var phone = form.querySelector('input[name=\"phone\"]');\n            if (phone && (phone._hcTouched || (phone.value || '').trim() !== '')) {\n                phone._hcTouched = true;\n                _hcValidateField(phone);\n            }\n            _hcUpdateBtn(c);\n        });\n    });\n\n    document.querySelectorAll('.hc-form-container[data-hc-validate]').forEach(_hcDisableBtn);\n    new MutationObserver(function(mutations) {\n        mutations.forEach(function(m) {\n            m.addedNodes.forEach(function(node) {\n                if (node.nodeType !== 1) return;\n                if (node.matches && node.matches('.hc-form-container[data-hc-validate]')) _hcDisableBtn(node);\n                if (node.querySelectorAll) node.querySelectorAll('.hc-form-container[data-hc-validate]').forEach(_hcDisableBtn);\n            });\n        });\n    }).observe(document.documentElement, { childList: true, subtree: true });\n}\n<\/script><\/div>\n<script type=\"text\/javascript\">\n\/* Healthcademia Default Form JS *\/\n(function() {\n    \/\/ Funci\u00f3n para inicializar el formulario\n    function initForm() {\n        \/\/ Buscar el contenedor - intentar varias formas\n        let container = document.getElementById('hc_form_1_5139');\n        \n        \/\/ Si no se encuentra, buscar por clase como fallback\n        if (!container) {\n            const containers = document.querySelectorAll('.hc-form-container');\n            if (containers.length > 0) {\n                container = containers[containers.length - 1]; \/\/ Tomar el \u00faltimo\n            }\n        }\n        \n        if (!container) {\n            return false;\n        }\n\n        const form = container.querySelector('form');\n        if (!form) {\n            return false;\n        }\n        \n        \/\/ Asegurarse de que el formulario no se env\u00ede de forma tradicional\n        form.setAttribute('novalidate', 'novalidate');\n        if (form.hasAttribute('action')) {\n            form.removeAttribute('action');\n        }\n        if (form.hasAttribute('method')) {\n            form.removeAttribute('method');\n        }\n    \n    const wrapper = container.closest('.healthcademia-form-wrapper');\n    const endpoints = {\n        leads: container.dataset.restLeads,\n        programs: container.dataset.restPrograms\n    };\n    const restNonce = (wrapper && wrapper.dataset.restNonce) || container.dataset.restNonce || '';\n    const redirectUrl = ((wrapper && wrapper.dataset.redirect) || container.dataset.redirect || '').trim();\n    const privacyUrl = (wrapper && wrapper.dataset.privacyUrl) || '';\n    const successMessage = (wrapper && wrapper.dataset.successMessage) || '\u00a1Hemos recibido tus datos! Nos pondremos en contacto contigo muy pronto.';\n    const recaptchaSiteKey = (wrapper && wrapper.dataset.recaptchaKey) || '';\n    const programId = container.dataset.programId;\n    let countryPrefixes = {};\n    let defaultRegion = container.dataset.region || '';\n    try {\n        countryPrefixes = JSON.parse(container.dataset.countryPrefixes || '{}');\n    } catch (error) {\n        countryPrefixes = {};\n    }\n    \/\/ JavaScript solo recoge la respuesta del servidor\n    const emailInput = form.querySelector('input[name=\"email\"]');\n    const phoneInput = form.querySelector('input[name=\"phone\"]');\n    const countrySelect = form.querySelector('select[name=\"country\"]');\n    const regionInput = form.querySelector('input[name=\"region\"]');\n    const statusBox = container.querySelector('.hc-form-status');\n    const successMessageBox = container.querySelector('.hc-form-success-message');\n\n    const setStatus = (state, message) => {\n        if (!statusBox) {\n            return;\n        }\n        if (message) {\n            statusBox.textContent = message;\n            statusBox.className = 'hc-form-status ' + state;\n            statusBox.style.display = 'block';\n        } else {\n            statusBox.textContent = '';\n            statusBox.className = 'hc-form-status';\n            statusBox.style.display = '';\n        }\n    };\n\n    const setSuccessMessage = (message) => {\n        if (!successMessageBox) {\n            return;\n        }\n        if (message) {\n            successMessageBox.textContent = message;\n            successMessageBox.className = 'hc-form-success-message success';\n            successMessageBox.style.display = 'block';\n        } else {\n            successMessageBox.textContent = '';\n            successMessageBox.style.display = 'none';\n        }\n    };\n\n    const setLoading = (flag) => {\n        if (!container) return;\n        if (flag) {\n            container.classList.add('is-loading');\n        } else {\n            container.classList.remove('is-loading');\n        }\n    };\n\n    \/\/ Sanitizar tel\u00e9fono: eliminar todo excepto n\u00fameros, +, (, ), -, ., espacios\n    \/\/ Esto se usa solo al enviar al servidor, no en tiempo real\n    const sanitizePhone = (value) => (value || '').replace(\/[^0-9+()\\-\\s.]\/g, '');\n    \n    \/\/ Funci\u00f3n para permitir caracteres est\u00e1ndar de tel\u00e9fono mientras el usuario escribe\n    \/\/ Permite: n\u00fameros, +, (, ), -, ., espacios\n    \/\/ Ejemplos v\u00e1lidos: +34 612 345 678, (612) 345-678, +34.612.345.678, +34-612-345-678\n    const allowPhoneChars = (value) => {\n        return (value || '').replace(\/[^0-9+()\\-\\s.]\/g, '');\n    };\n    const sanitizeLetters = (value) => (value || '').replace(\/[^A-Za-z\u00c0-\u00ff\\s'-]\/g, '');\n    const getPhonePrefix = () => {\n        if (!countrySelect) {\n            return '';\n        }\n        return countryPrefixes[countrySelect.value] || '';\n    };\n\n    const updateRegionField = () => {\n        if (!regionInput) {\n            return;\n        }\n        \n        \/\/ Si no hay program_id, usar siempre la regi\u00f3n global de la configuraci\u00f3n\n        if (!programId) {\n            regionInput.value = defaultRegion || 'Iberia';\n            return;\n        }\n        \n        \/\/ Si hay program_id, inferir regi\u00f3n del pa\u00eds seleccionado\n        if (!countrySelect || !countrySelect.value) {\n            regionInput.value = defaultRegion || 'Iberia';\n            return;\n        }\n        const countryValue = countrySelect.value.toLowerCase();\n        const iberiaSet = ['espa\u00f1a', 'spain', 'espa\\u00f1a'];\n        regionInput.value = iberiaSet.includes(countryValue) ? 'Iberia' : 'LATAM';\n    };\n\n    if (regionInput && !regionInput.value) {\n        regionInput.value = defaultRegion || 'Iberia';\n    }\n    \n    \/\/ Solo actualizar regi\u00f3n basada en pa\u00eds si hay program_id\n    if (countrySelect && programId) {\n        updateRegionField();\n        countrySelect.addEventListener('change', updateRegionField);\n    } else if (countrySelect && !programId) {\n        \/\/ Si no hay program_id, mantener la regi\u00f3n global siempre\n        updateRegionField();\n    }\n\n    if (phoneInput) {\n        \/\/ Permitir caracteres est\u00e1ndar de tel\u00e9fono en tiempo real (+, (, ), -, espacios)\n        \/\/ Form Guard necesita estos caracteres para validar correctamente\n        phoneInput.addEventListener('input', () => {\n            \/\/ Solo eliminar caracteres no permitidos, pero mantener formato est\u00e1ndar\n            const allowed = allowPhoneChars(phoneInput.value);\n            if (allowed !== phoneInput.value) {\n                phoneInput.value = allowed;\n            }\n            \n            \/\/ Limpiar errores al escribir\n            phoneInput.classList.remove('hc-error');\n            phoneInput.setCustomValidity('');\n        });\n        \n        \/\/ Limpiar error del selector de prefijos tambi\u00e9n\n        const phonePrefixSelect = form.querySelector('select[name=\"phone_prefix\"]');\n        if (phonePrefixSelect) {\n            phonePrefixSelect.addEventListener('change', () => {\n                phonePrefixSelect.classList.remove('hc-error');\n                phoneInput.classList.remove('hc-error');\n                phoneInput.setCustomValidity('');\n            });\n        }\n    }\n    form.querySelectorAll('[data-only-letters=\"true\"]').forEach((input) => {\n        input.addEventListener('input', () => {\n            const sanitized = sanitizeLetters(input.value);\n            if (sanitized !== input.value) {\n                input.value = sanitized;\n            }\n        });\n    });\n\n    const hydrateUTMs = () => {\n        const params = new URLSearchParams(window.location.search);\n        ['utm_campaign','utm_source','utm_medium','utm_term','utm_content'].forEach(key => {\n            const el = form.querySelector('[name=\"' + key + '\"]');\n            if (el && params.get(key)) {\n                el.value = params.get(key);\n            }\n        });\n    };\n\n    const validateForm = () => {\n        let valid = true;\n        const invalidFields = [];\n        \/\/ Primero limpiar todos los errores\n        form.querySelectorAll('[required]').forEach(field => {\n            field.classList.remove('hc-error');\n            \/\/ Limpiar error del label del checkbox tambi\u00e9n\n            if (field.type === 'checkbox') {\n                const label = field.closest('label');\n                if (label) {\n                    label.classList.remove('hc-error');\n                }\n            }\n        });\n        \/\/ Limpiar tambi\u00e9n el prefijo telef\u00f3nico y labels flotantes\n        const phonePrefixSelect = form.querySelector('select[name=\"phone_prefix\"]');\n        if (phonePrefixSelect) {\n            phonePrefixSelect.classList.remove('hc-error');\n        }\n        \n        \/\/ Luego validar y marcar errores\n        form.querySelectorAll('[required]').forEach(field => {\n            let fieldValid = true;\n            \n            if (field.type === 'checkbox') {\n                \/\/ Para checkboxes, validar si est\u00e1 checkeado\n                fieldValid = field.checked;\n            } else {\n                \/\/ Para inputs normales, validar si tiene valor\n                fieldValid = field.value && field.value.trim() !== '';\n            }\n            \n            if (!fieldValid) {\n                field.classList.add('hc-error');\n                \/\/ Para checkboxes, tambi\u00e9n marcar el label\n                if (field.type === 'checkbox') {\n                    const label = field.closest('label');\n                    if (label) {\n                        label.classList.add('hc-error');\n                    }\n                }\n                \/\/ Si es el campo de tel\u00e9fono, tambi\u00e9n marcar el prefijo si est\u00e1 visible\n                if (field.name === 'phone' && phonePrefixSelect) {\n                    const isVisible = window.getComputedStyle(phonePrefixSelect).display !== 'none';\n                    if (isVisible) {\n                        phonePrefixSelect.classList.add('hc-error');\n                    }\n                }\n                valid = false;\n                \/\/ Recopilar nombres de campos inv\u00e1lidos para el mensaje\n                const fieldName = field.getAttribute('name') || field.getAttribute('id') || 'campo';\n                if (field.type === 'checkbox') {\n                    invalidFields.push('aceptar la pol\u00edtica de privacidad');\n                } else {\n                    const label = field.closest('.hc-field')?.querySelector('label');\n                    const labelText = label ? label.textContent.replace('*', '').trim() : fieldName;\n                    invalidFields.push(labelText.toLowerCase());\n                }\n            }\n        });\n        \n        \/\/ Validar email espec\u00edficamente (puede estar vac\u00edo o con formato inv\u00e1lido)\n        if (emailInput) {\n            const emailValue = emailInput.value.trim();\n            if (!emailValue) {\n                \/\/ Email vac\u00edo - ya deber\u00eda estar marcado por [required], pero nos aseguramos\n                if (!emailInput.classList.contains('hc-error')) {\n                    emailInput.classList.add('hc-error');\n                    valid = false;\n                }\n            }\n        }\n        \n        \/\/ Mostrar mensaje de error si hay campos inv\u00e1lidos\n        if (!valid && invalidFields.length > 0) {\n            const message = 'Por favor, revisa el formulario.';\n            setStatus('error', message);\n        }\n        return valid;\n    };\n\n    const validateEmailFormat = () => {\n        if (!emailInput) {\n            return true;\n        }\n        const value = emailInput.value.trim();\n        \/\/ Si est\u00e1 vac\u00edo, no validar formato (ya se valida en validateForm)\n        if (!value) {\n            return true;\n        }\n        const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\n        const isValid = emailRegex.test(value);\n        emailInput.setCustomValidity(isValid ? '' : 'Email err\u00f3neo');\n        if (!isValid) {\n            emailInput.classList.add('hc-error');\n            emailInput.reportValidity();\n            setStatus('error', 'Email no v\u00e1lido');\n        }\n        return isValid;\n    };\n\n    \/\/ La validaci\u00f3n de Clearout se hace SOLO en el servidor (PHP)\n    \/\/ JavaScript solo recoge la respuesta del servidor\n\n\n    form.querySelectorAll('input, textarea, select').forEach(el => {\n        el.addEventListener('input', () => {\n            el.classList.remove('hc-error');\n            \/\/ Limpiar error del label si es checkbox\n            if (el.type === 'checkbox') {\n                const label = el.closest('label');\n                if (label) {\n                    label.classList.remove('hc-error');\n                }\n            }\n            if (el === emailInput) {\n                emailInput.setCustomValidity('');\n            }\n            if (el === phoneInput) {\n                phoneInput.setCustomValidity('');\n            }\n            \/\/ Limpiar mensaje de error cuando el usuario empieza a escribir\n            if (statusBox && statusBox.classList.contains('error')) {\n                setStatus('', '');\n            }\n        });\n        el.addEventListener('change', () => {\n            el.classList.remove('hc-error');\n            \/\/ Limpiar error del label si es checkbox\n            if (el.type === 'checkbox') {\n                const label = el.closest('label');\n                if (label) {\n                    label.classList.remove('hc-error');\n                }\n            }\n        });\n    });\n\n    const applyPrivacyLink = () => {\n        if (!privacyUrl) {\n            return;\n        }\n        const targetLink = form.querySelector('[data-privacy-link]') || form.querySelector('.hc-checkbox-group a');\n        if (targetLink) {\n            targetLink.setAttribute('href', privacyUrl);\n            targetLink.setAttribute('target', '_blank');\n            targetLink.setAttribute('rel', 'noopener');\n        }\n    };\n\n    applyPrivacyLink();\n    \n    \/\/ Si no hay program_id, configurar el listener para cuando se seleccione un programa\n    if (!programId) {\n        const programSelect = form.querySelector('select[name=\"program_id_select\"]');\n        if (programSelect) {\n            programSelect.addEventListener('change', function() {\n                const selectedProgramId = this.value;\n                if (selectedProgramId) {\n                    \/\/ Actualizar los inputs hidden inmediatamente\n                    const programIdInput = form.querySelector('input[name=\"program_id\"]');\n                    if (programIdInput) {\n                        programIdInput.value = selectedProgramId;\n                    }\n                    loadProgramData(selectedProgramId);\n                } else {\n                    \/\/ Si se deselecciona, limpiar los inputs hidden y ocultar los selects\n                    const programIdInput = form.querySelector('input[name=\"program_id\"]');\n                    const programNameInput = form.querySelector('input[name=\"program_name\"]');\n                    if (programIdInput) {\n                        programIdInput.value = '';\n                    }\n                    if (programNameInput) {\n                        programNameInput.value = '';\n                    }\n                    hideProgramSelects();\n                }\n            });\n        }\n    }\n    \n    \/\/ Funci\u00f3n para cargar los datos de un programa espec\u00edfico\n    function loadProgramData(programId) {\n        if (!endpoints.programs || !programId) {\n            return;\n        }\n        \n        \/\/ Obtener configuraci\u00f3n de visibilidad de la p\u00e1gina\n        const displayConfig = container.dataset.displayConfig ? JSON.parse(container.dataset.displayConfig) : {};\n        \n        \/\/ Obtener el grid de selects\n        let selectsGrid = container.querySelector('.hc-selects-grid');\n        \n        \/\/ Si no existe el grid, crearlo vac\u00edo (se llenar\u00e1 despu\u00e9s con skeleton y selects seg\u00fan datos)\n        if (!selectsGrid) {\n            \/\/ Buscar d\u00f3nde insertar el grid (despu\u00e9s del select de programa o antes de los checkboxes)\n            const programSelect = form.querySelector('select[name=\"program_id_select\"]') || form.querySelector('select[name=\"program_id\"]');\n            const checkboxes = form.querySelector('.hc-checkbox-group');\n            \n            \/\/ Crear el grid vac\u00edo (no crear campos hasta tener los datos del programa)\n            selectsGrid = document.createElement('div');\n            selectsGrid.className = 'hc-selects-grid';\n            selectsGrid.style.display = 'none'; \/\/ Oculto hasta que haya datos\n            \n            \/\/ Insertar el grid en el formulario\n            if (programSelect && programSelect.parentElement) {\n                programSelect.parentElement.insertAdjacentElement('afterend', selectsGrid);\n            } else if (checkboxes && checkboxes.parentElement) {\n                checkboxes.parentElement.insertBefore(selectsGrid, checkboxes);\n            } else {\n                \/\/ Fallback: insertar antes del bot\u00f3n submit\n                const submitButton = form.querySelector('button[type=\"submit\"]');\n                if (submitButton && submitButton.parentElement) {\n                    submitButton.parentElement.insertBefore(selectsGrid, submitButton);\n                }\n            }\n        }\n        \n        fetch(endpoints.programs + '?program_id=' + encodeURIComponent(programId) + '&X-WP-Nonce=' + encodeURIComponent(restNonce), {\n            method: 'GET',\n            headers: {\n                'X-WP-Nonce': restNonce\n            },\n            credentials: 'same-origin'\n        })\n        .then(resp => {\n            if (!resp.ok) {\n                return resp.json().then(errorData => {\n                    throw new Error(errorData.message || 'Error al cargar datos del programa');\n                });\n            }\n            return resp.json();\n        })\n        .then(response => {\n            if (response.success && response.data && response.data.length > 0) {\n                const program = response.data[0];\n                \n                \/\/ Actualizar los inputs hidden con el program_id y program_name\n                const programIdInput = form.querySelector('input[name=\"program_id\"]');\n                const programNameInput = form.querySelector('input[name=\"program_name\"]');\n                \n                if (programIdInput) {\n                    programIdInput.value = programId;\n                }\n                if (programNameInput) {\n                    programNameInput.value = program.nombre || '';\n                }\n                \n                \/\/ Verificar qu\u00e9 campos tienen datos Y est\u00e1n habilitados en la configuraci\u00f3n\n                \/\/ Solo mostrar skeleton y selects para campos que cumplen ambas condiciones\n                const fieldsToShow = [];\n                const fields = [\n                    { name: 'convocatoria', label: 'Convocatoria', data: program.convocatoria },\n                    { name: 'edicion', label: 'Edici\u00f3n', data: program.edicion },\n                    { name: 'modalidad', label: 'Modalidad', data: program.modalidad },\n                    { name: 'sede', label: 'Sede', data: program.sede }\n                ];\n                \n                fields.forEach(field => {\n                    \/\/ Verificar: 1) est\u00e1 habilitado en la configuraci\u00f3n, 2) tiene datos (m\u00e1s de 1 opci\u00f3n)\n                    const isEnabled = displayConfig[field.name] !== false;\n                    const hasData = field.data && field.data.length > 1;\n                    \n                    if (isEnabled && hasData) {\n                        fieldsToShow.push(field);\n                    }\n                });\n                \n                \/\/ Si hay campos para mostrar, mostrar skeleton y luego los selects\n                if (fieldsToShow.length > 0) {\n                    \/\/ Mostrar skeleton solo para los campos que se van a mostrar\n                    showSkeletonLoading(selectsGrid, fieldsToShow.map(f => f.name));\n                    \n                    \/\/ Simular un peque\u00f1o delay para que se vea el skeleton\n                    setTimeout(() => {\n                        hideSkeletonLoading(selectsGrid);\n                        \n                        \/\/ Asegurar que el grid existe y est\u00e1 visible\n                        if (!selectsGrid) {\n                            selectsGrid = container.querySelector('.hc-selects-grid');\n                        }\n                        if (selectsGrid) {\n                            selectsGrid.style.display = 'grid';\n                        }\n                        \n                        \/\/ Mostrar los selects del programa con sus opciones (solo los habilitados y con datos)\n                        showProgramSelects(program, selectsGrid, displayConfig);\n                    }, 300);\n                } else {\n                    \/\/ Si no hay campos para mostrar, ocultar el grid\n                    if (selectsGrid) {\n                        selectsGrid.style.display = 'none';\n                        selectsGrid.innerHTML = '';\n                    }\n                }\n            } else {\n                if (selectsGrid) {\n                    selectsGrid.style.display = 'none';\n                }\n                setStatus('error', 'No se encontraron datos para el programa seleccionado');\n            }\n        })\n        .catch(error => {\n            if (selectsGrid) {\n                selectsGrid.style.display = 'none';\n            }\n            setStatus('error', 'Error al cargar datos del programa: ' + error.message);\n        });\n    }\n    \n    \/\/ Funci\u00f3n para mostrar skeleton loading solo para campos espec\u00edficos que se van a mostrar\n    function showSkeletonLoading(selectsGrid, enabledFields) {\n        \/\/ Limpiar contenido previo (skeleton y selects existentes)\n        selectsGrid.innerHTML = '';\n        selectsGrid.style.display = 'grid';\n        \n        \/\/ Generar skeleton SOLO para los campos que est\u00e1n habilitados Y tienen datos\n        enabledFields.forEach(fieldName => {\n            const skeletonWrapper = document.createElement('div');\n            skeletonWrapper.className = 'hc-field hc-skeleton-field';\n            skeletonWrapper.setAttribute('data-field', fieldName + '-wrapper');\n            \n            const skeletonBar = document.createElement('div');\n            skeletonBar.className = 'hc-skeleton';\n            skeletonBar.innerHTML = '<div class=\"hc-skeleton-line\"><\/div>';\n            \n            skeletonWrapper.appendChild(skeletonBar);\n            selectsGrid.appendChild(skeletonWrapper);\n        });\n    }\n    \n    \/\/ Funci\u00f3n para ocultar skeleton loading\n    function hideSkeletonLoading(selectsGrid) {\n        if (!selectsGrid) return;\n        \/\/ Solo remover los skeleton, NO limpiar todo el innerHTML\n        \/\/ porque los selects se crear\u00e1n despu\u00e9s\n        const skeletonFields = selectsGrid.querySelectorAll('.hc-skeleton-field');\n        skeletonFields.forEach(field => field.remove());\n    }\n    \n    \/\/ Funci\u00f3n para mostrar los selects del programa\n    \/\/ Solo crea\/actualiza selects para campos habilitados Y con datos disponibles\n    function showProgramSelects(program, selectsGridParam, displayConfig) {\n        \/\/ Asegurar que tenemos referencia al grid\n        let selectsGrid = selectsGridParam || container.querySelector('.hc-selects-grid');\n        \n        if (!selectsGrid) {\n            return;\n        }\n        \n        \/\/ Funci\u00f3n auxiliar para crear\/actualizar un select\n        const createOrUpdateSelect = (name, label, values) => {\n            \/\/ Verificar que est\u00e1 habilitado en la configuraci\u00f3n\n            if (displayConfig && displayConfig[name] === false) {\n                return false; \/\/ Campo deshabilitado, no crear\n            }\n            \n            \/\/ Verificar que hay datos\n            if (!values || values.length <= 1) {\n                return false; \/\/ No hay datos suficientes\n            }\n            \n            \/\/ Buscar si ya existe un wrapper (puede venir del skeleton o de creaci\u00f3n previa)\n            let selectWrapper = selectsGrid.querySelector('[data-field=\"' + name + '-wrapper\"]');\n            \n            if (!selectWrapper) {\n                \/\/ Crear el wrapper si no existe\n                selectWrapper = document.createElement('div');\n                selectWrapper.className = 'hc-field';\n                selectWrapper.setAttribute('data-field', name + '-wrapper');\n                selectsGrid.appendChild(selectWrapper);\n            }\n            \n            \/\/ Buscar o crear el select\n            let select = selectWrapper.querySelector('select[name=\"' + name + '\"]');\n            \n            if (!select) {\n                \/\/ Crear el select si no existe\n                select = document.createElement('select');\n                select.name = name;\n                select.className = 'hc-select';\n                select.required = true;\n                selectWrapper.appendChild(select);\n            }\n            \n            \/\/ Actualizar las opciones\n            select.innerHTML = '<option value=\"\">' + label + '<\/option>';\n            values.forEach(value => {\n                const option = document.createElement('option');\n                option.value = value;\n                option.textContent = value;\n                select.appendChild(option);\n            });\n            \n            \/\/ Asegurar que el wrapper est\u00e1 visible\n            selectWrapper.style.display = 'block';\n            return true;\n        };\n        \n        \/\/ Crear\/actualizar solo los selects que est\u00e1n habilitados Y tienen datos\n        let hasVisibleSelects = false;\n        \n        if (program.convocatoria && program.convocatoria.length > 1) {\n            if (createOrUpdateSelect('convocatoria', 'Convocatoria', program.convocatoria)) {\n                hasVisibleSelects = true;\n            }\n        }\n        \n        if (program.edicion && program.edicion.length > 1) {\n            if (createOrUpdateSelect('edicion', 'Edici\u00f3n', program.edicion)) {\n                hasVisibleSelects = true;\n            }\n        }\n        \n        if (program.modalidad && program.modalidad.length > 1) {\n            if (createOrUpdateSelect('modalidad', 'Modalidad', program.modalidad)) {\n                hasVisibleSelects = true;\n            }\n        }\n        \n        if (program.sede && program.sede.length > 1) {\n            if (createOrUpdateSelect('sede', 'Sede', program.sede)) {\n                hasVisibleSelects = true;\n            }\n        }\n        \n        \/\/ Mostrar\/ocultar el grid seg\u00fan si hay selects visibles\n        if (selectsGrid) {\n            if (hasVisibleSelects) {\n                selectsGrid.style.display = 'grid';\n            } else {\n                selectsGrid.style.display = 'none';\n            }\n        }\n    }\n    \n    \/\/ Funci\u00f3n para ocultar los selects del programa\n    function hideProgramSelects() {\n        const selectsGrid = container.querySelector('.hc-selects-grid');\n        if (selectsGrid) {\n            selectsGrid.style.display = 'none';\n            selectsGrid.innerHTML = '';\n        }\n        \n        const programNameInput = form.querySelector('input[name=\"program_name\"]');\n        if (programNameInput) {\n            programNameInput.value = '';\n        }\n    }\n\n    form.addEventListener('submit', async function(event) {\n\n        \/\/ Bloquear el bot\u00f3n durante 2 segundos para prevenir env\u00edos duplicados\n        const submitButton = form.querySelector('.hc-submit');\n        if (submitButton) {\n            \/\/ Guardar el texto original\n            const originalText = submitButton.textContent || submitButton.innerText;\n            \n            \/\/ Cambiar a indicador de carga con spinner peque\u00f1o\n            submitButton.innerHTML = '<span style=\"display: inline-block; width: 16px; height: 16px; border: 2px solid rgba(255,255,255,0.3); border-top-color: #fff; border-radius: 50%; animation: hc-spin 0.8s linear infinite; margin-right: 8px; vertical-align: middle;\"><\/span>';\n            submitButton.disabled = true;\n            submitButton.style.cursor = 'not-allowed';\n            submitButton.style.opacity = '0.6';\n            \n            setTimeout(() => {\n                \/\/ Restaurar el texto original\n                submitButton.textContent = originalText;\n                submitButton.disabled = false;\n                submitButton.style.cursor = 'pointer';\n                submitButton.style.opacity = '1';\n            }, 2000);\n        }\n\n        \/\/ PREVENIR ENV\u00cdO TRADICIONAL - SIEMPRE PRIMERO\n        event.preventDefault();\n        event.stopPropagation();\n        \n        \/\/ Limpiar mensajes anteriores\n        setStatus('', '');\n        setSuccessMessage('');\n        \n        \/\/ Validaciones b\u00e1sicas ANTES de mostrar spinner\n        let hasErrors = false;\n        \n        \/\/ Validar campos obligatorios (marca en rojo autom\u00e1ticamente y muestra mensaje)\n        if (!validateForm()) {\n            hasErrors = true;\n        }\n        \n        \/\/ Validar formato de email (marca en rojo autom\u00e1ticamente y muestra mensaje)\n        if (!validateEmailFormat()) {\n            hasErrors = true;\n        }\n        \n        \/\/ Si hay errores, no continuar (los campos ya est\u00e1n marcados en rojo y el mensaje mostrado)\n        if (hasErrors) {\n            return;\n        }\n\n        \n        \/\/ Si todo est\u00e1 bien, mostrar spinner y continuar\n        setLoading(true);\n        \n        \/\/ Obtener token de reCAPTCHA v3 si est\u00e1 configurado\n        let recaptchaToken = '';\n        if (recaptchaSiteKey && window.grecaptcha) {\n            try {\n                recaptchaToken = await window.grecaptcha.execute(recaptchaSiteKey, { action: 'submit_lead' });\n            } catch (error) {\n                console.error('[reCAPTCHA] Error obteniendo token:', error);\n                \/\/ Si falla reCAPTCHA, continuar de todos modos (fallback)\n            }\n        }\n\n        const formData = new FormData(form);\n        \n        \/\/ Procesar tel\u00e9fono: concatenar prefijo si el selector est\u00e1 visible\n        let phoneRawInput = formData.get('phone') || '';\n        let phoneCountryCode = '';\n        const phonePrefixSelect = form.querySelector('select[name=\"phone_prefix\"]');\n        \n        \/\/ Solo procesar si el selector est\u00e1 visible (display !== 'none')\n        if (phonePrefixSelect && window.getComputedStyle(phonePrefixSelect).display !== 'none') {\n            const selectedPrefix = phonePrefixSelect.value || '+34';\n            const selectedOption = phonePrefixSelect.options[phonePrefixSelect.selectedIndex];\n            phoneCountryCode = selectedOption.getAttribute('data-country') || '';\n            \n            \/\/ Concatenar prefijo solo si el n\u00famero NO empieza con +\n            if (phoneRawInput && !phoneRawInput.trim().startsWith('+')) {\n                phoneRawInput = selectedPrefix + phoneRawInput.trim();\n            }\n        }\n        \n        const phoneRaw = sanitizePhone(phoneRawInput);\n        \n        const privacyAccepted = formData.get('privacy') ? '1' : '0';\n        const leadSource = formData.get('lead_source') || 'P\u00e1gina Web';\n        const tipoOrigen = formData.get('tipo_origen') || 'Digital';\n        const regionValue = formData.get('region') || '';\n        const phoneSecondary = sanitizePhone(formData.get('phone_secondary') || '');\n\n        \/\/ Obtener program_id del select si no est\u00e1 en el contexto inicial\n        const selectedProgramId = formData.get('program_id') || programId || '';\n        const selectedProgramName = formData.get('program_name') || '';\n        \n        \/\/ Si no hay program_id, usar siempre la regi\u00f3n global de la configuraci\u00f3n\n        \/\/ Si hay program_id, usar la regi\u00f3n inferida del pa\u00eds o la global como fallback\n        let finalRegion = defaultRegion || 'Iberia';\n        if (selectedProgramId && regionValue) {\n            finalRegion = regionValue;\n        } else if (!selectedProgramId) {\n            \/\/ Sin program_id: siempre usar regi\u00f3n global\n            finalRegion = defaultRegion || 'Iberia';\n        }\n        \n        \/\/ Obtener datos de Form Guard (si est\u00e1n disponibles)\n        const clearoutPhoneStatus = formData.get('clearout_phone_status') || '';\n        const clearoutPhoneCountryCode = formData.get('clearout_phone_country_code') || '';\n        const clearoutPhoneE164 = formData.get('clearout_phone_e164') || '';\n        \n        \/\/ Usar el tel\u00e9fono validado (E164) si est\u00e1 disponible, sino usar el tel\u00e9fono raw\n        const phoneToSend = clearoutPhoneE164 || phoneRaw;\n        \n        \/\/ Obtener GCLID de Google Ads (capturado por el script de Zoho)\n        const zcGadInput = form.querySelector('#zc_gad');\n        let zcGad = '';\n        if (zcGadInput) {\n            const rawValue = zcGadInput.value || '';\n            \/\/ Filtrar valores inv\u00e1lidos: undefined, null, 'undefined', 'null', strings vac\u00edos\n            if (rawValue && rawValue !== 'undefined' && rawValue !== 'null' && rawValue.trim() !== '') {\n                zcGad = rawValue.trim();\n            }\n        }\n        \n        const payload = {\n            program_id: selectedProgramId,\n            program_name: selectedProgramName,\n            first_name: formData.get('first_name') || '',\n            last_name: formData.get('last_name') || '',\n            email: formData.get('email') || '',\n            phone: phoneToSend,\n            \/\/ Datos de Form Guard para tel\u00e9fono\n            clearout_phone_status: clearoutPhoneStatus,\n            clearout_phone_country_code: clearoutPhoneCountryCode,\n            clearout_phone_e164: clearoutPhoneE164,\n            phone_secondary: phoneSecondary,\n            \/\/ Pa\u00eds del selector de prefijos (para clearoutphone.io)\n            phone_prefix_country: phoneCountryCode,\n            \/\/ Token de reCAPTCHA v3\n            recaptcha_token: recaptchaToken,\n            country: formData.get('country') || '',\n            region: finalRegion,\n            convocatoria: formData.get('convocatoria') || '',\n            sede: formData.get('sede') || '',\n            modalidad: formData.get('modalidad') || '',\n            edicion: formData.get('edicion') || '',\n            comments: formData.get('comments') || '',\n            marketing: formData.get('marketing') ? '1' : '0',\n            privacy: privacyAccepted,\n            lead_source: leadSource,\n            tipo_origen: tipoOrigen,\n            traffic_source: formData.get('traffic_source') || '',\n            \/\/ GCLID de Google Ads (capturado por script de Zoho)\n            zc_gad: zcGad,\n            utm: {\n                campaign: formData.get('utm_campaign') || '',\n                source: formData.get('utm_source') || '',\n                medium: formData.get('utm_medium') || '',\n                term: formData.get('utm_term') || '',\n                content: formData.get('utm_content') || ''\n            }\n        };\n\n        fetch(endpoints.leads, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application\/json',\n                'X-WP-Nonce': restNonce\n            },\n            credentials: 'same-origin',\n            body: JSON.stringify(payload)\n        })\n        .then(resp => {\n            console.log('[Form] Response status:', resp.status, 'OK:', resp.ok);\n            \n            \/\/ Verificar si la respuesta es un error HTTP\n            if (!resp.ok) {\n                return resp.json().then(errorData => {\n                    console.log('[Form] Error HTTP response:', errorData);\n                    \/\/ WordPress REST API devuelve errores con 'code' y 'message'\n                    const errorCode = errorData.code || '';\n                    const errorMessage = errorData.message || errorCode || 'Error en el servidor';\n                    \/\/ Crear un objeto de error con el c\u00f3digo para poder identificarlo despu\u00e9s\n                    const error = new Error(errorMessage);\n                    error.code = errorCode;\n                    error.errorData = errorData;\n                    throw error;\n                });\n            }\n            return resp.json();\n        })\n        .then(response => {\n            \/\/ Verificar si la respuesta indica \u00e9xito\n            if (!response.success) {\n                \/\/ WordPress REST API puede devolver errores en el formato {code, message, data}\n                const errorCode = response.code || '';\n                const errorMessage = response.message || errorCode || 'No se pudo completar el env\u00edo.';\n                const error = new Error(errorMessage);\n                error.code = errorCode;\n                error.errorData = response;\n                throw error;\n            }\n            \/\/ \u00c9xito: guardar email antes del reset (para Conversiones Mejoradas \/ GTM)\n            const leadEmail = (payload.email || '').trim();\n            if (leadEmail) {\n                try {\n                    sessionStorage.setItem('hc_user_email', leadEmail);\n                    sessionStorage.setItem('hc_generate_lead', '1');\n                } catch (e) {}\n            }\n\n            form.reset();\n\n            \/\/ Si hay URL de redirect, redirigir (el dataLayer se lanza en la p\u00e1gina de gracias)\n            if (redirectUrl && redirectUrl !== '') {\n                window.location.href = redirectUrl;\n            } else {\n                \/\/ Sin redirect: push inmediato en la misma p\u00e1gina\n                if (leadEmail) {\n                    window.dataLayer = window.dataLayer || [];\n                    window.dataLayer.push({\n                        event: 'generate_lead',\n                        user_email: leadEmail\n                    });\n                    try {\n                        sessionStorage.removeItem('hc_user_email');\n                        sessionStorage.removeItem('hc_generate_lead');\n                    } catch (e) {}\n                }\n                \/\/ Mostrar mensaje de \u00e9xito fuera del formulario\n                setSuccessMessage(successMessage);\n                \/\/ Ocultar el formulario, el header y el spinner\n                const formHeader = container.querySelector('.hc-form-header');\n                if (formHeader) {\n                    formHeader.style.display = 'none';\n                }\n                if (form) {\n                    form.style.display = 'none';\n                }\n                const spinner = container.querySelector('.hc-form-spinner');\n                if (spinner) {\n                    spinner.style.display = 'none';\n                }\n            }\n        })\n        .catch((error) => {\n            \/\/ Manejar errores del backend\n            const errorCode = error.code || '';\n            \n            \/\/ Debug: log del error\n            console.log('[Form] Error capturado:', errorCode, error.message);\n            \n            \/\/ Error de email inv\u00e1lido (Clearout)\n            if (errorCode === 'hc_clearout_email_invalid' && emailInput) {\n                emailInput.classList.add('hc-error');\n                emailInput.setCustomValidity('Email no v\u00e1lido');\n                \/\/emailInput.reportValidity();\n                setStatus('error', error.message || 'Email no v\u00e1lido');\n                setLoading(false);\n                return;\n            }\n            \n            \/\/ Error de tel\u00e9fono inv\u00e1lido (m\u00faltiples c\u00f3digos de error)\n            const phoneErrorCodes = ['hc_clearout_phone_invalid', 'hc_lead_invalid_phone'];\n            if (phoneErrorCodes.includes(errorCode) && phoneInput) {\n                console.log('[Form] Pintando campo tel\u00e9fono de rojo');\n                phoneInput.classList.add('hc-error');\n                phoneInput.setCustomValidity(error.message || 'Tel\u00e9fono no v\u00e1lido');\n                \n                \/\/ Tambi\u00e9n marcar el selector de prefijos si existe y est\u00e1 visible\n                const phonePrefixSelect = form.querySelector('select[name=\"phone_prefix\"]');\n                if (phonePrefixSelect) {\n                    const isVisible = window.getComputedStyle(phonePrefixSelect).display !== 'none';\n                    console.log('[Form] Selector de prefijos visible:', isVisible);\n                    if (isVisible) {\n                        phonePrefixSelect.classList.add('hc-error');\n                        console.log('[Form] Selector de prefijos pintado de rojo');\n                    }\n                }\n                \n                phoneInput.reportValidity();\n                setStatus('error', error.message || 'Tel\u00e9fono no v\u00e1lido');\n                setLoading(false);\n                return;\n            }\n            \n            \/\/ Otros errores: mostrar mensaje gen\u00e9rico\n            setStatus('error', '');\n            setLoading(false);\n        })\n        .finally(() => {\n            setLoading(false);\n        });\n    });\n\n    hydrateUTMs();\n    return true;\n    } \/\/ Fin de initForm\n    \n    \/\/ Intentar ejecutar inmediatamente\n    let initialized = initForm();\n    \n    \/\/ Si no se inicializ\u00f3, intentar cuando el DOM est\u00e9 listo\n    if (!initialized) {\n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initForm);\n        } else {\n            \/\/ Si el DOM ya est\u00e1 listo pero no se encontr\u00f3, intentar de nuevo despu\u00e9s de un breve delay\n            setTimeout(function() {\n                const testContainer = document.getElementById('hc_form_1_5139');\n                if (testContainer) {\n                    initForm();\n                }\n            }, 100);\n        }\n    }\n})();\n<\/script>\n\n<h2>Detalles clave<\/h2>\n<ul>\n<li>\n<strong>Duraci\u00f3n:<\/strong> 9 meses (1500 horas)<\/li>\n<li>\n<strong>Modalidad:<\/strong> H\u00edbrida (Online con Pr\u00e1cticas Presenciales Obligatorias)<\/li>\n<li>\n<strong>Certificaci\u00f3n:<\/strong> T\u00edtulo Propio de M\u00e1ster Espa\u00f1ol por UDIMA.<\/li>\n<li>\n<strong>Acceso:<\/strong> Plataforma Blackboard 24\/7 | Clases en vivo y grabadas<\/li>\n<li>\nInscripciones abiertas | Cupos limitados<\/li>\n<\/ul>\n<h2>La Pr\u00e1ctica que Asegura tu Futuro Profesional<\/h2>\n<p>El sector del bienestar y la salud capilar crece globalmente sin precedentes. En AMIR, tu formaci\u00f3n combina teor\u00eda de alto nivel con <strong>pr\u00e1cticas reales obligatorias<\/strong>, donde aprendes directamente sobre pacientes, con t\u00e9cnicas que hoy lideran el mercado:<\/p>\n<ul role=\"list\">\n<li><strong>FUE (Follicular Unit Extraction)\u00a0<\/strong><\/li>\n<li><strong>NON SHAVEN (FUE sin rasurar)\u00a0<\/strong><\/li>\n<li><strong>FUSS (T\u00e9cnica de tira)\u00a0<\/strong><\/li>\n<li><strong>Tratamientos m\u00e9dicos:<\/strong>PRP, mesoterapia, terapias combinadas<\/li>\n<\/ul>\n<h2>El 98% de nuestros egresados est\u00e1 ejerciendo en el sector.<\/h2>\n<h2>Metodolog\u00eda AMIR: Pr\u00e1ctica real y Liderazgo profesional<\/h2>\n<p>Nuestra metodolog\u00eda te brinda la destreza quir\u00fargica, la seguridad cl\u00ednica y la confianza profesional necesarias para insertarte laboralmente desde el primer d\u00eda.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/App-4.svg\" alt=\"\" width=\"54\" height=\"54\" \/><\/figure>\n<h3>Pr\u00e1cticas presenciales reales<\/h3>\n<p>Desarrolla habilidades t\u00e9cnicas y psicomotrices en microinjerto capilar y tratamientos no quir\u00fargicos, siempre con pacientes reales.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/App-1.svg\" alt=\"\" width=\"54\" height=\"54\" \/><\/figure>\n<h3>Plataforma Blackboard 24\/7<\/h3>\n<p>Acceso continuo a esquemas, clases, evaluaciones y recursos en Blackboard.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/App-7.svg\" alt=\"\" width=\"54\" height=\"54\" \/><\/figure>\n<h3>Equipo Docente de Alto Prestigio<\/h3>\n<p>Especialistas en tricolog\u00eda, cirug\u00eda capilar y restauraci\u00f3n est\u00e9tica con trayectoria internacional.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/App-3.svg\" alt=\"\" width=\"54\" height=\"54\" \/><\/figure>\n<h3>Doble Enfoque (M\u00e9dico y Quir\u00fargico)<\/h3>\n<p>Con an\u00e1lisis de y progreso.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/App-6.svg\" alt=\"\" width=\"54\" height=\"54\" \/><\/figure>\n<h3>Masterclasses cl\u00ednicas<\/h3>\n<p>Casos cl\u00ednicos, sesiones en vivo y an\u00e1lisis diagn\u00f3stico-terap\u00e9utico para entrenar tu criterio profesional.<\/p>\n<h2>\u00bfPor qu\u00e9 estudiar el M\u00e1ster en Tricolog\u00eda y Microinjerto Capilar?<\/h2>\n<p>Conocimiento cl\u00ednico, t\u00e9cnica quir\u00fargica y desarrollo empresarial. Todo en un solo programa.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/Container-1-1.svg\" alt=\"\" width=\"50\" height=\"50\" \/><\/figure>\n<h3>Domina un \u00e1rea de crecimiento acelerado<\/h3>\n<p>La tricolog\u00eda y el microinjerto capilar son hoy dos de las especialidades con mayor demanda, innovaci\u00f3n y rentabilidad.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/Container-5.svg\" alt=\"\" width=\"50\" height=\"50\" \/><\/figure>\n<h3>Emprendimiento y gesti\u00f3n<\/h3>\n<p>Incorpora herramientas de marketing, gesti\u00f3n, redes sociales y marca personal.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/Container-3.svg\" alt=\"\" width=\"50\" height=\"50\" \/><\/figure>\n<h3>Certificaci\u00f3n Europea<\/h3>\n<p>Obt\u00e9n un M\u00e1ster por UDIMA, instituci\u00f3n referente en Europa en educaci\u00f3n a distancia y formaci\u00f3n en salud.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/App-3.svg\" alt=\"\" width=\"54\" height=\"54\" \/><\/figure>\n<h3>Habilidad quir\u00fargica especializada<\/h3>\n<p>Aprende a ejecutar con maestr\u00eda las t\u00e9cnicas de injerto m\u00e1s solicitadas (FUE y NON SHAVEN), con est\u00e1ndares de calidad internacional.<\/p>\n<h2>Historias de \u00e9xito<\/h2>\n<div style=\"width: 640px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-2088-1\" width=\"640\" height=\"360\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/Testimonial-Alberto-Negrete_V1_ALTA.mp4https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/YTDown.com_YouTube_Por-que-decidiste-hacer-el-master-en-Sex_Media__DyGFrBLcLI_001_1080p.mp4?_=1\" \/><a href=\"https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/Testimonial-Alberto-Negrete_V1_ALTA.mp4https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/YTDown.com_YouTube_Por-que-decidiste-hacer-el-master-en-Sex_Media__DyGFrBLcLI_001_1080p.mp4\">https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/Testimonial-Alberto-Negrete_V1_ALTA.mp4https:\/\/qa.amirlatam.com\/colombia\/wp-content\/uploads\/2025\/11\/YTDown.com_YouTube_Por-que-decidiste-hacer-el-master-en-Sex_Media__DyGFrBLcLI_001_1080p.mp4<\/a><\/video><\/div>\n<p>Hoy, nuestros egresados ya ejercen en cl\u00ednicas especializadas, laboratorios tricol\u00f3gicos y centros de restauraci\u00f3n capilar en Latinoam\u00e9rica y Europa.<\/p>\n<h2>Acreditaci\u00f3n UDIMA: M\u00e1ster Propio en Medicina Cl\u00ednica<\/h2>\n<p>Gracias al convenio entre AMIR y la Universidad a Distancia de Madrid (UDIMA), este programa otorga un T\u00edtulo Propio con reconocimiento europeo que te acredita como especialista en Tricolog\u00eda y Microinjerto Capilar.<\/p>\n<ul role=\"list\">\n<li><strong>M\u00e1ster Propio (60 ECTS) acreditado por UDIMA<\/strong> (Espa\u00f1a)<\/li>\n<li><strong>Validez internacional<\/strong> para tu trayectoria profesional<\/li>\n<li><strong>Respaldo acad\u00e9mico europeo<\/strong> en uno de los sectores est\u00e9ticos m\u00e1s din\u00e1micos del mundo<\/li>\n<\/ul>\n<h2>Tu curso incluye:<\/h2>\n<ul>\n<li>Manuales AMIR impresos y digitales.<\/li>\n<li>Curso de Memorizaci\u00f3n Genius Gratis.<\/li>\n<li>Clases en vivo y grabadas.<\/li>\n<li>Acceso 24\/7 a la App del alumno.<\/li>\n<li>40 simulacros y evaluaciones progresivas.<\/li>\n<li>Garant\u00eda de repetici\u00f3n.<\/li>\n<\/ul>\n<p><a role=\"button\"><br \/>\nDESCARGAR BROCHURE<br \/>\n<\/a><\/p>\n<details id=\"e-n-accordion-item-3960\">\n<summary tabindex=\"0\" data-accordion-index=\"1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-3960\">Preguntas frecuentes<\/p>\n<\/summary>\n<h2>\u00bfQu\u00e9 hace un m\u00e9dico especializado en tricolog\u00eda y microinjerto capilar y qu\u00e9 oportunidades hay en Colombia?<\/h2>\n<p style=\"font-weight: 400;\">El tric\u00f3logo diagnostica y trata:<\/p>\n<ul>\n<li>Alopecias de origen hormonal, autoinmune o inflamatorio.<\/li>\n<li>Enfermedades del cuero cabelludo.<\/li>\n<li>P\u00e9rdida capilar masculina y femenina.<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\">Y realiza procedimientos como:<\/p>\n<ul>\n<li>Microinjerto capilar<\/li>\n<li>Mesoterapia<\/li>\n<li>Terapias regenerativas capilares<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\">Mercado en crecimiento del <strong>25\u201330% anual<\/strong> en LATAM.<br \/>\nPocos profesionales formados = alta demanda + alto retorno.<\/p>\n<h2>\u00bfCu\u00e1nto pueden aumentar mis ingresos al estudiar un M\u00e1ster en Tricolog\u00eda y Microinjerto Capilar?<\/h2>\n<p style=\"font-weight: 400;\">Ingresos estimados por pr\u00e1ctica:<\/p>\n<table style=\"font-weight: 400;\">\n<tbody>\n<tr>\n<td><strong>Procedimiento<\/strong><\/td>\n<td><strong>Tarifa promedio<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Microinjerto capilar<\/td>\n<td>USD 1.500 \u2013 4.500 por cirug\u00eda<\/td>\n<\/tr>\n<tr>\n<td>Mesoterapia recurrente<\/td>\n<td>Ingresos mensuales continuos<\/td>\n<\/tr>\n<tr>\n<td>Consultas capilares<\/td>\n<td>Alta fidelizaci\u00f3n de pacientes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"font-weight: 400;\">Muchos m\u00e9dicos <strong>multiplican sus ingresos 5 a 10 veces<\/strong> en un a\u00f1o al integrar protocolos completos.<\/p>\n<h2>\u00bfCurso corto o M\u00e1ster completo? \u00bfCu\u00e1l conviene?<\/h2>\n<table style=\"font-weight: 400;\">\n<tbody>\n<tr>\n<td><strong>Curso corto<\/strong><\/td>\n<td><strong>M\u00e1ster UDIMA + AMIR<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Solo t\u00e9cnica<\/td>\n<td>Diagn\u00f3stico \u2192 cirug\u00eda \u2192 seguimiento<\/td>\n<\/tr>\n<tr>\n<td>Resultados variables<\/td>\n<td>Protocolos estandarizados<\/td>\n<\/tr>\n<tr>\n<td>Sin respaldo internacional<\/td>\n<td>Titulaci\u00f3n europea + pr\u00e1ctica real<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"font-weight: 400;\">Con el Master de AMIR tendr\u00e1s:<\/p>\n<ul>\n<li>Formaci\u00f3n cl\u00ednica integral.<\/li>\n<li><strong>Pr\u00e1cticas reales con pacientes<\/strong>, no simuladores.<\/li>\n<li>Supervisi\u00f3n de especialistas internacionales.<\/li>\n<li>Certificaci\u00f3n universitaria europea.<\/li>\n<\/ul>\n<h2>\u00bfPor qu\u00e9 la tricolog\u00eda es una especialidad con tanta demanda hoy?<\/h2>\n<ul>\n<li>El <strong>50% de los hombres y 35% de las mujeres<\/strong> presentan alopecia antes de los 40.<\/li>\n<li>Los pacientes buscan soluciones no invasivas pero efectivas.<\/li>\n<li>El microinjerto capilar es un procedimiento seguro con resultados predecibles.<\/li>\n<li>Hay pocos profesionales formados en protocolos completos.<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\">AMIR prepara al m\u00e9dico para integrarse inmediata y \u00e9ticamente al sector capilar.<\/p>\n<h2>\u00bfQu\u00e9 t\u00e9cnicas aprender\u00e9 en el m\u00e1ster?<\/h2>\n<ul>\n<li>Diagn\u00f3stico con tricoscopio digital.<\/li>\n<li>Plan terap\u00e9utico capilar integral.<\/li>\n<li>Mesoterapia capilar avanzada.<\/li>\n<li>Microinjerto FUE paso a paso.<\/li>\n<li>Uso de punch, control de \u00e1ngulos, densidad y dise\u00f1o.<\/li>\n<li>Manejo de complicaciones y seguimiento cl\u00ednico.<\/li>\n<li>Regeneraci\u00f3n capilar y terapias adyuvantes.<\/li>\n<\/ul>\n<\/details>\n<h2>\u00bfQu\u00e9 hace un m\u00e9dico especializado en tricolog\u00eda y microinjerto capilar y qu\u00e9 oportunidades hay en Colombia?<\/h2>\n<p style=\"font-weight: 400;\">El tric\u00f3logo diagnostica y trata:<\/p>\n<ul>\n<li>Alopecias de origen hormonal, autoinmune o inflamatorio.<\/li>\n<li>Enfermedades del cuero cabelludo.<\/li>\n<li>P\u00e9rdida capilar masculina y femenina.<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\">Y realiza procedimientos como:<\/p>\n<ul>\n<li>Microinjerto capilar<\/li>\n<li>Mesoterapia<\/li>\n<li>Terapias regenerativas capilares<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\">Mercado en crecimiento del <strong>25\u201330% anual<\/strong> en LATAM.<br \/>\nPocos profesionales formados = alta demanda + alto retorno.<\/p>\n<h2>\u00bfCu\u00e1nto pueden aumentar mis ingresos al estudiar un M\u00e1ster en Tricolog\u00eda y Microinjerto Capilar?<\/h2>\n<p style=\"font-weight: 400;\">Ingresos estimados por pr\u00e1ctica:<\/p>\n<table style=\"font-weight: 400;\">\n<tbody>\n<tr>\n<td><strong>Procedimiento<\/strong><\/td>\n<td><strong>Tarifa promedio<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Microinjerto capilar<\/td>\n<td>USD 1.500 \u2013 4.500 por cirug\u00eda<\/td>\n<\/tr>\n<tr>\n<td>Mesoterapia recurrente<\/td>\n<td>Ingresos mensuales continuos<\/td>\n<\/tr>\n<tr>\n<td>Consultas capilares<\/td>\n<td>Alta fidelizaci\u00f3n de pacientes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"font-weight: 400;\">Muchos m\u00e9dicos <strong>multiplican sus ingresos 5 a 10 veces<\/strong> en un a\u00f1o al integrar protocolos completos.<\/p>\n<h2>\u00bfCurso corto o M\u00e1ster completo? \u00bfCu\u00e1l conviene?<\/h2>\n<table style=\"font-weight: 400;\">\n<tbody>\n<tr>\n<td><strong>Curso corto<\/strong><\/td>\n<td><strong>M\u00e1ster UDIMA + AMIR<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Solo t\u00e9cnica<\/td>\n<td>Diagn\u00f3stico \u2192 cirug\u00eda \u2192 seguimiento<\/td>\n<\/tr>\n<tr>\n<td>Resultados variables<\/td>\n<td>Protocolos estandarizados<\/td>\n<\/tr>\n<tr>\n<td>Sin respaldo internacional<\/td>\n<td>Titulaci\u00f3n europea + pr\u00e1ctica real<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"font-weight: 400;\">Con el Master de AMIR tendr\u00e1s:<\/p>\n<ul>\n<li>Formaci\u00f3n cl\u00ednica integral.<\/li>\n<li><strong>Pr\u00e1cticas reales con pacientes<\/strong>, no simuladores.<\/li>\n<li>Supervisi\u00f3n de especialistas internacionales.<\/li>\n<li>Certificaci\u00f3n universitaria europea.<\/li>\n<\/ul>\n<h2>\u00bfPor qu\u00e9 la tricolog\u00eda es una especialidad con tanta demanda hoy?<\/h2>\n<ul>\n<li>El <strong>50% de los hombres y 35% de las mujeres<\/strong> presentan alopecia antes de los 40.<\/li>\n<li>Los pacientes buscan soluciones no invasivas pero efectivas.<\/li>\n<li>El microinjerto capilar es un procedimiento seguro con resultados predecibles.<\/li>\n<li>Hay pocos profesionales formados en protocolos completos.<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\">AMIR prepara al m\u00e9dico para integrarse inmediata y \u00e9ticamente al sector capilar.<\/p>\n<h2>\u00bfQu\u00e9 t\u00e9cnicas aprender\u00e9 en el m\u00e1ster?<\/h2>\n<ul>\n<li>Diagn\u00f3stico con tricoscopio digital.<\/li>\n<li>Plan terap\u00e9utico capilar integral.<\/li>\n<li>Mesoterapia capilar avanzada.<\/li>\n<li>Microinjerto FUE paso a paso.<\/li>\n<li>Uso de punch, control de \u00e1ngulos, densidad y dise\u00f1o.<\/li>\n<li>Manejo de complicaciones y seguimiento cl\u00ednico.<\/li>\n<li>Regeneraci\u00f3n capilar y terapias adyuvantes.<\/li>\n<\/ul>\n<h2>Todo lo que necesitas en un solo lugar<\/h2>\n<p>Comienza hoy tu M\u00e1ster en Tricolog\u00eda y Microinjerto Capilar. Da el paso hacia una carrera m\u00e9dica de alto crecimiento, reconocimiento internacional y oportunidades reales.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El camino hacia una pr\u00e1ctica capilar moderna, rentable y con demanda real de profesionales especializados. Domina el \u00e1rea de tricolog\u00eda cl\u00ednica y cirug\u00eda capilar con el programa l\u00edder en Latinoam\u00e9rica. \u2028Aprende el diagn\u00f3stico, tratamiento y prevenci\u00f3n de las patolog\u00edas capilares, y convi\u00e9rtete en un referente en restauraci\u00f3n capilar m\u00e9dica y quir\u00fargica, el campo con mayor [&hellip;]<\/p>\n","protected":false},"featured_media":3304,"template":"","meta":{"_acf_changed":false,"inline_featured_image":false},"product_brand":[],"product_cat":[44],"product_tag":[72],"class_list":["post-2088","product","type-product","status-publish","has-post-thumbnail","product_cat-destacados","product_tag-masters-posgrados","first","instock","shipping-taxable","purchasable","product-type-simple"],"acf":[],"_links":{"self":[{"href":"https:\/\/qa.amirlatam.com\/colombia\/wp-json\/wp\/v2\/product\/2088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/qa.amirlatam.com\/colombia\/wp-json\/wp\/v2\/product"}],"about":[{"href":"https:\/\/qa.amirlatam.com\/colombia\/wp-json\/wp\/v2\/types\/product"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/qa.amirlatam.com\/colombia\/wp-json\/wp\/v2\/media\/3304"}],"wp:attachment":[{"href":"https:\/\/qa.amirlatam.com\/colombia\/wp-json\/wp\/v2\/media?parent=2088"}],"wp:term":[{"taxonomy":"product_brand","embeddable":true,"href":"https:\/\/qa.amirlatam.com\/colombia\/wp-json\/wp\/v2\/product_brand?post=2088"},{"taxonomy":"product_cat","embeddable":true,"href":"https:\/\/qa.amirlatam.com\/colombia\/wp-json\/wp\/v2\/product_cat?post=2088"},{"taxonomy":"product_tag","embeddable":true,"href":"https:\/\/qa.amirlatam.com\/colombia\/wp-json\/wp\/v2\/product_tag?post=2088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}