{"id":24780,"date":"2026-08-28T08:26:56","date_gmt":"2026-08-28T08:26:56","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24780"},"modified":"2026-08-28T08:26:58","modified_gmt":"2026-08-28T08:26:58","slug":"shear-modulus-g-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/pt\/shear-modulus-g-calculator\/","title":{"rendered":"Shear Modulus G Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Shear Modulus G Calculator<\/strong> is a practical engineering tool designed to calculate shear modulus from shear stress and shear strain or from Young\u2019s modulus and Poisson\u2019s ratio. It helps engineers evaluate material rigidity, shear deformation, torsional stiffness, and mechanical performance under shear loading. The Shear Modulus G Calculator is useful for shaft design, material selection, structural analysis, and preliminary engineering calculations, providing fast and reliable results for common metals and other engineering materials.<\/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 #smgc-calculator. Will NOT affect theme header, footer, menus, or other page content. -->\n<style>\n\/* Shear Modulus G Calculator - WordPress-safe scoped styles *\/\n\/*\n * WordPress-safe: every rule is scoped under #smgc-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#smgc-calculator.smgc-calculator,\n#smgc-calculator.smgc-calculator *,\n#smgc-calculator.smgc-calculator *::before,\n#smgc-calculator.smgc-calculator *::after {\n    box-sizing: border-box !important;\n}\n\n#smgc-calculator.smgc-calculator {\n    all: revert;\n    --smgc-primary: #1a5276;\n    --smgc-primary-light: #2471a3;\n    --smgc-primary-dark: #0e3352;\n    --smgc-accent: #e67e22;\n    --smgc-safe: #27ae60;\n    --smgc-caution: #f39c12;\n    --smgc-danger: #c0392b;\n    --smgc-neutral: #7f8c8d;\n    --smgc-bg: #ecf0f1;\n    --smgc-card-bg: #ffffff;\n    --smgc-border: #d5dbdb;\n    --smgc-text: #2c3e50;\n    --smgc-text-muted: #5d6d7e;\n    --smgc-shadow: 0 2px 12px rgba(26, 82, 118, 0.08);\n    --smgc-radius: 8px;\n    --smgc-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n    --smgc-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(--smgc-font) !important;\n    color: var(--smgc-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#smgc-calculator.smgc-calculator [hidden] {\n    display: none !important;\n}\n\n#smgc-calculator.smgc-calculator h1,\n#smgc-calculator.smgc-calculator h2,\n#smgc-calculator.smgc-calculator h3,\n#smgc-calculator.smgc-calculator h4,\n#smgc-calculator.smgc-calculator p,\n#smgc-calculator.smgc-calculator ul,\n#smgc-calculator.smgc-calculator ol,\n#smgc-calculator.smgc-calculator li,\n#smgc-calculator.smgc-calculator section,\n#smgc-calculator.smgc-calculator div,\n#smgc-calculator.smgc-calculator span,\n#smgc-calculator.smgc-calculator strong,\n#smgc-calculator.smgc-calculator em,\n#smgc-calculator.smgc-calculator sub,\n#smgc-calculator.smgc-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#smgc-calculator.smgc-calculator button,\n#smgc-calculator.smgc-calculator input,\n#smgc-calculator.smgc-calculator select,\n#smgc-calculator.smgc-calculator label,\n#smgc-calculator.smgc-calculator legend,\n#smgc-calculator.smgc-calculator summary {\n    font: inherit !important;\n    font-family: var(--smgc-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#smgc-calculator.smgc-calculator ul,\n#smgc-calculator.smgc-calculator ol {\n    list-style: none !important;\n    padding: 0 !important;\n    margin: 0 !important;\n}\n\n#smgc-calculator.smgc-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#smgc-calculator.smgc-calculator input[type=\"number\"],\n#smgc-calculator.smgc-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(--smgc-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.95rem !important;\n    font-family: var(--smgc-font) !important;\n    background: #ffffff !important;\n    color: var(--smgc-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#smgc-calculator.smgc-calculator .smgc-input-section legend {\n    display: block !important;\n    float: none !important;\n    width: 100% !important;\n    font-weight: 600 !important;\n    color: var(--smgc-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(--smgc-font) !important;\n    line-height: 1.4 !important;\n}\n\n#smgc-calculator.smgc-calculator svg {\n    display: block !important;\n    max-width: 100% !important;\n    height: auto !important;\n}\n\n#smgc-calculator.smgc-calculator sub,\n#smgc-calculator.smgc-calculator sup {\n    font-size: 75% !important;\n    line-height: 0 !important;\n    position: relative !important;\n    vertical-align: baseline !important;\n}\n\n#smgc-calculator.smgc-calculator sub { bottom: -0.2em !important; }\n#smgc-calculator.smgc-calculator sup { top: -0.45em !important; }\n\n#smgc-calculator.smgc-calculator div,\n#smgc-calculator.smgc-calculator section,\n#smgc-calculator.smgc-calculator form,\n#smgc-calculator.smgc-calculator fieldset,\n#smgc-calculator.smgc-calculator details {\n    float: none !important;\n    clear: none !important;\n    max-width: none;\n}\n\n#smgc-calculator.smgc-calculator form {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: transparent !important;\n}\n\n#smgc-calculator.smgc-calculator fieldset.smgc-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#smgc-calculator.smgc-calculator .smgc-card {\n    background: var(--smgc-card-bg) !important;\n    border-radius: var(--smgc-radius) !important;\n    box-shadow: var(--smgc-shadow) !important;\n    border: 1px solid var(--smgc-border) !important;\n    padding: 1.5rem !important;\n    margin: 0 0 1.5rem 0 !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-layout {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 1.5rem !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-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(--smgc-bg) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-panel-header h2 {\n    font-size: 1.25rem !important;\n    color: var(--smgc-primary) !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    font-weight: 600 !important;\n    line-height: 1.3 !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-unit-toggle {\n    display: flex !important;\n    flex-direction: row !important;\n    border-radius: var(--smgc-radius) !important;\n    overflow: hidden !important;\n    border: 1px solid var(--smgc-border) !important;\n}\n\n#smgc-calculator.smgc-calculator button.smgc-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(--smgc-bg) !important;\n    color: var(--smgc-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#smgc-calculator.smgc-calculator button.smgc-unit-btn.smgc-active {\n    background: var(--smgc-primary) !important;\n    color: #ffffff !important;\n}\n\n#smgc-calculator.smgc-calculator button.smgc-unit-btn:hover:not(.smgc-active) {\n    background: #dfe6e9 !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-form-row {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 1rem !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-form-group {\n    display: block !important;\n    margin-bottom: 0.85rem !important;\n    width: 100% !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-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(--smgc-text) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-optional {\n    font-weight: 400 !important;\n    color: var(--smgc-text-muted) !important;\n    font-size: 0.8rem !important;\n}\n\n#smgc-calculator.smgc-calculator input[type=\"number\"]:focus,\n#smgc-calculator.smgc-calculator select:focus {\n    border-color: var(--smgc-primary-light) !important;\n    box-shadow: 0 0 0 3px rgba(36, 113, 163, 0.15) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-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#smgc-calculator.smgc-calculator .smgc-input-with-unit input[type=\"number\"] {\n    flex: 1 1 auto !important;\n    width: auto !important;\n    min-width: 0 !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-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(--smgc-bg) !important;\n    border: 1px solid var(--smgc-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.8rem !important;\n    font-weight: 600 !important;\n    color: var(--smgc-text-muted) !important;\n    white-space: nowrap !important;\n    min-width: 3rem !important;\n    justify-content: center !important;\n}\n\n#smgc-calculator.smgc-calculator select.smgc-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#smgc-calculator.smgc-calculator .smgc-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(--smgc-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#smgc-calculator.smgc-calculator .smgc-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(--smgc-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#smgc-calculator.smgc-calculator .smgc-tooltip:hover::after {\n    opacity: 1 !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-ref-note {\n    font-size: 0.8rem !important;\n    color: var(--smgc-text-muted) !important;\n    margin: 0.5rem 0 0 !important;\n    font-style: italic !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-hidden {\n    display: none !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-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#smgc-calculator.smgc-calculator button.smgc-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#smgc-calculator.smgc-calculator button.smgc-btn-primary {\n    background: linear-gradient(135deg, var(--smgc-primary) 0%, var(--smgc-primary-light) 100%) !important;\n    color: #ffffff !important;\n    min-width: 220px !important;\n}\n\n#smgc-calculator.smgc-calculator button.smgc-btn-primary:hover {\n    transform: translateY(-1px) !important;\n    box-shadow: 0 4px 12px rgba(26, 82, 118, 0.3) !important;\n}\n\n#smgc-calculator.smgc-calculator button.smgc-btn-secondary {\n    background: var(--smgc-bg) !important;\n    color: var(--smgc-text) !important;\n    border: 1px solid var(--smgc-border) !important;\n}\n\n#smgc-calculator.smgc-calculator button.smgc-btn-secondary:hover {\n    background: #dfe6e9 !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-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#smgc-calculator.smgc-calculator .smgc-status-neutral {\n    background: #ecf0f1 !important;\n    color: var(--smgc-neutral) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-status-safe {\n    background: rgba(39, 174, 96, 0.15) !important;\n    color: var(--smgc-safe) !important;\n    border: 1px solid var(--smgc-safe) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-status-caution {\n    background: rgba(243, 156, 18, 0.15) !important;\n    color: #d68910 !important;\n    border: 1px solid var(--smgc-caution) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-status-danger {\n    background: rgba(192, 57, 43, 0.12) !important;\n    color: var(--smgc-danger) !important;\n    border: 1px solid var(--smgc-danger) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-error-box,\n#smgc-calculator.smgc-calculator .smgc-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#smgc-calculator.smgc-calculator .smgc-error-box {\n    background: rgba(192, 57, 43, 0.08) !important;\n    border: 1px solid var(--smgc-danger) !important;\n    color: var(--smgc-danger) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-warning-box {\n    background: rgba(243, 156, 18, 0.08) !important;\n    border: 1px solid var(--smgc-caution) !important;\n    color: #b7950b !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-error-box ul,\n#smgc-calculator.smgc-calculator .smgc-warning-box ul {\n    margin: 0.35rem 0 0 1.25rem !important;\n    padding: 0 !important;\n    list-style: disc !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-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#smgc-calculator.smgc-calculator .smgc-result-item {\n    background: var(--smgc-bg) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    border: 1px solid var(--smgc-border) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-result-label {\n    display: block !important;\n    font-size: 0.75rem !important;\n    color: var(--smgc-text-muted) !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.03em !important;\n    margin-bottom: 0.25rem !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-result-value {\n    display: block !important;\n    font-size: 1.1rem !important;\n    font-weight: 700 !important;\n    color: var(--smgc-primary) !important;\n    font-family: var(--smgc-mono) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-result-sub {\n    display: block !important;\n    font-size: 0.75rem !important;\n    color: var(--smgc-text-muted) !important;\n    margin-top: 0.15rem !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-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#smgc-calculator.smgc-calculator .smgc-recommendations h3 {\n    font-size: 0.9rem !important;\n    color: var(--smgc-primary) !important;\n    margin: 0 0 0.5rem !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-recommendations ul {\n    margin: 0 !important;\n    padding-left: 1.25rem !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-visual-grid {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 1rem !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-viz-wide {\n    grid-column: 1 \/ -1 !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-viz-card {\n    background: var(--smgc-bg) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    border: 1px solid var(--smgc-border) !important;\n}\n\n#smgc-calculator.smgc-calculator .smgc-viz-card h3 {\n    font-size: 0.8rem !important;\n    color: var(--smgc-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    #smgc-calculator.smgc-calculator .smgc-form-row {\n        grid-template-columns: 1fr !important;\n    }\n\n    #smgc-calculator.smgc-calculator button.smgc-btn-primary,\n    #smgc-calculator.smgc-calculator button.smgc-btn-secondary {\n        width: 100% !important;\n    }\n}\n\n@media (max-width: 700px) {\n    #smgc-calculator.smgc-calculator .smgc-visual-grid {\n        grid-template-columns: 1fr !important;\n    }\n\n    #smgc-calculator.smgc-calculator .smgc-viz-wide {\n        grid-column: auto !important;\n    }\n}\n\n@media print {\n    #smgc-calculator.smgc-calculator .smgc-form-actions,\n    #smgc-calculator.smgc-calculator .smgc-unit-toggle {\n        display: none !important;\n    }\n}\n\n<\/style>\n<div id=\"smgc-calculator\" class=\"smgc-calculator\">\n        <div class=\"smgc-layout\">\n            <section class=\"smgc-input-panel smgc-card\" aria-label=\"Calculator inputs\">\n                <div class=\"smgc-panel-header\">\n                    <h2>Input Parameters<\/h2>\n                    <div class=\"smgc-unit-toggle\" role=\"group\" aria-label=\"Unit system\">\n                        <button type=\"button\" class=\"smgc-unit-btn smgc-active\" data-unit=\"metric\">Metric<\/button>\n                        <button type=\"button\" class=\"smgc-unit-btn\" data-unit=\"imperial\">Imperial<\/button>\n                    <\/div>\n                <\/div>\n\n                <form id=\"smgc-calcForm\" novalidate>\n                    <fieldset class=\"smgc-input-section\">\n                        <legend>Calculation Mode<\/legend>\n                        <div class=\"smgc-form-row\">\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-calcMode\">Mode<\/label>\n                                <select id=\"smgc-calcMode\" name=\"calcMode\">\n                                    <option value=\"calcModulus\" selected>Calculate Shear Modulus<\/option>\n                                    <option value=\"calcStress\">Calculate Shear Stress<\/option>\n                                    <option value=\"calcStrain\">Calculate Shear Strain<\/option>\n                                    <option value=\"calcTorsionalStress\">Calculate Torsional Stress<\/option>\n                                    <option value=\"calcTwist\">Calculate Angle of Twist<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"smgc-form-group smgc-mode-field\" data-mode=\"calcModulus\">\n                                <label for=\"smgc-inputMethod\">Input Method<\/label>\n                                <select id=\"smgc-inputMethod\" name=\"inputMethod\">\n                                    <option value=\"stressStrain\" selected>Shear Stress &amp; Strain<\/option>\n                                    <option value=\"ePoisson\">Young&#8217;s Modulus &amp; Poisson&#8217;s Ratio<\/option>\n                                    <option value=\"shaftTorsion\">Shaft Torsion<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"smgc-input-section\">\n                        <legend>Shear Properties<\/legend>\n                        <div class=\"smgc-form-row smgc-shear-field\" data-mode=\"calcModulus calcStress calcStrain\" data-method=\"stressStrain\" data-always=\"calcStress calcStrain\">\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-shearStress\">\n                                    Shear Stress (&tau;)\n                                    <span class=\"smgc-tooltip\" data-tip=\"Tangential shear stress in the material\">?<\/span>\n                                <\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-shearStress\" name=\"shearStress\" value=\"80\" min=\"0.001\" step=\"any\">\n                                    <select id=\"smgc-stressUnit\" class=\"smgc-inline-unit\" aria-label=\"Shear stress unit\">\n                                        <option value=\"MPa\" selected>MPa<\/option>\n                                        <option value=\"GPa\">GPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                        <option value=\"ksi\">ksi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-shearStrain\">\n                                    Shear Strain (&gamma;)\n                                    <span class=\"smgc-tooltip\" data-tip=\"Shear strain \u2014 dimensionless or percent\">?<\/span>\n                                <\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-shearStrain\" name=\"shearStrain\" value=\"0.001\" min=\"0.0000001\" step=\"any\">\n                                    <select id=\"smgc-strainUnit\" class=\"smgc-inline-unit\" aria-label=\"Shear 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=\"smgc-form-row smgc-ep-field\" data-mode=\"calcModulus\" data-method=\"ePoisson\">\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-youngModulus\">\n                                    Young&#8217;s Modulus (E)\n                                    <span class=\"smgc-tooltip\" data-tip=\"Elastic modulus for isotropic materials\">?<\/span>\n                                <\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-youngModulus\" name=\"youngModulus\" value=\"200\" min=\"0.001\" step=\"any\">\n                                    <select id=\"smgc-youngUnit\" class=\"smgc-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=\"smgc-form-group\">\n                                <label for=\"smgc-poisson\">\n                                    Poisson&#8217;s Ratio (&nu;)\n                                    <span class=\"smgc-tooltip\" data-tip=\"Typically 0.25\u20130.35 for metals\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"smgc-poisson\" name=\"poisson\" value=\"0.30\" min=\"0\" max=\"0.499\" step=\"any\">\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"smgc-form-group smgc-modulus-field\" data-mode=\"calcStress calcStrain calcTorsionalStress calcTwist\">\n                            <label for=\"smgc-shearModulus\">Shear Modulus (G)<\/label>\n                            <div class=\"smgc-input-with-unit\">\n                                <input type=\"number\" id=\"smgc-shearModulus\" name=\"shearModulus\" value=\"77\" min=\"0.001\" step=\"any\">\n                                <select id=\"smgc-modulusUnit\" class=\"smgc-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                    <\/fieldset>\n\n                    <fieldset class=\"smgc-input-section smgc-shaft-section\">\n                        <legend>Shaft Geometry &amp; Loading<\/legend>\n                        <div class=\"smgc-form-group smgc-shaft-field\" data-mode=\"calcModulus calcTorsionalStress calcTwist\" data-method=\"shaftTorsion\" data-always=\"calcTorsionalStress calcTwist\">\n                            <label for=\"smgc-shaftType\">Shaft Type<\/label>\n                            <select id=\"smgc-shaftType\" name=\"shaftType\">\n                                <option value=\"solidRound\" selected>Solid Round<\/option>\n                                <option value=\"hollowRound\">Hollow Round<\/option>\n                            <\/select>\n                        <\/div>\n\n                        <div class=\"smgc-form-group smgc-shaft-field smgc-shaft-solid\" data-mode=\"calcModulus calcTorsionalStress calcTwist\" data-method=\"shaftTorsion\" data-always=\"calcTorsionalStress calcTwist\">\n                            <label for=\"smgc-shaftDiameter\">\n                                Shaft Diameter\n                                <span class=\"smgc-tooltip\" data-tip=\"Outer diameter of solid round shaft\">?<\/span>\n                            <\/label>\n                            <div class=\"smgc-input-with-unit\">\n                                <input type=\"number\" id=\"smgc-shaftDiameter\" name=\"shaftDiameter\" value=\"40\" min=\"0.001\" step=\"any\">\n                                <span class=\"smgc-unit-label\" data-unit-key=\"length\">mm<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"smgc-form-row smgc-shaft-field smgc-shaft-hollow smgc-hidden\" data-mode=\"calcModulus calcTorsionalStress calcTwist\" data-method=\"shaftTorsion\" data-always=\"calcTorsionalStress calcTwist\">\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-outerDiameter\">Outer Diameter<\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-outerDiameter\" name=\"outerDiameter\" value=\"50\" min=\"0.001\" step=\"any\">\n                                    <span class=\"smgc-unit-label\" data-unit-key=\"length\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-innerDiameter\">Inner Diameter<\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-innerDiameter\" name=\"innerDiameter\" value=\"30\" min=\"0.001\" step=\"any\">\n                                    <span class=\"smgc-unit-label\" data-unit-key=\"length\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"smgc-form-row smgc-shaft-field\" data-mode=\"calcModulus calcTorsionalStress calcTwist\" data-method=\"shaftTorsion\" data-always=\"calcTorsionalStress calcTwist\">\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-shaftLength\">\n                                    Shaft Length (L)\n                                    <span class=\"smgc-tooltip\" data-tip=\"Length over which twist is measured\">?<\/span>\n                                <\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-shaftLength\" name=\"shaftLength\" value=\"500\" min=\"0.001\" step=\"any\">\n                                    <select id=\"smgc-shaftLengthUnit\" class=\"smgc-inline-unit\" aria-label=\"Shaft 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=\"smgc-form-group\">\n                                <label for=\"smgc-torque\">\n                                    Applied Torque (T)\n                                    <span class=\"smgc-tooltip\" data-tip=\"Torsional moment applied to the shaft\">?<\/span>\n                                <\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-torque\" name=\"torque\" value=\"200\" min=\"0.001\" step=\"any\">\n                                    <select id=\"smgc-torqueUnit\" class=\"smgc-inline-unit\" aria-label=\"Torque unit\">\n                                        <option value=\"Nm\" selected>N\u00b7m<\/option>\n                                        <option value=\"Nmm\">N\u00b7mm<\/option>\n                                        <option value=\"kNm\">kN\u00b7m<\/option>\n                                        <option value=\"lbfIn\">lbf\u00b7in<\/option>\n                                        <option value=\"lbfFt\">lbf\u00b7ft<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"smgc-form-group smgc-shaft-field smgc-measured-twist-field smgc-hidden\" data-mode=\"calcModulus\" data-method=\"shaftTorsion\">\n                            <label for=\"smgc-measuredTwist\">\n                                Measured Angle of Twist (&theta;) <span class=\"smgc-optional\">(for G = TL \/ J&theta;)<\/span>\n                                <span class=\"smgc-tooltip\" data-tip=\"Enter measured twist to back-calculate shear modulus from torsion test data\">?<\/span>\n                            <\/label>\n                            <div class=\"smgc-input-with-unit\">\n                                <input type=\"number\" id=\"smgc-measuredTwist\" name=\"measuredTwist\" placeholder=\"Optional\" min=\"0.000001\" step=\"any\">\n                                <select id=\"smgc-twistUnit\" class=\"smgc-inline-unit\" aria-label=\"Twist angle unit\">\n                                    <option value=\"rad\" selected>rad<\/option>\n                                    <option value=\"deg\">deg<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"smgc-input-section smgc-advanced-section\">\n                        <legend>Advanced Options<\/legend>\n                        <div class=\"smgc-form-row smgc-twopoint-field\" data-mode=\"calcModulus\" data-method=\"stressStrain\">\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-stress1\">Shear Stress Point 1 (&tau;<sub>1<\/sub>) <span class=\"smgc-optional\">(optional)<\/span><\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-stress1\" name=\"stress1\" placeholder=\"Two-point slope\" step=\"any\">\n                                    <span class=\"smgc-unit-label\" data-unit-key=\"stress\">MPa<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-strain1\">Shear Strain Point 1 (&gamma;<sub>1<\/sub>)<\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-strain1\" name=\"strain1\" placeholder=\"e.g. 0.0005\" step=\"any\">\n                                    <select id=\"smgc-strain1Unit\" class=\"smgc-inline-unit\" aria-label=\"Strain 1 unit\">\n                                        <option value=\"dimensionless\" selected>&#8211;<\/option>\n                                        <option value=\"percent\">%<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"smgc-form-row smgc-twopoint-field\" data-mode=\"calcModulus\" data-method=\"stressStrain\">\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-stress2\">Shear Stress Point 2 (&tau;<sub>2<\/sub>)<\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-stress2\" name=\"stress2\" placeholder=\"Two-point slope\" step=\"any\">\n                                    <span class=\"smgc-unit-label\" data-unit-key=\"stress\">MPa<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-strain2\">Shear Strain Point 2 (&gamma;<sub>2<\/sub>)<\/label>\n                                <div class=\"smgc-input-with-unit\">\n                                    <input type=\"number\" id=\"smgc-strain2\" name=\"strain2\" placeholder=\"e.g. 0.001\" step=\"any\">\n                                    <select id=\"smgc-strain2Unit\" class=\"smgc-inline-unit\" aria-label=\"Strain 2 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=\"smgc-form-group smgc-allowable-field\">\n                            <label for=\"smgc-allowableStress\">\n                                Allowable Shear Stress \/ Shear Yield <span class=\"smgc-optional\">(optional)<\/span>\n                                <span class=\"smgc-tooltip\" data-tip=\"Used for shear utilization and elastic range check\">?<\/span>\n                            <\/label>\n                            <div class=\"smgc-input-with-unit\">\n                                <input type=\"number\" id=\"smgc-allowableStress\" name=\"allowableStress\" value=\"150\" min=\"0.001\" step=\"any\">\n                                <span class=\"smgc-unit-label\" data-unit-key=\"stress\">MPa<\/span>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"smgc-input-section\">\n                        <legend>Material<\/legend>\n                        <div class=\"smgc-form-row\">\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-material\">Material Preset<\/label>\n                                <select id=\"smgc-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=\"engineeringPlastic\">Engineering Plastic<\/option>\n                                    <option value=\"custom\">Custom Material<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                        <div class=\"smgc-form-row smgc-ref-fields\">\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-refGMin\">Reference G Min (GPa)<\/label>\n                                <input type=\"number\" id=\"smgc-refGMin\" name=\"refGMin\" value=\"75\" min=\"0.001\" step=\"any\">\n                            <\/div>\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-refGMax\">Reference G Max (GPa)<\/label>\n                                <input type=\"number\" id=\"smgc-refGMax\" name=\"refGMax\" value=\"82\" min=\"0.001\" step=\"any\">\n                            <\/div>\n                            <div class=\"smgc-form-group\">\n                                <label for=\"smgc-refGTypical\">Reference G Typical (GPa)<\/label>\n                                <input type=\"number\" id=\"smgc-refGTypical\" name=\"refGTypical\" value=\"77\" min=\"0.001\" step=\"any\">\n                            <\/div>\n                        <\/div>\n                        <p class=\"smgc-ref-note\">Reference values are editable. Actual shear modulus varies with alloy, temperature, manufacturing condition, and material orientation.<\/p>\n                    <\/fieldset>\n\n                    <div class=\"smgc-form-actions\">\n                        <button type=\"submit\" class=\"smgc-btn smgc-btn-primary\" id=\"smgc-calculateBtn\">Calculate<\/button>\n                    <\/div>\n                <\/form>\n            <\/section>\n\n            <section class=\"smgc-results-panel smgc-card smgc-hidden\" id=\"smgc-resultsPanel\" aria-label=\"Calculation results\">\n                <div class=\"smgc-panel-header\">\n                    <h2>Results<\/h2>\n                    <div id=\"smgc-statusBadge\" class=\"smgc-status-badge smgc-status-neutral\">Awaiting Input<\/div>\n                <\/div>\n\n                <div id=\"smgc-errorBox\" class=\"smgc-error-box smgc-hidden\" role=\"alert\"><\/div>\n                <div id=\"smgc-warningBox\" class=\"smgc-warning-box smgc-hidden\" role=\"status\"><\/div>\n\n                <div class=\"smgc-results-grid\" id=\"smgc-resultsGrid\"><\/div>\n\n                <div id=\"smgc-recommendations\" class=\"smgc-recommendations smgc-hidden\"><\/div>\n\n                <div class=\"smgc-visual-grid\">\n                    <div class=\"smgc-viz-card\">\n                        <h3>Shear Deformation<\/h3>\n                        <svg id=\"smgc-shearDiagram\" viewBox=\"0 0 280 130\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"smgc-viz-card\">\n                        <h3>Shaft Torsion<\/h3>\n                        <svg id=\"smgc-torsionDiagram\" viewBox=\"0 0 280 130\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"smgc-viz-card smgc-viz-wide\">\n                        <h3>Shear Stress-Strain Curve<\/h3>\n                        <svg id=\"smgc-stressStrainCurve\" viewBox=\"0 0 560 180\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"smgc-viz-card\">\n                        <h3>Shear Stress Distribution<\/h3>\n                        <svg id=\"smgc-stressDistribution\" viewBox=\"0 0 200 140\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"smgc-viz-card\">\n                        <h3>Elastic Range Status<\/h3>\n                        <svg id=\"smgc-elasticGauge\" 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('smgc-calculator');\n  if(!r){return;}\n  try{\n    var p=[\"LyoqDQogKiBTaGVhciBNb2R1bHVzIEcgQ2FsY3VsYXRvcg0KICogU2NvcGVkIGZvciBXb3JkUHJlc3MgZW1iZWQgLSBkb2VzIG5vdCBhZmZlY3QgZWxlbWVudHMgb3V0c2lkZSAjc21nYy1jYWxjdWxhdG9yDQogKi8NCg0KKGZ1bmN0aW9uICgpIHsNCiAgICAndXNlIHN0cmljdCc7DQoNCiAgICBjb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtZ2MtY2FsY3VsYXRvcicpOw0KICAgIGlmICghcm9vdCkgcmV0dXJuOw0KDQogICAgZnVuY3Rpb24gJChpZCkgew0KICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKCcjc21nYy0nICsgaWQpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uICRhbGwoc2VsKSB7DQogICAgICAgIHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKTsNCiAgICB9DQoNCiAgICBjb25zdCBNQVRFUklBTFMgPSB7DQogICAgICAgIHN0cnVjdHVyYWxTdGVlbDogICAgeyBtaW46IDc1LCBtYXg6IDgyLCB0eXBpY2FsOiA3NywgRTogMjAwLCBudTogMC4zMCwgYWxsb3c6IDE1MCB9LA0KICAgICAgICBjYXJib25TdGVlbDogICAgICAgIHsgbWluOiA3NSwgbWF4OiA4MiwgdHlwaWNhbDogNzcsIEU6IDIwMCwgbnU6IDAuMzAsIGFsbG93OiAxNDAgfSwNCiAgICAgICAgc3RhaW5sZXNzU3RlZWw6ICAgICB7IG1pbjogNzAsIG1heDogODAsIHR5cGljYWw6IDc1LCBFOiAxOTUsIG51OiAwLjMwLCBhbGxvdzogMTMwIH0sDQogICAgICAgIGFsdW1pbnVtOiAgICAgICAgICAgeyBtaW46IDI1LCBtYXg6IDI4LCB0eXBpY2FsOiAyNiwgRTogNzAsICBudTogMC4zMywgYWxsb3c6IDk1IH0sDQogICAgICAgIHRpdGFuaXVtOiAgICAgICAgICAgeyBtaW46IDM4LCBtYXg6IDQ2LCB0eXBpY2FsOiA0MiwgRTogMTEwLCBudTogMC4zNCwgYWxsb3c6IDM1MCB9LA0KICAgICAgICBjb3BwZXI6ICAgICAgICAgICAgIHsgbWluOiA0MCwgbWF4OiA1MCwgdHlwaWNhbDogNDUsIEU6IDEyMCwgbnU6IDAuMzQsIGFsbG93OiA3MCB9LA0KICAgICAgICBicmFzczogICAgICAgICAgICAgIHsgbWluOiAzNCwgbWF4OiA0MCwgdHlwaWNhbDogMzcsIEU6IDEwMCwgbnU6IDAuMzQsIGFsbG93OiA4MCB9LA0KICAgICAgICBjYXN0SXJvbjogICAgICAgICAgIHsgbWluOiAzMCwgbWF4OiA0NSwgdHlwaWNhbDogMzgsIEU6IDEwMCwgbnU6IDAuMjUsIGFsbG93OiAxMDAgfSwNCiAgICAgICAgZW5naW5lZXJpbmdQbGFzdGljOiB7IG1pbjogMC41LCBtYXg6IDMsIHR5cGljYWw6IDEuNSwgRTogMywgbnU6IDAuNDAsIGFsbG93OiAzMCB9LA0KICAgICAgICBjdXN0b206ICAgICAgICAgICAgIHsgbWluOiBudWxsLCBtYXg6IG51bGwsIHR5cGljYWw6IG51bGwsIEU6IG51bGwsIG51OiBudWxsLCBhbGxvdzogbnVsbCB9DQogICAgfTsNCg0KICAgIGNvbnN0IENPTlYgPSB7DQogICAgICAgIGxlbmd0aFRvSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdpbicpIHJldHVybiB2ICogMjUuNDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnbScpIHJldHVybiB2ICogMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnZnQnKSByZXR1cm4gdiAqIDMwNC44Ow0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIGxlbmd0aEZyb21JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2luJykgcmV0dXJuIHYgLyAyNS40Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdtJykgcmV0dXJuIHYgLyAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdmdCcpIHJldHVybiB2IC8gMzA0Ljg7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgc3RyZXNzVG9JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ0dQYScpIHJldHVybiB2ICogMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAncHNpJykgcmV0dXJuIHYgKiAwLjAwNjg5NDc2Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdrc2knKSByZXR1cm4gdiAqIDYuODk0NzY7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgc3RyZXNzRnJvbUludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnR1BhJykgcmV0dXJuIHYgLyAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdwc2knKSByZXR1cm4gdiAvIDAuMDA2ODk0NzY7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2tzaScpIHJldHVybiB2IC8gNi44OTQ3NjsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBtb2R1bHVzVG9JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ01QYScpIHJldHVybiB2IC8gMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAncHNpJykgcmV0dXJuIHYgKiAwLjAwNjg5NDc2IC8gMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAna3NpJykgcmV0dXJuIHYgKiA2Ljg5NDc2IC8gMTAwMDsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBtb2R1bHVzRnJvbUludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnTVBhJykgcmV0dXJuIHYgKiAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdwc2knKSByZXR1cm4gKHYgKiAxMDAwKSAvIDAuMDA2ODk0NzY7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2tzaScpIHJldHVybiAodiAqIDEwMDApIC8gNi44OTQ3NjsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBzdHJhaW5Ub0ludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIHJldHVybiB1bml0ID09PSAncGVyY2VudCcgPyB2IC8gMTAwIDogdjsNCiAgICAgICAgfSwNCiAgICAgICAgc3RyYWluRnJvbUludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIHJldHVybiB1bml0ID09PSAncGVyY2VudCcgPyB2ICogMTAwIDogdjsNCiAgICAgICAgfSwNCiAgICAgICAgdG9ycXVlVG9JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ05tbScpIHJldHVybiB2Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdObScpIHJldHVybiB2ICogMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAna05tJykgcmV0dXJuIHYgKiAxZTY7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2xiZkluJykgcmV0dXJuIHYgKiAwLjExMjk4NTsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnbGJmRnQnKSByZXR1cm4gdiAqIDEuMzU1ODI7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgcG9sYXJGcm9tSW50ZXJuYWwodiwgc3lzKSB7DQogICAgICAgICAgICByZXR1cm4gc3lzID09PSAnaW1wZXJpYWwnID8gdiAvIE1hdGgucG93KDI1LjQsIDQpIDogdjsNCiAgICAgICAgfSwNCiAgICAgICAgcG9sYXJUb0Rpc3BsYXkodiwgc3lzKSB7DQogICAgICAgICAgICByZXR1cm4gc3lzID09PSAnaW1wZXJpYWwnID8gdiAqIE1hdGgucG93KDI1LjQsIDQpIDogdjsNCiAgICAgICAgfSwNCiAgICAgICAgdHdpc3RQZXJMZW5ndGhGcm9tSW50ZXJuYWwodiwgc3lzKSB7DQogICAgICAgICAgICBpZiAoc3lzID09PSAnaW1wZXJpYWwnKSByZXR1cm4geyB2YWx1ZTogdiAqICgxODAgLyBNYXRoLlBJKSAvIDAuMzA0OCwgdW5pdDogJ2RlZy9mdCcgfTsNCiAgICAgICAgICAgIGlmICh2ID49IDAuMDEpIHJldHVybiB7IHZhbHVlOiB2ICogKDE4MCAvIE1hdGguUEkpLCB1bml0OiAnZGVnL20nIH07DQogICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdiAqICgxODAgLyBNYXRoLlBJKSAqIDEwMDAsIHVuaXQ6ICdkZWcvbScgfTsNCiAgICAgICAgfSwNCiAgICAgICAgdG9yc2lvbmFsU3RpZmZuZXNzRnJvbUludGVybmFsKHYsIHN5cykgew0KICAgICAgICAgICAgaWYgKHN5cyA9PT0gJ2ltcGVyaWFsJykgcmV0dXJuIHsgdmFsdWU6IHYgLyAwLjExMjk4NSwgdW5pdDogJ2xiZsK3aW4vcmFkJyB9Ow0KICAgICAgICAgICAgaWYgKHYgPj0gMWU2KSByZXR1cm4geyB2YWx1ZTogdiAvIDFlNiwgdW5pdDogJ2tOwrdtL3JhZCcgfTsNCiAgICAgICAgICAgIGlmICh2ID49IDEwMDApIHJldHVybiB7IHZhbHVlOiB2IC8gMTAwMCwgdW5pdDogJ07Ct20vcmFkJyB9Ow0KICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHYsIHVuaXQ6ICdOwrdtbS9yYWQnIH07DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgbGV0IHVuaXRTeXN0ZW0gPSAnbWV0cmljJzsNCiAgICBsZXQgZGVib3VuY2VUaW1lciA9IG51bGw7DQoNCiAgICBjb25zdCBmb3JtID0gJCgnY2FsY0Zvcm0nKTsNCiAgICBjb25zdCBjYWxjTW9kZSA9ICQoJ2NhbGNNb2RlJyk7DQogICAgY29uc3QgaW5wdXRNZXRob2QgPSAkKCdpbnB1dE1ldGhvZCcpOw0KICAgIGNvbnN0IHNoYWZ0VHlwZSA9ICQoJ3NoYWZ0VHlwZScpOw0KICAgIGNvbnN0IG1hdGVyaWFsU2VsZWN0ID0gJCgnbWF0\",\n    \"ZXJpYWwnKTsNCiAgICBjb25zdCByZXN1bHRzUGFuZWwgPSAkKCdyZXN1bHRzUGFuZWwnKTsNCg0KICAgIGZ1bmN0aW9uIGluaXQoKSB7DQogICAgICAgIGJpbmRFdmVudHMoKTsNCiAgICAgICAgdXBkYXRlRmllbGRWaXNpYmlsaXR5KCk7DQogICAgICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7DQogICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGUpID0+IHsNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIGNhbGN1bGF0ZSgpOw0KICAgICAgICB9KTsNCg0KICAgICAgICAkYWxsKCcuc21nYy11bml0LWJ0bicpLmZvckVhY2goKGJ0bikgPT4gew0KICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc3dpdGNoVW5pdFN5c3RlbShidG4uZGF0YXNldC51bml0KSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGNhbGNNb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsNCiAgICAgICAgICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpbnB1dE1ldGhvZC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7DQogICAgICAgICAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgc2hhZnRUeXBlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsNCiAgICAgICAgICAgIHVwZGF0ZVNoYWZ0RmllbGRzKCk7DQogICAgICAgICAgICBoaWRlUmVzdWx0c1BhbmVsKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIG1hdGVyaWFsU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFwcGx5TWF0ZXJpYWxQcmVzZXQpOw0KDQogICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7DQogICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lcik7DQogICAgICAgICAgICBkZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlU2lsZW50KCkpIGNhbGN1bGF0ZShmYWxzZSk7DQogICAgICAgICAgICB9LCA0MDApOw0KICAgICAgICB9KTsNCg0KICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsNCiAgICAgICAgICAgIGlmICh2YWxpZGF0ZVNpbGVudCgpKSBjYWxjdWxhdGUoZmFsc2UpOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzd2l0Y2hVbml0U3lzdGVtKHN5cykgew0KICAgICAgICBpZiAoc3lzID09PSB1bml0U3lzdGVtKSByZXR1cm47DQoNCiAgICAgICAgY29uc3QgbGVuZ3RoSWRzID0gWydzaGFmdERpYW1ldGVyJywgJ291dGVyRGlhbWV0ZXInLCAnaW5uZXJEaWFtZXRlciddOw0KICAgICAgICBsZW5ndGhJZHMuZm9yRWFjaCgoaWQpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGVsID0gJChpZCk7DQogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnZhbHVlID09PSAnJykgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgICAgICBpZiAoaXNOYU4odmFsKSkgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwodmFsLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgZWwudmFsdWUgPSBmb3JtYXROdW0oQ09OVi5sZW5ndGhGcm9tSW50ZXJuYWwoaW50ZXJuYWwsIHN5cyA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKSwgNCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGNvbnN0IHNoYWZ0TGVuID0gJCgnc2hhZnRMZW5ndGgnKTsNCiAgICAgICAgaWYgKHNoYWZ0TGVuICYmIHNoYWZ0TGVuLnZhbHVlICE9PSAnJykgew0KICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChzaGFmdExlbi52YWx1ZSk7DQogICAgICAgICAgICBpZiAoIWlzTmFOKHZhbCkpIHsNCiAgICAgICAgICAgICAgICBjb25zdCB1ID0gJCgnc2hhZnRMZW5ndGhVbml0JykudmFsdWU7DQogICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwodmFsLCB1KTsNCiAgICAgICAgICAgICAgICBjb25zdCBuZXdVID0gc3lzID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbSc7DQogICAgICAgICAgICAgICAgc2hhZnRMZW4udmFsdWUgPSBmb3JtYXROdW0oQ09OVi5sZW5ndGhGcm9tSW50ZXJuYWwoaW50ZXJuYWwsIG5ld1UpLCA0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHN0cmVzc0ZpZWxkcyA9IFsnc2hlYXJTdHJlc3MnLCAnc3RyZXNzMScsICdzdHJlc3MyJywgJ2FsbG93YWJsZVN0cmVzcyddOw0KICAgICAgICBzdHJlc3NGaWVsZHMuZm9yRWFjaCgoaWQpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGVsID0gJChpZCk7DQogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnZhbHVlID09PSAnJykgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgICAgICBpZiAoaXNOYU4odmFsKSkgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBDT05WLnN0cmVzc1RvSW50ZXJuYWwodmFsLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ3BzaScgOiAnTVBhJyk7DQogICAgICAgICAgICBlbC52YWx1ZSA9IGZvcm1hdE51bShDT05WLnN0cmVzc0Zyb21JbnRlcm5hbChpbnRlcm5hbCwgc3lzID09PSAnaW1wZXJpYWwnID8gJ3BzaScgOiAnTVBhJyksIDIpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBbJ3NoZWFyTW9kdWx1cycsICd5b3VuZ01vZHVsdXMnLCAncmVmR01pbicsICdyZWZHTWF4JywgJ3JlZkdUeXBpY2FsJ10uZm9yRWFjaCgoaWQpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGVsID0gJChpZCk7DQogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnZhbHVlID09PSAnJykgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgICAgICBpZiAoaXNOYU4odmFsKSkgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgaXNSZWYgPSBpZC5zdGFydHNXaXRoKCdyZWYnKTsNCiAgICAgICAgICAgIGNvbnN0IGludGVybmFsID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbCh2YWwsIGlzUmVmID8gJ0dQYScgOiAkKCdtb2R1bHVzVW5pdCcpLnZhbHVlKTsNCiAgICAgICAgICAgIGlmIChpc1JlZikgew0KICAgICAgICAgICAgICAgIGVsLnZhbHVlID0gZm9ybWF0TnVtKGludGVybmFsLCAyKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZWwudmFsdWUgPSBmb3JtYXROdW0oQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKGludGVybmFsLCBzeXMgPT09ICdpbXBlcmlhbCcgPyAna3NpJyA6ICdHUGEnKSwgMik7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIHVuaXRTeXN0ZW0gPSBzeXM7DQogICAgICAgICRhbGwoJy5zbWdjLXVuaXQtYnRuJykuZm9yRWFjaCgoYikgPT4gYi5jbGFzc0xpc3QudG9nZ2xlKCdzbWdjLWFjdGl2ZScsIGIuZGF0YXNldC51bml0ID09PSBzeXMpKTsNCiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICBoaWRlUmVzdWx0c1BhbmVsKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlVW5pdExhYmVscygpIHsNCiAgICAgICAgY29uc3QgaXNJbXAgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnOw0KICAgICAgICAkYWxsKCdbZGF0YS11bml0LWtleT0ibGVuZ3RoIl0nKS5mb3JFYWNoKChlbCkgPT4geyBlbC50ZXh0Q29udGVudCA9IGlzSW1wID8gJ2luJyA6ICdtbSc7IH0pOw0KICAgICAgICAkYWxsKCdbZGF0YS11bml0LWtleT0ic3RyZXNzIl0nKS5mb3JFYWNoKChlbCkgPT4geyBlbC50ZXh0Q29udGVudCA9IGlzSW1wID8gJ3BzaScgOiAnTVBhJzsgfSk7DQoNCiAgICAgICAgY29uc3Qgc3RyZXNzVW5pdCA9ICQoJ3N0cmVzc1VuaXQnKTsNCiAgICAgICAgaWYgKGlzSW1wKSB7DQogICAgICAgICAgICBzdHJlc3NVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJwc2kiIHNlbGVjdGVkPnBzaTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImtzaSI+a3NpPC9vcHRpb24+JzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHN0cmVzc1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9Ik1QYSIgc2VsZWN0ZWQ+TVBhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iR1BhIj5HUGE8L29wdGlvbj4nOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgeW91bmdVbml0ID0gJCgneW91bmdVbml0Jyk7DQogICAgICAgIGlmIChpc0ltcCkgew0KICAgICAgICAgICAgeW91bmdVbml0LmlubmVy\",\n    \"SFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJrc2kiIHNlbGVjdGVkPmtzaTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InBzaSI+cHNpPC9vcHRpb24+JzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHlvdW5nVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0iR1BhIiBzZWxlY3RlZD5HUGE8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJNUGEiPk1QYTwvb3B0aW9uPic7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBtb2R1bHVzVW5pdCA9ICQoJ21vZHVsdXNVbml0Jyk7DQogICAgICAgIGlmIChpc0ltcCkgew0KICAgICAgICAgICAgbW9kdWx1c1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9ImtzaSIgc2VsZWN0ZWQ+a3NpPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icHNpIj5wc2k8L29wdGlvbj4nOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbW9kdWx1c1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9IkdQYSIgc2VsZWN0ZWQ+R1BhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iTVBhIj5NUGE8L29wdGlvbj4nOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgdG9ycXVlVW5pdCA9ICQoJ3RvcnF1ZVVuaXQnKTsNCiAgICAgICAgaWYgKGlzSW1wKSB7DQogICAgICAgICAgICB0b3JxdWVVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJsYmZJbiIgc2VsZWN0ZWQ+bGJmwrdpbjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImxiZkZ0Ij5sYmbCt2Z0PC9vcHRpb24+JzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRvcnF1ZVVuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9Ik5tIiBzZWxlY3RlZD5OwrdtPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iTm1tIj5OwrdtbTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImtObSI+a07Ct208L29wdGlvbj4nOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3Qgc2hhZnRMZW5ndGhVbml0ID0gJCgnc2hhZnRMZW5ndGhVbml0Jyk7DQogICAgICAgIGlmIChpc0ltcCkgew0KICAgICAgICAgICAgc2hhZnRMZW5ndGhVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJpbiIgc2VsZWN0ZWQ+aW48L29wdGlvbj48b3B0aW9uIHZhbHVlPSJmdCI+ZnQ8L29wdGlvbj4nOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgc2hhZnRMZW5ndGhVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJtbSIgc2VsZWN0ZWQ+bW08L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtIj5tPC9vcHRpb24+JzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZVNoYWZ0RmllbGRzKCkgew0KICAgICAgICBjb25zdCBzdCA9IHNoYWZ0VHlwZS52YWx1ZTsNCiAgICAgICAgJGFsbCgnLnNtZ2Mtc2hhZnQtc29saWQnKS5mb3JFYWNoKChlbCkgPT4gZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc21nYy1oaWRkZW4nLCBzdCAhPT0gJ3NvbGlkUm91bmQnKSk7DQogICAgICAgICRhbGwoJy5zbWdjLXNoYWZ0LWhvbGxvdycpLmZvckVhY2goKGVsKSA9PiBlbC5jbGFzc0xpc3QudG9nZ2xlKCdzbWdjLWhpZGRlbicsIHN0ICE9PSAnaG9sbG93Um91bmQnKSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlRmllbGRWaXNpYmlsaXR5KCkgew0KICAgICAgICBjb25zdCBtb2RlID0gY2FsY01vZGUudmFsdWU7DQogICAgICAgIGNvbnN0IG1ldGhvZCA9IGlucHV0TWV0aG9kLnZhbHVlOw0KDQogICAgICAgICRhbGwoJ1tkYXRhLW1vZGVdJykuZm9yRWFjaCgoZWwpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IG1vZGVzID0gZWwuZGF0YXNldC5tb2RlLnNwbGl0KCcgJyk7DQogICAgICAgICAgICBpZiAoIW1vZGVzLmluY2x1ZGVzKG1vZGUpKSB7DQogICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnc21nYy1oaWRkZW4nKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb25zdCBhbHdheXNNb2RlcyA9IGVsLmRhdGFzZXQuYWx3YXlzID8gZWwuZGF0YXNldC5hbHdheXMuc3BsaXQoJyAnKSA6IFtdOw0KICAgICAgICAgICAgaWYgKGFsd2F5c01vZGVzLmluY2x1ZGVzKG1vZGUpKSB7DQogICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnc21nYy1oaWRkZW4nKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwuZGF0YXNldC5tZXRob2QgJiYgbW9kZSA9PT0gJ2NhbGNNb2R1bHVzJykgew0KICAgICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ3NtZ2MtaGlkZGVuJywgIWVsLmRhdGFzZXQubWV0aG9kLnNwbGl0KCcgJykuaW5jbHVkZXMobWV0aG9kKSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3NtZ2MtaGlkZGVuJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgICRhbGwoJy5zbWdjLXR3b3BvaW50LWZpZWxkJykuZm9yRWFjaCgoZWwpID0+IHsNCiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ3NtZ2MtaGlkZGVuJywgbW9kZSAhPT0gJ2NhbGNNb2R1bHVzJyB8fCBtZXRob2QgIT09ICdzdHJlc3NTdHJhaW4nKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJGFsbCgnLnNtZ2MtbWVhc3VyZWQtdHdpc3QtZmllbGQnKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc21nYy1oaWRkZW4nLCBtb2RlICE9PSAnY2FsY01vZHVsdXMnIHx8IG1ldGhvZCAhPT0gJ3NoYWZ0VG9yc2lvbicpOw0KICAgICAgICB9KTsNCg0KICAgICAgICB1cGRhdGVTaGFmdEZpZWxkcygpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGFwcGx5TWF0ZXJpYWxQcmVzZXQoKSB7DQogICAgICAgIGNvbnN0IG1hdCA9IE1BVEVSSUFMU1ttYXRlcmlhbFNlbGVjdC52YWx1ZV07DQogICAgICAgIGlmICghbWF0IHx8IG1hdGVyaWFsU2VsZWN0LnZhbHVlID09PSAnY3VzdG9tJykgcmV0dXJuOw0KICAgICAgICBpZiAobWF0Lm1pbiAhPSBudWxsKSAkKCdyZWZHTWluJykudmFsdWUgPSBtYXQubWluOw0KICAgICAgICBpZiAobWF0Lm1heCAhPSBudWxsKSAkKCdyZWZHTWF4JykudmFsdWUgPSBtYXQubWF4Ow0KICAgICAgICBpZiAobWF0LnR5cGljYWwgIT0gbnVsbCkgew0KICAgICAgICAgICAgJCgncmVmR1R5cGljYWwnKS52YWx1ZSA9IG1hdC50eXBpY2FsOw0KICAgICAgICAgICAgJCgnc2hlYXJNb2R1bHVzJykudmFsdWUgPSBmb3JtYXROdW0oDQogICAgICAgICAgICAgICAgQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKG1hdC50eXBpY2FsLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2tzaScgOiAnR1BhJyksIDINCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG1hdC5FICE9IG51bGwpIHsNCiAgICAgICAgICAgICQoJ3lvdW5nTW9kdWx1cycpLnZhbHVlID0gZm9ybWF0TnVtKA0KICAgICAgICAgICAgICAgIENPTlYubW9kdWx1c0Zyb21JbnRlcm5hbChtYXQuRSwgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdrc2knIDogJ0dQYScpLCAxDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIGlmIChtYXQubnUgIT0gbnVsbCkgJCgncG9pc3NvbicpLnZhbHVlID0gbWF0Lm51Ow0KICAgICAgICBpZiAobWF0LmFsbG93ICE9IG51bGwpIHsNCiAgICAgICAgICAgICQoJ2FsbG93YWJsZVN0cmVzcycpLnZhbHVlID0gZm9ybWF0TnVtKA0KICAgICAgICAgICAgICAgIENPTlYuc3RyZXNzRnJvbUludGVybmFsKG1hdC5hbGxvdywgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdwc2knIDogJ01QYScpLCAwDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcGFyc2VOdW0oaWQpIHsNCiAgICAgICAgY29uc3QgZWwgPSAkKGlkKTsNCiAgICAgICAgaWYgKCFlbCB8fCBlbC52YWx1ZSA9PT0gJycpIHJldHVybiBudWxsOw0KICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgIHJldHVybiBpc05hTih2KSA\/IG51bGwgOiB2Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFNoYWZ0R2VvbWV0cnkoaW5wdXRzKSB7DQogICAgICAgIGxldCByLCBKLCBkT3V0Ow0KICAgICAgICBjb25zdCBzdCA9IGlucHV0cy5zaGFmdFR5cGU7DQoNCiAgICAgICAgaWYgKHN0ID09PSAnc29saWRSb3VuZCcpIHsNCiAgICAgICAgICAgIGRPdXQgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLnNoYWZ0RGlhbWV0ZXIgfHwgMCwgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKTsNCiAgICAgICAgICAgIHIgPSBkT3V0IC8gMjsNCiAgICAgICAgICAgIEogPSBNYXRoLlBJICogTWF0aC5wb3coZE91dCwgNCkgLyAzMjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNvbnN0IEQgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLm91dGVyRGlhbWV0ZXIgfHwgMCwgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKTsNCiAgICAgICAgICAgIGNvbnN0IGQgPSBDT05WLmxlbmd0aFRvSW50\",\n    \"ZXJuYWwoaW5wdXRzLmlubmVyRGlhbWV0ZXIgfHwgMCwgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKTsNCiAgICAgICAgICAgIGRPdXQgPSBEOw0KICAgICAgICAgICAgciA9IEQgLyAyOw0KICAgICAgICAgICAgSiA9IE1hdGguUEkgKiAoTWF0aC5wb3coRCwgNCkgLSBNYXRoLnBvdyhkLCA0KSkgLyAzMjsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4geyByLCBKLCBkT3V0IH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0SW5wdXRzKCkgew0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgbW9kZTogY2FsY01vZGUudmFsdWUsDQogICAgICAgICAgICBpbnB1dE1ldGhvZDogaW5wdXRNZXRob2QudmFsdWUsDQogICAgICAgICAgICBzaGVhclN0cmVzczogcGFyc2VOdW0oJ3NoZWFyU3RyZXNzJyksDQogICAgICAgICAgICBzdHJlc3NVbml0OiAkKCdzdHJlc3NVbml0JykudmFsdWUsDQogICAgICAgICAgICBzaGVhclN0cmFpbjogcGFyc2VOdW0oJ3NoZWFyU3RyYWluJyksDQogICAgICAgICAgICBzdHJhaW5Vbml0OiAkKCdzdHJhaW5Vbml0JykudmFsdWUsDQogICAgICAgICAgICB5b3VuZ01vZHVsdXM6IHBhcnNlTnVtKCd5b3VuZ01vZHVsdXMnKSwNCiAgICAgICAgICAgIHlvdW5nVW5pdDogJCgneW91bmdVbml0JykudmFsdWUsDQogICAgICAgICAgICBwb2lzc29uOiBwYXJzZU51bSgncG9pc3NvbicpLA0KICAgICAgICAgICAgc2hlYXJNb2R1bHVzOiBwYXJzZU51bSgnc2hlYXJNb2R1bHVzJyksDQogICAgICAgICAgICBtb2R1bHVzVW5pdDogJCgnbW9kdWx1c1VuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIHNoYWZ0VHlwZTogc2hhZnRUeXBlLnZhbHVlLA0KICAgICAgICAgICAgc2hhZnREaWFtZXRlcjogcGFyc2VOdW0oJ3NoYWZ0RGlhbWV0ZXInKSwNCiAgICAgICAgICAgIG91dGVyRGlhbWV0ZXI6IHBhcnNlTnVtKCdvdXRlckRpYW1ldGVyJyksDQogICAgICAgICAgICBpbm5lckRpYW1ldGVyOiBwYXJzZU51bSgnaW5uZXJEaWFtZXRlcicpLA0KICAgICAgICAgICAgc2hhZnRMZW5ndGg6IHBhcnNlTnVtKCdzaGFmdExlbmd0aCcpLA0KICAgICAgICAgICAgc2hhZnRMZW5ndGhVbml0OiAkKCdzaGFmdExlbmd0aFVuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIHRvcnF1ZTogcGFyc2VOdW0oJ3RvcnF1ZScpLA0KICAgICAgICAgICAgdG9ycXVlVW5pdDogJCgndG9ycXVlVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgc3RyZXNzMTogcGFyc2VOdW0oJ3N0cmVzczEnKSwNCiAgICAgICAgICAgIHN0cmFpbjE6IHBhcnNlTnVtKCdzdHJhaW4xJyksDQogICAgICAgICAgICBzdHJhaW4xVW5pdDogJCgnc3RyYWluMVVuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIHN0cmVzczI6IHBhcnNlTnVtKCdzdHJlc3MyJyksDQogICAgICAgICAgICBzdHJhaW4yOiBwYXJzZU51bSgnc3RyYWluMicpLA0KICAgICAgICAgICAgc3RyYWluMlVuaXQ6ICQoJ3N0cmFpbjJVbml0JykudmFsdWUsDQogICAgICAgICAgICBhbGxvd2FibGVTdHJlc3M6IHBhcnNlTnVtKCdhbGxvd2FibGVTdHJlc3MnKSwNCiAgICAgICAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbFNlbGVjdC52YWx1ZSwNCiAgICAgICAgICAgIHJlZkdNaW46IHBhcnNlTnVtKCdyZWZHTWluJyksDQogICAgICAgICAgICByZWZHTWF4OiBwYXJzZU51bSgncmVmR01heCcpLA0KICAgICAgICAgICAgcmVmR1R5cGljYWw6IHBhcnNlTnVtKCdyZWZHVHlwaWNhbCcpLA0KICAgICAgICAgICAgbWVhc3VyZWRUd2lzdDogcGFyc2VOdW0oJ21lYXN1cmVkVHdpc3QnKSwNCiAgICAgICAgICAgIHR3aXN0VW5pdDogJCgndHdpc3RVbml0JykudmFsdWUNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2YWxpZGF0ZVNpbGVudCgpIHsNCiAgICAgICAgcmV0dXJuIHZhbGlkYXRlSW5wdXRzKGdldElucHV0cygpKS5sZW5ndGggPT09IDA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dHMoaW5wdXRzKSB7DQogICAgICAgIGNvbnN0IGVycm9ycyA9IFtdOw0KICAgICAgICBjb25zdCB1c2VzU2hlYXIgPSAoaW5wdXRzLm1vZGUgPT09ICdjYWxjTW9kdWx1cycgJiYgaW5wdXRzLmlucHV0TWV0aG9kID09PSAnc3RyZXNzU3RyYWluJykgfHwNCiAgICAgICAgICAgIGlucHV0cy5tb2RlID09PSAnY2FsY1N0cmVzcycgfHwgaW5wdXRzLm1vZGUgPT09ICdjYWxjU3RyYWluJzsNCiAgICAgICAgY29uc3QgdXNlc0VQID0gaW5wdXRzLm1vZGUgPT09ICdjYWxjTW9kdWx1cycgJiYgaW5wdXRzLmlucHV0TWV0aG9kID09PSAnZVBvaXNzb24nOw0KICAgICAgICBjb25zdCB1c2VzU2hhZnQgPSAoaW5wdXRzLm1vZGUgPT09ICdjYWxjTW9kdWx1cycgJiYgaW5wdXRzLmlucHV0TWV0aG9kID09PSAnc2hhZnRUb3JzaW9uJykgfHwNCiAgICAgICAgICAgIGlucHV0cy5tb2RlID09PSAnY2FsY1RvcnNpb25hbFN0cmVzcycgfHwgaW5wdXRzLm1vZGUgPT09ICdjYWxjVHdpc3QnOw0KDQogICAgICAgIGlmICh1c2VzU2hlYXIgJiYgaW5wdXRzLm1vZGUgPT09ICdjYWxjTW9kdWx1cycpIHsNCiAgICAgICAgICAgIGNvbnN0IGhhc1R3b1BvaW50ID0gaW5wdXRzLnN0cmVzczEgIT0gbnVsbCAmJiBpbnB1dHMuc3RyYWluMSAhPSBudWxsICYmDQogICAgICAgICAgICAgICAgaW5wdXRzLnN0cmVzczIgIT0gbnVsbCAmJiBpbnB1dHMuc3RyYWluMiAhPSBudWxsOw0KICAgICAgICAgICAgaWYgKCFoYXNUd29Qb2ludCkgew0KICAgICAgICAgICAgICAgIGNvbnN0IGdhbW1hID0gQ09OVi5zdHJhaW5Ub0ludGVybmFsKGlucHV0cy5zaGVhclN0cmFpbiB8fCAwLCBpbnB1dHMuc3RyYWluVW5pdCk7DQogICAgICAgICAgICAgICAgaWYgKGdhbW1hID09PSAwKSBlcnJvcnMucHVzaCgnU2hlYXIgc3RyYWluIGNhbm5vdCBiZSB6ZXJvIHdoZW4gY2FsY3VsYXRpbmcgRyBmcm9tIM+EIC8gzrMuJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodXNlc0VQKSB7DQogICAgICAgICAgICBjb25zdCBudSA9IGlucHV0cy5wb2lzc29uOw0KICAgICAgICAgICAgaWYgKG51ID09IG51bGwgfHwgbnUgPCAwIHx8IG51ID49IDAuNSkgew0KICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKCJQb2lzc29uJ3MgcmF0aW8gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDAuNSAoZXhjbHVzaXZlKSBmb3IgaXNvdHJvcGljIG1hdGVyaWFscy4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNvbnN0IEUgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy55b3VuZ01vZHVsdXMgfHwgMCwgaW5wdXRzLnlvdW5nVW5pdCk7DQogICAgICAgICAgICBpZiAoRSA8PSAwKSBlcnJvcnMucHVzaCgiWW91bmcncyBtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoaW5wdXRzLm1vZGUgPT09ICdjYWxjU3RyZXNzJyB8fCBpbnB1dHMubW9kZSA9PT0gJ2NhbGNTdHJhaW4nKSB7DQogICAgICAgICAgICBjb25zdCBHID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnB1dHMuc2hlYXJNb2R1bHVzIHx8IDAsIGlucHV0cy5tb2R1bHVzVW5pdCk7DQogICAgICAgICAgICBpZiAoRyA8PSAwKSBlcnJvcnMucHVzaCgnU2hlYXIgbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHVzZXNTaGFmdCkgew0KICAgICAgICAgICAgaWYgKGlucHV0cy5zaGFmdFR5cGUgPT09ICdob2xsb3dSb3VuZCcpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBvZCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMub3V0ZXJEaWFtZXRlciB8fCAwLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucHV0cy5pbm5lckRpYW1ldGVyIHx8IDAsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICAgICAgaWYgKGlkIDw9IDApIGVycm9ycy5wdXNoKCdJbm5lciBkaWFtZXRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgICAgIGlmIChvZCA8PSAwKSBlcnJvcnMucHVzaCgnT3V0ZXIgZGlhbWV0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgICAgICAgICBpZiAoaWQgPj0gb2QpIGVycm9ycy5wdXNoKCdJbm5lciBkaWFtZXRlciBtdXN0IGJlIGxlc3MgdGhhbiBvdXRlciBkaWFtZXRlci4nKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgY29uc3QgZCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMuc2hhZnREaWFtZXRlciB8fCAwLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgICAgIGlmIChkIDw9IDApIGVycm9ycy5wdXNoKCdTaGFmdCBkaWFtZXRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY29u\",\n    \"c3QgTCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMuc2hhZnRMZW5ndGggfHwgMCwgaW5wdXRzLnNoYWZ0TGVuZ3RoVW5pdCk7DQogICAgICAgICAgICBpZiAoTCA8PSAwKSBlcnJvcnMucHVzaCgnU2hhZnQgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgICAgICBpZiAoaW5wdXRzLnRvcnF1ZSA9PSBudWxsIHx8IGlucHV0cy50b3JxdWUgPD0gMCkgZXJyb3JzLnB1c2goJ0FwcGxpZWQgdG9ycXVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgICAgICBjb25zdCB7IEogfSA9IGdldFNoYWZ0R2VvbWV0cnkoaW5wdXRzKTsNCiAgICAgICAgICAgIGlmIChKIDw9IDApIGVycm9ycy5wdXNoKCdQb2xhciBtb21lbnQgb2YgaW5lcnRpYSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGlucHV0cy5tb2RlID09PSAnY2FsY1R3aXN0JyB8fCAoaW5wdXRzLm1vZGUgPT09ICdjYWxjTW9kdWx1cycgJiYgaW5wdXRzLmlucHV0TWV0aG9kID09PSAnc2hhZnRUb3JzaW9uJykpIHsNCiAgICAgICAgICAgIGNvbnN0IEcgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5zaGVhck1vZHVsdXMgfHwgMCwgaW5wdXRzLm1vZHVsdXNVbml0KTsNCiAgICAgICAgICAgIGlmIChHIDw9IDAgJiYgaW5wdXRzLm1vZGUgPT09ICdjYWxjVHdpc3QnKSBlcnJvcnMucHVzaCgnU2hlYXIgbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGVycm9yczsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWxjdWxhdGUoc2hvd1BhbmVsKSB7DQogICAgICAgIGlmIChzaG93UGFuZWwgPT09IHVuZGVmaW5lZCkgc2hvd1BhbmVsID0gdHJ1ZTsNCiAgICAgICAgaGlkZU1lc3NhZ2VzKCk7DQogICAgICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0cygpOw0KICAgICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZUlucHV0cyhpbnB1dHMpOw0KICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgew0KICAgICAgICAgICAgaWYgKHNob3dQYW5lbCkgew0KICAgICAgICAgICAgICAgIHNob3dSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgICAgICAgICBzaG93RXJyb3JzKGVycm9ycyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCB3YXJuaW5ncyA9IFtdOw0KICAgICAgICBsZXQgdGF1ID0gbnVsbCwgZ2FtbWEgPSBudWxsLCBHID0gbnVsbCwgRSA9IG51bGwsIG51ID0gbnVsbDsNCiAgICAgICAgbGV0IFQgPSBudWxsLCBMID0gbnVsbCwgSiA9IG51bGwsIHIgPSBudWxsLCB0aGV0YSA9IG51bGw7DQogICAgICAgIGxldCBtb2R1bHVzTGFiZWwgPSAnU2hlYXIgTW9kdWx1cyBHJzsNCg0KICAgICAgICBpZiAoaW5wdXRzLm1vZGUgPT09ICdjYWxjTW9kdWx1cycpIHsNCiAgICAgICAgICAgIGlmIChpbnB1dHMuaW5wdXRNZXRob2QgPT09ICdzdHJlc3NTdHJhaW4nKSB7DQogICAgICAgICAgICAgICAgY29uc3QgaGFzVHdvUG9pbnQgPSBpbnB1dHMuc3RyZXNzMSAhPSBudWxsICYmIGlucHV0cy5zdHJhaW4xICE9IG51bGwgJiYNCiAgICAgICAgICAgICAgICAgICAgaW5wdXRzLnN0cmVzczIgIT0gbnVsbCAmJiBpbnB1dHMuc3RyYWluMiAhPSBudWxsOw0KDQogICAgICAgICAgICAgICAgaWYgKGhhc1R3b1BvaW50KSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHQxID0gQ09OVi5zdHJlc3NUb0ludGVybmFsKGlucHV0cy5zdHJlc3MxLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ3BzaScgOiAnTVBhJyk7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHQyID0gQ09OVi5zdHJlc3NUb0ludGVybmFsKGlucHV0cy5zdHJlc3MyLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ3BzaScgOiAnTVBhJyk7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGcxID0gQ09OVi5zdHJhaW5Ub0ludGVybmFsKGlucHV0cy5zdHJhaW4xLCBpbnB1dHMuc3RyYWluMVVuaXQpOw0KICAgICAgICAgICAgICAgICAgICBjb25zdCBnMiA9IENPTlYuc3RyYWluVG9JbnRlcm5hbChpbnB1dHMuc3RyYWluMiwgaW5wdXRzLnN0cmFpbjJVbml0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHQyIC0gdDEpIDwgMWUtMTIgJiYgTWF0aC5hYnMoZzIgLSBnMSkgPCAxZS0xMikgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnVHdvIHN0cmVzcy1zdHJhaW4gcG9pbnRzIGFyZSBpZGVudGljYWwg4oCUIGNhbm5vdCBjb21wdXRlIHNsb3BlLicpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGcyIC0gZzEpIDwgMWUtMTUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goJ1NoZWFyIHN0cmFpbiBkaWZmZXJlbmNlIGlzIHplcm8g4oCUIGNhbm5vdCBjYWxjdWxhdGUgRyBmcm9tIHR3byBwb2ludHMuJyk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBHID0gKHQyIC0gdDEpIC8gKGcyIC0gZzEpIC8gMTAwMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhdSA9IHQyOw0KICAgICAgICAgICAgICAgICAgICAgICAgZ2FtbWEgPSBnMjsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsdXNMYWJlbCA9ICdUd28tUG9pbnQgU2hlYXIgTW9kdWx1cyBHJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRhdSA9IENPTlYuc3RyZXNzVG9JbnRlcm5hbChpbnB1dHMuc2hlYXJTdHJlc3MsIGlucHV0cy5zdHJlc3NVbml0KTsNCiAgICAgICAgICAgICAgICAgICAgZ2FtbWEgPSBDT05WLnN0cmFpblRvSW50ZXJuYWwoaW5wdXRzLnNoZWFyU3RyYWluLCBpbnB1dHMuc3RyYWluVW5pdCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChnYW1tYSA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1Jlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Vycm9ycyhbJ1NoZWFyIHN0cmFpbiBjYW5ub3QgYmUgemVybyB3aGVuIGNhbGN1bGF0aW5nIEcgZnJvbSDPhCAvIM6zLiddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBHID0gKHRhdSAvIGdhbW1hKSAvIDEwMDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dHMuaW5wdXRNZXRob2QgPT09ICdlUG9pc3NvbicpIHsNCiAgICAgICAgICAgICAgICBFID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnB1dHMueW91bmdNb2R1bHVzLCBpbnB1dHMueW91bmdVbml0KTsNCiAgICAgICAgICAgICAgICBudSA9IGlucHV0cy5wb2lzc29uOw0KICAgICAgICAgICAgICAgIGlmIChudSA+PSAwLjUpIHsNCiAgICAgICAgICAgICAgICAgICAgc2hvd1Jlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3JzKFsiUG9pc3NvbidzIHJhdGlvIG11c3QgYmUgbGVzcyB0aGFuIDAuNSBmb3IgaXNvdHJvcGljIG1hdGVyaWFscy4iXSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgRyA9IEUgLyAoMiAqICgxICsgbnUpKTsNCiAgICAgICAgICAgICAgICBtb2R1bHVzTGFiZWwgPSAnU2hlYXIgTW9kdWx1cyBmcm9tIEUgYW5kIM69JzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgVCA9IENPTlYudG9ycXVlVG9JbnRlcm5hbChpbnB1dHMudG9ycXVlLCBpbnB1dHMudG9ycXVlVW5pdCk7DQogICAgICAgICAgICAgICAgTCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMuc2hhZnRMZW5ndGgsIGlucHV0cy5zaGFmdExlbmd0aFVuaXQpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGdlb20gPSBnZXRTaGFmdEdlb21ldHJ5KGlucHV0cyk7DQogICAgICAgICAgICAgICAgSiA9IGdlb20uSjsNCiAgICAgICAgICAgICAgICByID0gZ2VvbS5yOw0KICAgICAgICAgICAgICAgIHRhdSA9IFQgKiByIC8gSjsNCg0KICAgICAgICAgICAgICAgIGlmIChpbnB1dHMubWVhc3VyZWRUd2lzdCAhPSBudWxsICYmIGlucHV0cy5tZWFzdXJlZFR3aXN0ID4gMCkgew0KICAgICAgICAgICAgICAgICAgICB0aGV0YSA9IGlucHV0cy50d2lzdFVuaXQgPT09ICdkZWcnDQogICAgICAgICAgICAgICAgICAgICAgICA\/IGlucHV0cy5tZWFzdXJlZFR3aXN0ICogTWF0aC5QSSAvIDE4MA0KICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnB1dHMubWVhc3VyZWRUd2lzdDsNCiAgICAgICAgICAgICAgICAgICAgRyA9IFQgKiBMIC8gKEogKiB0aGV0YSkgLyAxMDAwOw0KICAgICAgICAgICAgICAgICAgICBnYW1tYSA9IHIgKiB0aGV0YSAvIEw7DQogICAgICAgICAgICAgICAgICAgIG1vZHVsdXNMYWJlbCA9ICdTaGVhciBN\",\n    \"b2R1bHVzIGZyb20gVG9yc2lvbiBUZXN0JzsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBHID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnB1dHMuc2hlYXJNb2R1bHVzLCBpbnB1dHMubW9kdWx1c1VuaXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoRyA8PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzaG93UmVzdWx0c1BhbmVsKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3JzKFsnRW50ZXIgbWVhc3VyZWQgYW5nbGUgb2YgdHdpc3QgdG8gY2FsY3VsYXRlIEcsIG9yIHByb3ZpZGUgYSBrbm93biBzaGVhciBtb2R1bHVzIHZhbHVlLiddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0aGV0YSA9IFQgKiBMIC8gKEogKiBHICogMTAwMCk7DQogICAgICAgICAgICAgICAgICAgIGdhbW1hID0gciAqIHRoZXRhIC8gTDsNCiAgICAgICAgICAgICAgICAgICAgbW9kdWx1c0xhYmVsID0gJ1NoZWFyIE1vZHVsdXMgKGlucHV0KSc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGlucHV0cy5tb2RlID09PSAnY2FsY1N0cmVzcycpIHsNCiAgICAgICAgICAgIEcgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5zaGVhck1vZHVsdXMsIGlucHV0cy5tb2R1bHVzVW5pdCk7DQogICAgICAgICAgICBnYW1tYSA9IENPTlYuc3RyYWluVG9JbnRlcm5hbChpbnB1dHMuc2hlYXJTdHJhaW4sIGlucHV0cy5zdHJhaW5Vbml0KTsNCiAgICAgICAgICAgIHRhdSA9IEcgKiAxMDAwICogZ2FtbWE7DQogICAgICAgIH0gZWxzZSBpZiAoaW5wdXRzLm1vZGUgPT09ICdjYWxjU3RyYWluJykgew0KICAgICAgICAgICAgdGF1ID0gQ09OVi5zdHJlc3NUb0ludGVybmFsKGlucHV0cy5zaGVhclN0cmVzcywgaW5wdXRzLnN0cmVzc1VuaXQpOw0KICAgICAgICAgICAgRyA9IENPTlYubW9kdWx1c1RvSW50ZXJuYWwoaW5wdXRzLnNoZWFyTW9kdWx1cywgaW5wdXRzLm1vZHVsdXNVbml0KTsNCiAgICAgICAgICAgIGdhbW1hID0gdGF1IC8gKEcgKiAxMDAwKTsNCiAgICAgICAgfSBlbHNlIGlmIChpbnB1dHMubW9kZSA9PT0gJ2NhbGNUb3JzaW9uYWxTdHJlc3MnKSB7DQogICAgICAgICAgICBUID0gQ09OVi50b3JxdWVUb0ludGVybmFsKGlucHV0cy50b3JxdWUsIGlucHV0cy50b3JxdWVVbml0KTsNCiAgICAgICAgICAgIGNvbnN0IGdlb20gPSBnZXRTaGFmdEdlb21ldHJ5KGlucHV0cyk7DQogICAgICAgICAgICBKID0gZ2VvbS5KOw0KICAgICAgICAgICAgciA9IGdlb20ucjsNCiAgICAgICAgICAgIEcgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5zaGVhck1vZHVsdXMsIGlucHV0cy5tb2R1bHVzVW5pdCk7DQogICAgICAgICAgICB0YXUgPSBUICogciAvIEo7DQogICAgICAgICAgICBnYW1tYSA9IEcgPiAwID8gdGF1IC8gKEcgKiAxMDAwKSA6IG51bGw7DQogICAgICAgICAgICBMID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucHV0cy5zaGFmdExlbmd0aCwgaW5wdXRzLnNoYWZ0TGVuZ3RoVW5pdCk7DQogICAgICAgIH0gZWxzZSBpZiAoaW5wdXRzLm1vZGUgPT09ICdjYWxjVHdpc3QnKSB7DQogICAgICAgICAgICBUID0gQ09OVi50b3JxdWVUb0ludGVybmFsKGlucHV0cy50b3JxdWUsIGlucHV0cy50b3JxdWVVbml0KTsNCiAgICAgICAgICAgIEwgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLnNoYWZ0TGVuZ3RoLCBpbnB1dHMuc2hhZnRMZW5ndGhVbml0KTsNCiAgICAgICAgICAgIGNvbnN0IGdlb20gPSBnZXRTaGFmdEdlb21ldHJ5KGlucHV0cyk7DQogICAgICAgICAgICBKID0gZ2VvbS5KOw0KICAgICAgICAgICAgciA9IGdlb20ucjsNCiAgICAgICAgICAgIEcgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5zaGVhck1vZHVsdXMsIGlucHV0cy5tb2R1bHVzVW5pdCk7DQogICAgICAgICAgICB0aGV0YSA9IFQgKiBMIC8gKEogKiBHICogMTAwMCk7DQogICAgICAgICAgICB0YXUgPSBUICogciAvIEo7DQogICAgICAgICAgICBnYW1tYSA9IHIgKiB0aGV0YSAvIEw7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoRSA9PSBudWxsICYmIEcgIT0gbnVsbCAmJiBudSA9PSBudWxsICYmIGlucHV0cy5wb2lzc29uICE9IG51bGwpIHsNCiAgICAgICAgICAgIG51ID0gaW5wdXRzLnBvaXNzb247DQogICAgICAgICAgICBFID0gMiAqIEcgKiAoMSArIG51KTsNCiAgICAgICAgfSBlbHNlIGlmIChFID09IG51bGwgJiYgRyAhPSBudWxsICYmIGlucHV0cy55b3VuZ01vZHVsdXMgIT0gbnVsbCAmJiBpbnB1dHMucG9pc3NvbiAhPSBudWxsKSB7DQogICAgICAgICAgICBFID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnB1dHMueW91bmdNb2R1bHVzLCBpbnB1dHMueW91bmdVbml0KTsNCiAgICAgICAgICAgIG51ID0gaW5wdXRzLnBvaXNzb247DQogICAgICAgIH0gZWxzZSBpZiAoRSA9PSBudWxsICYmIEcgIT0gbnVsbCAmJiBudSAhPSBudWxsKSB7DQogICAgICAgICAgICBFID0gMiAqIEcgKiAoMSArIG51KTsNCiAgICAgICAgfSBlbHNlIGlmIChudSA9PSBudWxsICYmIEUgIT0gbnVsbCAmJiBHICE9IG51bGwgJiYgRyA+IDApIHsNCiAgICAgICAgICAgIG51ID0gRSAvICgyICogRykgLSAxOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKFQgPT0gbnVsbCAmJiAoaW5wdXRzLm1vZGUgPT09ICdjYWxjVG9yc2lvbmFsU3RyZXNzJyB8fCBpbnB1dHMubW9kZSA9PT0gJ2NhbGNUd2lzdCcgfHwNCiAgICAgICAgICAgIChpbnB1dHMubW9kZSA9PT0gJ2NhbGNNb2R1bHVzJyAmJiBpbnB1dHMuaW5wdXRNZXRob2QgPT09ICdzaGFmdFRvcnNpb24nKSkpIHsNCiAgICAgICAgICAgIFQgPSBDT05WLnRvcnF1ZVRvSW50ZXJuYWwoaW5wdXRzLnRvcnF1ZSwgaW5wdXRzLnRvcnF1ZVVuaXQpOw0KICAgICAgICB9DQogICAgICAgIGlmIChMID09IG51bGwgJiYgaW5wdXRzLnNoYWZ0TGVuZ3RoICE9IG51bGwpIHsNCiAgICAgICAgICAgIEwgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLnNoYWZ0TGVuZ3RoLCBpbnB1dHMuc2hhZnRMZW5ndGhVbml0KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoSiA9PSBudWxsICYmIChpbnB1dHMubW9kZSA9PT0gJ2NhbGNUb3JzaW9uYWxTdHJlc3MnIHx8IGlucHV0cy5tb2RlID09PSAnY2FsY1R3aXN0JyB8fA0KICAgICAgICAgICAgKGlucHV0cy5tb2RlID09PSAnY2FsY01vZHVsdXMnICYmIGlucHV0cy5pbnB1dE1ldGhvZCA9PT0gJ3NoYWZ0VG9yc2lvbicpKSkgew0KICAgICAgICAgICAgY29uc3QgZ2VvbSA9IGdldFNoYWZ0R2VvbWV0cnkoaW5wdXRzKTsNCiAgICAgICAgICAgIEogPSBnZW9tLko7DQogICAgICAgICAgICByID0gZ2VvbS5yOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoZXRhID09IG51bGwgJiYgVCAhPSBudWxsICYmIEwgIT0gbnVsbCAmJiBKICE9IG51bGwgJiYgRyAhPSBudWxsICYmIEcgPiAwKSB7DQogICAgICAgICAgICB0aGV0YSA9IFQgKiBMIC8gKEogKiBHICogMTAwMCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZ2FtbWEgIT0gbnVsbCAmJiBnYW1tYSA+IDAuMDEpIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goJ1NoZWFyIHN0cmFpbiBleGNlZWRzIDElIOKAlCB1bnVzdWFsbHkgbGFyZ2UgZm9yIGxpbmVhciBlbGFzdGljIGNhbGN1bGF0aW9uLiBWZXJpZnkgZWxhc3RpYyByYW5nZS4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHRhdUFsbG93ID0gaW5wdXRzLmFsbG93YWJsZVN0cmVzcw0KICAgICAgICAgICAgPyBDT05WLnN0cmVzc1RvSW50ZXJuYWwoaW5wdXRzLmFsbG93YWJsZVN0cmVzcywgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdwc2knIDogJ01QYScpDQogICAgICAgICAgICA6IG51bGw7DQoNCiAgICAgICAgbGV0IHV0aWxpemF0aW9uID0gbnVsbDsNCiAgICAgICAgY29uc3QgdGF1Q2hlY2sgPSB0YXU7DQogICAgICAgIGlmICh0YXVBbGxvdyAmJiB0YXVDaGVjayAhPSBudWxsKSB7DQogICAgICAgICAgICB1dGlsaXphdGlvbiA9ICh0YXVDaGVjayAvIHRhdUFsbG93KSAqIDEwMDsNCiAgICAgICAgICAgIGlmICh0YXVDaGVjayA+IHRhdUFsbG93KSB7DQogICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnU2hlYXIgc3RyZXNzIGV4Y2VlZHMgYWxsb3dhYmxlIG9yIHlpZWxkIHZhbHVlIOKAlCBsaW5lYXIgZWxhc3RpYyBhc3N1bXB0aW9ucyBtYXkgbm8gbG9uZ2VyIGJlIHZhbGlkLicpOw0KICAgICAgICAgICAgfSBlbHNlIGlmICh1dGlsaXphdGlvbiA+IDgwKSB7DQogICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnU2hlYXIgc3RyZXNzIGFwcHJvYWNoZXMgYWxsb3dhYmxlIGxpbWl0IOKAlCB2ZXJpZnkgbGluZWFyIGVsYXN0aWMgYXNzdW1wdGlvbnMuJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCByZWZNaW4gPSBDT05WLm1vZHVsdXNUb0ludGVy\",\n    \"bmFsKGlucHV0cy5yZWZHTWluIHx8IDAsICdHUGEnKTsNCiAgICAgICAgY29uc3QgcmVmTWF4ID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnB1dHMucmVmR01heCB8fCAwLCAnR1BhJyk7DQogICAgICAgIGNvbnN0IHJlZlR5cCA9IENPTlYubW9kdWx1c1RvSW50ZXJuYWwoaW5wdXRzLnJlZkdUeXBpY2FsIHx8IDAsICdHUGEnKTsNCg0KICAgICAgICBsZXQgbWF0ZXJpYWxNYXRjaCA9ICdOL0EnOw0KICAgICAgICBpZiAoRyAhPSBudWxsICYmIHJlZk1pbiA+IDAgJiYgcmVmTWF4ID4gMCkgew0KICAgICAgICAgICAgaWYgKEcgPj0gcmVmTWluICYmIEcgPD0gcmVmTWF4KSB7DQogICAgICAgICAgICAgICAgbWF0ZXJpYWxNYXRjaCA9IG1hdGVyaWFsU2VsZWN0Lm9wdGlvbnNbbWF0ZXJpYWxTZWxlY3Quc2VsZWN0ZWRJbmRleF0udGV4dCArICcgKHdpdGhpbiByZWZlcmVuY2UgcmFuZ2UpJzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IHJlZlR5cCA+IDAgPyBNYXRoLmFicyhHIC0gcmVmVHlwKSAvIHJlZlR5cCAqIDEwMCA6IDEwMDsNCiAgICAgICAgICAgICAgICBtYXRlcmlhbE1hdGNoID0gZGlmZiA8IDMwDQogICAgICAgICAgICAgICAgICAgID8gJ05lYXIgJyArIG1hdGVyaWFsU2VsZWN0Lm9wdGlvbnNbbWF0ZXJpYWxTZWxlY3Quc2VsZWN0ZWRJbmRleF0udGV4dA0KICAgICAgICAgICAgICAgICAgICA6ICdEaWZmZXJzIGZyb20gJyArIG1hdGVyaWFsU2VsZWN0Lm9wdGlvbnNbbWF0ZXJpYWxTZWxlY3Quc2VsZWN0ZWRJbmRleF0udGV4dCArICcgcmVmZXJlbmNlJzsNCiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDMwKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goJ0NhbGN1bGF0ZWQgRyBkaWZmZXJzIHNpZ25pZmljYW50bHkgZnJvbSB0eXBpY2FsIG1hdGVyaWFsIHZhbHVlcyDigJQgY2hlY2sgdW5pdHMgYW5kIGVsYXN0aWMgcmFuZ2UuJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgbGV0IGt0ID0gbnVsbCwgR0ogPSBudWxsLCB0d2lzdFBlckxlbmd0aCA9IG51bGwsIGdhbW1hTWF4ID0gbnVsbDsNCiAgICAgICAgaWYgKEcgIT0gbnVsbCAmJiBKICE9IG51bGwgJiYgTCAhPSBudWxsICYmIEwgPiAwKSB7DQogICAgICAgICAgICBHSiA9IEcgKiAxMDAwICogSjsNCiAgICAgICAgICAgIGt0ID0gR0ogLyBMOw0KICAgICAgICAgICAgaWYgKFQgIT0gbnVsbCkgdHdpc3RQZXJMZW5ndGggPSBUIC8gR0o7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHIgIT0gbnVsbCAmJiB0aGV0YSAhPSBudWxsICYmIEwgIT0gbnVsbCAmJiBMID4gMCkgew0KICAgICAgICAgICAgZ2FtbWFNYXggPSByICogdGhldGEgLyBMOw0KICAgICAgICB9IGVsc2UgaWYgKHRhdSAhPSBudWxsICYmIEcgIT0gbnVsbCAmJiBHID4gMCkgew0KICAgICAgICAgICAgZ2FtbWFNYXggPSB0YXUgLyAoRyAqIDEwMDApOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3Qgc3RhdHVzID0gY2xhc3NpZnlTdGF0dXModGF1Q2hlY2ssIHRhdUFsbG93LCB1dGlsaXphdGlvbiwgRywgcmVmTWluLCByZWZNYXgpOw0KDQogICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGgpIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7DQoNCiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHsNCiAgICAgICAgICAgIEcsIHRhdSwgZ2FtbWEsIEUsIG51LCBULCBMLCBKLCByLCB0aGV0YSwga3QsIEdKLCB0d2lzdFBlckxlbmd0aCwgZ2FtbWFNYXgsDQogICAgICAgICAgICB1dGlsaXphdGlvbiwgbWF0ZXJpYWxNYXRjaCwgc3RhdHVzLCBtb2R1bHVzTGFiZWwsIHRhdUFsbG93LCByZWZNaW4sIHJlZk1heCwgcmVmVHlwLA0KICAgICAgICAgICAgbW9kZTogaW5wdXRzLm1vZGUsIGlucHV0TWV0aG9kOiBpbnB1dHMuaW5wdXRNZXRob2QNCiAgICAgICAgfTsNCg0KICAgICAgICBkaXNwbGF5UmVzdWx0cyhyZXN1bHRzKTsNCiAgICAgICAgZHJhd1Zpc3VhbGl6YXRpb25zKHJlc3VsdHMpOw0KICAgICAgICBpZiAoc2hvd1BhbmVsKSBzaG93UmVzdWx0c1BhbmVsKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2xhc3NpZnlTdGF0dXModGF1LCB0YXVBbGxvdywgdXRpbGl6YXRpb24sIEcsIHJlZk1pbiwgcmVmTWF4KSB7DQogICAgICAgIGlmICh0YXVBbGxvdyAmJiB0YXUgIT0gbnVsbCAmJiB0YXUgPiB0YXVBbGxvdykgew0KICAgICAgICAgICAgcmV0dXJuIHsgbGV2ZWw6ICdkYW5nZXInLCBsYWJlbDogJ091dHNpZGUgRWxhc3RpYyBSYW5nZScgfTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodXRpbGl6YXRpb24gIT0gbnVsbCAmJiB1dGlsaXphdGlvbiA+IDgwKSB7DQogICAgICAgICAgICByZXR1cm4geyBsZXZlbDogJ2NhdXRpb24nLCBsYWJlbDogJ0NhdXRpb24nIH07DQogICAgICAgIH0NCiAgICAgICAgaWYgKEcgIT0gbnVsbCAmJiByZWZNaW4gPiAwICYmIHJlZk1heCA+IDAgJiYgKEcgPCByZWZNaW4gKiAwLjcgfHwgRyA+IHJlZk1heCAqIDEuMykpIHsNCiAgICAgICAgICAgIHJldHVybiB7IGxldmVsOiAnY2F1dGlvbicsIGxhYmVsOiAnQ2F1dGlvbicgfTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGF1ICE9IG51bGwgfHwgRyAhPSBudWxsKSB7DQogICAgICAgICAgICByZXR1cm4geyBsZXZlbDogJ3NhZmUnLCBsYWJlbDogJ1ZhbGlkIEVsYXN0aWMgUmVzdWx0JyB9Ow0KICAgICAgICB9DQogICAgICAgIHJldHVybiB7IGxldmVsOiAnbmV1dHJhbCcsIGxhYmVsOiAnQXdhaXRpbmcgSW5wdXQnIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm9ybWF0TnVtKG4sIGRlY2ltYWxzKSB7DQogICAgICAgIGlmIChkZWNpbWFscyA9PT0gdW5kZWZpbmVkKSBkZWNpbWFscyA9IDM7DQogICAgICAgIGlmIChuID09PSBudWxsIHx8IG4gPT09IHVuZGVmaW5lZCB8fCAhaXNGaW5pdGUobikpIHJldHVybiAnTi9BJzsNCiAgICAgICAgaWYgKE1hdGguYWJzKG4pID49IDEwMDAwKSByZXR1cm4gbi50b0V4cG9uZW50aWFsKDMpOw0KICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChuLnRvRml4ZWQoZGVjaW1hbHMpKS50b1N0cmluZygpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRpc3BsYXlSZXN1bHRzKHIpIHsNCiAgICAgICAgY29uc3QgYmFkZ2UgPSAkKCdzdGF0dXNCYWRnZScpOw0KICAgICAgICBiYWRnZS50ZXh0Q29udGVudCA9IHIuc3RhdHVzLmxhYmVsOw0KICAgICAgICBiYWRnZS5jbGFzc05hbWUgPSAnc21nYy1zdGF0dXMtYmFkZ2Ugc21nYy1zdGF0dXMtJyArIHIuc3RhdHVzLmxldmVsOw0KDQogICAgICAgIGNvbnN0IGdyaWQgPSAkKCdyZXN1bHRzR3JpZCcpOw0KICAgICAgICBjb25zdCBzdHJlc3NVbml0ID0gdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdwc2knIDogJ01QYSc7DQogICAgICAgIGNvbnN0IG1vZFVuaXQgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2tzaScgOiAnR1BhJzsNCiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTsNCg0KICAgICAgICBpZiAoci5HICE9IG51bGwpIHsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goew0KICAgICAgICAgICAgICAgIGxhYmVsOiByLm1vZHVsdXNMYWJlbCwNCiAgICAgICAgICAgICAgICB2YWx1ZTogZm9ybWF0TnVtKENPTlYubW9kdWx1c0Zyb21JbnRlcm5hbChyLkcsIG1vZFVuaXQpLCAyKSwNCiAgICAgICAgICAgICAgICB1bml0OiBtb2RVbml0DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyLnRhdSAhPSBudWxsKSB7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsNCiAgICAgICAgICAgICAgICBsYWJlbDogJ1NoZWFyIFN0cmVzcyDPhCcsDQogICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdE51bShDT05WLnN0cmVzc0Zyb21JbnRlcm5hbChyLnRhdSwgc3RyZXNzVW5pdCksIDIpLA0KICAgICAgICAgICAgICAgIHVuaXQ6IHN0cmVzc1VuaXQNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHIuZ2FtbWEgIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7DQogICAgICAgICAgICAgICAgbGFiZWw6ICdTaGVhciBTdHJhaW4gzrMnLA0KICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXROdW0oci5nYW1tYSwgNiksDQogICAgICAgICAgICAgICAgdW5pdDogJycsDQogICAgICAgICAgICAgICAgc3ViOiAnKCcgKyBmb3JtYXROdW0oci5nYW1tYSAqIDEwMCwgNCkgKyAnICUpJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci5FICE9IG51bGwpIHsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goew0KICAgICAgICAgICAgICAgIGxhYmVsOiAiWW91bmcncyBNb2R1bHVzIEUiLA0KICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXROdW0oQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKHIuRSwgbW9kVW5pdCksIDIpLA0KICAgICAgICAgICAgICAgIHVuaXQ6IG1vZFVuaXQNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHIubnUgIT0gbnVsbCAmJiBpc0Zpbml0ZShy\",\n    \"Lm51KSkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7DQogICAgICAgICAgICAgICAgbGFiZWw6ICJQb2lzc29uJ3MgUmF0aW8gzr0iLA0KICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXROdW0oci5udSwgNCksDQogICAgICAgICAgICAgICAgdW5pdDogJycNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHIuSiAhPSBudWxsKSB7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsNCiAgICAgICAgICAgICAgICBsYWJlbDogJ1BvbGFyIE1vbWVudCBvZiBJbmVydGlhIEonLA0KICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXROdW0oQ09OVi5wb2xhclRvRGlzcGxheShyLkosIHVuaXRTeXN0ZW0pLCAwKSwNCiAgICAgICAgICAgICAgICB1bml0OiB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2lu4oG0JyA6ICdtbeKBtCcNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHIudGhldGEgIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7DQogICAgICAgICAgICAgICAgbGFiZWw6ICdBbmdsZSBvZiBUd2lzdCDOuCcsDQogICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdE51bShyLnRoZXRhLCA2KSwNCiAgICAgICAgICAgICAgICB1bml0OiAncmFkJywNCiAgICAgICAgICAgICAgICBzdWI6ICcoJyArIGZvcm1hdE51bShyLnRoZXRhICogMTgwIC8gTWF0aC5QSSwgNCkgKyAnIGRlZyknDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyLnR3aXN0UGVyTGVuZ3RoICE9IG51bGwpIHsNCiAgICAgICAgICAgIGNvbnN0IHRwbCA9IENPTlYudHdpc3RQZXJMZW5ndGhGcm9tSW50ZXJuYWwoci50d2lzdFBlckxlbmd0aCwgdW5pdFN5c3RlbSk7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsNCiAgICAgICAgICAgICAgICBsYWJlbDogJ1R3aXN0IHBlciBVbml0IExlbmd0aCcsDQogICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdE51bSh0cGwudmFsdWUsIDQpLA0KICAgICAgICAgICAgICAgIHVuaXQ6IHRwbC51bml0DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyLmt0ICE9IG51bGwpIHsNCiAgICAgICAgICAgIGNvbnN0IGtzID0gQ09OVi50b3JzaW9uYWxTdGlmZm5lc3NGcm9tSW50ZXJuYWwoci5rdCwgdW5pdFN5c3RlbSk7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsNCiAgICAgICAgICAgICAgICBsYWJlbDogJ1RvcnNpb25hbCBTdGlmZm5lc3MgazxzdWI+dDwvc3ViPicsDQogICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdE51bShrcy52YWx1ZSwgMiksDQogICAgICAgICAgICAgICAgdW5pdDoga3MudW5pdA0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci5HSiAhPSBudWxsKSB7DQogICAgICAgICAgICBjb25zdCBnalVuaXQgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2tzacK3aW7igbQnIDogJ07Ct21twrInOw0KICAgICAgICAgICAgY29uc3QgZ2pWYWwgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnDQogICAgICAgICAgICAgICAgPyBDT05WLm1vZHVsdXNGcm9tSW50ZXJuYWwoci5HLCAna3NpJykgKiBDT05WLnBvbGFyVG9EaXNwbGF5KHIuSiwgdW5pdFN5c3RlbSkNCiAgICAgICAgICAgICAgICA6IHIuRyAqIDEwMDAgKiByLko7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsNCiAgICAgICAgICAgICAgICBsYWJlbDogJ1RvcnNpb25hbCBSaWdpZGl0eSBHSicsDQogICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdE51bShnalZhbCwgMCksDQogICAgICAgICAgICAgICAgdW5pdDogZ2pVbml0DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyLmdhbW1hTWF4ICE9IG51bGwpIHsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goew0KICAgICAgICAgICAgICAgIGxhYmVsOiAnTWF4IFN1cmZhY2UgU2hlYXIgU3RyYWluIM6zPHN1Yj5tYXg8L3N1Yj4nLA0KICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXROdW0oci5nYW1tYU1heCwgNiksDQogICAgICAgICAgICAgICAgdW5pdDogJycsDQogICAgICAgICAgICAgICAgc3ViOiAnKCcgKyBmb3JtYXROdW0oci5nYW1tYU1heCAqIDEwMCwgNCkgKyAnICUpJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci51dGlsaXphdGlvbiAhPSBudWxsKSB7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdTaGVhciBVdGlsaXphdGlvbicsIHZhbHVlOiBmb3JtYXROdW0oci51dGlsaXphdGlvbiwgMSksIHVuaXQ6ICclJyB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ01hdGVyaWFsIFJlZmVyZW5jZSBDb21wYXJpc29uJywgdmFsdWU6IHIubWF0ZXJpYWxNYXRjaCwgdW5pdDogJycgfSk7DQogICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0VsYXN0aWMgU2hlYXIgU3RhdHVzJywgdmFsdWU6IHIuc3RhdHVzLmxhYmVsLCB1bml0OiAnJyB9KTsNCg0KICAgICAgICBncmlkLmlubmVySFRNTCA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gYA0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic21nYy1yZXN1bHQtaXRlbSI+DQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNtZ2MtcmVzdWx0LWxhYmVsIj4ke2l0ZW0ubGFiZWx9PC9zcGFuPg0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzbWdjLXJlc3VsdC12YWx1ZSI+JHtpdGVtLnZhbHVlfSR7aXRlbS51bml0ID8gJyAnICsgaXRlbS51bml0IDogJyd9PC9zcGFuPg0KICAgICAgICAgICAgICAgICR7aXRlbS5zdWIgPyBgPHNwYW4gY2xhc3M9InNtZ2MtcmVzdWx0LXN1YiI+JHtpdGVtLnN1Yn08L3NwYW4+YCA6ICcnfQ0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIGApLmpvaW4oJycpOw0KDQogICAgICAgIHNob3dSZWNvbW1lbmRhdGlvbnMocik7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd1JlY29tbWVuZGF0aW9ucyhyKSB7DQogICAgICAgIGNvbnN0IHJlYyA9ICQoJ3JlY29tbWVuZGF0aW9ucycpOw0KICAgICAgICBjb25zdCB0aXBzID0gWw0KICAgICAgICAgICAgJ1ZlcmlmeSB0aGF0IHN0cmVzcy1zdHJhaW4gZGF0YSBjb21lcyBmcm9tIHRoZSBsaW5lYXIgZWxhc3RpYyByZWdpb24uJywNCiAgICAgICAgICAgICdDaGVjayB1bml0cyBjYXJlZnVsbHkgaWYgdGhlIGNhbGN1bGF0ZWQgc2hlYXIgbW9kdWx1cyBpcyB1bnJlYWxpc3RpYy4nLA0KICAgICAgICAgICAgJ1VzZSBhY2N1cmF0ZSBkaWFtZXRlciBtZWFzdXJlbWVudHMgZm9yIHRvcnNpb25hbCBzaGFmdCBjYWxjdWxhdGlvbnMuJywNCiAgICAgICAgICAgICdJbmNyZWFzZSBzaGFmdCBkaWFtZXRlciBpZiB0b3JzaW9uYWwgc3RyZXNzIG9yIHR3aXN0IGlzIGV4Y2Vzc2l2ZS4nLA0KICAgICAgICAgICAgJ1NlbGVjdCBhIG1hdGVyaWFsIHdpdGggaGlnaGVyIHNoZWFyIG1vZHVsdXMgdG8gaW5jcmVhc2UgdG9yc2lvbmFsIHN0aWZmbmVzcy4nLA0KICAgICAgICAgICAgJ1JlZHVjZSBzaGFmdCBsZW5ndGggdG8gcmVkdWNlIGFuZ2xlIG9mIHR3aXN0LicsDQogICAgICAgICAgICAnVXNlIHN1cHBsaWVyIG9yIHRlc3QgZGF0YSBmb3IgbWF0ZXJpYWwtc3BlY2lmaWMgc2hlYXIgbW9kdWx1cyB2YWx1ZXMuJywNCiAgICAgICAgICAgICdQZXJmb3JtIGZhdGlndWUgYW5hbHlzaXMgZm9yIGN5Y2xpYyB0b3JzaW9uYWwgbG9hZGluZy4nLA0KICAgICAgICAgICAgJ1VzZSBhZHZhbmNlZCBhbmFseXNpcyBmb3Igbm9uLWNpcmN1bGFyIHNlY3Rpb25zIG9yIGNvbXBsZXggbG9hZGluZyBjb25kaXRpb25zLicNCiAgICAgICAgXTsNCg0KICAgICAgICBpZiAoci5zdGF0dXMubGV2ZWwgPT09ICdjYXV0aW9uJyB8fCByLnN0YXR1cy5sZXZlbCA9PT0gJ2RhbmdlcicpIHsNCiAgICAgICAgICAgIHRpcHMudW5zaGlmdCgnUmV2aWV3IGxvYWRpbmcgYW5kIG1hdGVyaWFsIGRhdGEg4oCUIGN1cnJlbnQgcmVzdWx0cyBtYXkgYmUgb3V0c2lkZSByZWxpYWJsZSBlbGFzdGljIGFzc3VtcHRpb25zLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmVjLmlubmVySFRNTCA9ICc8aDM+RW5naW5lZXJpbmcgUmVjb21tZW5kYXRpb25zPC9oMz48dWw+JyArDQogICAgICAgICAgICB0aXBzLm1hcCgodCkgPT4gJzxsaT4nICsgdCArICc8L2xpPicpLmpvaW4oJycpICsgJzwvdWw+JzsNCiAgICAgICAgcmVjLmNsYXNzTGlzdC5yZW1vdmUoJ3NtZ2MtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd0Vycm9ycyhlcnJvcnMpIHsNCiAgICAgICAgJCgnZXJyb3JCb3gnKS5pbm5lckhUTUwgPSAnPHN0cm9uZz5QbGVhc2UgY29ycmVjdCB0aGUgZm9sbG93aW5nOjwvc3Ryb25nPjx1bD4nICsNCiAgICAgICAgICAgIGVycm9ycy5tYXAoKGUpID0+ICc8bGk+JyArIGUgKyAnPC9saT4nKS5qb2luKCcnKSArICc8L3VsPic7DQogICAgICAgICQoJ2Vycm9yQm94JykuY2xhc3NMaXN0LnJlbW92ZSgnc21nYy1oaWRkZW4nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93V2FybmluZ3Mo\",\n    \"d2FybmluZ3MpIHsNCiAgICAgICAgJCgnd2FybmluZ0JveCcpLmlubmVySFRNTCA9ICc8c3Ryb25nPldhcm5pbmdzOjwvc3Ryb25nPjx1bD4nICsNCiAgICAgICAgICAgIHdhcm5pbmdzLm1hcCgodykgPT4gJzxsaT4nICsgdyArICc8L2xpPicpLmpvaW4oJycpICsgJzwvdWw+JzsNCiAgICAgICAgJCgnd2FybmluZ0JveCcpLmNsYXNzTGlzdC5yZW1vdmUoJ3NtZ2MtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaGlkZU1lc3NhZ2VzKCkgew0KICAgICAgICAkKCdlcnJvckJveCcpLmNsYXNzTGlzdC5hZGQoJ3NtZ2MtaGlkZGVuJyk7DQogICAgICAgICQoJ3dhcm5pbmdCb3gnKS5jbGFzc0xpc3QuYWRkKCdzbWdjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNob3dSZXN1bHRzUGFuZWwoKSB7DQogICAgICAgIHJlc3VsdHNQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCdzbWdjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGhpZGVSZXN1bHRzUGFuZWwoKSB7DQogICAgICAgIHJlc3VsdHNQYW5lbC5jbGFzc0xpc3QuYWRkKCdzbWdjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdWaXN1YWxpemF0aW9ucyhyKSB7DQogICAgICAgIGRyYXdTaGVhckRpYWdyYW0ocik7DQogICAgICAgIGRyYXdUb3JzaW9uRGlhZ3JhbShyKTsNCiAgICAgICAgZHJhd1N0cmVzc1N0cmFpbkN1cnZlKHIpOw0KICAgICAgICBkcmF3U3RyZXNzRGlzdHJpYnV0aW9uKHIpOw0KICAgICAgICBkcmF3RWxhc3RpY0dhdWdlKHIpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdTaGVhckRpYWdyYW0ocikgew0KICAgICAgICBjb25zdCBzdmcgPSAkKCdzaGVhckRpYWdyYW0nKTsNCiAgICAgICAgY29uc3Qgc2hlYXJBbmdsZSA9IHIuZ2FtbWEgPyBNYXRoLm1pbigxNSwgci5nYW1tYSAqIDgwMCkgOiAzOw0KICAgICAgICBjb25zdCBibG9ja1cgPSAxMjAsIGJsb2NrSCA9IDUwOw0KICAgICAgICBjb25zdCB4ID0gODAsIHkgPSA0MDsNCg0KICAgICAgICBzdmcuaW5uZXJIVE1MID0gYA0KICAgICAgICAgICAgPGRlZnM+DQogICAgICAgICAgICAgICAgPG1hcmtlciBpZD0ic21nYy1hcnJSIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSIzIiBvcmllbnQ9ImF1dG8iPg0KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwIEw4LDMgTDAsNiIgZmlsbD0iI2U2N2UyMiIvPg0KICAgICAgICAgICAgICAgIDwvbWFya2VyPg0KICAgICAgICAgICAgICAgIDxtYXJrZXIgaWQ9InNtZ2MtYXJyVSIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iOCIgcmVmWD0iMyIgcmVmWT0iMSIgb3JpZW50PSJhdXRvIj4NCiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsOCBMMywwIEw2LDgiIGZpbGw9IiMyNDcxYTMiLz4NCiAgICAgICAgICAgICAgICA8L21hcmtlcj4NCiAgICAgICAgICAgIDwvZGVmcz4NCiAgICAgICAgICAgIDxyZWN0IHg9IiR7eH0iIHk9IiR7eX0iIHdpZHRoPSIke2Jsb2NrV30iIGhlaWdodD0iJHtibG9ja0h9IiBmaWxsPSIjYmRjM2M3IiBzdHJva2U9IiM3ZjhjOGQiIHN0cm9rZS13aWR0aD0iMS41Ii8+DQogICAgICAgICAgICA8cGF0aCBkPSJNJHt4ICsgYmxvY2tXfSwke3l9IEwke3ggKyBibG9ja1cgKyBzaGVhckFuZ2xlfSwke3kgLSBzaGVhckFuZ2xlfSIgc3Ryb2tlPSIjMjQ3MWEzIiBzdHJva2Utd2lkdGg9IjIiLz4NCiAgICAgICAgICAgIDxwYXRoIGQ9Ik0ke3ggKyBibG9ja1d9LCR7eSArIGJsb2NrSH0gTCR7eCArIGJsb2NrVyArIHNoZWFyQW5nbGV9LCR7eSArIGJsb2NrSCAtIHNoZWFyQW5nbGV9IiBzdHJva2U9IiMyNDcxYTMiIHN0cm9rZS13aWR0aD0iMiIvPg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7eH0iIHkxPSIke3kgKyBibG9ja0ggLyAyfSIgeDI9IiR7eCAtIDIwfSIgeTI9IiR7eSArIGJsb2NrSCAvIDJ9IiBzdHJva2U9IiNlNjdlMjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNzbWdjLWFyclIpIi8+DQogICAgICAgICAgICA8bGluZSB4MT0iJHt4ICsgYmxvY2tXICsgc2hlYXJBbmdsZX0iIHkxPSIke3kgKyBibG9ja0ggLyAyfSIgeDI9IiR7eCArIGJsb2NrVyArIHNoZWFyQW5nbGUgKyAyMH0iIHkyPSIke3kgKyBibG9ja0ggLyAyfSIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1zdGFydD0idXJsKCNzbWdjLWFyclIpIi8+DQogICAgICAgICAgICA8bGluZSB4MT0iJHt4ICsgYmxvY2tXIC8gMn0iIHkxPSIke3kgLSAxNX0iIHgyPSIke3ggKyBibG9ja1cgLyAyICsgc2hlYXJBbmdsZX0iIHkyPSIke3kgLSAxNSAtIHNoZWFyQW5nbGV9IiBzdHJva2U9IiMyNDcxYTMiIHN0cm9rZS13aWR0aD0iMS41IiBtYXJrZXItZW5kPSJ1cmwoI3NtZ2MtYXJyVSkiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IjE0MCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjkiIGZpbGw9IiM1ZDZkN2UiPlNoZWFyIERlZm9ybWF0aW9uICjPhCwgdGFuZ2VudGlhbCBmb3JjZXMpPC90ZXh0Pg0KICAgICAgICAgICAgPHRleHQgeD0iMTQwIiB5PSIxMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOCIgZmlsbD0iIzk1YTVhNiI+RyA9IM+EIC8gzrM8L3RleHQ+DQogICAgICAgIGA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd1RvcnNpb25EaWFncmFtKHIpIHsNCiAgICAgICAgY29uc3Qgc3ZnID0gJCgndG9yc2lvbkRpYWdyYW0nKTsNCiAgICAgICAgY29uc3QgY3ggPSAxNDAsIGN5ID0gNjUsIHJ4ID0gNDUsIHJ5ID0gMTg7DQogICAgICAgIGNvbnN0IHR3aXN0RGVnID0gci50aGV0YSA\/IE1hdGgubWluKDI1LCByLnRoZXRhICogMTgwIC8gTWF0aC5QSSAqIDUpIDogODsNCg0KICAgICAgICBzdmcuaW5uZXJIVE1MID0gYA0KICAgICAgICAgICAgPGRlZnM+DQogICAgICAgICAgICAgICAgPG1hcmtlciBpZD0ic21nYy10b3JxIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSIzIiBvcmllbnQ9ImF1dG8iPg0KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwIEw4LDMgTDAsNiIgZmlsbD0iI2U2N2UyMiIvPg0KICAgICAgICAgICAgICAgIDwvbWFya2VyPg0KICAgICAgICAgICAgPC9kZWZzPg0KICAgICAgICAgICAgPGVsbGlwc2UgY3g9IiR7Y3h9IiBjeT0iJHtjeX0iIHJ4PSIke3J4fSIgcnk9IiR7cnl9IiBmaWxsPSIjYmRjM2M3IiBzdHJva2U9IiM3ZjhjOGQiIHN0cm9rZS13aWR0aD0iMS41Ii8+DQogICAgICAgICAgICA8ZWxsaXBzZSBjeD0iJHtjeH0iIGN5PSIke2N5fSIgcng9IiR7cnggKiAwLjM1fSIgcnk9IiR7cnkgKiAwLjM1fSIgZmlsbD0iI2VjZjBmMSIgc3Ryb2tlPSIjOTVhNWE2IiBzdHJva2Utd2lkdGg9IjEiLz4NCiAgICAgICAgICAgIDxwYXRoIGQ9Ik0ke2N4ICsgcnggLSA1fSwke2N5fSBBJHtyeH0sJHtyeX0gMCAwIDEgJHtjeH0sJHtjeSAtIHJ5ICsgNX0iIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2U2N2UyMiIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI3NtZ2MtdG9ycSkiLz4NCiAgICAgICAgICAgIDxsaW5lIHgxPSIke2N4IC0gcnh9IiB5MT0iJHtjeX0iIHgyPSIke2N4ICsgcnh9IiB5Mj0iJHtjeX0iIHN0cm9rZT0iIzI0NzFhMyIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtZGFzaGFycmF5PSI0LDIiIHRyYW5zZm9ybT0icm90YXRlKCR7dHdpc3REZWd9ICR7Y3h9ICR7Y3l9KSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeCArIHJ4ICsgMTV9IiB5PSIke2N5IC0gMTB9IiBmb250LXNpemU9IjkiIGZpbGw9IiNlNjdlMjIiIGZvbnQtd2VpZ2h0PSJib2xkIj5UPC90ZXh0Pg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeH0iIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5IiBmaWxsPSIjNWQ2ZDdlIj5DaXJjdWxhciBTaGFmdCB3aXRoIEFwcGxpZWQgVG9ycXVlPC90ZXh0Pg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeH0iIHk9IjEyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4IiBmaWxsPSIjOTVhNWE2Ij7OuCA9IFRMIC8gKEpHKTwvdGV4dD4NCiAgICAgICAgYDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3U3RyZXNzU3RyYWluQ3VydmUocikgew0KICAgICAgICBjb25zdCBzdmcgPSAkKCdzdHJlc3NTdHJhaW5DdXJ2ZScpOw0KICAgICAgICBjb25zdCBHX0dQYSA9IHIuRyB8fCA3NzsNCiAgICAgICAgY29uc3QgRyA9IEdfR1BhICogMTAwMDsNCiAgICAgICAgY29uc3QgdGF1QWxsb3cgPSByLnRhdUFsbG93IHx8IDE1MDsNCiAgICAgICAgY29uc3QgeWllbGRTdHJhaW4gPSB0YXVBbGxvdyAvIEc7DQogICAgICAgIGNvbnN0IGN1cnJlbnRTdHJhaW4gPSByLmdhbW1hIHx8IDAuMDAxOw0KICAgICAgICBjb25zdCBjdXJyZW50U3RyZXNzID0gci50YXUgfHwgRyAqIGN1cnJlbnRTdHJhaW47DQoNCiAgICAgICAgY29uc3QgbWFyZ2luID0geyBsOiA0NSwgcjogMjAsIHQ6IDIwLCBiOiAz\",\n    \"NSB9Ow0KICAgICAgICBjb25zdCB3ID0gNTYwIC0gbWFyZ2luLmwgLSBtYXJnaW4ucjsNCiAgICAgICAgY29uc3QgaCA9IDE4MCAtIG1hcmdpbi50IC0gbWFyZ2luLmI7DQogICAgICAgIGNvbnN0IG1heFN0cmVzcyA9IE1hdGgubWF4KHRhdUFsbG93ICogMS40LCBjdXJyZW50U3RyZXNzICogMS4yLCAxKTsNCiAgICAgICAgY29uc3QgbWF4U3RyYWluID0gTWF0aC5tYXgoeWllbGRTdHJhaW4gKiAzLCBjdXJyZW50U3RyYWluICogMiwgMC4wMDIpOw0KDQogICAgICAgIGNvbnN0IHRvWCA9IChlKSA9PiBtYXJnaW4ubCArIChlIC8gbWF4U3RyYWluKSAqIHc7DQogICAgICAgIGNvbnN0IHRvWSA9IChzKSA9PiBtYXJnaW4udCArIGggLSAocyAvIG1heFN0cmVzcykgKiBoOw0KDQogICAgICAgIGNvbnN0IGVsYXN0aWNFbmRYID0gdG9YKHlpZWxkU3RyYWluKTsNCiAgICAgICAgY29uc3QgZWxhc3RpY0VuZFkgPSB0b1kodGF1QWxsb3cpOw0KICAgICAgICBjb25zdCBjdXJYID0gdG9YKE1hdGgubWluKGN1cnJlbnRTdHJhaW4sIG1heFN0cmFpbikpOw0KICAgICAgICBjb25zdCBjdXJZID0gdG9ZKE1hdGgubWluKGN1cnJlbnRTdHJlc3MsIG1heFN0cmVzcykpOw0KICAgICAgICBjb25zdCBvcmlnaW5ZID0gbWFyZ2luLnQgKyBoOw0KDQogICAgICAgIHN2Zy5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICA8bGluZSB4MT0iJHttYXJnaW4ubH0iIHkxPSIke29yaWdpbll9IiB4Mj0iJHttYXJnaW4ubCArIHd9IiB5Mj0iJHtvcmlnaW5ZfSIgc3Ryb2tlPSIjN2Y4YzhkIiBzdHJva2Utd2lkdGg9IjEiLz4NCiAgICAgICAgICAgIDxsaW5lIHgxPSIke21hcmdpbi5sfSIgeTE9IiR7bWFyZ2luLnR9IiB4Mj0iJHttYXJnaW4ubH0iIHkyPSIke29yaWdpbll9IiBzdHJva2U9IiM3ZjhjOGQiIHN0cm9rZS13aWR0aD0iMSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHttYXJnaW4ubCArIHcgLyAyfSIgeT0iJHsxODAgLSA4fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5IiBmaWxsPSIjNWQ2ZDdlIj5TaGVhciBTdHJhaW4gzrM8L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIxNCIgeT0iJHttYXJnaW4udCArIGggLyAyfSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5IiBmaWxsPSIjNWQ2ZDdlIiB0cmFuc2Zvcm09InJvdGF0ZSgtOTAgMTQgJHttYXJnaW4udCArIGggLyAyfSkiPlNoZWFyIFN0cmVzcyDPhDwvdGV4dD4NCg0KICAgICAgICAgICAgPHJlY3QgeD0iJHttYXJnaW4ubH0iIHk9IiR7dG9ZKHRhdUFsbG93KX0iIHdpZHRoPSIke2VsYXN0aWNFbmRYIC0gbWFyZ2luLmx9IiBoZWlnaHQ9IiR7b3JpZ2luWSAtIHRvWSh0YXVBbGxvdyl9IiBmaWxsPSIjMjdhZTYwIiBvcGFjaXR5PSIwLjEiLz4NCiAgICAgICAgICAgIDxwYXRoIGQ9Ik0ke21hcmdpbi5sfSwke29yaWdpbll9IEwke2VsYXN0aWNFbmRYfSwke2VsYXN0aWNFbmRZfSIgc3Ryb2tlPSIjMjdhZTYwIiBzdHJva2Utd2lkdGg9IjIuNSIgZmlsbD0ibm9uZSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHttYXJnaW4ubCArIDEwfSIgeT0iJHt0b1kodGF1QWxsb3cgLyAyKX0iIGZvbnQtc2l6ZT0iOCIgZmlsbD0iIzI3YWU2MCI+TGluZWFyIEVsYXN0aWM8L3RleHQ+DQoNCiAgICAgICAgICAgIDxwYXRoIGQ9Ik0ke2VsYXN0aWNFbmRYfSwke2VsYXN0aWNFbmRZfSBMJHtlbGFzdGljRW5kWCArIDUwfSwke3RvWSh0YXVBbGxvdyAqIDEuMDUpfSIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMyIvPg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7ZWxhc3RpY0VuZFh9IiB5MT0iJHttYXJnaW4udH0iIHgyPSIke2VsYXN0aWNFbmRYfSIgeTI9IiR7b3JpZ2luWX0iIHN0cm9rZT0iI2MwMzkyYiIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtZGFzaGFycmF5PSI0LDMiIG9wYWNpdHk9IjAuNiIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtlbGFzdGljRW5kWCArIDR9IiB5PSIke21hcmdpbi50ICsgMTJ9IiBmb250LXNpemU9IjgiIGZpbGw9IiNjMDM5MmIiPkFsbG93YWJsZTwvdGV4dD4NCg0KICAgICAgICAgICAgPGNpcmNsZSBjeD0iJHtjdXJYfSIgY3k9IiR7Y3VyWX0iIHI9IjUiIGZpbGw9IiR7ci5zdGF0dXMubGV2ZWwgPT09ICdkYW5nZXInID8gJyNjMDM5MmInIDogJyMxYTUyNzYnfSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjdXJYICsgOH0iIHk9IiR7Y3VyWSAtIDZ9IiBmb250LXNpemU9IjgiIGZpbGw9IiMxYTUyNzYiPijOsywgz4QpPC90ZXh0Pg0KDQogICAgICAgICAgICA8dGV4dCB4PSIke21hcmdpbi5sICsgMjB9IiB5PSIke29yaWdpblkgLSAxNX0iIGZvbnQtc2l6ZT0iOCIgZmlsbD0iIzI0NzFhMyIgZm9udC1zdHlsZT0iaXRhbGljIj5HID0gz4QgLyDOsyAoc2xvcGUpPC90ZXh0Pg0KICAgICAgICBgOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdTdHJlc3NEaXN0cmlidXRpb24ocikgew0KICAgICAgICBjb25zdCBzdmcgPSAkKCdzdHJlc3NEaXN0cmlidXRpb24nKTsNCiAgICAgICAgY29uc3QgY3ggPSAxMDAsIGN5ID0gNzA7DQogICAgICAgIGNvbnN0IG1heFIgPSA1MDsNCiAgICAgICAgY29uc3QgdGF1UmF0aW8gPSByLnRhdSAmJiByLnRhdUFsbG93ID8gTWF0aC5taW4oMSwgci50YXUgLyByLnRhdUFsbG93KSA6IDAuNTsNCg0KICAgICAgICBsZXQgYmFycyA9ICcnOw0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSA1OyBpKyspIHsNCiAgICAgICAgICAgIGNvbnN0IGZyYWMgPSBpIC8gNTsNCiAgICAgICAgICAgIGNvbnN0IGJhckxlbiA9IGZyYWMgKiBtYXhSICogdGF1UmF0aW87DQogICAgICAgICAgICBjb25zdCB5ID0gY3kgLSBtYXhSICsgaSAqIChtYXhSICogMiAvIDUpOw0KICAgICAgICAgICAgYmFycyArPSBgPGxpbmUgeDE9IiR7Y3h9IiB5MT0iJHt5fSIgeDI9IiR7Y3ggKyBiYXJMZW59IiB5Mj0iJHt5fSIgc3Ryb2tlPSIjMjQ3MWEzIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPmA7DQogICAgICAgIH0NCg0KICAgICAgICBzdmcuaW5uZXJIVE1MID0gYA0KICAgICAgICAgICAgPGNpcmNsZSBjeD0iJHtjeH0iIGN5PSIke2N5fSIgcj0iJHttYXhSfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjN2Y4YzhkIiBzdHJva2Utd2lkdGg9IjEuNSIvPg0KICAgICAgICAgICAgPGNpcmNsZSBjeD0iJHtjeH0iIGN5PSIke2N5fSIgcj0iMyIgZmlsbD0iIzJjM2U1MCIvPg0KICAgICAgICAgICAgJHtiYXJzfQ0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeCArIG1heFIgKyA4fSIgeT0iJHtjeSAtIG1heFJ9IiBmb250LXNpemU9IjgiIGZpbGw9IiM1ZDZkN2UiPs+EPHN1Yj5tYXg8L3N1Yj48L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIke2N4fSIgeT0iJHtjeSArIG1heFIgKyAxOH0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOCIgZmlsbD0iIzk1YTVhNiI+z4Qg4oidIHIgKGxpbmVhcik8L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIke2N4fSIgeT0iJHtjeSArIG1heFIgKyAzMH0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOCIgZmlsbD0iIzk1YTVhNiI+U29saWQgY2lyY3VsYXIgc2hhZnQ8L3RleHQ+DQogICAgICAgIGA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd0VsYXN0aWNHYXVnZShyKSB7DQogICAgICAgIGNvbnN0IHN2ZyA9ICQoJ2VsYXN0aWNHYXVnZScpOw0KICAgICAgICBjb25zdCB1dGlsID0gTWF0aC5taW4oci51dGlsaXphdGlvbiB8fCAwLCAxMjApOw0KICAgICAgICBjb25zdCBjeCA9IDEwMCwgY3kgPSA4NSwgcmFkaXVzID0gNTU7DQogICAgICAgIGNvbnN0IHN0YXJ0QW5nbGUgPSBNYXRoLlBJOw0KICAgICAgICBjb25zdCB1dGlsQW5nbGUgPSBzdGFydEFuZ2xlIC0gKHV0aWwgLyAxMDApICogTWF0aC5QSTsNCg0KICAgICAgICBjb25zdCBhcmMgPSAoc3RhcnQsIGVuZCwgY29sb3IsIHdpZHRoKSA9PiB7DQogICAgICAgICAgICBjb25zdCB4MSA9IGN4ICsgcmFkaXVzICogTWF0aC5jb3Moc3RhcnQpOw0KICAgICAgICAgICAgY29uc3QgeTEgPSBjeSArIHJhZGl1cyAqIE1hdGguc2luKHN0YXJ0KTsNCiAgICAgICAgICAgIGNvbnN0IHgyID0gY3ggKyByYWRpdXMgKiBNYXRoLmNvcyhlbmQpOw0KICAgICAgICAgICAgY29uc3QgeTIgPSBjeSArIHJhZGl1cyAqIE1hdGguc2luKGVuZCk7DQogICAgICAgICAgICBjb25zdCBsYXJnZSA9IHN0YXJ0IC0gZW5kID4gTWF0aC5QSSA\/IDEgOiAwOw0KICAgICAgICAgICAgcmV0dXJuIGA8cGF0aCBkPSJNJHt4MX0sJHt5MX0gQSR7cmFkaXVzfSwke3JhZGl1c30gMCAke2xhcmdlfSAxICR7eDJ9LCR7eTJ9IiBmaWxsPSJub25lIiBzdHJva2U9IiR7Y29sb3J9IiBzdHJva2Utd2lkdGg9IiR7d2lkdGh9IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz5gOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IG5lZWRsZVggPSBjeCArIChyYWRpdXMgLSAxMCkgKiBNYXRoLmNvcyh1dGlsQW5nbGUpOw0K\",\n    \"ICAgICAgICBjb25zdCBuZWVkbGVZID0gY3kgKyAocmFkaXVzIC0gMTApICogTWF0aC5zaW4odXRpbEFuZ2xlKTsNCiAgICAgICAgY29uc3QgZ2F1Z2VDb2xvciA9IHV0aWwgPiAxMDAgPyAnI2MwMzkyYicgOiB1dGlsID4gODAgPyAnI2YzOWMxMicgOiAnIzI3YWU2MCc7DQogICAgICAgIGNvbnN0IGxhYmVsID0gci51dGlsaXphdGlvbiAhPSBudWxsID8gZm9ybWF0TnVtKHV0aWwsIDEpICsgJyUnIDogJ04vQSc7DQoNCiAgICAgICAgc3ZnLmlubmVySFRNTCA9IGANCiAgICAgICAgICAgICR7YXJjKHN0YXJ0QW5nbGUsIHN0YXJ0QW5nbGUgLSAwLjcgKiBNYXRoLlBJLCAnIzI3YWU2MCcsIDEwKX0NCiAgICAgICAgICAgICR7YXJjKHN0YXJ0QW5nbGUgLSAwLjcgKiBNYXRoLlBJLCBzdGFydEFuZ2xlIC0gMC45ICogTWF0aC5QSSwgJyNmMzljMTInLCAxMCl9DQogICAgICAgICAgICAke2FyYyhzdGFydEFuZ2xlIC0gMC45ICogTWF0aC5QSSwgMCwgJyNjMDM5MmInLCAxMCl9DQogICAgICAgICAgICA8bGluZSB4MT0iJHtjeH0iIHkxPSIke2N5fSIgeDI9IiR7bmVlZGxlWH0iIHkyPSIke25lZWRsZVl9IiBzdHJva2U9IiR7Z2F1Z2VDb2xvcn0iIHN0cm9rZS13aWR0aD0iMi41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4NCiAgICAgICAgICAgIDxjaXJjbGUgY3g9IiR7Y3h9IiBjeT0iJHtjeX0iIHI9IjQiIGZpbGw9IiMyYzNlNTAiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7Y3h9IiB5PSIke2N5ICsgMjJ9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE0IiBmb250LXdlaWdodD0iYm9sZCIgZmlsbD0iJHtnYXVnZUNvbG9yfSI+JHtsYWJlbH08L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIke2N4fSIgeT0iJHtjeSArIDM2fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4IiBmaWxsPSIjOTVhNWE2Ij5TaGVhciBVdGlsaXphdGlvbjwvdGV4dD4NCiAgICAgICAgYDsNCiAgICB9DQoNCiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7DQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbml0KTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBpbml0KCk7DQogICAgfQ0KfSkoKTsNCg==\"];\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 s=document.createElement('script');\n    s.text=new TextDecoder('utf-8').decode(bytes);\n    r.appendChild(s);\n  }catch(e){\n    console.error('Shear Modulus G Calculator load error:',e);\n  }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Shear Modulus G Calculator is a practical engineering tool designed to calculate shear modulus from shear stress and shear strain or from Young\u2019s modulus&#8230;<\/p>","protected":false},"author":2,"featured_media":24781,"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":[8658,8655,8656,8657],"class_list":["post-24780","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-material-rigidity","tag-shear-modulus","tag-shear-strain","tag-shear-stress","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Shear-Modulus-G-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/comments?post=24780"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24780\/revisions"}],"predecessor-version":[{"id":24782,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24780\/revisions\/24782"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media\/24781"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media?parent=24780"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/categories?post=24780"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/tags?post=24780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}