{"id":24784,"date":"2026-08-31T02:02:05","date_gmt":"2026-08-31T02:02:05","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24784"},"modified":"2026-08-31T02:02:08","modified_gmt":"2026-08-31T02:02:08","slug":"poissons-ratio-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/es\/poissons-ratio-calculator\/","title":{"rendered":"Poisson&#8217;s Ratio Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Poisson&#8217;s Ratio Calculator<\/strong> is a practical engineering tool designed to calculate Poisson&#8217;s ratio from longitudinal and lateral strain or from elastic properties such as Young\u2019s modulus and shear modulus. It helps engineers evaluate how materials deform laterally when subjected to axial tension or compression. The Poisson&#8217;s Ratio Calculator is useful for material analysis, mechanical design, structural engineering, and elastic deformation studies, providing quick results for comparing material behavior and related elastic properties.<\/p>\n\n\n\n<!-- WordPress Custom HTML Block: copy ALL content below -->\n<!-- Do NOT wrap in DOCTYPE\/html\/head\/body. Use Code Editor mode. -->\n<!-- All CSS\/JS scoped to #prc-calculator. Will NOT affect theme header, footer, menus, or other page content. -->\n<style>\n\/* Poisson's Ratio Calculator - WordPress-safe scoped styles *\/\n\/*\n * WordPress-safe: every rule is scoped under #prc-calculator.\n * Will NOT affect theme header, footer, sidebar, menus, or other page content.\n * No html, body, :root, or unscoped universal selectors.\n *\/\n\n#prc-calculator.prc-calculator,\n#prc-calculator.prc-calculator *,\n#prc-calculator.prc-calculator *::before,\n#prc-calculator.prc-calculator *::after {\n    box-sizing: border-box !important;\n}\n\n#prc-calculator.prc-calculator {\n    all: revert;\n    --prc-primary: #1a5276;\n    --prc-primary-light: #2471a3;\n    --prc-primary-dark: #0e3352;\n    --prc-accent: #e67e22;\n    --prc-safe: #27ae60;\n    --prc-caution: #f39c12;\n    --prc-danger: #c0392b;\n    --prc-neutral: #7f8c8d;\n    --prc-bg: #ecf0f1;\n    --prc-card-bg: #ffffff;\n    --prc-border: #d5dbdb;\n    --prc-text: #2c3e50;\n    --prc-text-muted: #5d6d7e;\n    --prc-shadow: 0 2px 12px rgba(26, 82, 118, 0.08);\n    --prc-radius: 8px;\n    --prc-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n    --prc-mono: 'Consolas', 'Courier New', monospace;\n\n    box-sizing: border-box !important;\n    display: block !important;\n    max-width: 1000px !important;\n    width: 100% !important;\n    margin: 0 auto !important;\n    padding: 1.5rem 1rem !important;\n    font-family: var(--prc-font) !important;\n    color: var(--prc-text) !important;\n    line-height: 1.6 !important;\n    font-size: 16px !important;\n    text-align: left !important;\n    background: transparent !important;\n    border: none !important;\n    float: none !important;\n    clear: none !important;\n    position: relative !important;\n    isolation: isolate !important;\n    contain: layout style paint !important;\n    z-index: auto;\n    letter-spacing: normal !important;\n    text-transform: none !important;\n    box-shadow: none !important;\n}\n\n#prc-calculator.prc-calculator [hidden] {\n    display: none !important;\n}\n\n#prc-calculator.prc-calculator h1,\n#prc-calculator.prc-calculator h2,\n#prc-calculator.prc-calculator h3,\n#prc-calculator.prc-calculator h4,\n#prc-calculator.prc-calculator p,\n#prc-calculator.prc-calculator ul,\n#prc-calculator.prc-calculator ol,\n#prc-calculator.prc-calculator li,\n#prc-calculator.prc-calculator section,\n#prc-calculator.prc-calculator div,\n#prc-calculator.prc-calculator span,\n#prc-calculator.prc-calculator strong,\n#prc-calculator.prc-calculator em,\n#prc-calculator.prc-calculator sub,\n#prc-calculator.prc-calculator sup {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: none !important;\n    box-shadow: none !important;\n    font-family: inherit !important;\n    font-size: inherit !important;\n    font-weight: inherit !important;\n    font-style: inherit !important;\n    line-height: inherit !important;\n    color: inherit !important;\n    letter-spacing: inherit !important;\n    text-transform: none !important;\n    text-decoration: none !important;\n    float: none !important;\n}\n\n#prc-calculator.prc-calculator button,\n#prc-calculator.prc-calculator input,\n#prc-calculator.prc-calculator select,\n#prc-calculator.prc-calculator label,\n#prc-calculator.prc-calculator legend,\n#prc-calculator.prc-calculator summary {\n    font: inherit !important;\n    font-family: var(--prc-font) !important;\n    color: inherit !important;\n    margin: 0 !important;\n    max-width: none !important;\n    min-width: 0 !important;\n    float: none !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n}\n\n#prc-calculator.prc-calculator ul,\n#prc-calculator.prc-calculator ol {\n    list-style: none !important;\n    padding: 0 !important;\n    margin: 0 !important;\n}\n\n#prc-calculator.prc-calculator button {\n    cursor: pointer !important;\n    background: transparent !important;\n    border: none !important;\n    padding: 0 !important;\n    box-shadow: none !important;\n    text-decoration: none !important;\n    appearance: none !important;\n    -webkit-appearance: none !important;\n    text-transform: none !important;\n    min-height: unset !important;\n    height: auto !important;\n    width: auto !important;\n}\n\n#prc-calculator.prc-calculator input[type=\"number\"],\n#prc-calculator.prc-calculator select {\n    display: block !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    padding: 0.55rem 0.75rem !important;\n    border: 1px solid var(--prc-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.95rem !important;\n    font-family: var(--prc-font) !important;\n    background: #ffffff !important;\n    color: var(--prc-text) !important;\n    min-height: 38px !important;\n    outline: none !important;\n    box-shadow: none !important;\n    margin: 0 !important;\n    line-height: 1.4 !important;\n    appearance: auto !important;\n    -webkit-appearance: auto !important;\n}\n\n#prc-calculator.prc-calculator .prc-input-section legend {\n    display: block !important;\n    float: none !important;\n    width: 100% !important;\n    font-weight: 600 !important;\n    color: var(--prc-primary-dark) !important;\n    font-size: 0.9rem !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.04em !important;\n    margin: 0 0 0.75rem 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: transparent !important;\n    font-family: var(--prc-font) !important;\n    line-height: 1.4 !important;\n}\n\n#prc-calculator.prc-calculator svg {\n    display: block !important;\n    max-width: 100% !important;\n    height: auto !important;\n}\n\n#prc-calculator.prc-calculator sub,\n#prc-calculator.prc-calculator sup {\n    font-size: 75% !important;\n    line-height: 0 !important;\n    position: relative !important;\n    vertical-align: baseline !important;\n}\n\n#prc-calculator.prc-calculator sub { bottom: -0.2em !important; }\n#prc-calculator.prc-calculator sup { top: -0.45em !important; }\n\n#prc-calculator.prc-calculator div,\n#prc-calculator.prc-calculator section,\n#prc-calculator.prc-calculator form,\n#prc-calculator.prc-calculator fieldset,\n#prc-calculator.prc-calculator details {\n    float: none !important;\n    clear: none !important;\n    max-width: none;\n}\n\n#prc-calculator.prc-calculator form {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: transparent !important;\n}\n\n#prc-calculator.prc-calculator fieldset.prc-input-section {\n    border: none !important;\n    margin: 0 0 1.25rem 0 !important;\n    padding: 0 !important;\n    min-width: 0 !important;\n    background: transparent !important;\n    box-shadow: none !important;\n}\n\n#prc-calculator.prc-calculator .prc-card {\n    background: var(--prc-card-bg) !important;\n    border-radius: var(--prc-radius) !important;\n    box-shadow: var(--prc-shadow) !important;\n    border: 1px solid var(--prc-border) !important;\n    padding: 1.5rem !important;\n    margin: 0 0 1.5rem 0 !important;\n}\n\n#prc-calculator.prc-calculator .prc-layout {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 1.5rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-panel-header {\n    display: flex !important;\n    flex-wrap: wrap !important;\n    align-items: center !important;\n    justify-content: space-between !important;\n    gap: 0.75rem !important;\n    margin-bottom: 1.25rem !important;\n    padding-bottom: 0.75rem !important;\n    border-bottom: 2px solid var(--prc-bg) !important;\n}\n\n#prc-calculator.prc-calculator .prc-panel-header h2 {\n    font-size: 1.25rem !important;\n    color: var(--prc-primary) !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    font-weight: 600 !important;\n    line-height: 1.3 !important;\n}\n\n#prc-calculator.prc-calculator .prc-unit-toggle {\n    display: flex !important;\n    flex-direction: row !important;\n    border-radius: var(--prc-radius) !important;\n    overflow: hidden !important;\n    border: 1px solid var(--prc-border) !important;\n}\n\n#prc-calculator.prc-calculator button.prc-unit-btn {\n    display: inline-block !important;\n    padding: 0.4rem 1rem !important;\n    border: none !important;\n    border-radius: 0 !important;\n    background: var(--prc-bg) !important;\n    color: var(--prc-text-muted) !important;\n    cursor: pointer !important;\n    font-size: 0.85rem !important;\n    font-weight: 600 !important;\n    line-height: 1.4 !important;\n    transition: background 0.2s !important;\n}\n\n#prc-calculator.prc-calculator button.prc-unit-btn.prc-active {\n    background: var(--prc-primary) !important;\n    color: #ffffff !important;\n}\n\n#prc-calculator.prc-calculator button.prc-unit-btn:hover:not(.prc-active) {\n    background: #dfe6e9 !important;\n}\n\n#prc-calculator.prc-calculator .prc-form-row {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 1rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-form-group {\n    display: block !important;\n    margin-bottom: 0.85rem !important;\n    width: 100% !important;\n}\n\n#prc-calculator.prc-calculator .prc-form-group label {\n    display: block !important;\n    font-size: 0.875rem !important;\n    font-weight: 600 !important;\n    margin: 0 0 0.35rem 0 !important;\n    color: var(--prc-text) !important;\n}\n\n#prc-calculator.prc-calculator .prc-optional {\n    font-weight: 400 !important;\n    color: var(--prc-text-muted) !important;\n    font-size: 0.8rem !important;\n}\n\n#prc-calculator.prc-calculator input[type=\"number\"]:focus,\n#prc-calculator.prc-calculator select:focus {\n    border-color: var(--prc-primary-light) !important;\n    box-shadow: 0 0 0 3px rgba(36, 113, 163, 0.15) !important;\n}\n\n#prc-calculator.prc-calculator .prc-input-with-unit {\n    display: flex !important;\n    flex-direction: row !important;\n    align-items: stretch !important;\n    gap: 0.5rem !important;\n    width: 100% !important;\n}\n\n#prc-calculator.prc-calculator .prc-input-with-unit input[type=\"number\"] {\n    flex: 1 1 auto !important;\n    width: auto !important;\n    min-width: 0 !important;\n}\n\n#prc-calculator.prc-calculator .prc-unit-label {\n    display: flex !important;\n    align-items: center !important;\n    flex-shrink: 0 !important;\n    padding: 0 0.65rem !important;\n    background: var(--prc-bg) !important;\n    border: 1px solid var(--prc-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.8rem !important;\n    font-weight: 600 !important;\n    color: var(--prc-text-muted) !important;\n    white-space: nowrap !important;\n    min-width: 3rem !important;\n    justify-content: center !important;\n}\n\n#prc-calculator.prc-calculator select.prc-inline-unit {\n    width: auto !important;\n    flex: 0 0 auto !important;\n    min-width: 4.5rem !important;\n    padding: 0.55rem 0.5rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-tooltip {\n    display: inline-flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    width: 16px !important;\n    height: 16px !important;\n    border-radius: 50% !important;\n    background: var(--prc-primary-light) !important;\n    color: #ffffff !important;\n    font-size: 0.65rem !important;\n    font-weight: 700 !important;\n    cursor: help !important;\n    position: relative !important;\n    vertical-align: middle !important;\n    margin-left: 0.25rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-tooltip::after {\n    content: attr(data-tip) !important;\n    position: absolute !important;\n    bottom: calc(100% + 6px) !important;\n    left: 50% !important;\n    transform: translateX(-50%) !important;\n    background: var(--prc-primary-dark) !important;\n    color: #ffffff !important;\n    padding: 0.4rem 0.6rem !important;\n    border-radius: 4px !important;\n    font-size: 0.75rem !important;\n    font-weight: 400 !important;\n    white-space: normal !important;\n    width: max-content !important;\n    max-width: 220px !important;\n    opacity: 0 !important;\n    pointer-events: none !important;\n    transition: opacity 0.2s !important;\n    z-index: 100 !important;\n}\n\n#prc-calculator.prc-calculator .prc-tooltip:hover::after {\n    opacity: 1 !important;\n}\n\n#prc-calculator.prc-calculator .prc-ref-note {\n    font-size: 0.8rem !important;\n    color: var(--prc-text-muted) !important;\n    margin: 0.5rem 0 0 !important;\n    font-style: italic !important;\n}\n\n#prc-calculator.prc-calculator .prc-hidden {\n    display: none !important;\n}\n\n#prc-calculator.prc-calculator .prc-form-actions {\n    display: flex !important;\n    flex-wrap: wrap !important;\n    justify-content: center !important;\n    gap: 0.75rem !important;\n    margin-top: 1rem !important;\n}\n\n#prc-calculator.prc-calculator button.prc-btn {\n    display: inline-block !important;\n    padding: 0.75rem 1.5rem !important;\n    border: none !important;\n    border-radius: 6px !important;\n    font-size: 0.95rem !important;\n    font-weight: 600 !important;\n    cursor: pointer !important;\n    transition: transform 0.2s, box-shadow 0.2s !important;\n}\n\n#prc-calculator.prc-calculator button.prc-btn-primary {\n    background: linear-gradient(135deg, var(--prc-primary) 0%, var(--prc-primary-light) 100%) !important;\n    color: #ffffff !important;\n    min-width: 220px !important;\n}\n\n#prc-calculator.prc-calculator button.prc-btn-primary:hover {\n    transform: translateY(-1px) !important;\n    box-shadow: 0 4px 12px rgba(26, 82, 118, 0.3) !important;\n}\n\n#prc-calculator.prc-calculator button.prc-btn-secondary {\n    background: var(--prc-bg) !important;\n    color: var(--prc-text) !important;\n    border: 1px solid var(--prc-border) !important;\n}\n\n#prc-calculator.prc-calculator button.prc-btn-secondary:hover {\n    background: #dfe6e9 !important;\n}\n\n#prc-calculator.prc-calculator .prc-status-badge {\n    display: inline-block !important;\n    padding: 0.35rem 0.85rem !important;\n    border-radius: 20px !important;\n    font-size: 0.8rem !important;\n    font-weight: 700 !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.03em !important;\n}\n\n#prc-calculator.prc-calculator .prc-status-neutral {\n    background: #ecf0f1 !important;\n    color: var(--prc-neutral) !important;\n}\n\n#prc-calculator.prc-calculator .prc-status-safe {\n    background: rgba(39, 174, 96, 0.15) !important;\n    color: var(--prc-safe) !important;\n    border: 1px solid var(--prc-safe) !important;\n}\n\n#prc-calculator.prc-calculator .prc-status-caution {\n    background: rgba(243, 156, 18, 0.15) !important;\n    color: #d68910 !important;\n    border: 1px solid var(--prc-caution) !important;\n}\n\n#prc-calculator.prc-calculator .prc-status-danger {\n    background: rgba(192, 57, 43, 0.12) !important;\n    color: var(--prc-danger) !important;\n    border: 1px solid var(--prc-danger) !important;\n}\n\n#prc-calculator.prc-calculator .prc-error-box,\n#prc-calculator.prc-calculator .prc-warning-box {\n    padding: 0.85rem 1rem !important;\n    border-radius: 6px !important;\n    margin-bottom: 1rem !important;\n    font-size: 0.9rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-error-box {\n    background: rgba(192, 57, 43, 0.08) !important;\n    border: 1px solid var(--prc-danger) !important;\n    color: var(--prc-danger) !important;\n}\n\n#prc-calculator.prc-calculator .prc-warning-box {\n    background: rgba(243, 156, 18, 0.08) !important;\n    border: 1px solid var(--prc-caution) !important;\n    color: #b7950b !important;\n}\n\n#prc-calculator.prc-calculator .prc-error-box ul,\n#prc-calculator.prc-calculator .prc-warning-box ul {\n    margin: 0.35rem 0 0 1.25rem !important;\n    padding: 0 !important;\n    list-style: disc !important;\n}\n\n#prc-calculator.prc-calculator .prc-results-grid {\n    display: grid !important;\n    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)) !important;\n    gap: 0.75rem !important;\n    margin-bottom: 1.25rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-result-item {\n    background: var(--prc-bg) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    border: 1px solid var(--prc-border) !important;\n}\n\n#prc-calculator.prc-calculator .prc-result-label {\n    display: block !important;\n    font-size: 0.75rem !important;\n    color: var(--prc-text-muted) !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.03em !important;\n    margin-bottom: 0.25rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-result-value {\n    display: block !important;\n    font-size: 1.1rem !important;\n    font-weight: 700 !important;\n    color: var(--prc-primary) !important;\n    font-family: var(--prc-mono) !important;\n}\n\n#prc-calculator.prc-calculator .prc-result-sub {\n    display: block !important;\n    font-size: 0.75rem !important;\n    color: var(--prc-text-muted) !important;\n    margin-top: 0.15rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-recommendations {\n    background: rgba(36, 113, 163, 0.06) !important;\n    border: 1px solid rgba(36, 113, 163, 0.2) !important;\n    border-radius: 6px !important;\n    padding: 0.85rem 1rem !important;\n    margin-bottom: 1.25rem !important;\n    font-size: 0.875rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-recommendations h3 {\n    font-size: 0.9rem !important;\n    color: var(--prc-primary) !important;\n    margin: 0 0 0.5rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-recommendations ul {\n    margin: 0 !important;\n    padding-left: 1.25rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-recommendations li {\n    list-style: disc !important;\n    margin-bottom: 0.25rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-visual-grid {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 1rem !important;\n}\n\n#prc-calculator.prc-calculator .prc-viz-wide {\n    grid-column: 1 \/ -1 !important;\n}\n\n#prc-calculator.prc-calculator .prc-viz-card {\n    background: var(--prc-bg) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    border: 1px solid var(--prc-border) !important;\n}\n\n#prc-calculator.prc-calculator .prc-viz-card h3 {\n    font-size: 0.8rem !important;\n    color: var(--prc-text-muted) !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.03em !important;\n    margin: 0 0 0.5rem 0 !important;\n    text-align: center !important;\n    font-weight: 600 !important;\n}\n\n@media (max-width: 600px) {\n    #prc-calculator.prc-calculator .prc-form-row {\n        grid-template-columns: 1fr !important;\n    }\n\n    #prc-calculator.prc-calculator button.prc-btn-primary,\n    #prc-calculator.prc-calculator button.prc-btn-secondary {\n        width: 100% !important;\n    }\n}\n\n@media (max-width: 700px) {\n    #prc-calculator.prc-calculator .prc-visual-grid {\n        grid-template-columns: 1fr !important;\n    }\n\n    #prc-calculator.prc-calculator .prc-viz-wide {\n        grid-column: auto !important;\n    }\n}\n\n@media print {\n    #prc-calculator.prc-calculator .prc-form-actions,\n    #prc-calculator.prc-calculator .prc-unit-toggle {\n        display: none !important;\n    }\n}\n\n<\/style>\n<div id=\"prc-calculator\" class=\"prc-calculator\">\n        <div class=\"prc-layout\">\n\n            <section class=\"prc-input-panel prc-card\" aria-label=\"Calculator inputs\">\n                <div class=\"prc-panel-header\">\n                    <h2>Input Parameters<\/h2>\n                    <div class=\"prc-unit-toggle\" role=\"group\" aria-label=\"Unit system\">\n                        <button type=\"button\" class=\"prc-unit-btn prc-active\" data-unit=\"metric\">Metric<\/button>\n                        <button type=\"button\" class=\"prc-unit-btn\" data-unit=\"imperial\">Imperial<\/button>\n                    <\/div>\n                <\/div>\n\n                <form id=\"prc-calcForm\" novalidate>\n                    <fieldset class=\"prc-input-section\">\n                        <legend>Calculation Mode<\/legend>\n                        <div class=\"prc-form-row\">\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-calcMode\">Mode<\/label>\n                                <select id=\"prc-calcMode\" name=\"calcMode\">\n                                    <option value=\"calcPoisson\" selected>Calculate Poisson&#8217;s Ratio<\/option>\n                                    <option value=\"calcLateralStrain\">Calculate Lateral Strain<\/option>\n                                    <option value=\"calcLongitudinalStrain\">Calculate Longitudinal Strain<\/option>\n                                    <option value=\"calcDimensionalChange\">Calculate Dimensional Change<\/option>\n                                    <option value=\"calcElasticConstants\">Calculate Elastic Constants<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"prc-form-group prc-mode-field\" data-mode=\"calcPoisson calcLateralStrain calcLongitudinalStrain calcDimensionalChange calcElasticConstants\">\n                                <label for=\"prc-inputMethod\">Input Method<\/label>\n                                <select id=\"prc-inputMethod\" name=\"inputMethod\">\n                                    <option value=\"strain\" selected>Longitudinal &amp; Lateral Strain<\/option>\n                                    <option value=\"lengthDiameter\">Length &amp; Diameter Change<\/option>\n                                    <option value=\"eAndG\">Young&#8217;s Modulus &amp; Shear Modulus<\/option>\n                                    <option value=\"eAndK\">Young&#8217;s Modulus &amp; Bulk Modulus<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"prc-input-section\">\n                        <legend>Strain &amp; Poisson&#8217;s Ratio<\/legend>\n                        <div class=\"prc-form-row prc-strain-field\" data-mode=\"calcPoisson calcLateralStrain calcLongitudinalStrain calcDimensionalChange\" data-method=\"strain\">\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-longStrain\">\n                                    Longitudinal Strain (&epsilon;<sub>long<\/sub>)\n                                    <span class=\"prc-tooltip\" data-tip=\"Axial strain \u2014 positive in tension, negative in compression\">?<\/span>\n                                <\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-longStrain\" name=\"longStrain\" value=\"0.001\" step=\"any\">\n                                    <select id=\"prc-longStrainUnit\" class=\"prc-inline-unit\" aria-label=\"Longitudinal strain unit\">\n                                        <option value=\"dimensionless\" selected>&#8211;<\/option>\n                                        <option value=\"percent\">%<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"prc-form-group prc-lateral-strain-input\" data-mode=\"calcPoisson calcLongitudinalStrain\" data-method=\"strain\">\n                                <label for=\"prc-lateralStrain\">\n                                    Lateral Strain (&epsilon;<sub>lat<\/sub>)\n                                    <span class=\"prc-tooltip\" data-tip=\"Transverse strain \u2014 typically negative under axial tension\">?<\/span>\n                                <\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-lateralStrain\" name=\"lateralStrain\" value=\"-0.00030\" step=\"any\">\n                                    <select id=\"prc-lateralStrainUnit\" class=\"prc-inline-unit\" aria-label=\"Lateral strain unit\">\n                                        <option value=\"dimensionless\" selected>&#8211;<\/option>\n                                        <option value=\"percent\">%<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"prc-form-row prc-poisson-field\" data-mode=\"calcLateralStrain calcLongitudinalStrain calcDimensionalChange\" data-method=\"strain lengthDiameter\">\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-poisson\">\n                                    Poisson&#8217;s Ratio (&nu;)\n                                    <span class=\"prc-tooltip\" data-tip=\"Ratio of lateral to longitudinal strain (with sign convention)\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"prc-poisson\" name=\"poisson\" value=\"0.30\" min=\"-0.99\" max=\"0.499\" step=\"any\">\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"prc-form-row prc-elastic-extra\" data-mode=\"calcElasticConstants\" data-method=\"eAndG eAndK\">\n                            <div class=\"prc-form-group prc-elastic-nu-field prc-hidden\" data-method=\"eAndG eAndK\">\n                                <label for=\"prc-poissonElastic\">Poisson&#8217;s Ratio (&nu;) <span class=\"prc-optional\">(computed)<\/span><\/label>\n                                <input type=\"number\" id=\"prc-poissonElastic\" name=\"poissonElastic\" placeholder=\"Result\" readonly tabindex=\"-1\">\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"prc-input-section prc-geometry-section\">\n                        <legend>Geometry &amp; Dimensional Change<\/legend>\n                        <div class=\"prc-form-group prc-geom-type-field\" data-mode=\"calcPoisson calcDimensionalChange\" data-method=\"lengthDiameter\">\n                            <label for=\"prc-lateralType\">Lateral Dimension<\/label>\n                            <select id=\"prc-lateralType\" name=\"lateralType\">\n                                <option value=\"diameter\" selected>Diameter<\/option>\n                                <option value=\"width\">Width<\/option>\n                            <\/select>\n                        <\/div>\n\n                        <div class=\"prc-form-row prc-length-field\" data-mode=\"calcPoisson calcDimensionalChange\" data-method=\"lengthDiameter\">\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-originalLength\">\n                                    Original Length (L<sub>0<\/sub>)\n                                    <span class=\"prc-tooltip\" data-tip=\"Original axial length before loading\">?<\/span>\n                                <\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-originalLength\" name=\"originalLength\" value=\"100\" min=\"0.001\" step=\"any\">\n                                    <select id=\"prc-lengthUnit\" class=\"prc-inline-unit\" aria-label=\"Length unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"m\">m<\/option>\n                                        <option value=\"in\">in<\/option>\n                                        <option value=\"ft\">ft<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-lengthChange\">\n                                    Change in Length (&Delta;L)\n                                    <span class=\"prc-tooltip\" data-tip=\"Positive for elongation under tension\">?<\/span>\n                                <\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-lengthChange\" name=\"lengthChange\" value=\"0.1\" step=\"any\">\n                                    <select id=\"prc-lengthChangeUnit\" class=\"prc-inline-unit\" aria-label=\"Length change unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"um\">\u03bcm<\/option>\n                                        <option value=\"in\">in<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"prc-form-row prc-diameter-field\" data-mode=\"calcPoisson calcLongitudinalStrain calcDimensionalChange\" data-method=\"lengthDiameter\">\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-originalDiameter\">\n                                    Original Diameter (d<sub>0<\/sub>)\n                                    <span class=\"prc-tooltip\" data-tip=\"Original transverse diameter\">?<\/span>\n                                <\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-originalDiameter\" name=\"originalDiameter\" value=\"10\" min=\"0.001\" step=\"any\">\n                                    <span class=\"prc-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-diameterChange\">\n                                    Change in Diameter (&Delta;d)\n                                    <span class=\"prc-tooltip\" data-tip=\"Negative for contraction under tension\">?<\/span>\n                                <\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-diameterChange\" name=\"diameterChange\" value=\"-0.003\" step=\"any\">\n                                    <select id=\"prc-diameterChangeUnit\" class=\"prc-inline-unit\" aria-label=\"Diameter change unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"um\">\u03bcm<\/option>\n                                        <option value=\"in\">in<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"prc-form-row prc-width-field prc-hidden\" data-mode=\"calcPoisson calcDimensionalChange\" data-method=\"lengthDiameter\">\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-originalWidth\">Original Width (w<sub>0<\/sub>)<\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-originalWidth\" name=\"originalWidth\" value=\"20\" min=\"0.001\" step=\"any\">\n                                    <span class=\"prc-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-widthChange\">Change in Width (&Delta;w)<\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-widthChange\" name=\"widthChange\" value=\"-0.006\" step=\"any\">\n                                    <select id=\"prc-widthChangeUnit\" class=\"prc-inline-unit\" aria-label=\"Width change unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"um\">\u03bcm<\/option>\n                                        <option value=\"in\">in<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"prc-form-row prc-lateral-dim-field\" data-mode=\"calcDimensionalChange\" data-method=\"strain\">\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-lateralDimType\">Calculate Lateral Change For<\/label>\n                                <select id=\"prc-lateralDimType\" name=\"lateralDimType\">\n                                    <option value=\"diameter\" selected>Diameter<\/option>\n                                    <option value=\"width\">Width<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"prc-form-group prc-dim-size-field\">\n                                <label for=\"prc-lateralDimSize\">Original Lateral Size<\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-lateralDimSize\" name=\"lateralDimSize\" value=\"10\" min=\"0.001\" step=\"any\">\n                                    <span class=\"prc-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"prc-input-section\">\n                        <legend>Elastic Constants<\/legend>\n                        <div class=\"prc-form-row prc-modulus-field\" data-mode=\"calcPoisson calcElasticConstants\" data-method=\"eAndG eAndK\">\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-youngModulus\">\n                                    Young&#8217;s Modulus (E)\n                                    <span class=\"prc-tooltip\" data-tip=\"Elastic modulus for isotropic materials\">?<\/span>\n                                <\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-youngModulus\" name=\"youngModulus\" value=\"200\" min=\"0.001\" step=\"any\">\n                                    <select id=\"prc-youngUnit\" class=\"prc-inline-unit\" aria-label=\"Young's modulus unit\">\n                                        <option value=\"GPa\" selected>GPa<\/option>\n                                        <option value=\"MPa\">MPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                        <option value=\"ksi\">ksi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"prc-form-group prc-shear-field\" data-mode=\"calcPoisson calcElasticConstants\" data-method=\"eAndG\">\n                                <label for=\"prc-shearModulus\">\n                                    Shear Modulus (G)\n                                    <span class=\"prc-tooltip\" data-tip=\"Modulus of rigidity\">?<\/span>\n                                <\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-shearModulus\" name=\"shearModulus\" value=\"76.9\" min=\"0.001\" step=\"any\">\n                                    <select id=\"prc-modulusUnit\" class=\"prc-inline-unit\" aria-label=\"Shear modulus unit\">\n                                        <option value=\"GPa\" selected>GPa<\/option>\n                                        <option value=\"MPa\">MPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                        <option value=\"ksi\">ksi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"prc-form-group prc-bulk-field prc-hidden\" data-mode=\"calcPoisson calcElasticConstants\" data-method=\"eAndK\">\n                                <label for=\"prc-bulkModulus\">\n                                    Bulk Modulus (K)\n                                    <span class=\"prc-tooltip\" data-tip=\"Volumetric stiffness \u2014 very large near \u03bd = 0.5\">?<\/span>\n                                <\/label>\n                                <div class=\"prc-input-with-unit\">\n                                    <input type=\"number\" id=\"prc-bulkModulus\" name=\"bulkModulus\" value=\"166.7\" min=\"0.001\" step=\"any\">\n                                    <select id=\"prc-bulkUnit\" class=\"prc-inline-unit\" aria-label=\"Bulk modulus unit\">\n                                        <option value=\"GPa\" selected>GPa<\/option>\n                                        <option value=\"MPa\">MPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                        <option value=\"ksi\">ksi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"prc-input-section\">\n                        <legend>Material<\/legend>\n                        <div class=\"prc-form-row\">\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-material\">Material Preset<\/label>\n                                <select id=\"prc-material\" name=\"material\">\n                                    <option value=\"structuralSteel\" selected>Structural Steel<\/option>\n                                    <option value=\"carbonSteel\">Carbon Steel<\/option>\n                                    <option value=\"stainlessSteel\">Stainless Steel<\/option>\n                                    <option value=\"aluminum\">Aluminum Alloy<\/option>\n                                    <option value=\"titanium\">Titanium Alloy<\/option>\n                                    <option value=\"copper\">Copper<\/option>\n                                    <option value=\"brass\">Brass<\/option>\n                                    <option value=\"castIron\">Cast Iron<\/option>\n                                    <option value=\"rubber\">Rubber<\/option>\n                                    <option value=\"engineeringPlastic\">Engineering Plastic<\/option>\n                                    <option value=\"custom\">Custom Material<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                        <div class=\"prc-form-row prc-ref-fields\">\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-refNuMin\">Reference \u03bd Min<\/label>\n                                <input type=\"number\" id=\"prc-refNuMin\" name=\"refNuMin\" value=\"0.27\" min=\"-1\" max=\"0.5\" step=\"any\">\n                            <\/div>\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-refNuMax\">Reference \u03bd Max<\/label>\n                                <input type=\"number\" id=\"prc-refNuMax\" name=\"refNuMax\" value=\"0.30\" min=\"-1\" max=\"0.5\" step=\"any\">\n                            <\/div>\n                            <div class=\"prc-form-group\">\n                                <label for=\"prc-refNuTypical\">Reference \u03bd Typical<\/label>\n                                <input type=\"number\" id=\"prc-refNuTypical\" name=\"refNuTypical\" value=\"0.30\" min=\"-1\" max=\"0.5\" step=\"any\">\n                            <\/div>\n                        <\/div>\n                        <p class=\"prc-ref-note\">Reference values are editable. Actual Poisson&#8217;s ratio depends on material grade, temperature, loading direction, strain level, and test conditions.<\/p>\n                    <\/fieldset>\n\n                    <div class=\"prc-form-actions\">\n                        <button type=\"submit\" class=\"prc-btn prc-btn-primary\" id=\"prc-calculateBtn\">Calculate<\/button>\n                    <\/div>\n                <\/form>\n            <\/section>\n\n            <section class=\"prc-results-panel prc-card prc-hidden\" id=\"prc-resultsPanel\" aria-label=\"Calculation results\">\n                <div class=\"prc-panel-header\">\n                    <h2>Results<\/h2>\n                    <div id=\"prc-statusBadge\" class=\"prc-status-badge prc-status-neutral\">Awaiting Input<\/div>\n                <\/div>\n\n                <div id=\"prc-errorBox\" class=\"prc-error-box prc-hidden\" role=\"alert\"><\/div>\n                <div id=\"prc-warningBox\" class=\"prc-warning-box prc-hidden\" role=\"status\"><\/div>\n\n                <div class=\"prc-results-grid\" id=\"prc-resultsGrid\"><\/div>\n\n                <div id=\"prc-recommendations\" class=\"prc-recommendations prc-hidden\"><\/div>\n\n                <div class=\"prc-visual-grid\">\n                    <div class=\"prc-viz-card\">\n                        <h3>Axial Tension Specimen<\/h3>\n                        <svg id=\"prc-axialDiagram\" viewBox=\"0 0 280 130\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"prc-viz-card\">\n                        <h3>Strain Directions<\/h3>\n                        <svg id=\"prc-strainDiagram\" viewBox=\"0 0 280 130\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"prc-viz-card prc-viz-wide\">\n                        <h3>Elastic Constants Relationship<\/h3>\n                        <svg id=\"prc-elasticDiagram\" viewBox=\"0 0 560 180\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"prc-viz-card\">\n                        <h3>Material Behavior<\/h3>\n                        <svg id=\"prc-behaviorGauge\" viewBox=\"0 0 200 140\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"prc-viz-card\">\n                        <h3>Reference Comparison<\/h3>\n                        <svg id=\"prc-referenceGauge\" viewBox=\"0 0 200 140\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                <\/div>\n            <\/section>\n        <\/div>\n    <\/div>\n<script>\n(function(){\n  var r=document.getElementById('prc-calculator');\n  if(!r||r.dataset.prcLoaderDone==='1'){return;}\n  r.dataset.prcLoaderDone='1';\n  try{\n    var p=[\"LyoqDQogKiBQb2lzc29uJ3MgUmF0aW8gQ2FsY3VsYXRvcg0KICogU2NvcGVkIGZvciBXb3JkUHJlc3MgZW1iZWQgLSBkb2VzIG5vdCBhZmZlY3QgZWxlbWVudHMgb3V0c2lkZSAjcHJjLWNhbGN1bGF0b3INCiAqLw0KDQooZnVuY3Rpb24gKCkgew0KICAgICd1c2Ugc3RyaWN0JzsNCg0KICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJjLWNhbGN1bGF0b3InKTsNCiAgICBpZiAoIXJvb3QgfHwgcm9vdC5kYXRhc2V0LnByY1JlYWR5ID09PSAnMScpIHJldHVybjsNCiAgICByb290LmRhdGFzZXQucHJjUmVhZHkgPSAnMSc7DQoNCiAgICBjb25zdCBTVkdfSUQgPSAncHJjLWNhbGN1bGF0b3Itc3ZnLSc7DQoNCiAgICBmdW5jdGlvbiAkKGlkKSB7DQogICAgICAgIHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3IoJyNwcmMtJyArIGlkKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiAkYWxsKHNlbCkgew0KICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbCk7DQogICAgfQ0KDQogICAgY29uc3QgTUFURVJJQUxTID0gew0KICAgICAgICBzdHJ1Y3R1cmFsU3RlZWw6ICAgIHsgbnVNaW46IDAuMjcsIG51TWF4OiAwLjMwLCBudVR5cDogMC4zMCwgRTogMjAwLCBHOiA3Ni45LCBLOiAxNjYuNyB9LA0KICAgICAgICBjYXJib25TdGVlbDogICAgICAgIHsgbnVNaW46IDAuMjcsIG51TWF4OiAwLjMwLCBudVR5cDogMC4zMCwgRTogMjAwLCBHOiA3Ni45LCBLOiAxNjYuNyB9LA0KICAgICAgICBzdGFpbmxlc3NTdGVlbDogICAgIHsgbnVNaW46IDAuMjcsIG51TWF4OiAwLjMxLCBudVR5cDogMC4zMCwgRTogMTk1LCBHOiA3NS4wLCBLOiAxNjMuMCB9LA0KICAgICAgICBhbHVtaW51bTogICAgICAgICAgIHsgbnVNaW46IDAuMzAsIG51TWF4OiAwLjM1LCBudVR5cDogMC4zMywgRTogNzAsICBHOiAyNi4zLCBLOiA1OC4zIH0sDQogICAgICAgIHRpdGFuaXVtOiAgICAgICAgICAgeyBudU1pbjogMC4zMCwgbnVNYXg6IDAuMzYsIG51VHlwOiAwLjM0LCBFOiAxMTAsIEc6IDQxLjAsIEs6IDkxLjcgfSwNCiAgICAgICAgY29wcGVyOiAgICAgICAgICAgICB7IG51TWluOiAwLjMzLCBudU1heDogMC4zNiwgbnVUeXA6IDAuMzQsIEU6IDEyMCwgRzogNDQuOCwgSzogMTAwLjAgfSwNCiAgICAgICAgYnJhc3M6ICAgICAgICAgICAgICB7IG51TWluOiAwLjMxLCBudU1heDogMC4zNSwgbnVUeXA6IDAuMzQsIEU6IDEwMCwgRzogMzcuMywgSzogODMuMyB9LA0KICAgICAgICBjYXN0SXJvbjogICAgICAgICAgIHsgbnVNaW46IDAuMjEsIG51TWF4OiAwLjI2LCBudVR5cDogMC4yNSwgRTogMTAwLCBHOiA0MC4wLCBLOiA2Ni43IH0sDQogICAgICAgIHJ1YmJlcjogICAgICAgICAgICAgeyBudU1pbjogMC40OCwgbnVNYXg6IDAuNTAsIG51VHlwOiAwLjUwLCBFOiAwLjAxLCBHOiAwLjAwMzMsIEs6IDEwMDAgfSwNCiAgICAgICAgZW5naW5lZXJpbmdQbGFzdGljOiB7IG51TWluOiAwLjM1LCBudU1heDogMC40NSwgbnVUeXA6IDAuNDAsIEU6IDMsICAgRzogMS4wNywgSzogNS4wIH0sDQogICAgICAgIGN1c3RvbTogICAgICAgICAgICAgeyBudU1pbjogbnVsbCwgbnVNYXg6IG51bGwsIG51VHlwOiBudWxsLCBFOiBudWxsLCBHOiBudWxsLCBLOiBudWxsIH0NCiAgICB9Ow0KDQogICAgY29uc3QgQ09OViA9IHsNCiAgICAgICAgbGVuZ3RoVG9JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2luJykgcmV0dXJuIHYgKiAyNS40Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdtJykgcmV0dXJuIHYgKiAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdmdCcpIHJldHVybiB2ICogMzA0Ljg7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ3VtJykgcmV0dXJuIHYgLyAxMDAwOw0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIGxlbmd0aEZyb21JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2luJykgcmV0dXJuIHYgLyAyNS40Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdtJykgcmV0dXJuIHYgLyAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdmdCcpIHJldHVybiB2IC8gMzA0Ljg7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ3VtJykgcmV0dXJuIHYgKiAxMDAwOw0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIG1vZHVsdXNUb0ludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnTVBhJykgcmV0dXJuIHYgLyAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdwc2knKSByZXR1cm4gdiAqIDAuMDA2ODk0NzYgLyAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdrc2knKSByZXR1cm4gdiAqIDYuODk0NzYgLyAxMDAwOw0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIG1vZHVsdXNGcm9tSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdNUGEnKSByZXR1cm4gdiAqIDEwMDA7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ3BzaScpIHJldHVybiAodiAqIDEwMDApIC8gMC4wMDY4OTQ3NjsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAna3NpJykgcmV0dXJuICh2ICogMTAwMCkgLyA2Ljg5NDc2Ow0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIHN0cmFpblRvSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgcmV0dXJuIHVuaXQgPT09ICdwZXJjZW50JyA\/IHYgLyAxMDAgOiB2Ow0KICAgICAgICB9LA0KICAgICAgICBzdHJhaW5Gcm9tSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgcmV0dXJuIHVuaXQgPT09ICdwZXJjZW50JyA\/IHYgKiAxMDAgOiB2Ow0KICAgICAgICB9DQogICAgfTsNCg0KICAgIGxldCB1bml0U3lzdGVtID0gJ21ldHJpYyc7DQogICAgbGV0IGRlYm91bmNlVGltZXIgPSBudWxsOw0KDQogICAgY29uc3QgZm9ybSA9ICQoJ2NhbGNGb3JtJyk7DQogICAgY29uc3QgY2FsY01vZGUgPSAkKCdjYWxjTW9kZScpOw0KICAgIGNvbnN0IGlucHV0TWV0aG9kID0gJCgnaW5wdXRNZXRob2QnKTsNCiAgICBjb25zdCBsYXRlcmFsVHlwZSA9ICQoJ2xhdGVyYWxUeXBlJyk7DQogICAgY29uc3QgbWF0ZXJpYWxTZWxlY3QgPSAkKCdtYXRlcmlhbCcpOw0KICAgIGNvbnN0IHJlc3VsdHNQYW5lbCA9ICQoJ3Jlc3VsdHNQYW5lbCcpOw0KDQogICAgZnVuY3Rpb24gaW5pdCgpIHsNCiAgICAgICAgYmluZEV2ZW50cygpOw0KICAgICAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsNCiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICBoaWRlUmVzdWx0c1BhbmVsKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYmluZEV2ZW50cygpIHsNCiAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZSkgPT4gew0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgY2FsY3VsYXRlKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgICRhbGwoJy5wcmMtdW5pdC1idG4nKS5mb3JFYWNoKChidG4pID0+IHsNCiAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN3aXRjaFVuaXRTeXN0ZW0oYnRuLmRhdGFzZXQudW5pdCkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBjYWxjTW9kZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7DQogICAgICAgICAgICB1cGRhdGVJbnB1dE1ldGhvZE9wdGlvbnMoKTsNCiAgICAgICAgICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpbnB1dE1ldGhvZC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7DQogICAgICAgICAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgaWYgKGxhdGVyYWxUeXBlKSB7DQogICAgICAgICAgICBsYXRlcmFsVHlwZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVMYXRlcmFsR2VvbWV0cnlGaWVsZHMpOw0KICAgICAgICB9DQoNCiAgICAgICAgbWF0ZXJpYWxTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXBwbHlNYXRlcmlhbFByZXNldCk7DQoNCiAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsNCiAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVyKTsNCiAgICAgICAgICAgIGRlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVTaWxlbnQoKSkgY2FsY3VsYXRlKGZhbHNlKTsNCiAgICAgICAgICAgIH0sIDQwMCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgaWYgKHZhbGlkYXRl\",\n    \"U2lsZW50KCkpIGNhbGN1bGF0ZShmYWxzZSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUlucHV0TWV0aG9kT3B0aW9ucygpIHsNCiAgICAgICAgY29uc3QgbW9kZSA9IGNhbGNNb2RlLnZhbHVlOw0KICAgICAgICBjb25zdCBtZXRob2QgPSBpbnB1dE1ldGhvZDsNCiAgICAgICAgY29uc3QgY3VycmVudCA9IG1ldGhvZC52YWx1ZTsNCg0KICAgICAgICBjb25zdCBvcHRpb25zID0gew0KICAgICAgICAgICAgY2FsY1BvaXNzb246IFsNCiAgICAgICAgICAgICAgICBbJ3N0cmFpbicsICdMb25naXR1ZGluYWwgJiBMYXRlcmFsIFN0cmFpbiddLA0KICAgICAgICAgICAgICAgIFsnbGVuZ3RoRGlhbWV0ZXInLCAnTGVuZ3RoICYgRGlhbWV0ZXIgQ2hhbmdlJ10sDQogICAgICAgICAgICAgICAgWydlQW5kRycsICJZb3VuZydzIE1vZHVsdXMgJiBTaGVhciBNb2R1bHVzIl0sDQogICAgICAgICAgICAgICAgWydlQW5kSycsICJZb3VuZydzIE1vZHVsdXMgJiBCdWxrIE1vZHVsdXMiXQ0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgIGNhbGNMYXRlcmFsU3RyYWluOiBbDQogICAgICAgICAgICAgICAgWydzdHJhaW4nLCAnTG9uZ2l0dWRpbmFsICYgTGF0ZXJhbCBTdHJhaW4nXSwNCiAgICAgICAgICAgICAgICBbJ2xlbmd0aERpYW1ldGVyJywgJ0xlbmd0aCAmIERpYW1ldGVyIENoYW5nZSddDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgY2FsY0xvbmdpdHVkaW5hbFN0cmFpbjogWw0KICAgICAgICAgICAgICAgIFsnc3RyYWluJywgJ0xvbmdpdHVkaW5hbCAmIExhdGVyYWwgU3RyYWluJ10sDQogICAgICAgICAgICAgICAgWydsZW5ndGhEaWFtZXRlcicsICdMZW5ndGggJiBEaWFtZXRlciBDaGFuZ2UnXQ0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgIGNhbGNEaW1lbnNpb25hbENoYW5nZTogWw0KICAgICAgICAgICAgICAgIFsnc3RyYWluJywgJ0xvbmdpdHVkaW5hbCAmIExhdGVyYWwgU3RyYWluJ10sDQogICAgICAgICAgICAgICAgWydsZW5ndGhEaWFtZXRlcicsICdMZW5ndGggJiBEaWFtZXRlciBDaGFuZ2UnXQ0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgIGNhbGNFbGFzdGljQ29uc3RhbnRzOiBbDQogICAgICAgICAgICAgICAgWydlQW5kRycsICJZb3VuZydzIE1vZHVsdXMgJiBTaGVhciBNb2R1bHVzIl0sDQogICAgICAgICAgICAgICAgWydlQW5kSycsICJZb3VuZydzIE1vZHVsdXMgJiBCdWxrIE1vZHVsdXMiXQ0KICAgICAgICAgICAgXQ0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IGxpc3QgPSBvcHRpb25zW21vZGVdIHx8IG9wdGlvbnMuY2FsY1BvaXNzb247DQogICAgICAgIG1ldGhvZC5pbm5lckhUTUwgPSBsaXN0Lm1hcCgoW3YsIHRdKSA9PiBgPG9wdGlvbiB2YWx1ZT0iJHt2fSI+JHt0fTwvb3B0aW9uPmApLmpvaW4oJycpOw0KICAgICAgICBpZiAobGlzdC5zb21lKChbdl0pID0+IHYgPT09IGN1cnJlbnQpKSB7DQogICAgICAgICAgICBtZXRob2QudmFsdWUgPSBjdXJyZW50Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3dpdGNoVW5pdFN5c3RlbShzeXMpIHsNCiAgICAgICAgaWYgKHN5cyA9PT0gdW5pdFN5c3RlbSkgcmV0dXJuOw0KDQogICAgICAgIFsnb3JpZ2luYWxMZW5ndGgnLCAnb3JpZ2luYWxEaWFtZXRlcicsICdvcmlnaW5hbFdpZHRoJywgJ2xhdGVyYWxEaW1TaXplJ10uZm9yRWFjaCgoaWQpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGVsID0gJChpZCk7DQogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnZhbHVlID09PSAnJykgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgICAgICBpZiAoaXNOYU4odmFsKSkgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwodmFsLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgZWwudmFsdWUgPSBmb3JtYXROdW0oQ09OVi5sZW5ndGhGcm9tSW50ZXJuYWwoaW50ZXJuYWwsIHN5cyA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKSwgNCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGNvbnN0IGNoYW5nZVVuaXRzID0gew0KICAgICAgICAgICAgbGVuZ3RoQ2hhbmdlOiAnbGVuZ3RoQ2hhbmdlVW5pdCcsDQogICAgICAgICAgICBkaWFtZXRlckNoYW5nZTogJ2RpYW1ldGVyQ2hhbmdlVW5pdCcsDQogICAgICAgICAgICB3aWR0aENoYW5nZTogJ3dpZHRoQ2hhbmdlVW5pdCcNCiAgICAgICAgfTsNCiAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlVW5pdHMpLmZvckVhY2goKGlkKSA9PiB7DQogICAgICAgICAgICBjb25zdCBlbCA9ICQoaWQpOw0KICAgICAgICAgICAgaWYgKCFlbCB8fCBlbC52YWx1ZSA9PT0gJycpIHJldHVybjsNCiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHBhcnNlRmxvYXQoZWwudmFsdWUpOw0KICAgICAgICAgICAgaWYgKGlzTmFOKHZhbCkpIHJldHVybjsNCiAgICAgICAgICAgIGNvbnN0IHVuaXRFbCA9ICQoY2hhbmdlVW5pdHNbaWRdKTsNCiAgICAgICAgICAgIGNvbnN0IHUgPSB1bml0RWwgPyB1bml0RWwudmFsdWUgOiAodW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKTsNCiAgICAgICAgICAgIGNvbnN0IGludGVybmFsID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKHZhbCwgdSk7DQogICAgICAgICAgICBjb25zdCBuZXdVID0gc3lzID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbSc7DQogICAgICAgICAgICBlbC52YWx1ZSA9IGZvcm1hdE51bShDT05WLmxlbmd0aEZyb21JbnRlcm5hbChpbnRlcm5hbCwgbmV3VSksIDQpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBbJ3lvdW5nTW9kdWx1cycsICdzaGVhck1vZHVsdXMnLCAnYnVsa01vZHVsdXMnXS5mb3JFYWNoKChpZCkgPT4gew0KICAgICAgICAgICAgY29uc3QgZWwgPSAkKGlkKTsNCiAgICAgICAgICAgIGlmICghZWwgfHwgZWwudmFsdWUgPT09ICcnKSByZXR1cm47DQogICAgICAgICAgICBjb25zdCB2YWwgPSBwYXJzZUZsb2F0KGVsLnZhbHVlKTsNCiAgICAgICAgICAgIGlmIChpc05hTih2YWwpKSByZXR1cm47DQogICAgICAgICAgICBjb25zdCB1bml0SWQgPSBpZCA9PT0gJ3lvdW5nTW9kdWx1cycgPyAneW91bmdVbml0JyA6IGlkID09PSAnc2hlYXJNb2R1bHVzJyA\/ICdtb2R1bHVzVW5pdCcgOiAnYnVsa1VuaXQnOw0KICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKHZhbCwgJCh1bml0SWQpLnZhbHVlKTsNCiAgICAgICAgICAgIGNvbnN0IG5ld1VuaXQgPSBzeXMgPT09ICdpbXBlcmlhbCcgPyAna3NpJyA6ICdHUGEnOw0KICAgICAgICAgICAgZWwudmFsdWUgPSBmb3JtYXROdW0oQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKGludGVybmFsLCBuZXdVbml0KSwgMik7DQogICAgICAgIH0pOw0KDQogICAgICAgIHVuaXRTeXN0ZW0gPSBzeXM7DQogICAgICAgICRhbGwoJy5wcmMtdW5pdC1idG4nKS5mb3JFYWNoKChiKSA9PiBiLmNsYXNzTGlzdC50b2dnbGUoJ3ByYy1hY3RpdmUnLCBiLmRhdGFzZXQudW5pdCA9PT0gc3lzKSk7DQogICAgICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZVVuaXRMYWJlbHMoKSB7DQogICAgICAgIGNvbnN0IGlzSW1wID0gdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJzsNCiAgICAgICAgJGFsbCgnW2RhdGEtdW5pdC1rZXk9Imxlbmd0aFNtYWxsIl0nKS5mb3JFYWNoKChlbCkgPT4geyBlbC50ZXh0Q29udGVudCA9IGlzSW1wID8gJ2luJyA6ICdtbSc7IH0pOw0KDQogICAgICAgIGNvbnN0IHlvdW5nVW5pdCA9ICQoJ3lvdW5nVW5pdCcpOw0KICAgICAgICBjb25zdCBtb2R1bHVzVW5pdCA9ICQoJ21vZHVsdXNVbml0Jyk7DQogICAgICAgIGNvbnN0IGJ1bGtVbml0ID0gJCgnYnVsa1VuaXQnKTsNCg0KICAgICAgICBpZiAoaXNJbXApIHsNCiAgICAgICAgICAgIHlvdW5nVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0ia3NpIiBzZWxlY3RlZD5rc2k8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwc2kiPnBzaTwvb3B0aW9uPic7DQogICAgICAgICAgICBtb2R1bHVzVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0ia3NpIiBzZWxlY3RlZD5rc2k8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwc2kiPnBzaTwvb3B0aW9uPic7DQogICAgICAgICAgICBidWxrVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0ia3NpIiBzZWxlY3RlZD5rc2k8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwc2kiPnBzaTwvb3B0aW9uPic7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB5b3VuZ1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9IkdQYSIgc2VsZWN0ZWQ+R1BhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iTVBhIj5NUGE8L29wdGlvbj4nOw0KICAgICAgICAgICAgbW9kdWx1c1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24g\",\n    \"dmFsdWU9IkdQYSIgc2VsZWN0ZWQ+R1BhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iTVBhIj5NUGE8L29wdGlvbj4nOw0KICAgICAgICAgICAgYnVsa1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9IkdQYSIgc2VsZWN0ZWQ+R1BhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iTVBhIj5NUGE8L29wdGlvbj4nOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgbGVuZ3RoVW5pdCA9ICQoJ2xlbmd0aFVuaXQnKTsNCiAgICAgICAgaWYgKGxlbmd0aFVuaXQpIHsNCiAgICAgICAgICAgIGxlbmd0aFVuaXQuaW5uZXJIVE1MID0gaXNJbXANCiAgICAgICAgICAgICAgICA\/ICc8b3B0aW9uIHZhbHVlPSJpbiIgc2VsZWN0ZWQ+aW48L29wdGlvbj48b3B0aW9uIHZhbHVlPSJmdCI+ZnQ8L29wdGlvbj4nDQogICAgICAgICAgICAgICAgOiAnPG9wdGlvbiB2YWx1ZT0ibW0iIHNlbGVjdGVkPm1tPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibSI+bTwvb3B0aW9uPic7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVMYXRlcmFsR2VvbWV0cnlGaWVsZHMoKSB7DQogICAgICAgIGNvbnN0IHVzZVdpZHRoID0gbGF0ZXJhbFR5cGUgJiYgbGF0ZXJhbFR5cGUudmFsdWUgPT09ICd3aWR0aCc7DQogICAgICAgICRhbGwoJy5wcmMtZGlhbWV0ZXItZmllbGQnKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgaWYgKGVsLmRhdGFzZXQubWV0aG9kICYmIGVsLmRhdGFzZXQubWV0aG9kLmluY2x1ZGVzKCdsZW5ndGhEaWFtZXRlcicpKSB7DQogICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgncHJjLWhpZGRlbicsIHVzZVdpZHRoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgICRhbGwoJy5wcmMtd2lkdGgtZmllbGQnKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgncHJjLWhpZGRlbicsICF1c2VXaWR0aCk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpIHsNCiAgICAgICAgY29uc3QgbW9kZSA9IGNhbGNNb2RlLnZhbHVlOw0KICAgICAgICBjb25zdCBtZXRob2QgPSBpbnB1dE1ldGhvZC52YWx1ZTsNCg0KICAgICAgICAkYWxsKCdbZGF0YS1tb2RlXScpLmZvckVhY2goKGVsKSA9PiB7DQogICAgICAgICAgICBjb25zdCBtb2RlcyA9IGVsLmRhdGFzZXQubW9kZS5zcGxpdCgnICcpOw0KICAgICAgICAgICAgaWYgKCFtb2Rlcy5pbmNsdWRlcyhtb2RlKSkgew0KICAgICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3ByYy1oaWRkZW4nKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZWwuZGF0YXNldC5tZXRob2QpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBtZXRob2RzID0gZWwuZGF0YXNldC5tZXRob2Quc3BsaXQoJyAnKTsNCiAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdwcmMtaGlkZGVuJywgIW1ldGhvZHMuaW5jbHVkZXMobWV0aG9kKSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3ByYy1oaWRkZW4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgJGFsbCgnLnByYy1sYXRlcmFsLXN0cmFpbi1pbnB1dCcpLmZvckVhY2goKGVsKSA9PiB7DQogICAgICAgICAgICBjb25zdCBzaG93ID0gKG1vZGUgPT09ICdjYWxjUG9pc3NvbicgfHwgbW9kZSA9PT0gJ2NhbGNMb25naXR1ZGluYWxTdHJhaW4nKSAmJiBtZXRob2QgPT09ICdzdHJhaW4nOw0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgncHJjLWhpZGRlbicsICFzaG93KTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJGFsbCgnLnByYy1wb2lzc29uLWZpZWxkJykuZm9yRWFjaCgoZWwpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IHNob3cgPSAobW9kZSA9PT0gJ2NhbGNMYXRlcmFsU3RyYWluJyB8fCBtb2RlID09PSAnY2FsY0xvbmdpdHVkaW5hbFN0cmFpbicgfHwgbW9kZSA9PT0gJ2NhbGNEaW1lbnNpb25hbENoYW5nZScpICYmDQogICAgICAgICAgICAgICAgKG1ldGhvZCA9PT0gJ3N0cmFpbicgfHwgbWV0aG9kID09PSAnbGVuZ3RoRGlhbWV0ZXInKTsNCiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ3ByYy1oaWRkZW4nLCAhc2hvdyk7DQogICAgICAgIH0pOw0KDQogICAgICAgICRhbGwoJy5wcmMtc2hlYXItZmllbGQnKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgncHJjLWhpZGRlbicsIG1ldGhvZCAhPT0gJ2VBbmRHJyk7DQogICAgICAgIH0pOw0KDQogICAgICAgICRhbGwoJy5wcmMtYnVsay1maWVsZCcpLmZvckVhY2goKGVsKSA9PiB7DQogICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdwcmMtaGlkZGVuJywgbWV0aG9kICE9PSAnZUFuZEsnKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgaWYgKG1vZGUgPT09ICdjYWxjTG9uZ2l0dWRpbmFsU3RyYWluJyAmJiBtZXRob2QgPT09ICdsZW5ndGhEaWFtZXRlcicpIHsNCiAgICAgICAgICAgICRhbGwoJy5wcmMtbGVuZ3RoLWZpZWxkJykuZm9yRWFjaCgoZWwpID0+IGVsLmNsYXNzTGlzdC5hZGQoJ3ByYy1oaWRkZW4nKSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobW9kZSA9PT0gJ2NhbGNMYXRlcmFsU3RyYWluJyAmJiBtZXRob2QgPT09ICdsZW5ndGhEaWFtZXRlcicpIHsNCiAgICAgICAgICAgICRhbGwoJy5wcmMtZGlhbWV0ZXItZmllbGQsIC5wcmMtd2lkdGgtZmllbGQnKS5mb3JFYWNoKChlbCkgPT4gZWwuY2xhc3NMaXN0LmFkZCgncHJjLWhpZGRlbicpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHVwZGF0ZUxhdGVyYWxHZW9tZXRyeUZpZWxkcygpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGFwcGx5TWF0ZXJpYWxQcmVzZXQoKSB7DQogICAgICAgIGNvbnN0IG1hdCA9IE1BVEVSSUFMU1ttYXRlcmlhbFNlbGVjdC52YWx1ZV07DQogICAgICAgIGlmICghbWF0IHx8IG1hdGVyaWFsU2VsZWN0LnZhbHVlID09PSAnY3VzdG9tJykgcmV0dXJuOw0KDQogICAgICAgIGlmIChtYXQubnVNaW4gIT0gbnVsbCkgJCgncmVmTnVNaW4nKS52YWx1ZSA9IG1hdC5udU1pbjsNCiAgICAgICAgaWYgKG1hdC5udU1heCAhPSBudWxsKSAkKCdyZWZOdU1heCcpLnZhbHVlID0gbWF0Lm51TWF4Ow0KICAgICAgICBpZiAobWF0Lm51VHlwICE9IG51bGwpIHsNCiAgICAgICAgICAgICQoJ3JlZk51VHlwaWNhbCcpLnZhbHVlID0gbWF0Lm51VHlwOw0KICAgICAgICAgICAgaWYgKCQoJ3BvaXNzb24nKSkgJCgncG9pc3NvbicpLnZhbHVlID0gbWF0Lm51VHlwOw0KICAgICAgICB9DQogICAgICAgIGlmIChtYXQuRSAhPSBudWxsKSB7DQogICAgICAgICAgICAkKCd5b3VuZ01vZHVsdXMnKS52YWx1ZSA9IGZvcm1hdE51bSgNCiAgICAgICAgICAgICAgICBDT05WLm1vZHVsdXNGcm9tSW50ZXJuYWwobWF0LkUsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAna3NpJyA6ICdHUGEnKSwgMQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAobWF0LkcgIT0gbnVsbCkgew0KICAgICAgICAgICAgJCgnc2hlYXJNb2R1bHVzJykudmFsdWUgPSBmb3JtYXROdW0oDQogICAgICAgICAgICAgICAgQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKG1hdC5HLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2tzaScgOiAnR1BhJyksIDINCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG1hdC5LICE9IG51bGwpIHsNCiAgICAgICAgICAgICQoJ2J1bGtNb2R1bHVzJykudmFsdWUgPSBmb3JtYXROdW0oDQogICAgICAgICAgICAgICAgQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKG1hdC5LLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2tzaScgOiAnR1BhJyksIDENCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBwYXJzZU51bShpZCkgew0KICAgICAgICBjb25zdCBlbCA9ICQoaWQpOw0KICAgICAgICBpZiAoIWVsIHx8IGVsLnZhbHVlID09PSAnJykgcmV0dXJuIG51bGw7DQogICAgICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KGVsLnZhbHVlKTsNCiAgICAgICAgcmV0dXJuIGlzTmFOKHYpID8gbnVsbCA6IHY7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0SW5wdXRzKCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgbW9kZTogY2FsY01vZGUudmFsdWUsDQogICAgICAgICAgICBpbnB1dE1ldGhvZDogaW5wdXRNZXRob2QudmFsdWUsDQogICAgICAgICAgICBsb25nU3RyYWluOiBwYXJzZU51bSgnbG9uZ1N0cmFpbicpLA0KICAgICAgICAgICAgbG9uZ1N0cmFpblVuaXQ6ICQoJ2xvbmdTdHJhaW5Vbml0JykudmFsdWUsDQogICAgICAgICAgICBsYXRlcmFsU3RyYWluOiBwYXJzZU51bSgnbGF0ZXJhbFN0cmFpbicpLA0KICAgICAgICAgICAgbGF0ZXJhbFN0cmFpblVuaXQ6ICQoJ2xhdGVyYWxTdHJhaW5Vbml0JykudmFsdWUsDQog\",\n    \"ICAgICAgICAgICBwb2lzc29uOiBwYXJzZU51bSgncG9pc3NvbicpLA0KICAgICAgICAgICAgb3JpZ2luYWxMZW5ndGg6IHBhcnNlTnVtKCdvcmlnaW5hbExlbmd0aCcpLA0KICAgICAgICAgICAgbGVuZ3RoVW5pdDogJCgnbGVuZ3RoVW5pdCcpID8gJCgnbGVuZ3RoVW5pdCcpLnZhbHVlIDogJ21tJywNCiAgICAgICAgICAgIGxlbmd0aENoYW5nZTogcGFyc2VOdW0oJ2xlbmd0aENoYW5nZScpLA0KICAgICAgICAgICAgbGVuZ3RoQ2hhbmdlVW5pdDogJCgnbGVuZ3RoQ2hhbmdlVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgb3JpZ2luYWxEaWFtZXRlcjogcGFyc2VOdW0oJ29yaWdpbmFsRGlhbWV0ZXInKSwNCiAgICAgICAgICAgIGRpYW1ldGVyQ2hhbmdlOiBwYXJzZU51bSgnZGlhbWV0ZXJDaGFuZ2UnKSwNCiAgICAgICAgICAgIGRpYW1ldGVyQ2hhbmdlVW5pdDogJCgnZGlhbWV0ZXJDaGFuZ2VVbml0JykudmFsdWUsDQogICAgICAgICAgICBvcmlnaW5hbFdpZHRoOiBwYXJzZU51bSgnb3JpZ2luYWxXaWR0aCcpLA0KICAgICAgICAgICAgd2lkdGhDaGFuZ2U6IHBhcnNlTnVtKCd3aWR0aENoYW5nZScpLA0KICAgICAgICAgICAgd2lkdGhDaGFuZ2VVbml0OiAkKCd3aWR0aENoYW5nZVVuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIGxhdGVyYWxUeXBlOiBsYXRlcmFsVHlwZSA\/IGxhdGVyYWxUeXBlLnZhbHVlIDogJ2RpYW1ldGVyJywNCiAgICAgICAgICAgIGxhdGVyYWxEaW1UeXBlOiAkKCdsYXRlcmFsRGltVHlwZScpID8gJCgnbGF0ZXJhbERpbVR5cGUnKS52YWx1ZSA6ICdkaWFtZXRlcicsDQogICAgICAgICAgICBsYXRlcmFsRGltU2l6ZTogcGFyc2VOdW0oJ2xhdGVyYWxEaW1TaXplJyksDQogICAgICAgICAgICB5b3VuZ01vZHVsdXM6IHBhcnNlTnVtKCd5b3VuZ01vZHVsdXMnKSwNCiAgICAgICAgICAgIHlvdW5nVW5pdDogJCgneW91bmdVbml0JykudmFsdWUsDQogICAgICAgICAgICBzaGVhck1vZHVsdXM6IHBhcnNlTnVtKCdzaGVhck1vZHVsdXMnKSwNCiAgICAgICAgICAgIG1vZHVsdXNVbml0OiAkKCdtb2R1bHVzVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgYnVsa01vZHVsdXM6IHBhcnNlTnVtKCdidWxrTW9kdWx1cycpLA0KICAgICAgICAgICAgYnVsa1VuaXQ6ICQoJ2J1bGtVbml0JykudmFsdWUsDQogICAgICAgICAgICBtYXRlcmlhbDogbWF0ZXJpYWxTZWxlY3QudmFsdWUsDQogICAgICAgICAgICByZWZOdU1pbjogcGFyc2VOdW0oJ3JlZk51TWluJyksDQogICAgICAgICAgICByZWZOdU1heDogcGFyc2VOdW0oJ3JlZk51TWF4JyksDQogICAgICAgICAgICByZWZOdVR5cGljYWw6IHBhcnNlTnVtKCdyZWZOdVR5cGljYWwnKQ0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlU2lsZW50KCkgew0KICAgICAgICByZXR1cm4gdmFsaWRhdGVJbnB1dHMoZ2V0SW5wdXRzKCkpLmxlbmd0aCA9PT0gMDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0cyhpbnB1dHMpIHsNCiAgICAgICAgY29uc3QgZXJyb3JzID0gW107DQogICAgICAgIGNvbnN0IHsgbW9kZSwgaW5wdXRNZXRob2Q6IG1ldGhvZCB9ID0gaW5wdXRzOw0KDQogICAgICAgIGlmIChtZXRob2QgPT09ICdzdHJhaW4nKSB7DQogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2NhbGNQb2lzc29uJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IGVMb25nID0gQ09OVi5zdHJhaW5Ub0ludGVybmFsKGlucHV0cy5sb25nU3RyYWluIHx8IDAsIGlucHV0cy5sb25nU3RyYWluVW5pdCk7DQogICAgICAgICAgICAgICAgaWYgKGVMb25nID09PSAwKSBlcnJvcnMucHVzaCgnTG9uZ2l0dWRpbmFsIHN0cmFpbiBjYW5ub3QgYmUgemVybyB3aGVuIGNhbGN1bGF0aW5nIFBvaXNzb25cJ3MgcmF0aW8gZnJvbSBzdHJhaW4uJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2NhbGNMb25naXR1ZGluYWxTdHJhaW4nKSB7DQogICAgICAgICAgICAgICAgY29uc3QgbnUgPSBpbnB1dHMucG9pc3NvbjsNCiAgICAgICAgICAgICAgICBpZiAobnUgPT0gbnVsbCB8fCBudSA9PT0gMCkgZXJyb3JzLnB1c2goJ1BvaXNzb25cJ3MgcmF0aW8gY2Fubm90IGJlIHplcm8gd2hlbiBjYWxjdWxhdGluZyBsb25naXR1ZGluYWwgc3RyYWluIGZyb20gbGF0ZXJhbCBzdHJhaW4uJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2NhbGNMYXRlcmFsU3RyYWluJyB8fCBtb2RlID09PSAnY2FsY0RpbWVuc2lvbmFsQ2hhbmdlJykgew0KICAgICAgICAgICAgICAgIGlmIChpbnB1dHMucG9pc3NvbiA9PSBudWxsKSBlcnJvcnMucHVzaCgnUG9pc3NvblwncyByYXRpbyBpcyByZXF1aXJlZC4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChtZXRob2QgPT09ICdsZW5ndGhEaWFtZXRlcicpIHsNCiAgICAgICAgICAgIGNvbnN0IEwwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucHV0cy5vcmlnaW5hbExlbmd0aCB8fCAwLCBpbnB1dHMubGVuZ3RoVW5pdCk7DQogICAgICAgICAgICBpZiAobW9kZSAhPT0gJ2NhbGNMb25naXR1ZGluYWxTdHJhaW4nICYmIEwwIDw9IDApIHsNCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCgnT3JpZ2luYWwgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChtb2RlID09PSAnY2FsY1BvaXNzb24nIHx8IG1vZGUgPT09ICdjYWxjTG9uZ2l0dWRpbmFsU3RyYWluJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IGQwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKA0KICAgICAgICAgICAgICAgICAgICBpbnB1dHMubGF0ZXJhbFR5cGUgPT09ICd3aWR0aCcgPyAoaW5wdXRzLm9yaWdpbmFsV2lkdGggfHwgMCkgOiAoaW5wdXRzLm9yaWdpbmFsRGlhbWV0ZXIgfHwgMCksDQogICAgICAgICAgICAgICAgICAgIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJw0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgaWYgKGQwIDw9IDApIGVycm9ycy5wdXNoKCdPcmlnaW5hbCBsYXRlcmFsIGRpbWVuc2lvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2NhbGNMb25naXR1ZGluYWxTdHJhaW4nKSB7DQogICAgICAgICAgICAgICAgY29uc3QgbnUgPSBpbnB1dHMucG9pc3NvbjsNCiAgICAgICAgICAgICAgICBpZiAobnUgPT0gbnVsbCB8fCBudSA9PT0gMCkgZXJyb3JzLnB1c2goJ1BvaXNzb25cJ3MgcmF0aW8gY2Fubm90IGJlIHplcm8gd2hlbiBjYWxjdWxhdGluZyBsb25naXR1ZGluYWwgc3RyYWluLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ2VBbmRHJyB8fCBtZXRob2QgPT09ICdlQW5kSycpIHsNCiAgICAgICAgICAgIGNvbnN0IEUgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy55b3VuZ01vZHVsdXMgfHwgMCwgaW5wdXRzLnlvdW5nVW5pdCk7DQogICAgICAgICAgICBpZiAoRSA8PSAwKSBlcnJvcnMucHVzaCgnWW91bmdcJ3MgbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ2VBbmRHJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IEcgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5zaGVhck1vZHVsdXMgfHwgMCwgaW5wdXRzLm1vZHVsdXNVbml0KTsNCiAgICAgICAgICAgICAgICBpZiAoRyA8PSAwKSBlcnJvcnMucHVzaCgnU2hlYXIgbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ2VBbmRLJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IEsgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5idWxrTW9kdWx1cyB8fCAwLCBpbnB1dHMuYnVsa1VuaXQpOw0KICAgICAgICAgICAgICAgIGlmIChLIDw9IDApIGVycm9ycy5wdXNoKCdCdWxrIG1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChtb2RlID09PSAnY2FsY0RpbWVuc2lvbmFsQ2hhbmdlJyAmJiBtZXRob2QgPT09ICdzdHJhaW4nKSB7DQogICAgICAgICAgICBjb25zdCBkMCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMubGF0ZXJhbERpbVNpemUgfHwgMCwgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKTsNCiAgICAgICAgICAgIGlmIChkMCA8PSAwKSBlcnJvcnMucHVzaCgnT3JpZ2luYWwgbGF0ZXJhbCBkaW1lbnNpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBlcnJvcnM7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29tcHV0ZVN0cmFpbnNGcm9tR2VvbWV0cnkoaW5wdXRzKSB7DQogICAgICAgIGNvbnN0IEwwID0gQ09OVi5sZW5ndGhU\",\n    \"b0ludGVybmFsKGlucHV0cy5vcmlnaW5hbExlbmd0aCB8fCAwLCBpbnB1dHMubGVuZ3RoVW5pdCk7DQogICAgICAgIGNvbnN0IGRMID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucHV0cy5sZW5ndGhDaGFuZ2UgfHwgMCwgaW5wdXRzLmxlbmd0aENoYW5nZVVuaXQpOw0KICAgICAgICBjb25zdCBlTG9uZyA9IEwwICE9PSAwID8gZEwgLyBMMCA6IG51bGw7DQoNCiAgICAgICAgbGV0IGVMYXQgPSBudWxsOw0KICAgICAgICBpZiAoaW5wdXRzLmxhdGVyYWxUeXBlID09PSAnd2lkdGgnKSB7DQogICAgICAgICAgICBjb25zdCB3MCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMub3JpZ2luYWxXaWR0aCB8fCAwLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgY29uc3QgZHcgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLndpZHRoQ2hhbmdlIHx8IDAsIGlucHV0cy53aWR0aENoYW5nZVVuaXQpOw0KICAgICAgICAgICAgZUxhdCA9IHcwICE9PSAwID8gZHcgLyB3MCA6IG51bGw7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBjb25zdCBkMCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMub3JpZ2luYWxEaWFtZXRlciB8fCAwLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgY29uc3QgZGQgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLmRpYW1ldGVyQ2hhbmdlIHx8IDAsIGlucHV0cy5kaWFtZXRlckNoYW5nZVVuaXQpOw0KICAgICAgICAgICAgZUxhdCA9IGQwICE9PSAwID8gZGQgLyBkMCA6IG51bGw7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4geyBlTG9uZywgZUxhdCwgTDAsIGRMIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29tcHV0ZUVsYXN0aWNGcm9tUGFpcihFLCBHLCBLLCBudSkgew0KICAgICAgICBjb25zdCByZXN1bHQgPSB7IEUsIEcsIEssIG51IH07DQogICAgICAgIGlmIChFICE9IG51bGwgJiYgRyAhPSBudWxsICYmIEcgPiAwKSB7DQogICAgICAgICAgICByZXN1bHQubnUgPSBFIC8gKDIgKiBHKSAtIDE7DQogICAgICAgIH0gZWxzZSBpZiAoRSAhPSBudWxsICYmIEsgIT0gbnVsbCAmJiBLID4gMCkgew0KICAgICAgICAgICAgcmVzdWx0Lm51ID0gKDMgKiBLIC0gRSkgLyAoNiAqIEspOw0KICAgICAgICB9DQogICAgICAgIGlmIChyZXN1bHQubnUgIT0gbnVsbCAmJiBFICE9IG51bGwpIHsNCiAgICAgICAgICAgIGlmIChNYXRoLmFicygxIC0gMiAqIHJlc3VsdC5udSkgPiAxZS0xMCkgew0KICAgICAgICAgICAgICAgIHJlc3VsdC5LID0gcmVzdWx0LksgPz8gRSAvICgzICogKDEgLSAyICogcmVzdWx0Lm51KSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXN1bHQuRyA9IHJlc3VsdC5HID8\/IEUgLyAoMiAqICgxICsgcmVzdWx0Lm51KSk7DQogICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lm51ICE9IG51bGwgJiYgRyAhPSBudWxsKSB7DQogICAgICAgICAgICByZXN1bHQuRSA9IDIgKiBHICogKDEgKyByZXN1bHQubnUpOw0KICAgICAgICAgICAgaWYgKE1hdGguYWJzKDEgLSAyICogcmVzdWx0Lm51KSA+IDFlLTEwKSB7DQogICAgICAgICAgICAgICAgcmVzdWx0LksgPSBFIC8gKDMgKiAoMSAtIDIgKiByZXN1bHQubnUpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNsYXNzaWZ5QmVoYXZpb3IobnUpIHsNCiAgICAgICAgaWYgKG51ID09IG51bGwgfHwgIWlzRmluaXRlKG51KSkgcmV0dXJuICdVbmtub3duJzsNCiAgICAgICAgaWYgKG51IDwgMCkgcmV0dXJuICdBdXhldGljJzsNCiAgICAgICAgaWYgKG51ID49IDAuNDkpIHJldHVybiAnTmVhci1JbmNvbXByZXNzaWJsZSc7DQogICAgICAgIHJldHVybiAnQ29udmVudGlvbmFsJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjbGFzc2lmeVJlZmVyZW5jZShudSwgcmVmTWluLCByZWZNYXgsIHJlZlR5cCkgew0KICAgICAgICBpZiAobnUgPT0gbnVsbCB8fCAhaXNGaW5pdGUobnUpKSByZXR1cm4geyBsYWJlbDogJ04vQScsIGxldmVsOiAnbmV1dHJhbCcgfTsNCiAgICAgICAgaWYgKG51IDwgLTEgfHwgbnUgPj0gMC41KSByZXR1cm4geyBsYWJlbDogJ1VudXN1YWwgUmVzdWx0JywgbGV2ZWw6ICdkYW5nZXInIH07DQogICAgICAgIGlmIChyZWZNaW4gIT0gbnVsbCAmJiByZWZNYXggIT0gbnVsbCAmJiBudSA+PSByZWZNaW4gJiYgbnUgPD0gcmVmTWF4KSB7DQogICAgICAgICAgICByZXR1cm4geyBsYWJlbDogJ1R5cGljYWwnLCBsZXZlbDogJ3NhZmUnIH07DQogICAgICAgIH0NCiAgICAgICAgaWYgKHJlZlR5cCAhPSBudWxsICYmIE1hdGguYWJzKG51IC0gcmVmVHlwKSAvIE1hdGgubWF4KE1hdGguYWJzKHJlZlR5cCksIDAuMDEpID4gMC4yNSkgew0KICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6ICdDYXV0aW9uJywgbGV2ZWw6ICdjYXV0aW9uJyB9Ow0KICAgICAgICB9DQogICAgICAgIGlmIChyZWZNaW4gIT0gbnVsbCAmJiByZWZNYXggIT0gbnVsbCkgew0KICAgICAgICAgICAgY29uc3QgbWFyZ2luID0gKHJlZk1heCAtIHJlZk1pbikgKiAwLjU7DQogICAgICAgICAgICBpZiAobnUgPCByZWZNaW4gLSBtYXJnaW4gfHwgbnUgPiByZWZNYXggKyBtYXJnaW4pIHsNCiAgICAgICAgICAgICAgICByZXR1cm4geyBsYWJlbDogJ1VudXN1YWwgUmVzdWx0JywgbGV2ZWw6ICdkYW5nZXInIH07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHsgbGFiZWw6ICdOZWFyIFR5cGljYWwnLCBsZXZlbDogJ2NhdXRpb24nIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY3VsYXRlKHNob3dQYW5lbCkgew0KICAgICAgICBpZiAoc2hvd1BhbmVsID09PSB1bmRlZmluZWQpIHNob3dQYW5lbCA9IHRydWU7DQogICAgICAgIGhpZGVNZXNzYWdlcygpOw0KICAgICAgICBjb25zdCBpbnB1dHMgPSBnZXRJbnB1dHMoKTsNCiAgICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVJbnB1dHMoaW5wdXRzKTsNCiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsNCiAgICAgICAgICAgIGlmIChzaG93UGFuZWwpIHsNCiAgICAgICAgICAgICAgICBzaG93UmVzdWx0c1BhbmVsKCk7DQogICAgICAgICAgICAgICAgc2hvd0Vycm9ycyhlcnJvcnMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3Qgd2FybmluZ3MgPSBbXTsNCiAgICAgICAgbGV0IG51ID0gbnVsbCwgZUxvbmcgPSBudWxsLCBlTGF0ID0gbnVsbCwgZVZvbCA9IG51bGw7DQogICAgICAgIGxldCBFID0gbnVsbCwgRyA9IG51bGwsIEsgPSBudWxsOw0KICAgICAgICBsZXQgZEwgPSBudWxsLCBkZCA9IG51bGwsIGR3ID0gbnVsbCwgTDAgPSBudWxsLCBkMCA9IG51bGwsIHcwID0gbnVsbDsNCg0KICAgICAgICBjb25zdCB7IG1vZGUsIGlucHV0TWV0aG9kOiBtZXRob2QgfSA9IGlucHV0czsNCg0KICAgICAgICBpZiAobWV0aG9kID09PSAnc3RyYWluJykgew0KICAgICAgICAgICAgZUxvbmcgPSBDT05WLnN0cmFpblRvSW50ZXJuYWwoaW5wdXRzLmxvbmdTdHJhaW4gfHwgMCwgaW5wdXRzLmxvbmdTdHJhaW5Vbml0KTsNCiAgICAgICAgICAgIGVMYXQgPSBDT05WLnN0cmFpblRvSW50ZXJuYWwoaW5wdXRzLmxhdGVyYWxTdHJhaW4gfHwgMCwgaW5wdXRzLmxhdGVyYWxTdHJhaW5Vbml0KTsNCiAgICAgICAgICAgIG51ID0gaW5wdXRzLnBvaXNzb247DQoNCiAgICAgICAgICAgIGlmIChtb2RlID09PSAnY2FsY1BvaXNzb24nKSB7DQogICAgICAgICAgICAgICAgaWYgKGVMb25nID09PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIHNob3dSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9ycyhbJ0xvbmdpdHVkaW5hbCBzdHJhaW4gY2Fubm90IGJlIHplcm8gd2hlbiBjYWxjdWxhdGluZyBQb2lzc29uXCdzIHJhdGlvIGZyb20gc3RyYWluLiddKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBudSA9IC1lTGF0IC8gZUxvbmc7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdjYWxjTGF0ZXJhbFN0cmFpbicpIHsNCiAgICAgICAgICAgICAgICBlTGF0ID0gLW51ICogZUxvbmc7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdjYWxjTG9uZ2l0dWRpbmFsU3RyYWluJykgew0KICAgICAgICAgICAgICAgIGlmIChudSA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICBzaG93UmVzdWx0c1BhbmVsKCk7DQogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcnMoWydQb2lzc29uXCdzIHJhdGlvIGNhbm5vdCBiZSB6ZXJvIHdoZW4gY2FsY3VsYXRpbmcgbG9uZ2l0dWRpbmFsIHN0cmFpbiBmcm9tIGxhdGVyYWwgc3RyYWluLiddKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlTG9uZyA9\",\n    \"IC1lTGF0IC8gbnU7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdjYWxjRGltZW5zaW9uYWxDaGFuZ2UnKSB7DQogICAgICAgICAgICAgICAgZUxhdCA9IC1udSAqIGVMb25nOw0KICAgICAgICAgICAgICAgIGNvbnN0IGRpbVR5cGUgPSBpbnB1dHMubGF0ZXJhbERpbVR5cGU7DQogICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMubGF0ZXJhbERpbVNpemUgfHwgMCwgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKTsNCiAgICAgICAgICAgICAgICBpZiAoZGltVHlwZSA9PT0gJ3dpZHRoJykgew0KICAgICAgICAgICAgICAgICAgICB3MCA9IHNpemU7DQogICAgICAgICAgICAgICAgICAgIGR3ID0gZUxhdCAqIHcwOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGQwID0gc2l6ZTsNCiAgICAgICAgICAgICAgICAgICAgZGQgPSBlTGF0ICogZDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ2xlbmd0aERpYW1ldGVyJykgew0KICAgICAgICAgICAgY29uc3QgZ2VvbSA9IGNvbXB1dGVTdHJhaW5zRnJvbUdlb21ldHJ5KGlucHV0cyk7DQogICAgICAgICAgICBlTG9uZyA9IGdlb20uZUxvbmc7DQogICAgICAgICAgICBlTGF0ID0gZ2VvbS5lTGF0Ow0KICAgICAgICAgICAgTDAgPSBnZW9tLkwwOw0KICAgICAgICAgICAgZEwgPSBnZW9tLmRMOw0KICAgICAgICAgICAgbnUgPSBpbnB1dHMucG9pc3NvbjsNCg0KICAgICAgICAgICAgaWYgKGlucHV0cy5sYXRlcmFsVHlwZSA9PT0gJ3dpZHRoJykgew0KICAgICAgICAgICAgICAgIHcwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucHV0cy5vcmlnaW5hbFdpZHRoIHx8IDAsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICAgICAgZHcgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLndpZHRoQ2hhbmdlIHx8IDAsIGlucHV0cy53aWR0aENoYW5nZVVuaXQpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBkMCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMub3JpZ2luYWxEaWFtZXRlciB8fCAwLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgICAgIGRkID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucHV0cy5kaWFtZXRlckNoYW5nZSB8fCAwLCBpbnB1dHMuZGlhbWV0ZXJDaGFuZ2VVbml0KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjYWxjUG9pc3NvbicpIHsNCiAgICAgICAgICAgICAgICBpZiAoZUxvbmcgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgc2hvd1Jlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3JzKFsnTG9uZ2l0dWRpbmFsIHN0cmFpbiBjYW5ub3QgYmUgemVybyDigJQgY2hlY2sgbGVuZ3RoIHZhbHVlcy4nXSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbnUgPSAtZUxhdCAvIGVMb25nOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnY2FsY0xhdGVyYWxTdHJhaW4nKSB7DQogICAgICAgICAgICAgICAgZUxhdCA9IC1udSAqIGVMb25nOw0KICAgICAgICAgICAgICAgIGlmIChpbnB1dHMubGF0ZXJhbFR5cGUgPT09ICd3aWR0aCcpIGR3ID0gZUxhdCAqIHcwOw0KICAgICAgICAgICAgICAgIGVsc2UgZGQgPSBlTGF0ICogZDA7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdjYWxjTG9uZ2l0dWRpbmFsU3RyYWluJykgew0KICAgICAgICAgICAgICAgIGlmIChudSA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICBzaG93UmVzdWx0c1BhbmVsKCk7DQogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcnMoWydQb2lzc29uXCdzIHJhdGlvIGNhbm5vdCBiZSB6ZXJvLiddKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlTG9uZyA9IC1lTGF0IC8gbnU7DQogICAgICAgICAgICAgICAgZEwgPSBlTG9uZyAqIEwwOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnY2FsY0RpbWVuc2lvbmFsQ2hhbmdlJykgew0KICAgICAgICAgICAgICAgIGVMYXQgPSAtbnUgKiBlTG9uZzsNCiAgICAgICAgICAgICAgICBpZiAoaW5wdXRzLmxhdGVyYWxUeXBlID09PSAnd2lkdGgnKSBkdyA9IGVMYXQgKiB3MDsNCiAgICAgICAgICAgICAgICBlbHNlIGRkID0gZUxhdCAqIGQwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ2VBbmRHJykgew0KICAgICAgICAgICAgRSA9IENPTlYubW9kdWx1c1RvSW50ZXJuYWwoaW5wdXRzLnlvdW5nTW9kdWx1cywgaW5wdXRzLnlvdW5nVW5pdCk7DQogICAgICAgICAgICBHID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnB1dHMuc2hlYXJNb2R1bHVzLCBpbnB1dHMubW9kdWx1c1VuaXQpOw0KICAgICAgICAgICAgY29uc3QgZWxhc3RpYyA9IGNvbXB1dGVFbGFzdGljRnJvbVBhaXIoRSwgRywgbnVsbCwgbnVsbCk7DQogICAgICAgICAgICBudSA9IGVsYXN0aWMubnU7DQogICAgICAgICAgICBLID0gZWxhc3RpYy5LOw0KICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjYWxjRWxhc3RpY0NvbnN0YW50cycpIHsNCiAgICAgICAgICAgICAgICBFID0gZWxhc3RpYy5FOw0KICAgICAgICAgICAgICAgIEcgPSBlbGFzdGljLkc7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnZUFuZEsnKSB7DQogICAgICAgICAgICBFID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnB1dHMueW91bmdNb2R1bHVzLCBpbnB1dHMueW91bmdVbml0KTsNCiAgICAgICAgICAgIEsgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5idWxrTW9kdWx1cywgaW5wdXRzLmJ1bGtVbml0KTsNCiAgICAgICAgICAgIGNvbnN0IGVsYXN0aWMgPSBjb21wdXRlRWxhc3RpY0Zyb21QYWlyKEUsIG51bGwsIEssIG51bGwpOw0KICAgICAgICAgICAgbnUgPSBlbGFzdGljLm51Ow0KICAgICAgICAgICAgRyA9IGVsYXN0aWMuRzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChtb2RlID09PSAnY2FsY0VsYXN0aWNDb25zdGFudHMnICYmIG51ICE9IG51bGwgJiYgRSAhPSBudWxsKSB7DQogICAgICAgICAgICBjb25zdCBlbGFzdGljID0gY29tcHV0ZUVsYXN0aWNGcm9tUGFpcihFLCBHLCBLLCBudSk7DQogICAgICAgICAgICBFID0gZWxhc3RpYy5FOw0KICAgICAgICAgICAgRyA9IGVsYXN0aWMuRzsNCiAgICAgICAgICAgIEsgPSBlbGFzdGljLks7DQogICAgICAgICAgICBudSA9IGVsYXN0aWMubnU7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobnUgIT0gbnVsbCAmJiAobnUgPD0gLTEgfHwgbnUgPj0gMC41KSkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnQ2FsY3VsYXRlZCBQb2lzc29uXCdzIHJhdGlvIGlzIG91dHNpZGUgdGhlIHRoZW9yZXRpY2FsIHJhbmdlIOKIkjEgJmx0OyDOvSAmbHQ7IDAuNSBmb3Igc3RhYmxlIGlzb3Ryb3BpYyBtYXRlcmlhbHMuIFZlcmlmeSBpbnB1dHMsIHVuaXRzLCBvciBtYXRlcmlhbCBtb2RlbC4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChudSAhPSBudWxsICYmIG51ID49IDAuNDkpIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goJ1BvaXNzb25cJ3MgcmF0aW8gYXBwcm9hY2hlcyAwLjUg4oCUIG5lYXItaW5jb21wcmVzc2libGUgbWF0ZXJpYWwuIEJ1bGsgbW9kdWx1cyBiZWNvbWVzIHZlcnkgbGFyZ2UgYW5kIG51bWVyaWNhbCBzZW5zaXRpdml0eSBpbmNyZWFzZXMuJyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobnUgIT0gbnVsbCAmJiBudSA8IDApIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goJ05lZ2F0aXZlIFBvaXNzb25cJ3MgcmF0aW8gZGV0ZWN0ZWQg4oCUIHBvc3NpYmxlIGF1eGV0aWMgYmVoYXZpb3IuIE1hdGVyaWFsIGV4cGFuZHMgbGF0ZXJhbGx5IHVuZGVyIGF4aWFsIHRlbnNpb24uJyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZUxvbmcgIT0gbnVsbCAmJiBlTGF0ICE9IG51bGwpIHsNCiAgICAgICAgICAgIGVWb2wgPSBlTG9uZyAqICgxIC0gMiAqIChudSAhPSBudWxsID8gbnUgOiAtZUxhdCAvIChlTG9uZyB8fCAxKSkpOw0KICAgICAgICB9IGVsc2UgaWYgKGVMb25nICE9IG51bGwgJiYgbnUgIT0gbnVsbCkgew0KICAgICAgICAgICAgZVZvbCA9IGVMb25nICogKDEgLSAyICogbnUpOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgcmVmTWluID0gaW5wdXRzLnJlZk51TWluOw0KICAgICAgICBjb25zdCByZWZNYXggPSBpbnB1dHMucmVmTnVNYXg7DQogICAgICAgIGNvbnN0IHJlZlR5cCA9IGlucHV0cy5yZWZOdVR5cGljYWw7DQogICAgICAgIGNvbnN0IHJlZkNvbXBhcmUgPSBjbGFzc2lmeVJlZmVy\",\n    \"ZW5jZShudSwgcmVmTWluLCByZWZNYXgsIHJlZlR5cCk7DQogICAgICAgIGlmIChyZWZDb21wYXJlLmxhYmVsID09PSAnQ2F1dGlvbicgfHwgcmVmQ29tcGFyZS5sYWJlbCA9PT0gJ1VudXN1YWwgUmVzdWx0Jykgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnQ2FsY3VsYXRlZCBQb2lzc29uXCdzIHJhdGlvIGRpZmZlcnMgZnJvbSB0aGUgc2VsZWN0ZWQgbWF0ZXJpYWwgcmVmZXJlbmNlIHJhbmdlIOKAlCBjaGVjayB1bml0cywgc3RyYWluIHNpZ24gY29udmVudGlvbiwgYW5kIHRlc3QgY29uZGl0aW9ucy4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IGJlaGF2aW9yID0gY2xhc3NpZnlCZWhhdmlvcihudSk7DQogICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlZkNvbXBhcmUubGV2ZWwgPT09ICdkYW5nZXInDQogICAgICAgICAgICA\/IHsgbGV2ZWw6ICdkYW5nZXInLCBsYWJlbDogJ1VudXN1YWwgUmVzdWx0JyB9DQogICAgICAgICAgICA6IHJlZkNvbXBhcmUubGV2ZWwgPT09ICdjYXV0aW9uJw0KICAgICAgICAgICAgICAgID8geyBsZXZlbDogJ2NhdXRpb24nLCBsYWJlbDogJ0NhdXRpb24nIH0NCiAgICAgICAgICAgICAgICA6IG51ICE9IG51bGwNCiAgICAgICAgICAgICAgICAgICAgPyB7IGxldmVsOiAnc2FmZScsIGxhYmVsOiAnVHlwaWNhbCcgfQ0KICAgICAgICAgICAgICAgICAgICA6IHsgbGV2ZWw6ICduZXV0cmFsJywgbGFiZWw6ICdDYWxjdWxhdGVkJyB9Ow0KDQogICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGgpIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7DQoNCiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHsNCiAgICAgICAgICAgIG51LCBlTG9uZywgZUxhdCwgZVZvbCwgRSwgRywgSywgZEwsIGRkLCBkdywgTDAsIGQwLCB3MCwNCiAgICAgICAgICAgIGJlaGF2aW9yLCByZWZDb21wYXJlLCBzdGF0dXMsIG1vZGUsIGlucHV0TWV0aG9kOiBtZXRob2QNCiAgICAgICAgfTsNCg0KICAgICAgICBkaXNwbGF5UmVzdWx0cyhyZXN1bHRzKTsNCiAgICAgICAgZHJhd1Zpc3VhbGl6YXRpb25zKHJlc3VsdHMpOw0KICAgICAgICBpZiAoc2hvd1BhbmVsKSBzaG93UmVzdWx0c1BhbmVsKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm9ybWF0TnVtKG4sIGRlY2ltYWxzKSB7DQogICAgICAgIGlmIChkZWNpbWFscyA9PT0gdW5kZWZpbmVkKSBkZWNpbWFscyA9IDQ7DQogICAgICAgIGlmIChuID09PSBudWxsIHx8IG4gPT09IHVuZGVmaW5lZCB8fCAhaXNGaW5pdGUobikpIHJldHVybiAnTi9BJzsNCiAgICAgICAgaWYgKE1hdGguYWJzKG4pID49IDEwMDAwKSByZXR1cm4gbi50b0V4cG9uZW50aWFsKDMpOw0KICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChuLnRvRml4ZWQoZGVjaW1hbHMpKS50b1N0cmluZygpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZvcm1hdExlbmd0aCh2KSB7DQogICAgICAgIGlmICh2ID09IG51bGwgfHwgIWlzRmluaXRlKHYpKSByZXR1cm4geyB2YWx1ZTogJ04vQScsIHVuaXQ6ICcnIH07DQogICAgICAgIGNvbnN0IGlzSW1wID0gdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJzsNCiAgICAgICAgaWYgKE1hdGguYWJzKHYpIDwgMC4wMDEgJiYgIWlzSW1wKSB7DQogICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogZm9ybWF0TnVtKHYgKiAxMDAwLCAzKSwgdW5pdDogJ868bScgfTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoTWF0aC5hYnModikgPCAwLjAxICYmIGlzSW1wKSB7DQogICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogZm9ybWF0TnVtKHYgKiAxMDAwLCA0KSwgdW5pdDogJ21pbCcgfTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdmFsdWU6IGZvcm1hdE51bShDT05WLmxlbmd0aEZyb21JbnRlcm5hbCh2LCBpc0ltcCA\/ICdpbicgOiAnbW0nKSwgNCksDQogICAgICAgICAgICB1bml0OiBpc0ltcCA\/ICdpbicgOiAnbW0nDQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGlzcGxheVJlc3VsdHMocikgew0KICAgICAgICBjb25zdCBiYWRnZSA9ICQoJ3N0YXR1c0JhZGdlJyk7DQogICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gci5zdGF0dXMubGFiZWw7DQogICAgICAgIGJhZGdlLmNsYXNzTmFtZSA9ICdwcmMtc3RhdHVzLWJhZGdlIHByYy1zdGF0dXMtJyArIHIuc3RhdHVzLmxldmVsOw0KDQogICAgICAgIGNvbnN0IGdyaWQgPSAkKCdyZXN1bHRzR3JpZCcpOw0KICAgICAgICBjb25zdCBtb2RVbml0ID0gdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdrc2knIDogJ0dQYSc7DQogICAgICAgIGNvbnN0IGl0ZW1zID0gW107DQoNCiAgICAgICAgaWYgKHIubnUgIT0gbnVsbCAmJiBpc0Zpbml0ZShyLm51KSkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAiUG9pc3NvbidzIFJhdGlvIM69IiwgdmFsdWU6IGZvcm1hdE51bShyLm51LCA0KSwgdW5pdDogJycgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci5lTG9uZyAhPSBudWxsKSB7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsNCiAgICAgICAgICAgICAgICBsYWJlbDogJ0xvbmdpdHVkaW5hbCBTdHJhaW4gzrU8c3ViPmxvbmc8L3N1Yj4nLA0KICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXROdW0oci5lTG9uZywgNiksDQogICAgICAgICAgICAgICAgdW5pdDogJycsDQogICAgICAgICAgICAgICAgc3ViOiAnKCcgKyBmb3JtYXROdW0oci5lTG9uZyAqIDEwMCwgNCkgKyAnICUpJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci5lTGF0ICE9IG51bGwpIHsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goew0KICAgICAgICAgICAgICAgIGxhYmVsOiAnTGF0ZXJhbCBTdHJhaW4gzrU8c3ViPmxhdDwvc3ViPicsDQogICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdE51bShyLmVMYXQsIDYpLA0KICAgICAgICAgICAgICAgIHVuaXQ6ICcnLA0KICAgICAgICAgICAgICAgIHN1YjogJygnICsgZm9ybWF0TnVtKHIuZUxhdCAqIDEwMCwgNCkgKyAnICUpJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci5kTCAhPSBudWxsKSB7DQogICAgICAgICAgICBjb25zdCBmID0gZm9ybWF0TGVuZ3RoKHIuZEwpOw0KICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnQXhpYWwgTGVuZ3RoIENoYW5nZSDOlEwnLCB2YWx1ZTogZi52YWx1ZSwgdW5pdDogZi51bml0IH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHIuZGQgIT0gbnVsbCkgew0KICAgICAgICAgICAgY29uc3QgZiA9IGZvcm1hdExlbmd0aChyLmRkKTsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0xhdGVyYWwgRGlhbWV0ZXIgQ2hhbmdlIM6UZCcsIHZhbHVlOiBmLnZhbHVlLCB1bml0OiBmLnVuaXQgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci5kdyAhPSBudWxsKSB7DQogICAgICAgICAgICBjb25zdCBmID0gZm9ybWF0TGVuZ3RoKHIuZHcpOw0KICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnTGF0ZXJhbCBXaWR0aCBDaGFuZ2UgzpR3JywgdmFsdWU6IGYudmFsdWUsIHVuaXQ6IGYudW5pdCB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyLkUgIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7DQogICAgICAgICAgICAgICAgbGFiZWw6ICJZb3VuZydzIE1vZHVsdXMgRSIsDQogICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdE51bShDT05WLm1vZHVsdXNGcm9tSW50ZXJuYWwoci5FLCBtb2RVbml0KSwgMiksDQogICAgICAgICAgICAgICAgdW5pdDogbW9kVW5pdA0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci5HICE9IG51bGwpIHsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goew0KICAgICAgICAgICAgICAgIGxhYmVsOiAnU2hlYXIgTW9kdWx1cyBHJywNCiAgICAgICAgICAgICAgICB2YWx1ZTogZm9ybWF0TnVtKENPTlYubW9kdWx1c0Zyb21JbnRlcm5hbChyLkcsIG1vZFVuaXQpLCAyKSwNCiAgICAgICAgICAgICAgICB1bml0OiBtb2RVbml0DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyLksgIT0gbnVsbCAmJiBpc0Zpbml0ZShyLkspKSB7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsNCiAgICAgICAgICAgICAgICBsYWJlbDogJ0J1bGsgTW9kdWx1cyBLJywNCiAgICAgICAgICAgICAgICB2YWx1ZTogZm9ybWF0TnVtKENPTlYubW9kdWx1c0Zyb21JbnRlcm5hbChyLkssIG1vZFVuaXQpLCAyKSwNCiAgICAgICAgICAgICAgICB1bml0OiBtb2RVbml0DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyLmVWb2wgIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7DQogICAgICAgICAgICAgICAgbGFiZWw6ICdWb2x1bWV0cmljIFN0cmFpbiDOtTxzdWI+djwvc3ViPicsDQogICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdE51bShyLmVWb2wsIDYpLA0KICAgICAgICAgICAgICAgIHVuaXQ6ICcnLA0KICAgICAgICAgICAgICAgIHN1YjogJygnICsgZm9y\",\n    \"bWF0TnVtKHIuZVZvbCAqIDEwMCwgNCkgKyAnICUpJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdNYXRlcmlhbCBCZWhhdmlvcicsIHZhbHVlOiByLmJlaGF2aW9yLCB1bml0OiAnJyB9KTsNCiAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnUmVmZXJlbmNlIENvbXBhcmlzb24nLCB2YWx1ZTogci5yZWZDb21wYXJlLmxhYmVsLCB1bml0OiAnJyB9KTsNCg0KICAgICAgICBncmlkLmlubmVySFRNTCA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gYA0KICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJjLXJlc3VsdC1pdGVtIj4NCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJjLXJlc3VsdC1sYWJlbCI+JHtpdGVtLmxhYmVsfTwvc3Bhbj4NCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJjLXJlc3VsdC12YWx1ZSI+JHtpdGVtLnZhbHVlfSR7aXRlbS51bml0ID8gJyAnICsgaXRlbS51bml0IDogJyd9PC9zcGFuPg0KICAgICAgICAgICAgICAgICR7aXRlbS5zdWIgPyBgPHNwYW4gY2xhc3M9InByYy1yZXN1bHQtc3ViIj4ke2l0ZW0uc3VifTwvc3Bhbj5gIDogJyd9DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgYCkuam9pbignJyk7DQoNCiAgICAgICAgc2hvd1JlY29tbWVuZGF0aW9ucyhyKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93UmVjb21tZW5kYXRpb25zKHIpIHsNCiAgICAgICAgY29uc3QgcmVjID0gJCgncmVjb21tZW5kYXRpb25zJyk7DQogICAgICAgIGNvbnN0IHRpcHMgPSBbDQogICAgICAgICAgICAnVmVyaWZ5IHN0cmFpbiBzaWduIGNvbnZlbnRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIFBvaXNzb25cJ3MgcmF0aW8uJywNCiAgICAgICAgICAgICdVc2Ugc3RyYWluIGRhdGEgbWVhc3VyZWQgaW4gdGhlIGVsYXN0aWMgcmFuZ2Ugd2hlbmV2ZXIgcG9zc2libGUuJywNCiAgICAgICAgICAgICdDaGVjayBkaW1lbnNpb25hbCB1bml0cyBjYXJlZnVsbHkgd2hlbiBjYWxjdWxhdGluZyBzdHJhaW4gZnJvbSBtZWFzdXJlZCBkZWZvcm1hdGlvbi4nLA0KICAgICAgICAgICAgJ1VzZSBtYXRlcmlhbCB0ZXN0IGRhdGEgZm9yIHByZWNpc2UgZW5naW5lZXJpbmcgZGVzaWduLicsDQogICAgICAgICAgICAnRG8gbm90IGFzc3VtZSBpc290cm9waWMgYmVoYXZpb3IgZm9yIGNvbXBvc2l0ZXMgb3Igc3Ryb25nbHkgZGlyZWN0aW9uYWwgbWF0ZXJpYWxzLicsDQogICAgICAgICAgICAnVXNlIGNhdXRpb24gd2hlbiDOvSBhcHByb2FjaGVzIDAuNSBiZWNhdXNlIGJ1bGsgbW9kdWx1cyBjYWxjdWxhdGlvbnMgYmVjb21lIGhpZ2hseSBzZW5zaXRpdmUuJywNCiAgICAgICAgICAgICdJbnZlc3RpZ2F0ZSBuZWdhdGl2ZSBQb2lzc29uXCdzIHJhdGlvIHJlc3VsdHMgaWYgYXV4ZXRpYyBiZWhhdmlvciBpcyBub3QgZXhwZWN0ZWQuJw0KICAgICAgICBdOw0KDQogICAgICAgIGlmIChyLmJlaGF2aW9yID09PSAnQXV4ZXRpYycpIHsNCiAgICAgICAgICAgIHRpcHMudW5zaGlmdCgnQXV4ZXRpYyBiZWhhdmlvciBkZXRlY3RlZCDigJQgY29uZmlybSBtYXRlcmlhbCB0eXBlIGFuZCBsb2FkaW5nIGRpcmVjdGlvbi4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoci5iZWhhdmlvciA9PT0gJ05lYXItSW5jb21wcmVzc2libGUnKSB7DQogICAgICAgICAgICB0aXBzLnVuc2hpZnQoJ05lYXItaW5jb21wcmVzc2libGUgbWF0ZXJpYWwg4oCUIGJ1bGsgbW9kdWx1cyBpcyB2ZXJ5IHNlbnNpdGl2ZSBuZWFyIM69ID0gMC41LicpOw0KICAgICAgICB9DQogICAgICAgIGlmIChyLnN0YXR1cy5sZXZlbCA9PT0gJ2NhdXRpb24nIHx8IHIuc3RhdHVzLmxldmVsID09PSAnZGFuZ2VyJykgew0KICAgICAgICAgICAgdGlwcy51bnNoaWZ0KCdSZXZpZXcgaW5wdXRzIGFuZCBtYXRlcmlhbCByZWZlcmVuY2Ug4oCUIHJlc3VsdCBtYXkgaW5kaWNhdGUgdW5pdCwgbWVhc3VyZW1lbnQsIG9yIG1vZGVsIGlzc3Vlcy4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJlYy5pbm5lckhUTUwgPSAnPGgzPkVuZ2luZWVyaW5nIFJlY29tbWVuZGF0aW9uczwvaDM+PHVsPicgKw0KICAgICAgICAgICAgdGlwcy5tYXAoKHQpID0+ICc8bGk+JyArIHQgKyAnPC9saT4nKS5qb2luKCcnKSArICc8L3VsPic7DQogICAgICAgIHJlYy5jbGFzc0xpc3QucmVtb3ZlKCdwcmMtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd0Vycm9ycyhlcnJvcnMpIHsNCiAgICAgICAgJCgnZXJyb3JCb3gnKS5pbm5lckhUTUwgPSAnPHN0cm9uZz5QbGVhc2UgY29ycmVjdCB0aGUgZm9sbG93aW5nOjwvc3Ryb25nPjx1bD4nICsNCiAgICAgICAgICAgIGVycm9ycy5tYXAoKGUpID0+ICc8bGk+JyArIGUgKyAnPC9saT4nKS5qb2luKCcnKSArICc8L3VsPic7DQogICAgICAgICQoJ2Vycm9yQm94JykuY2xhc3NMaXN0LnJlbW92ZSgncHJjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNob3dXYXJuaW5ncyh3YXJuaW5ncykgew0KICAgICAgICAkKCd3YXJuaW5nQm94JykuaW5uZXJIVE1MID0gJzxzdHJvbmc+V2FybmluZ3M6PC9zdHJvbmc+PHVsPicgKw0KICAgICAgICAgICAgd2FybmluZ3MubWFwKCh3KSA9PiAnPGxpPicgKyB3ICsgJzwvbGk+Jykuam9pbignJykgKyAnPC91bD4nOw0KICAgICAgICAkKCd3YXJuaW5nQm94JykuY2xhc3NMaXN0LnJlbW92ZSgncHJjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGhpZGVNZXNzYWdlcygpIHsNCiAgICAgICAgJCgnZXJyb3JCb3gnKS5jbGFzc0xpc3QuYWRkKCdwcmMtaGlkZGVuJyk7DQogICAgICAgICQoJ3dhcm5pbmdCb3gnKS5jbGFzc0xpc3QuYWRkKCdwcmMtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd1Jlc3VsdHNQYW5lbCgpIHsNCiAgICAgICAgcmVzdWx0c1BhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3ByYy1oaWRkZW4nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBoaWRlUmVzdWx0c1BhbmVsKCkgew0KICAgICAgICByZXN1bHRzUGFuZWwuY2xhc3NMaXN0LmFkZCgncHJjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdWaXN1YWxpemF0aW9ucyhyKSB7DQogICAgICAgIGRyYXdBeGlhbERpYWdyYW0ocik7DQogICAgICAgIGRyYXdTdHJhaW5EaWFncmFtKHIpOw0KICAgICAgICBkcmF3RWxhc3RpY0RpYWdyYW0ocik7DQogICAgICAgIGRyYXdCZWhhdmlvckdhdWdlKHIpOw0KICAgICAgICBkcmF3UmVmZXJlbmNlR2F1Z2Uocik7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd0F4aWFsRGlhZ3JhbShyKSB7DQogICAgICAgIGNvbnN0IHN2ZyA9ICQoJ2F4aWFsRGlhZ3JhbScpOw0KICAgICAgICBjb25zdCBudSA9IHIubnUgIT0gbnVsbCA\/IHIubnUgOiAwLjM7DQogICAgICAgIGNvbnN0IGVMb25nID0gci5lTG9uZyAhPSBudWxsID8gci5lTG9uZyA6IDAuMDAxOw0KICAgICAgICBjb25zdCBleHRTY2FsZSA9IE1hdGgubWluKDI1LCBNYXRoLmFicyhlTG9uZykgKiA4MDAwKTsNCiAgICAgICAgY29uc3QgbGF0U2NhbGUgPSBNYXRoLm1pbig4LCBNYXRoLmFicyhudSAqIGVMb25nKSAqIDgwMDApOw0KDQogICAgICAgIGNvbnN0IG9yaWdXID0gNjAsIG9yaWdIID0gMzA7DQogICAgICAgIGNvbnN0IHggPSA1MCwgeSA9IDUwOw0KICAgICAgICBjb25zdCBuZXdXID0gb3JpZ1cgKyBleHRTY2FsZTsNCiAgICAgICAgY29uc3QgbmV3SCA9IG9yaWdIIC0gbGF0U2NhbGUgKiAyOw0KDQogICAgICAgIHN2Zy5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICA8ZGVmcz4NCiAgICAgICAgICAgICAgICA8bWFya2VyIGlkPSIke1NWR19JRH1hcnJSIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSIzIiBvcmllbnQ9ImF1dG8iPg0KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwIEw4LDMgTDAsNiIgZmlsbD0iI2U2N2UyMiIvPg0KICAgICAgICAgICAgICAgIDwvbWFya2VyPg0KICAgICAgICAgICAgPC9kZWZzPg0KICAgICAgICAgICAgPHJlY3QgeD0iJHt4fSIgeT0iJHt5fSIgd2lkdGg9IiR7b3JpZ1d9IiBoZWlnaHQ9IiR7b3JpZ0h9IiBmaWxsPSJub25lIiBzdHJva2U9IiM5NWE1YTYiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI0LDMiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7eCArIG9yaWdXIC8gMn0iIHk9IiR7eSAtIDZ9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjgiIGZpbGw9IiM5NWE1YTYiPk9yaWdpbmFsPC90ZXh0Pg0KICAgICAgICAgICAgPHJlY3QgeD0iJHt4ICsgOTB9IiB5PSIke3kgKyBsYXRTY2FsZX0iIHdpZHRoPSIke25ld1d9IiBoZWlnaHQ9IiR7bmV3SH0iIGZpbGw9IiNiZGMzYzciIHN0cm9rZT0iIzdmOGM4ZCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7eCArIDkwICsgbmV3VyAvIDJ9IiB5PSIke3kgKyBsYXRTY2FsZSAtIDZ9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjgiIGZpbGw9IiMyNDcxYTMiPkRlZm9y\",\n    \"bWVkPC90ZXh0Pg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7eCArIDkwIC0gMTh9IiB5MT0iJHt5ICsgbGF0U2NhbGUgKyBuZXdIIC8gMn0iIHgyPSIke3ggKyA5MCAtIDJ9IiB5Mj0iJHt5ICsgbGF0U2NhbGUgKyBuZXdIIC8gMn0iIHN0cm9rZT0iI2U2N2UyMiIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoIyR7U1ZHX0lEfWFyclIpIi8+DQogICAgICAgICAgICA8bGluZSB4MT0iJHt4ICsgOTAgKyBuZXdXICsgMn0iIHkxPSIke3kgKyBsYXRTY2FsZSArIG5ld0ggLyAyfSIgeDI9IiR7eCArIDkwICsgbmV3VyArIDE4fSIgeTI9IiR7eSArIGxhdFNjYWxlICsgbmV3SCAvIDJ9IiBzdHJva2U9IiNlNjdlMjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLXN0YXJ0PSJ1cmwoIyR7U1ZHX0lEfWFyclIpIi8+DQogICAgICAgICAgICA8bGluZSB4MT0iJHt4ICsgOTAgKyBuZXdXIC8gMn0iIHkxPSIke3kgKyBsYXRTY2FsZSArIG5ld0ggKyA4fSIgeDI9IiR7eCArIDkwICsgbmV3VyAvIDIgKyBleHRTY2FsZSAqIDAuM30iIHkyPSIke3kgKyBsYXRTY2FsZSArIG5ld0ggKyA4fSIgc3Ryb2tlPSIjMjdhZTYwIiBzdHJva2Utd2lkdGg9IjEuNSIgbWFya2VyLWVuZD0idXJsKCMke1NWR19JRH1hcnJSKSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iMTQwIiB5PSIxMTUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOSIgZmlsbD0iIzVkNmQ3ZSI+QXhpYWwgVGVuc2lvbiDigJQgRXh0ZW5zaW9uICZhbXA7IExhdGVyYWwgQ29udHJhY3Rpb248L3RleHQ+DQogICAgICAgIGA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd1N0cmFpbkRpYWdyYW0ocikgew0KICAgICAgICBjb25zdCBzdmcgPSAkKCdzdHJhaW5EaWFncmFtJyk7DQogICAgICAgIGNvbnN0IGN4ID0gMTQwLCBjeSA9IDY1Ow0KICAgICAgICBjb25zdCBlTG9uZyA9IHIuZUxvbmcgIT0gbnVsbCA\/IHIuZUxvbmcgOiAwLjAwMTsNCiAgICAgICAgY29uc3QgZUxhdCA9IHIuZUxhdCAhPSBudWxsID8gci5lTGF0IDogLTAuMDAwMzsNCiAgICAgICAgY29uc3QgbG9uZ0xlbiA9IE1hdGgubWluKDQwLCBNYXRoLmFicyhlTG9uZykgKiAxMjAwMCk7DQogICAgICAgIGNvbnN0IGxhdExlbiA9IE1hdGgubWluKDIwLCBNYXRoLmFicyhlTGF0KSAqIDEyMDAwKTsNCg0KICAgICAgICBzdmcuaW5uZXJIVE1MID0gYA0KICAgICAgICAgICAgPGRlZnM+DQogICAgICAgICAgICAgICAgPG1hcmtlciBpZD0iJHtTVkdfSUR9YXJyRyIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iOCIgcmVmWD0iNyIgcmVmWT0iMyIgb3JpZW50PSJhdXRvIj4NCiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMCBMOCwzIEwwLDYiIGZpbGw9IiMyN2FlNjAiLz4NCiAgICAgICAgICAgICAgICA8L21hcmtlcj4NCiAgICAgICAgICAgICAgICA8bWFya2VyIGlkPSIke1NWR19JRH1hcnJCIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSIzIiBvcmllbnQ9ImF1dG8iPg0KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwIEw4LDMgTDAsNiIgZmlsbD0iIzI0NzFhMyIvPg0KICAgICAgICAgICAgICAgIDwvbWFya2VyPg0KICAgICAgICAgICAgPC9kZWZzPg0KICAgICAgICAgICAgPHJlY3QgeD0iJHtjeCAtIDMwfSIgeT0iJHtjeSAtIDE1fSIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZWNmMGYxIiBzdHJva2U9IiM3ZjhjOGQiIHN0cm9rZS13aWR0aD0iMSIvPg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7Y3ggLSAzMH0iIHkxPSIke2N5fSIgeDI9IiR7Y3ggLSAzMCAtIGxvbmdMZW59IiB5Mj0iJHtjeX0iIHN0cm9rZT0iIzI3YWU2MCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoIyR7U1ZHX0lEfWFyckcpIi8+DQogICAgICAgICAgICA8bGluZSB4MT0iJHtjeCArIDMwfSIgeTE9IiR7Y3l9IiB4Mj0iJHtjeCArIDMwICsgbG9uZ0xlbn0iIHkyPSIke2N5fSIgc3Ryb2tlPSIjMjdhZTYwIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjJHtTVkdfSUR9YXJyRykiLz4NCiAgICAgICAgICAgIDxsaW5lIHgxPSIke2N4fSIgeTE9IiR7Y3kgLSAxNX0iIHgyPSIke2N4fSIgeTI9IiR7Y3kgLSAxNSAtIGxhdExlbn0iIHN0cm9rZT0iIzI0NzFhMyIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoIyR7U1ZHX0lEfWFyckIpIi8+DQogICAgICAgICAgICA8bGluZSB4MT0iJHtjeH0iIHkxPSIke2N5ICsgMTV9IiB4Mj0iJHtjeH0iIHkyPSIke2N5ICsgMTUgKyBsYXRMZW59IiBzdHJva2U9IiMyNDcxYTMiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLXN0YXJ0PSJ1cmwoIyR7U1ZHX0lEfWFyckIpIi8+DQogICAgICAgICAgICA8dGV4dCB4PSIke2N4IC0gNDUgLSBsb25nTGVufSIgeT0iJHtjeSArIDR9IiBmb250LXNpemU9IjgiIGZpbGw9IiMyN2FlNjAiPs61PHN1Yj5sb25nPC9zdWI+PC90ZXh0Pg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeCArIDh9IiB5PSIke2N5IC0gMjAgLSBsYXRMZW59IiBmb250LXNpemU9IjgiIGZpbGw9IiMyNDcxYTMiPs61PHN1Yj5sYXQ8L3N1Yj48L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIke2N4fSIgeT0iMTE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjkiIGZpbGw9IiM1ZDZkN2UiPlN0cmFpbiBEaXJlY3Rpb24gQXJyb3dzPC90ZXh0Pg0KICAgICAgICBgOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdFbGFzdGljRGlhZ3JhbShyKSB7DQogICAgICAgIGNvbnN0IHN2ZyA9ICQoJ2VsYXN0aWNEaWFncmFtJyk7DQogICAgICAgIGNvbnN0IEUgPSByLkUgIT0gbnVsbCA\/IENPTlYubW9kdWx1c0Zyb21JbnRlcm5hbChyLkUsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAna3NpJyA6ICdHUGEnKSA6IDIwMDsNCiAgICAgICAgY29uc3QgRyA9IHIuRyAhPSBudWxsID8gQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKHIuRywgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdrc2knIDogJ0dQYScpIDogNzc7DQogICAgICAgIGNvbnN0IEsgPSByLksgIT0gbnVsbCAmJiBpc0Zpbml0ZShyLkspID8gQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKHIuSywgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdrc2knIDogJ0dQYScpIDogMTY3Ow0KICAgICAgICBjb25zdCBudSA9IHIubnUgIT0gbnVsbCA\/IHIubnUgOiAwLjM7DQogICAgICAgIGNvbnN0IG1vZFVuaXQgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2tzaScgOiAnR1BhJzsNCg0KICAgICAgICBzdmcuaW5uZXJIVE1MID0gYA0KICAgICAgICAgICAgPGRlZnM+DQogICAgICAgICAgICAgICAgPG1hcmtlciBpZD0iJHtTVkdfSUR9ZWxhc3RpY0FyciIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iOCIgcmVmWD0iNyIgcmVmWT0iMyIgb3JpZW50PSJhdXRvIj4NCiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMCBMOCwzIEwwLDYiIGZpbGw9IiM3ZjhjOGQiLz4NCiAgICAgICAgICAgICAgICA8L21hcmtlcj4NCiAgICAgICAgICAgIDwvZGVmcz4NCiAgICAgICAgICAgIDxyZWN0IHg9IjIwIiB5PSIyMCIgd2lkdGg9IjUyMCIgaGVpZ2h0PSIxNDAiIGZpbGw9IiNmOGY5ZmEiIHN0cm9rZT0iI2Q1ZGJkYiIgcng9IjYiLz4NCiAgICAgICAgICAgIDxjaXJjbGUgY3g9IjEyMCIgY3k9IjkwIiByPSI0MiIgZmlsbD0iIzFhNTI3NiIgb3BhY2l0eT0iMC4xMiIgc3Ryb2tlPSIjMWE1Mjc2IiBzdHJva2Utd2lkdGg9IjIiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IjEyMCIgeT0iODUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTQiIGZvbnQtd2VpZ2h0PSJib2xkIiBmaWxsPSIjMWE1Mjc2Ij5FPC90ZXh0Pg0KICAgICAgICAgICAgPHRleHQgeD0iMTIwIiB5PSIxMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOSIgZmlsbD0iIzVkNmQ3ZSI+JHtmb3JtYXROdW0oRSwgMSl9ICR7bW9kVW5pdH08L3RleHQ+DQoNCiAgICAgICAgICAgIDxjaXJjbGUgY3g9IjI4MCIgY3k9IjU1IiByPSIzNSIgZmlsbD0iIzI0NzFhMyIgb3BhY2l0eT0iMC4xMiIgc3Ryb2tlPSIjMjQ3MWEzIiBzdHJva2Utd2lkdGg9IjIiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IjI4MCIgeT0iNTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZvbnQtd2VpZ2h0PSJib2xkIiBmaWxsPSIjMjQ3MWEzIj5HPC90ZXh0Pg0KICAgICAgICAgICAgPHRleHQgeD0iMjgwIiB5PSI2NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4IiBmaWxsPSIjNWQ2ZDdlIj4ke2Zvcm1hdE51bShHLCAxKX0gJHttb2RVbml0fTwvdGV4dD4NCg0KICAgICAgICAgICAgPGNpcmNsZSBjeD0iMjgwIiBjeT0iMTI1IiByPSIzNSIgZmlsbD0iI2U2N2UyMiIgb3BhY2l0eT0iMC4xMiIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjIiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IjI4MCIgeT0iMTIyIiB0ZXh0LWFuY2hvcj0ibWlkZGxl\",\n    \"IiBmb250LXNpemU9IjEzIiBmb250LXdlaWdodD0iYm9sZCIgZmlsbD0iI2U2N2UyMiI+SzwvdGV4dD4NCiAgICAgICAgICAgIDx0ZXh0IHg9IjI4MCIgeT0iMTM2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjgiIGZpbGw9IiM1ZDZkN2UiPiR7Zm9ybWF0TnVtKEssIDEpfSAke21vZFVuaXR9PC90ZXh0Pg0KDQogICAgICAgICAgICA8Y2lyY2xlIGN4PSI0NDAiIGN5PSI5MCIgcj0iNDIiIGZpbGw9IiMyN2FlNjAiIG9wYWNpdHk9IjAuMTIiIHN0cm9rZT0iIzI3YWU2MCIgc3Ryb2tlLXdpZHRoPSIyIi8+DQogICAgICAgICAgICA8dGV4dCB4PSI0NDAiIHk9Ijg1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgZmlsbD0iIzI3YWU2MCI+zr08L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSI0NDAiIHk9IjEwMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5IiBmaWxsPSIjNWQ2ZDdlIj4ke2Zvcm1hdE51bShudSwgMyl9PC90ZXh0Pg0KDQogICAgICAgICAgICA8bGluZSB4MT0iMTYyIiB5MT0iODAiIHgyPSIyNDUiIHkyPSI2MCIgc3Ryb2tlPSIjN2Y4YzhkIiBzdHJva2Utd2lkdGg9IjEuNSIgbWFya2VyLWVuZD0idXJsKCMke1NWR19JRH1lbGFzdGljQXJyKSIvPg0KICAgICAgICAgICAgPGxpbmUgeDE9IjE2MiIgeTE9IjEwMCIgeDI9IjI0NSIgeTI9IjEyMCIgc3Ryb2tlPSIjN2Y4YzhkIiBzdHJva2Utd2lkdGg9IjEuNSIvPg0KICAgICAgICAgICAgPGxpbmUgeDE9IjMxNSIgeTE9IjkwIiB4Mj0iMzk4IiB5Mj0iOTAiIHN0cm9rZT0iIzdmOGM4ZCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4NCg0KICAgICAgICAgICAgPHRleHQgeD0iMjAwIiB5PSI2OCIgZm9udC1zaXplPSI4IiBmaWxsPSIjNWQ2ZDdlIj5HID0gRS9bMigxK869KV08L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIyMDAiIHk9IjEyOCIgZm9udC1zaXplPSI4IiBmaWxsPSIjNWQ2ZDdlIj5LID0gRS9bMygx4oiSMs69KV08L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIzNTAiIHk9Ijg1IiBmb250LXNpemU9IjgiIGZpbGw9IiM1ZDZkN2UiPs69ID0gRS8oMkcp4oiSMTwvdGV4dD4NCiAgICAgICAgYDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3QmVoYXZpb3JHYXVnZShyKSB7DQogICAgICAgIGNvbnN0IHN2ZyA9ICQoJ2JlaGF2aW9yR2F1Z2UnKTsNCiAgICAgICAgY29uc3QgYmVoYXZpb3IgPSByLmJlaGF2aW9yIHx8ICdDb252ZW50aW9uYWwnOw0KICAgICAgICBjb25zdCBjb2xvcnMgPSB7DQogICAgICAgICAgICBDb252ZW50aW9uYWw6ICcjMjdhZTYwJywNCiAgICAgICAgICAgIEF1eGV0aWM6ICcjMjQ3MWEzJywNCiAgICAgICAgICAgICdOZWFyLUluY29tcHJlc3NpYmxlJzogJyNlNjdlMjInLA0KICAgICAgICAgICAgVW5rbm93bjogJyM3ZjhjOGQnDQogICAgICAgIH07DQogICAgICAgIGNvbnN0IGNvbG9yID0gY29sb3JzW2JlaGF2aW9yXSB8fCAnIzdmOGM4ZCc7DQogICAgICAgIGNvbnN0IGN4ID0gMTAwLCBjeSA9IDc1Ow0KDQogICAgICAgIHN2Zy5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICA8Y2lyY2xlIGN4PSIke2N4fSIgY3k9IiR7Y3l9IiByPSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZWNmMGYxIiBzdHJva2Utd2lkdGg9IjgiLz4NCiAgICAgICAgICAgIDxjaXJjbGUgY3g9IiR7Y3h9IiBjeT0iJHtjeX0iIHI9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiR7Y29sb3J9IiBzdHJva2Utd2lkdGg9IjgiDQogICAgICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT0iMjQwIDMxNCIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwICR7Y3h9ICR7Y3l9KSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeH0iIHk9IiR7Y3kgLSA1fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMSIgZm9udC13ZWlnaHQ9ImJvbGQiIGZpbGw9IiR7Y29sb3J9Ij4ke2JlaGF2aW9yfTwvdGV4dD4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7Y3h9IiB5PSIke2N5ICsgMTJ9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjgiIGZpbGw9IiM5NWE1YTYiPk1hdGVyaWFsIEJlaGF2aW9yPC90ZXh0Pg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeH0iIHk9IiR7Y3kgKyA1NX0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iNyIgZmlsbD0iI2JkYzNjNiI+Q29udi4gfCBBdXhldGljIHwgzr3ihpIwLjU8L3RleHQ+DQogICAgICAgIGA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd1JlZmVyZW5jZUdhdWdlKHIpIHsNCiAgICAgICAgY29uc3Qgc3ZnID0gJCgncmVmZXJlbmNlR2F1Z2UnKTsNCiAgICAgICAgY29uc3QgbnUgPSByLm51ICE9IG51bGwgPyByLm51IDogMC4zOw0KICAgICAgICBjb25zdCByZWZNaW4gPSBwYXJzZU51bSgncmVmTnVNaW4nKSB8fCAwLjI3Ow0KICAgICAgICBjb25zdCByZWZNYXggPSBwYXJzZU51bSgncmVmTnVNYXgnKSB8fCAwLjMwOw0KICAgICAgICBjb25zdCBjeCA9IDEwMCwgY3kgPSA4NSwgYmFyVyA9IDE2MCwgYmFySCA9IDE2Ow0KICAgICAgICBjb25zdCB4MCA9IGN4IC0gYmFyVyAvIDI7DQogICAgICAgIGNvbnN0IHNjYWxlID0gKHYpID0+IHgwICsgKCh2ICsgMC4xKSAvIDAuNikgKiBiYXJXOw0KICAgICAgICBjb25zdCBudVggPSBNYXRoLm1heCh4MCwgTWF0aC5taW4oeDAgKyBiYXJXLCBzY2FsZShudSkpKTsNCiAgICAgICAgY29uc3QgcmVmQ29sb3IgPSByLnJlZkNvbXBhcmUubGV2ZWwgPT09ICdzYWZlJyA\/ICcjMjdhZTYwJw0KICAgICAgICAgICAgOiByLnJlZkNvbXBhcmUubGV2ZWwgPT09ICdjYXV0aW9uJyA\/ICcjZjM5YzEyJyA6ICcjYzAzOTJiJzsNCg0KICAgICAgICBzdmcuaW5uZXJIVE1MID0gYA0KICAgICAgICAgICAgPHJlY3QgeD0iJHt4MH0iIHk9IiR7Y3kgLSBiYXJIIC8gMn0iIHdpZHRoPSIke2Jhcld9IiBoZWlnaHQ9IiR7YmFySH0iIGZpbGw9IiNlY2YwZjEiIHN0cm9rZT0iI2Q1ZGJkYiIgcng9IjMiLz4NCiAgICAgICAgICAgIDxyZWN0IHg9IiR7c2NhbGUocmVmTWluKX0iIHk9IiR7Y3kgLSBiYXJIIC8gMn0iIHdpZHRoPSIke01hdGgubWF4KDIsIHNjYWxlKHJlZk1heCkgLSBzY2FsZShyZWZNaW4pKX0iIGhlaWdodD0iJHtiYXJIfSIgZmlsbD0icmdiYSgzOSwxNzQsOTYsMC4zKSIgcng9IjIiLz4NCiAgICAgICAgICAgIDxjaXJjbGUgY3g9IiR7bnVYfSIgY3k9IiR7Y3l9IiByPSI3IiBmaWxsPSIke3JlZkNvbG9yfSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7Y3h9IiB5PSIke2N5IC0gMTh9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjkiIGZvbnQtd2VpZ2h0PSJib2xkIiBmaWxsPSIke3JlZkNvbG9yfSI+JHtyLnJlZkNvbXBhcmUubGFiZWx9PC90ZXh0Pg0KICAgICAgICAgICAgPHRleHQgeD0iJHtzY2FsZShyZWZNaW4pfSIgeT0iJHtjeSArIDI4fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI3IiBmaWxsPSIjOTVhNWE2Ij4ke3JlZk1pbn08L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIke3NjYWxlKHJlZk1heCl9IiB5PSIke2N5ICsgMjh9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjciIGZpbGw9IiM5NWE1YTYiPiR7cmVmTWF4fTwvdGV4dD4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7bnVYfSIgeT0iJHtjeSArIDI4fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4IiBmb250LXdlaWdodD0iYm9sZCIgZmlsbD0iJHtyZWZDb2xvcn0iPs69PSR7Zm9ybWF0TnVtKG51LCAzKX08L3RleHQ+DQogICAgICAgIGA7DQogICAgfQ0KDQogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgew0KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgaW5pdCgpOw0KICAgIH0NCn0pKCk7DQo=\"];\n    var bin=atob(p.join(''));\n    var bytes=new Uint8Array(bin.length);\n    for(var i=0;i<bin.length;i++){bytes[i]=bin.charCodeAt(i);}\n    var src=new TextDecoder('utf-8').decode(bytes);\n    (new Function(src))();\n  }catch(e){\n    console.error('Poisson Ratio Calculator load error:',e);\n  }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Poisson&#8217;s Ratio Calculator is a practical engineering tool designed to calculate Poisson&#8217;s ratio from longitudinal and lateral strain or from elastic properties such as&#8230;<\/p>","protected":false},"author":2,"featured_media":24785,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8647],"tags":[8660,8662,8659,8661],"class_list":["post-24784","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-elastic-properties","tag-lateral-strain","tag-material-strain","tag-poisson-ratio","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Poissons-Ratio-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/24784","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/comments?post=24784"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/24784\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media\/24785"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media?parent=24784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/categories?post=24784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/tags?post=24784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}