{"id":24810,"date":"2026-09-02T08:14:15","date_gmt":"2026-09-02T08:14:15","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24810"},"modified":"2026-09-02T08:14:18","modified_gmt":"2026-09-02T08:14:18","slug":"strength-to-weight-ratio-calcilator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ar\/strength-to-weight-ratio-calcilator\/","title":{"rendered":"Strength-to-Weight Ratio Calcilator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Strength-to-Weight Ratio Calcilator<\/strong> is a practical engineering tool designed to compare material strength relative to weight and density. It helps engineers evaluate specific tensile strength, specific yield strength, load capacity, component mass, and potential weight savings across different materials. The Strength-to-Weight Ratio Calcilator is especially useful for lightweight material selection in automotive, aerospace, machinery, robotics, and structural design, helping users identify materials that provide high strength while minimizing overall component weight.<\/p>\n\n\n\n<!-- Strength-to-Weight Ratio Calculator - WordPress Embed -->\n<!-- Paste into Custom HTML block. All CSS\/JS scoped to #swr-calculator \u2014 will not affect theme header, footer, sidebar, menus, or other page content. -->\n<!-- Do NOT paste index.html \u2014 use this file only for WordPress embedding. -->\n<style>\n\/**\n * Strength-to-Weight Ratio Calculator \u2014 WordPress-safe scoped styles\n * Every rule is scoped under #swr-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.entry-content #swr-calculator.swr-root,\n.wp-block-html #swr-calculator.swr-root,\n.elementor-widget-container #swr-calculator.swr-root,\n#swr-calculator.swr-root,\n.entry-content #swr-calculator.swr-root *,\n.wp-block-html #swr-calculator.swr-root *,\n.elementor-widget-container #swr-calculator.swr-root *,\n#swr-calculator.swr-root *,\n.entry-content #swr-calculator.swr-root *::before,\n.wp-block-html #swr-calculator.swr-root *::before,\n.elementor-widget-container #swr-calculator.swr-root *::before,\n#swr-calculator.swr-root *::before,\n.entry-content #swr-calculator.swr-root *::after,\n.wp-block-html #swr-calculator.swr-root *::after,\n.elementor-widget-container #swr-calculator.swr-root *::after,\n#swr-calculator.swr-root *::after {\n    box-sizing: border-box !important;\n}\n\n.entry-content #swr-calculator.swr-root,\n.wp-block-html #swr-calculator.swr-root,\n.elementor-widget-container #swr-calculator.swr-root,\n#swr-calculator.swr-root {\n    --swr-primary: #1a5276;\n    --swr-primary-light: #2471a3;\n    --swr-primary-dark: #0e3d5c;\n    --swr-accent: #2980b9;\n    --swr-safe: #27ae60;\n    --swr-caution: #f39c12;\n    --swr-risk: #c0392b;\n    --swr-bg: #ffffff;\n    --swr-card-bg: #ffffff;\n    --swr-text: #2c3e50;\n    --swr-text-muted: #7f8c8d;\n    --swr-border: #dce4ec;\n    --swr-shadow: 0 2px 8px rgba(26, 82, 118, 0.08);\n    --swr-radius: 8px;\n    --swr-radius-lg: 12px;\n    --swr-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n    --swr-mono: Consolas, 'Courier New', monospace;\n\n    all: revert;\n    box-sizing: border-box !important;\n    display: block !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    font-family: var(--swr-font) !important;\n    font-size: 15px !important;\n    line-height: 1.6 !important;\n    color: var(--swr-text) !important;\n    background: transparent !important;\n    border: none !important;\n    border-radius: 0 !important;\n    padding: 0 !important;\n    margin: 0 auto !important;\n    text-align: left !important;\n    position: relative !important;\n    isolation: isolate !important;\n    contain: layout style paint !important;\n    float: none !important;\n    clear: both !important;\n    z-index: auto !important;\n    letter-spacing: normal !important;\n    text-transform: none !important;\n    box-shadow: none !important;\n}\n\n.entry-content #swr-calculator.swr-root .swr-wrap,\n.wp-block-html #swr-calculator.swr-root .swr-wrap,\n.elementor-widget-container #swr-calculator.swr-root .swr-wrap,\n#swr-calculator.swr-root .swr-wrap {\n    background: var(--swr-bg) !important;\n    border-radius: var(--swr-radius-lg) !important;\n    padding: 8px !important;\n}\n\n#swr-calculator.swr-root [hidden] {\n    display: none !important;\n}\n\n#swr-calculator.swr-root h1,\n#swr-calculator.swr-root h2,\n#swr-calculator.swr-root h3,\n#swr-calculator.swr-root h4,\n#swr-calculator.swr-root p,\n#swr-calculator.swr-root ul,\n#swr-calculator.swr-root ol,\n#swr-calculator.swr-root li,\n#swr-calculator.swr-root section,\n#swr-calculator.swr-root div,\n#swr-calculator.swr-root span,\n#swr-calculator.swr-root strong,\n#swr-calculator.swr-root em,\n#swr-calculator.swr-root table,\n#swr-calculator.swr-root thead,\n#swr-calculator.swr-root tbody,\n#swr-calculator.swr-root tr,\n#swr-calculator.swr-root th,\n#swr-calculator.swr-root td,\n#swr-calculator.swr-root details,\n#swr-calculator.swr-root summary {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    box-shadow: none !important;\n    font-family: inherit !important;\n    font-style: inherit !important;\n    line-height: inherit !important;\n    letter-spacing: normal !important;\n    text-transform: none !important;\n    text-decoration: none !important;\n    float: none !important;\n    background: none !important;\n}\n\n#swr-calculator.swr-root button,\n#swr-calculator.swr-root input,\n#swr-calculator.swr-root select,\n#swr-calculator.swr-root label,\n#swr-calculator.swr-root legend {\n    font-family: var(--swr-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    box-shadow: none !important;\n}\n\n#swr-calculator.swr-root ul,\n#swr-calculator.swr-root ol {\n    list-style: none !important;\n}\n\n#swr-calculator.swr-root button {\n    cursor: pointer !important;\n    background: none !important;\n    border: none !important;\n    padding: 0 !important;\n    appearance: none !important;\n    -webkit-appearance: none !important;\n}\n\n#swr-calculator.swr-root svg {\n    display: block !important;\n    max-width: 100% !important;\n    height: auto !important;\n    float: none !important;\n}\n\n#swr-calculator.swr-root *,\n#swr-calculator.swr-root *::before,\n#swr-calculator.swr-root *::after {\n    box-sizing: border-box !important;\n}\n\n#swr-calculator.swr-root .swr-wrap {\n    max-width: 1200px !important;\n    margin: 0 auto !important;\n    padding: 12px 8px !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-layout {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 24px !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-input,\n#swr-calculator.swr-root .swr-output {\n    width: 100% !important;\n    display: block !important;\n    float: none !important;\n}\n\n#swr-calculator.swr-root .swr-card {\n    display: block !important;\n    background: var(--swr-card-bg) !important;\n    border-radius: var(--swr-radius-lg) !important;\n    padding: 20px 24px !important;\n    box-shadow: var(--swr-shadow) !important;\n    border: 1px solid var(--swr-border) !important;\n    width: 100% !important;\n    margin: 0 !important;\n}\n\n#swr-calculator.swr-root .swr-section + .swr-section {\n    margin-top: 24px !important;\n    padding-top: 20px !important;\n    border-top: 1px solid var(--swr-border) !important;\n}\n\n#swr-calculator.swr-root .swr-section-head {\n    display: flex !important;\n    justify-content: space-between !important;\n    align-items: center !important;\n    flex-wrap: wrap !important;\n    gap: 10px !important;\n    margin-bottom: 14px !important;\n}\n\n#swr-calculator.swr-root .swr-section-title {\n    font-size: 1.05rem !important;\n    color: var(--swr-primary) !important;\n    font-weight: 600 !important;\n    padding-bottom: 6px !important;\n    border-bottom: 2px solid var(--swr-border) !important;\n}\n\n#swr-calculator.swr-root .swr-grid {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 14px !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-field {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 4px !important;\n    min-width: 0 !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-field.swr-span-full {\n    grid-column: 1 \/ -1 !important;\n}\n\n#swr-calculator.swr-root .swr-field > label {\n    font-size: 0.82rem !important;\n    font-weight: 600 !important;\n    display: flex !important;\n    align-items: center !important;\n    gap: 4px !important;\n    margin: 0 0 4px !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-field label input[type=\"checkbox\"],\n#swr-calculator.swr-root .swr-field label input[type=\"radio\"] {\n    width: auto !important;\n    min-height: 0 !important;\n    margin: 0 6px 0 0 !important;\n    accent-color: var(--swr-primary);\n}\n\n#swr-calculator.swr-root .swr-field input,\n#swr-calculator.swr-root .swr-field select {\n    display: block !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    padding: 9px 12px !important;\n    border: 1px solid var(--swr-border) !important;\n    border-radius: var(--swr-radius) !important;\n    font-size: 0.95rem !important;\n    font-family: var(--swr-font) !important;\n    background: #ffffff !important;\n    color: var(--swr-text) !important;\n    line-height: 1.4 !important;\n    height: auto !important;\n    min-height: 38px !important;\n    outline: none !important;\n    appearance: none !important;\n    -webkit-appearance: none !important;\n}\n\n#swr-calculator.swr-root .swr-field select {\n    background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%232c3e50' d='M1 1l5 5 5-5'\/%3E%3C\/svg%3E\") !important;\n    background-repeat: no-repeat !important;\n    background-position: right 12px center !important;\n    padding-right: 32px !important;\n}\n\n#swr-calculator.swr-root .swr-field input:focus,\n#swr-calculator.swr-root .swr-field select:focus {\n    border-color: var(--swr-primary-light) !important;\n    box-shadow: 0 0 0 3px rgba(36, 113, 163, 0.15) !important;\n    background-color: #fff !important;\n}\n\n#swr-calculator.swr-root .swr-field input::placeholder {\n    color: #b0bec5 !important;\n    opacity: 1 !important;\n}\n\n#swr-calculator.swr-root .swr-hidden {\n    display: none !important;\n}\n\n#swr-calculator.swr-root .swr-tip {\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(--swr-primary-light) !important;\n    color: #fff !important;\n    font-size: 0.65rem !important;\n    font-weight: 700 !important;\n    cursor: help !important;\n    position: relative !important;\n    flex-shrink: 0 !important;\n    line-height: 1 !important;\n}\n\n#swr-calculator.swr-root .swr-tip::after {\n    content: attr(data-tip);\n    position: absolute;\n    bottom: calc(100% + 6px);\n    left: 50%;\n    transform: translateX(-50%);\n    background: var(--swr-primary-dark);\n    color: #fff;\n    padding: 6px 10px;\n    border-radius: 6px;\n    font-size: 0.75rem;\n    font-weight: 400;\n    white-space: normal;\n    width: max-content;\n    max-width: 260px;\n    opacity: 0;\n    pointer-events: none;\n    transition: opacity 0.2s;\n    z-index: 100;\n    line-height: 1.4;\n}\n\n#swr-calculator.swr-root .swr-tip:hover::after {\n    opacity: 1;\n}\n\n#swr-calculator.swr-root .swr-material-actions {\n    display: flex !important;\n    align-items: center !important;\n    gap: 8px !important;\n    flex-wrap: wrap !important;\n}\n\n#swr-calculator.swr-root .swr-preset-search {\n    padding: 6px 10px !important;\n    border: 1px solid var(--swr-border) !important;\n    border-radius: var(--swr-radius) !important;\n    font-size: 0.85rem !important;\n    min-width: 140px !important;\n    background: #ffffff !important;\n}\n\n#swr-calculator.swr-root .swr-materials {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 14px !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-material-card {\n    border: 1px solid var(--swr-border) !important;\n    border-radius: var(--swr-radius) !important;\n    padding: 14px 16px !important;\n    background: #ffffff !important;\n    position: relative !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-material-card.swr-ref {\n    border-color: var(--swr-accent) !important;\n    box-shadow: 0 0 0 2px rgba(41, 128, 185, 0.15) !important;\n}\n\n#swr-calculator.swr-root .swr-material-card.swr-filtered-out {\n    display: none !important;\n}\n\n#swr-calculator.swr-root .swr-material-header {\n    display: flex !important;\n    justify-content: space-between !important;\n    align-items: center !important;\n    flex-wrap: wrap !important;\n    gap: 8px !important;\n    margin-bottom: 12px !important;\n}\n\n#swr-calculator.swr-root .swr-material-header h4 {\n    font-size: 0.95rem !important;\n    color: var(--swr-primary) !important;\n    font-weight: 600 !important;\n}\n\n#swr-calculator.swr-root .swr-material-controls {\n    display: flex !important;\n    align-items: center !important;\n    gap: 6px !important;\n    flex-wrap: wrap !important;\n}\n\n#swr-calculator.swr-root .swr-ref-label {\n    font-size: 0.78rem !important;\n    color: var(--swr-text-muted) !important;\n    display: flex !important;\n    align-items: center !important;\n    gap: 4px !important;\n}\n\n#swr-calculator.swr-root .swr-btn-icon {\n    padding: 4px 8px !important;\n    font-size: 0.78rem !important;\n    color: var(--swr-text-muted) !important;\n    border: 1px solid var(--swr-border) !important;\n    border-radius: 4px !important;\n    background: #fff !important;\n}\n\n#swr-calculator.swr-root .swr-btn-icon:hover {\n    color: var(--swr-primary) !important;\n    border-color: var(--swr-primary-light) !important;\n}\n\n#swr-calculator.swr-root .swr-btn-icon.swr-btn-remove:hover {\n    color: var(--swr-risk) !important;\n    border-color: var(--swr-risk) !important;\n}\n\n#swr-calculator.swr-root .swr-actions {\n    display: flex !important;\n    justify-content: center !important;\n    align-items: center !important;\n    flex-wrap: wrap !important;\n    gap: 12px !important;\n    margin-top: 24px !important;\n    padding-top: 20px !important;\n    border-top: 1px solid var(--swr-border) !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-btn {\n    display: inline-block !important;\n    width: auto !important;\n    max-width: none !important;\n    padding: 10px 28px !important;\n    min-width: 140px !important;\n    border: none !important;\n    border-radius: var(--swr-radius) !important;\n    font-size: 1rem !important;\n    font-weight: 600 !important;\n    text-align: center !important;\n    text-decoration: none !important;\n    cursor: pointer !important;\n    font-family: var(--swr-font) !important;\n    line-height: 1.4 !important;\n}\n\n#swr-calculator.swr-root .swr-btn-sm {\n    min-width: auto !important;\n    padding: 6px 14px !important;\n    font-size: 0.85rem !important;\n}\n\n#swr-calculator.swr-root .swr-btn-primary {\n    background: linear-gradient(135deg, var(--swr-primary) 0%, var(--swr-primary-light) 100%) !important;\n    color: #fff !important;\n    box-shadow: 0 3px 12px rgba(26, 82, 118, 0.3) !important;\n}\n\n#swr-calculator.swr-root .swr-btn-primary:hover {\n    background: linear-gradient(135deg, var(--swr-primary-light) 0%, var(--swr-primary) 100%) !important;\n    color: #fff !important;\n    transform: translateY(-1px);\n}\n\n#swr-calculator.swr-root .swr-btn-secondary {\n    background: #fff !important;\n    color: var(--swr-primary) !important;\n    border: 1px solid var(--swr-border) !important;\n}\n\n#swr-calculator.swr-root .swr-btn-secondary:hover {\n    border-color: var(--swr-primary-light) !important;\n    background: #ffffff !important;\n}\n\n#swr-calculator.swr-root .swr-warnings {\n    background: #fef9e7 !important;\n    border: 1px solid #f9e79f !important;\n    border-radius: var(--swr-radius) !important;\n    padding: 12px 16px !important;\n    margin-bottom: 16px !important;\n    font-size: 0.88rem !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-warnings ul {\n    list-style: disc !important;\n    padding-left: 20px !important;\n}\n\n#swr-calculator.swr-root .swr-warnings li {\n    margin-bottom: 4px !important;\n    list-style: disc !important;\n    color: var(--swr-text) !important;\n}\n\n#swr-calculator.swr-root .swr-classifications {\n    display: grid !important;\n    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)) !important;\n    gap: 12px !important;\n    margin-bottom: 20px !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-class-card {\n    padding: 12px 14px !important;\n    border-radius: var(--swr-radius) !important;\n    border: 1px solid var(--swr-border) !important;\n    background: #f8fbfd !important;\n}\n\n#swr-calculator.swr-root .swr-class-card .swr-class-label {\n    font-size: 0.75rem !important;\n    color: var(--swr-text-muted) !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.03em !important;\n    margin-bottom: 4px !important;\n    display: block !important;\n}\n\n#swr-calculator.swr-root .swr-class-card .swr-class-value {\n    font-size: 0.95rem !important;\n    font-weight: 600 !important;\n    color: var(--swr-primary) !important;\n}\n\n#swr-calculator.swr-root .swr-results > h2 {\n    font-size: 1.1rem !important;\n    color: var(--swr-primary) !important;\n    margin: 0 0 14px !important;\n    padding: 0 0 8px !important;\n    border: none !important;\n    border-bottom: 2px solid var(--swr-border) !important;\n    background: none !important;\n}\n\n#swr-calculator.swr-root .swr-table-wrap {\n    overflow-x: auto !important;\n    margin-bottom: 24px !important;\n    border: 1px solid var(--swr-border) !important;\n    border-radius: var(--swr-radius) !important;\n    width: 100% !important;\n}\n\n#swr-calculator.swr-root .swr-table {\n    width: 100% !important;\n    border-collapse: collapse !important;\n    font-size: 0.85rem !important;\n    min-width: 700px !important;\n    border-spacing: 0 !important;\n}\n\n#swr-calculator.swr-root .swr-table th,\n#swr-calculator.swr-root .swr-table td {\n    padding: 10px 12px !important;\n    border-bottom: 1px solid var(--swr-border) !important;\n    text-align: left !important;\n    vertical-align: top !important;\n}\n\n#swr-calculator.swr-root .swr-table th {\n    background: #eef4f8 !important;\n    color: var(--swr-primary) !important;\n    font-weight: 600 !important;\n    white-space: nowrap !important;\n}\n\n#swr-calculator.swr-root .swr-table td:first-child {\n    font-weight: 600 !important;\n    color: var(--swr-text-muted) !important;\n    background: #ffffff !important;\n    white-space: nowrap !important;\n}\n\n#swr-calculator.swr-root .swr-table tr.swr-highlight td {\n    background: #f0f8ff !important;\n}\n\n#swr-calculator.swr-root .swr-table .swr-best {\n    color: var(--swr-safe) !important;\n    font-weight: 700 !important;\n}\n\n@media (max-width: 768px) {\n    #swr-calculator.swr-root .swr-grid,\n    #swr-calculator.swr-root .swr-classifications {\n        grid-template-columns: 1fr !important;\n    }\n\n    #swr-calculator.swr-root .swr-card {\n        padding: 16px !important;\n    }\n}\n\n@media (max-width: 480px) {\n    #swr-calculator.swr-root .swr-btn {\n        width: 100% !important;\n    }\n}\n\n<\/style>\n\n<div id=\"swr-calculator\" class=\"swr-root\">\n    <div class=\"swr-wrap\">\n        <div class=\"swr-layout\">\n            <div class=\"swr-input\">\n                <section class=\"swr-card swr-inputs\">\n                    <div class=\"swr-section\">\n                        <h3 class=\"swr-section-title\">General Settings<\/h3>\n                        <div class=\"swr-grid\">\n                            <div class=\"swr-field\">\n                                <label for=\"swr-unitSystem\">Unit System<\/label>\n                                <select id=\"swr-unitSystem\">\n                                    <option value=\"metric\" selected>Metric (MPa, kg\/m\u00b3, mm, N, kg)<\/option>\n                                    <option value=\"imperial\">Imperial (ksi, lb\/in\u00b3, in, lbf, lb)<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"swr-field\">\n                                <label for=\"swr-calcMode\">Calculation Mode\n                                    <span class=\"swr-tip\" data-tip=\"Primary comparison focus. All metrics are still calculated.\">?<\/span>\n                                <\/label>\n                                <select id=\"swr-calcMode\">\n                                    <option value=\"strength_weight\" selected>Strength-to-Weight Ratio<\/option>\n                                    <option value=\"specific_tensile\">Specific Tensile Strength<\/option>\n                                    <option value=\"specific_yield\">Specific Yield Strength<\/option>\n                                    <option value=\"specific_compressive\">Specific Compressive Strength<\/option>\n                                    <option value=\"load_per_mass\">Load Capacity per Mass<\/option>\n                                    <option value=\"material_compare\">Material Comparison<\/option>\n                                    <option value=\"weight_compare\">Component Weight Comparison<\/option>\n                                    <option value=\"ranking\">Lightweight Material Ranking<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"swr-field\">\n                                <label for=\"swr-strengthBasis\">Strength Basis\n                                    <span class=\"swr-tip\" data-tip=\"Reference strength used for specific strength, allowable stress, and ranking.\">?<\/span>\n                                <\/label>\n                                <select id=\"swr-strengthBasis\">\n                                    <option value=\"yield\" selected>Yield Strength<\/option>\n                                    <option value=\"ultimate\">Ultimate Tensile Strength<\/option>\n                                    <option value=\"compressive\">Compressive Strength<\/option>\n                                    <option value=\"custom\">Custom Strength<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"swr-field\">\n                                <label for=\"swr-rankCriterion\">Ranking Criterion\n                                    <span class=\"swr-tip\" data-tip=\"Used for overall material ranking and best-material identification.\">?<\/span>\n                                <\/label>\n                                <select id=\"swr-rankCriterion\">\n                                    <option value=\"specificSelected\">Best Strength-to-Weight Ratio<\/option>\n                                    <option value=\"specificYield\">Highest Specific Yield Strength<\/option>\n                                    <option value=\"specificTensile\">Highest Specific Tensile Strength<\/option>\n                                    <option value=\"specificCompressive\">Highest Specific Compressive Strength<\/option>\n                                    <option value=\"loadPerMass\">Highest Allowable Load per Mass<\/option>\n                                    <option value=\"mass\">Lowest Component Mass<\/option>\n                                    <option value=\"weightSaving\">Highest Weight Saving<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"swr-field\">\n                                <label for=\"swr-geometryMode\">Geometry Mode<\/label>\n                                <select id=\"swr-geometryMode\">\n                                    <option value=\"same\" selected>Same Geometry for All Materials<\/option>\n                                    <option value=\"custom\">Custom Geometry per Material<\/option>\n                                    <option value=\"equal_load\">Equal Load Capacity Comparison<\/option>\n                                    <option value=\"equal_mass\">Equal Mass Comparison<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"swr-field swr-mode-field\" data-modes=\"equal_load\">\n                                <label for=\"swr-requiredLoad\">Required Load Capacity (<span class=\"swr-u-force\">kN<\/span>)\n                                    <span class=\"swr-tip\" data-tip=\"Target allowable load \u2014 geometry is sized so each material meets this capacity.\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"swr-requiredLoad\" value=\"50\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"swr-field swr-mode-field swr-hidden\" data-modes=\"equal_mass\">\n                                <label for=\"swr-targetMass\">Target Component Mass (<span class=\"swr-u-mass\">kg<\/span>)\n                                    <span class=\"swr-tip\" data-tip=\"Fixed mass \u2014 cross-section is sized to match this weight for each material.\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"swr-targetMass\" value=\"1\" min=\"0\" step=\"any\">\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"swr-section\" id=\"swr-sharedGeometry\">\n                        <h3 class=\"swr-section-title\">Shared Geometry<\/h3>\n                        <div class=\"swr-grid\">\n                            <div class=\"swr-field swr-span-full\">\n                                <label for=\"swr-componentType\">Component Type<\/label>\n                                <select id=\"swr-componentType\">\n                                    <option value=\"rod\" selected>Rod (Solid Round)<\/option>\n                                    <option value=\"tube\">Tube (Hollow Round)<\/option>\n                                    <option value=\"plate\">Plate (Rectangular Section)<\/option>\n                                    <option value=\"bar\">Bar (Rectangular Section)<\/option>\n                                    <option value=\"block\">Block (Rectangular Block)<\/option>\n                                    <option value=\"custom\">Custom Volume<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"swr-field swr-span-full swr-geom-mode\" data-modes=\"same,custom\">\n                                <label for=\"swr-sectionType\">Cross-Section Type<\/label>\n                                <select id=\"swr-sectionType\">\n                                    <option value=\"solid_round\" selected>Solid Round<\/option>\n                                    <option value=\"hollow_round\">Hollow Round<\/option>\n                                    <option value=\"rectangle\">Rectangle<\/option>\n                                    <option value=\"custom_area\">Custom Area<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"swr-field swr-geom-field\" data-sections=\"solid_round\">\n                                <label for=\"swr-diameter\">Diameter d (<span class=\"swr-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"swr-diameter\" value=\"20\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"swr-field swr-geom-field swr-hidden\" data-sections=\"hollow_round\">\n                                <label for=\"swr-outerDiameter\">Outer Diameter D (<span class=\"swr-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"swr-outerDiameter\" value=\"30\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"swr-field swr-geom-field swr-hidden\" data-sections=\"hollow_round\">\n                                <label for=\"swr-innerDiameter\">Inner Diameter d (<span class=\"swr-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"swr-innerDiameter\" value=\"20\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"swr-field swr-geom-field swr-hidden\" data-sections=\"rectangle\">\n                                <label for=\"swr-width\">Width b (<span class=\"swr-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"swr-width\" value=\"40\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"swr-field swr-geom-field swr-hidden\" data-sections=\"rectangle\">\n                                <label for=\"swr-thickness\">Thickness t (<span class=\"swr-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"swr-thickness\" value=\"10\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"swr-field swr-geom-field swr-hidden\" data-sections=\"block\">\n                                <label for=\"swr-blockWidth\">Width W (<span class=\"swr-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"swr-blockWidth\" value=\"50\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"swr-field swr-geom-field swr-hidden\" data-sections=\"block\">\n                                <label for=\"swr-blockHeight\">Height H (<span class=\"swr-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"swr-blockHeight\" value=\"30\" min=\"0\" step=\"any\">\n                            <\/div>\n                            <div class=\"swr-field swr-geom-field swr-hidden\" data-sections=\"custom_area\">\n                                <label for=\"swr-customArea\">Custom Area A (<span class=\"swr-u-area\">mm\u00b2<\/span>)<\/label>\n                                <input type=\"number\" id=\"swr-customArea\" min=\"0\" step=\"any\" placeholder=\"Enter area\">\n                            <\/div>\n                            <div class=\"swr-field swr-geom-field swr-hidden\" data-sections=\"custom_volume\">\n                                <label for=\"swr-customVolume\">Custom Volume V (<span class=\"swr-u-volume\">cm\u00b3<\/span>)<\/label>\n                                <input type=\"number\" id=\"swr-customVolume\" min=\"0\" step=\"any\" placeholder=\"Enter volume\">\n                            <\/div>\n                            <div class=\"swr-field swr-geom-field\" data-sections=\"solid_round,hollow_round,rectangle,custom_area,block\">\n                                <label for=\"swr-length\">Length L (<span class=\"swr-u-length\">mm<\/span>)<\/label>\n                                <input type=\"number\" id=\"swr-length\" value=\"1000\" min=\"0\" step=\"any\">\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"swr-section\">\n                        <div class=\"swr-section-head\">\n                            <h3 class=\"swr-section-title\">Materials (2\u20136)<\/h3>\n                            <div class=\"swr-material-actions\">\n                                <input type=\"search\" id=\"swr-presetSearch\" class=\"swr-preset-search\" placeholder=\"Search presets\u2026\" aria-label=\"Search material presets\">\n                                <button type=\"button\" id=\"swr-addMaterial\" class=\"swr-btn swr-btn-sm\">+ Add Material<\/button>\n                            <\/div>\n                        <\/div>\n                        <div id=\"swr-materialsContainer\" class=\"swr-materials\"><\/div>\n                    <\/div>\n\n                    <div id=\"swr-warnings\" class=\"swr-warnings\" hidden><\/div>\n\n                    <div class=\"swr-actions\">\n                        <button type=\"button\" id=\"swr-calcBtn\" class=\"swr-btn swr-btn-primary\">Calculate<\/button>\n                    <\/div>\n                <\/section>\n            <\/div>\n\n            <div class=\"swr-output swr-hidden\" id=\"swr-resultsPanel\">\n                <section class=\"swr-card swr-results\">\n                    <div id=\"swr-classifications\" class=\"swr-classifications\"><\/div>\n\n                    <h2>Comparison Results<\/h2>\n                    <div class=\"swr-table-wrap\">\n                        <table class=\"swr-table\" id=\"swr-resultsTable\">\n                            <thead><\/thead>\n                            <tbody><\/tbody>\n                        <\/table>\n                    <\/div>\n                <\/section>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\n(function(){\n  var b=\"LyoqDQogKiBTdHJlbmd0aC10by1XZWlnaHQgUmF0aW8gQ2FsY3VsYXRvcg0KICogQ29tcGFyZSBzcGVjaWZpYyBzdHJlbmd0aCwgY29tcG9uZW50IG1hc3MsIGxvYWQgY2FwYWNpdHksIGFuZCB3ZWlnaHQgc2F2aW5ncw0KICovDQoNCihmdW5jdGlvbiAoKSB7DQogICAgJ3VzZSBzdHJpY3QnOw0KDQogICAgdmFyIEcgPSA5LjgwNjY1Ow0KDQogICAgdmFyIFBSRVNFVFMgPSB7DQogICAgICAgIHN0cnVjdHVyYWxfc3RlZWw6IHsgbmFtZTogJ1N0cnVjdHVyYWwgU3RlZWwnLCByaG86IDc4NTAsIHN5OiAzNTUsIHN1dDogNTEwLCBzYzogMCwgY3VzdG9tOiAwLCBhbmlzb3Ryb3BpYzogZmFsc2UgfSwNCiAgICAgICAgY2FyYm9uX3N0ZWVsOiAgICAgeyBuYW1lOiAnQ2FyYm9uIFN0ZWVsJywgICAgIHJobzogNzg1MCwgc3k6IDI1MCwgc3V0OiA0MDAsIHNjOiAwLCBjdXN0b206IDAsIGFuaXNvdHJvcGljOiBmYWxzZSB9LA0KICAgICAgICBoaWdoX3N0cmVuZ3RoX3N0ZWVsOiB7IG5hbWU6ICdIaWdoLVN0cmVuZ3RoIFN0ZWVsJywgcmhvOiA3ODUwLCBzeTogNjkwLCBzdXQ6IDgwMCwgc2M6IDAsIGN1c3RvbTogMCwgYW5pc290cm9waWM6IGZhbHNlIH0sDQogICAgICAgIHN0YWlubGVzc19zdGVlbDogIHsgbmFtZTogJ1N0YWlubGVzcyBTdGVlbCcsICByaG86IDgwMDAsIHN5OiAyMDUsIHN1dDogNTE1LCBzYzogMCwgY3VzdG9tOiAwLCBhbmlzb3Ryb3BpYzogZmFsc2UgfSwNCiAgICAgICAgYWx1bWludW06ICAgICAgICAgeyBuYW1lOiAnQWx1bWludW0gQWxsb3knLCAgIHJobzogMjcwMCwgc3k6IDI3NSwgc3V0OiAzMTAsIHNjOiAwLCBjdXN0b206IDAsIGFuaXNvdHJvcGljOiBmYWxzZSB9LA0KICAgICAgICBtYWduZXNpdW06ICAgICAgICB7IG5hbWU6ICdNYWduZXNpdW0gQWxsb3knLCAgcmhvOiAxNzQwLCBzeTogMjAwLCBzdXQ6IDI5MCwgc2M6IDEyMCwgY3VzdG9tOiAwLCBhbmlzb3Ryb3BpYzogZmFsc2UgfSwNCiAgICAgICAgdGl0YW5pdW06ICAgICAgICAgeyBuYW1lOiAnVGl0YW5pdW0gQWxsb3knLCAgIHJobzogNDQzMCwgc3k6IDg4MCwgc3V0OiA5NTAsIHNjOiAwLCBjdXN0b206IDAsIGFuaXNvdHJvcGljOiBmYWxzZSB9LA0KICAgICAgICBjb3BwZXI6ICAgICAgICAgICB7IG5hbWU6ICdDb3BwZXInLCAgICAgICAgICAgcmhvOiA4OTYwLCBzeTogNzAsICBzdXQ6IDIyMCwgc2M6IDAsIGN1c3RvbTogMCwgYW5pc290cm9waWM6IGZhbHNlIH0sDQogICAgICAgIGJyYXNzOiAgICAgICAgICAgIHsgbmFtZTogJ0JyYXNzJywgICAgICAgICAgICByaG86IDg1MzAsIHN5OiAxMjQsIHN1dDogMzM4LCBzYzogMCwgY3VzdG9tOiAwLCBhbmlzb3Ryb3BpYzogZmFsc2UgfSwNCiAgICAgICAgY2FzdF9pcm9uOiAgICAgICAgeyBuYW1lOiAnQ2FzdCBJcm9uJywgICAgICAgIHJobzogNzIwMCwgc3k6IDEzMCwgc3V0OiAyMDAsIHNjOiA2MDAsIGN1c3RvbTogMCwgYW5pc290cm9waWM6IGZhbHNlIH0sDQogICAgICAgIGNmcnA6ICAgICAgICAgICAg\"+\"IHsgbmFtZTogJ0NhcmJvbiBGaWJlciBDb21wb3NpdGUnLCByaG86IDE2MDAsIHN5OiAxNTAwLCBzdXQ6IDE1MDAsIHNjOiAxMjAwLCBjdXN0b206IDAsIGFuaXNvdHJvcGljOiB0cnVlIH0sDQogICAgICAgIGdmcnA6ICAgICAgICAgICAgIHsgbmFtZTogJ0dsYXNzIEZpYmVyIENvbXBvc2l0ZScsIHJobzogMTkwMCwgc3k6IDUwMCwgc3V0OiA4MDAsIHNjOiA0MDAsIGN1c3RvbTogMCwgYW5pc290cm9waWM6IHRydWUgfSwNCiAgICAgICAgcGxhc3RpYzogICAgICAgICAgeyBuYW1lOiAnRW5naW5lZXJpbmcgUGxhc3RpYycsIHJobzogMTIwMCwgc3k6IDUwLCBzdXQ6IDcwLCBzYzogODAsIGN1c3RvbTogMCwgYW5pc290cm9waWM6IGZhbHNlIH0sDQogICAgICAgIGN1c3RvbTogICAgICAgICAgIHsgbmFtZTogJ0N1c3RvbSBNYXRlcmlhbCcsICByaG86IDAsIHN5OiAwLCBzdXQ6IDAsIHNjOiAwLCBjdXN0b206IDAsIGFuaXNvdHJvcGljOiBmYWxzZSB9DQogICAgfTsNCg0KICAgIHZhciBVTklUUyA9IHsNCiAgICAgICAgbWV0cmljOiB7DQogICAgICAgICAgICBzdHJlc3M6ICdNUGEnLCBkZW5zaXR5OiAna2cvbcKzJywgbGVuZ3RoOiAnbW0nLCBhcmVhOiAnbW3CsicsIHZvbHVtZTogJ2NtwrMnLA0KICAgICAgICAgICAgZm9yY2U6ICdrTicsIG1hc3M6ICdrZycsIHNtYWxsTWFzczogJ2cnLA0KICAgICAgICAgICAgc3RyZXNzRnJvbUlucHV0OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdjsgfSwNCiAgICAgICAgICAgIHN0cmVzc1RvRGlzcGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0sDQogICAgICAgICAgICByaG9mcm9tSW5wdXQ6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9LA0KICAgICAgICAgICAgcmhvdG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdjsgfSwNCiAgICAgICAgICAgIGxlbmd0aEZyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0sDQogICAgICAgICAgICBsZW5ndGhUb0Rpc3BsYXk6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9LA0KICAgICAgICAgICAgYXJlYUZyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0sDQogICAgICAgICAgICBhcmVhVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdjsgfSwNCiAgICAgICAgICAgIHZvbHVtZUZyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiAxMDAwOyB9LA0KICAgICAgICAgICAgdm9sdW1lVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAvIDEwMDA7IH0sDQogICAgICAgICAgICBmb3JjZUZyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiAxMDAwOyB9LA0KICAgICAgICAgICAgZm9yY2VUb0Rpc3BsYXk6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2IC8gMTAwMDsgfSwNCiAgICAgICAgICAgIG1hc3NUb0Rpc3BsYXk6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9LA0KICAgICAgICAgICAgbWFzc0Zyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0s\"+\"DQogICAgICAgICAgICBzbWFsbE1hc3NUb0Rpc3BsYXk6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ICogMTAwMDsgfSwNCiAgICAgICAgICAgIHNwZWNpZmljVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAvIDEwMDA7IH0sDQogICAgICAgICAgICBzcGVjaWZpY1VuaXQ6ICdtL3PCsiAow5cxMMKzKScsDQogICAgICAgICAgICBsb2FkUGVyTWFzc1RvRGlzcGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgLyAxMDAwOyB9LA0KICAgICAgICAgICAgbG9hZFBlck1hc3NVbml0OiAna04va2cnDQogICAgICAgIH0sDQogICAgICAgIGltcGVyaWFsOiB7DQogICAgICAgICAgICBzdHJlc3M6ICdrc2knLCBkZW5zaXR5OiAnbGIvaW7CsycsIGxlbmd0aDogJ2luJywgYXJlYTogJ2luwrInLCB2b2x1bWU6ICdpbsKzJywNCiAgICAgICAgICAgIGZvcmNlOiAnbGJmJywgbWFzczogJ2xiJywgc21hbGxNYXNzOiAnbGInLA0KICAgICAgICAgICAgc3RyZXNzRnJvbUlucHV0OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAqIDYuODk0NzY7IH0sDQogICAgICAgICAgICBzdHJlc3NUb0Rpc3BsYXk6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2IC8gNi44OTQ3NjsgfSwNCiAgICAgICAgICAgIHJob2Zyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiAyNzY3OS45OyB9LA0KICAgICAgICAgICAgcmhvdG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAvIDI3Njc5Ljk7IH0sDQogICAgICAgICAgICBsZW5ndGhGcm9tSW5wdXQ6IGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ICogMjUuNDsgfSwNCiAgICAgICAgICAgIGxlbmd0aFRvRGlzcGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgLyAyNS40OyB9LA0KICAgICAgICAgICAgYXJlYUZyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiA2NDUuMTY7IH0sDQogICAgICAgICAgICBhcmVhVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAvIDY0NS4xNjsgfSwNCiAgICAgICAgICAgIHZvbHVtZUZyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiBNYXRoLnBvdygyNS40LCAzKTsgfSwNCiAgICAgICAgICAgIHZvbHVtZVRvRGlzcGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgLyBNYXRoLnBvdygyNS40LCAzKTsgfSwNCiAgICAgICAgICAgIGZvcmNlRnJvbUlucHV0OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAqIDQuNDQ4MjI7IH0sDQogICAgICAgICAgICBmb3JjZVRvRGlzcGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgLyA0LjQ0ODIyOyB9LA0KICAgICAgICAgICAgbWFzc1RvRGlzcGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiAyLjIwNDYyOyB9LA0KICAgICAgICAgICAgbWFzc0Zyb21JbnB1dDogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgLyAyLjIwNDYyOyB9LA0KICAgICAgICAgICAgc21hbGxNYXNzVG9EaXNwbGF5OiBmdW5jdGlvbiAodikgeyByZXR1cm4gdiAqIDIuMjA0NjI7IH0sDQogICAgICAgICAg\"+\"ICBzcGVjaWZpY1RvRGlzcGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgKiAwLjAwMzI4MDg0OyB9LA0KICAgICAgICAgICAgc3BlY2lmaWNVbml0OiAnw5cxMOKBtiBpbicsDQogICAgICAgICAgICBsb2FkUGVyTWFzc1RvRGlzcGxheTogZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgLyA0LjQ0ODIyOyB9LA0KICAgICAgICAgICAgbG9hZFBlck1hc3NVbml0OiAnbGJmL2xiJw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHZhciBNT0RFX1JPV1MgPSB7DQogICAgICAgIHN0cmVuZ3RoX3dlaWdodDogWydzcGVjaWZpY1NlbGVjdGVkJywgJ2Rlc2lnblNwZWNpZmljJywgJ3JlbGF0aXZlUGVyZiddLA0KICAgICAgICBzcGVjaWZpY190ZW5zaWxlOiBbJ3NwZWNpZmljVGVuc2lsZScsICdyZWxhdGl2ZVBlcmYnXSwNCiAgICAgICAgc3BlY2lmaWNfeWllbGQ6IFsnc3BlY2lmaWNZaWVsZCcsICdyZWxhdGl2ZVBlcmYnXSwNCiAgICAgICAgc3BlY2lmaWNfY29tcHJlc3NpdmU6IFsnc3BlY2lmaWNDb21wcmVzc2l2ZScsICdyZWxhdGl2ZVBlcmYnXSwNCiAgICAgICAgbG9hZF9wZXJfbWFzczogWydsb2FkUGVyTWFzcycsICdGYWxsb3cnLCAnbWFzcyddLA0KICAgICAgICBtYXRlcmlhbF9jb21wYXJlOiBbJ3NwZWNpZmljWWllbGQnLCAnc3BlY2lmaWNUZW5zaWxlJywgJ3JlbGF0aXZlUGVyZiddLA0KICAgICAgICB3ZWlnaHRfY29tcGFyZTogWydtYXNzJywgJ3dlaWdodFNhdmluZycsICdyZWxhdGl2ZVBlcmYnXSwNCiAgICAgICAgcmFua2luZzogWydyYW5rJ10NCiAgICB9Ow0KDQogICAgdmFyIFJBTktfQ1JJVEVSSUEgPSB7DQogICAgICAgIHNwZWNpZmljU2VsZWN0ZWQ6IHsga2V5OiAnc3BlY2lmaWNTZWxlY3RlZCcsIGhpZ2hlcjogdHJ1ZSwgbGFiZWw6ICdTdHJlbmd0aC10by1XZWlnaHQgUmF0aW8nIH0sDQogICAgICAgIHNwZWNpZmljWWllbGQ6IHsga2V5OiAnc3BlY2lmaWNZaWVsZCcsIGhpZ2hlcjogdHJ1ZSwgbGFiZWw6ICdTcGVjaWZpYyBZaWVsZCBTdHJlbmd0aCcgfSwNCiAgICAgICAgc3BlY2lmaWNUZW5zaWxlOiB7IGtleTogJ3NwZWNpZmljVGVuc2lsZScsIGhpZ2hlcjogdHJ1ZSwgbGFiZWw6ICdTcGVjaWZpYyBUZW5zaWxlIFN0cmVuZ3RoJyB9LA0KICAgICAgICBzcGVjaWZpY0NvbXByZXNzaXZlOiB7IGtleTogJ3NwZWNpZmljQ29tcHJlc3NpdmUnLCBoaWdoZXI6IHRydWUsIGxhYmVsOiAnU3BlY2lmaWMgQ29tcHJlc3NpdmUgU3RyZW5ndGgnIH0sDQogICAgICAgIGxvYWRQZXJNYXNzOiB7IGtleTogJ2xvYWRQZXJNYXNzJywgaGlnaGVyOiB0cnVlLCBsYWJlbDogJ0FsbG93YWJsZSBMb2FkIHBlciBNYXNzJyB9LA0KICAgICAgICBtYXNzOiB7IGtleTogJ21hc3MnLCBoaWdoZXI6IGZhbHNlLCBsYWJlbDogJ0NvbXBvbmVudCBNYXNzJyB9LA0KICAgICAgICB3ZWlnaHRTYXZpbmc6IHsga2V5OiAnd2VpZ2h0U2F2aW5nJywgaGlnaGVyOiB0cnVlLCBsYWJlbDogJ1dlaWdodCBTYXZpbmcnIH0NCiAgICB9Ow0KDQogICAgdmFy\"+\"IENPTVBPTkVOVF9NQVAgPSB7DQogICAgICAgIHJvZDogJ3NvbGlkX3JvdW5kJywNCiAgICAgICAgdHViZTogJ2hvbGxvd19yb3VuZCcsDQogICAgICAgIHBsYXRlOiAncmVjdGFuZ2xlJywNCiAgICAgICAgYmFyOiAncmVjdGFuZ2xlJywNCiAgICAgICAgYmxvY2s6ICdibG9jaycsDQogICAgICAgIGN1c3RvbTogJ2N1c3RvbV92b2x1bWUnDQogICAgfTsNCg0KICAgIHZhciByb290ID0gbnVsbDsNCiAgICB2YXIgZWxzID0ge307DQogICAgdmFyIG1hdGVyaWFscyA9IFtdOw0KICAgIHZhciByZWZJbmRleCA9IDA7DQogICAgdmFyIG5leHRJZCA9IDE7DQoNCiAgICBmdW5jdGlvbiAkKGlkKSB7DQogICAgICAgIHJldHVybiByb290ID8gcm9vdC5xdWVyeVNlbGVjdG9yKCcjc3dyLScgKyBpZCkgOiBudWxsOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHFzYShzZWwpIHsNCiAgICAgICAgcmV0dXJuIHJvb3QgPyByb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKSA6IFtdOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNyZWF0ZUVsKHRhZykgew0KICAgICAgICByZXR1cm4gcm9vdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWNoZUVsZW1lbnRzKCkgew0KICAgICAgICByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N3ci1jYWxjdWxhdG9yJyk7DQogICAgICAgIGlmICghcm9vdCkgcmV0dXJuIGZhbHNlOw0KICAgICAgICBbJ3VuaXRTeXN0ZW0nLCAnY2FsY01vZGUnLCAnc3RyZW5ndGhCYXNpcycsICdyYW5rQ3JpdGVyaW9uJywgJ2dlb21ldHJ5TW9kZScsDQogICAgICAgICAgICAncmVxdWlyZWRMb2FkJywgJ3RhcmdldE1hc3MnLCAnY29tcG9uZW50VHlwZScsICdzZWN0aW9uVHlwZScsDQogICAgICAgICAgICAnZGlhbWV0ZXInLCAnb3V0ZXJEaWFtZXRlcicsICdpbm5lckRpYW1ldGVyJywgJ3dpZHRoJywgJ3RoaWNrbmVzcycsDQogICAgICAgICAgICAnYmxvY2tXaWR0aCcsICdibG9ja0hlaWdodCcsICdjdXN0b21BcmVhJywgJ2N1c3RvbVZvbHVtZScsICdsZW5ndGgnLA0KICAgICAgICAgICAgJ21hdGVyaWFsc0NvbnRhaW5lcicsICdhZGRNYXRlcmlhbCcsICdwcmVzZXRTZWFyY2gnLCAnY2FsY0J0bicsDQogICAgICAgICAgICAncmVzdWx0c1BhbmVsJywgJ3dhcm5pbmdzJywgJ2NsYXNzaWZpY2F0aW9ucycsICdyZXN1bHRzVGFibGUnDQogICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsgZWxzW2lkXSA9ICQoaWQpOyB9KTsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm10KHZhbCwgZGVjKSB7DQogICAgICAgIGRlYyA9IGRlYyA9PT0gdW5kZWZpbmVkID8gMyA6IGRlYzsNCiAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCAhaXNGaW5pdGUodmFsKSkgcmV0dXJuICfigJQnOw0KICAgICAgICBpZiAoTWF0aC5hYnModmFsKSA+PSAxZTkgfHwgKE1hdGguYWJzKHZhbCkgPCAwLjAwMDEgJiYg\"+\"dmFsICE9PSAwKSkgcmV0dXJuIHZhbC50b0V4cG9uZW50aWFsKDMpOw0KICAgICAgICByZXR1cm4gdmFsLnRvRml4ZWQoZGVjKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBvcmRpbmFsKG4pIHsNCiAgICAgICAgdmFyIHMgPSBbJ3RoJywgJ3N0JywgJ25kJywgJ3JkJ107DQogICAgICAgIHZhciB2ID0gbiAlIDEwMDsNCiAgICAgICAgcmV0dXJuIG4gKyAoc1sodiAtIDIwKSAlIDEwXSB8fCBzW3ZdIHx8IHNbMF0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFVuaXRzKCkgew0KICAgICAgICByZXR1cm4gVU5JVFNbZWxzLnVuaXRTeXN0ZW0udmFsdWVdIHx8IFVOSVRTLm1ldHJpYzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVVbml0TGFiZWxzKCkgew0KICAgICAgICB2YXIgdSA9IGdldFVuaXRzKCk7DQogICAgICAgIHFzYSgnLnN3ci11LWxlbmd0aCcpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IGVsLnRleHRDb250ZW50ID0gdS5sZW5ndGg7IH0pOw0KICAgICAgICBxc2EoJy5zd3ItdS1hcmVhJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsgZWwudGV4dENvbnRlbnQgPSB1LmFyZWE7IH0pOw0KICAgICAgICBxc2EoJy5zd3ItdS12b2x1bWUnKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyBlbC50ZXh0Q29udGVudCA9IHUudm9sdW1lOyB9KTsNCiAgICAgICAgcXNhKCcuc3dyLXUtZm9yY2UnKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyBlbC50ZXh0Q29udGVudCA9IHUuZm9yY2U7IH0pOw0KICAgICAgICBxc2EoJy5zd3ItdS1tYXNzJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsgZWwudGV4dENvbnRlbnQgPSB1Lm1hc3M7IH0pOw0KICAgICAgICBxc2EoJy5zd3ItdS1zdHJlc3MnKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyBlbC50ZXh0Q29udGVudCA9IHUuc3RyZXNzOyB9KTsNCiAgICAgICAgcXNhKCcuc3dyLXUtZGVuc2l0eScpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IGVsLnRleHRDb250ZW50ID0gdS5kZW5zaXR5OyB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjcmVhdGVNYXRlcmlhbChwcmVzZXRLZXksIGlzUmVmKSB7DQogICAgICAgIHZhciBwID0gUFJFU0VUU1twcmVzZXRLZXldIHx8IFBSRVNFVFMuY3VzdG9tOw0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgaWQ6IG5leHRJZCsrLA0KICAgICAgICAgICAgcHJlc2V0OiBwcmVzZXRLZXksDQogICAgICAgICAgICBuYW1lOiBwLm5hbWUsDQogICAgICAgICAgICByaG86IHAucmhvLA0KICAgICAgICAgICAgc3k6IHAuc3ksDQogICAgICAgICAgICBzdXQ6IHAuc3V0LA0KICAgICAgICAgICAgc2M6IHAuc2MgfHwgJycsDQogICAgICAgICAgICBjdXN0b21TdHJlbmd0aDogcC5jdXN0b20gfHwgJycsDQogICAgICAgICAgICBzZjogMi4wLA0KICAgICAgICAgICAgaXNSZWY6ICEhaXNSZWYsDQogICAgICAgICAgICBnZW9tOiB7DQogICAgICAgICAgICAgICAgc2VjdGlvblR5cGU6ICdzb2xpZF9yb3VuZCcsDQogICAgICAgICAgICAgICAgZGlhbWV0ZXI6\"+\"IDIwLA0KICAgICAgICAgICAgICAgIG91dGVyRGlhbWV0ZXI6IDMwLA0KICAgICAgICAgICAgICAgIGlubmVyRGlhbWV0ZXI6IDIwLA0KICAgICAgICAgICAgICAgIHdpZHRoOiA0MCwNCiAgICAgICAgICAgICAgICB0aGlja25lc3M6IDEwLA0KICAgICAgICAgICAgICAgIGJsb2NrV2lkdGg6IDUwLA0KICAgICAgICAgICAgICAgIGJsb2NrSGVpZ2h0OiAzMCwNCiAgICAgICAgICAgICAgICBjdXN0b21BcmVhOiAnJywNCiAgICAgICAgICAgICAgICBjdXN0b21Wb2x1bWU6ICcnLA0KICAgICAgICAgICAgICAgIGxlbmd0aDogMTAwMA0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGluaXRNYXRlcmlhbHMoKSB7DQogICAgICAgIG1hdGVyaWFscyA9IFsNCiAgICAgICAgICAgIGNyZWF0ZU1hdGVyaWFsKCdzdHJ1Y3R1cmFsX3N0ZWVsJywgdHJ1ZSksDQogICAgICAgICAgICBjcmVhdGVNYXRlcmlhbCgnYWx1bWludW0nLCBmYWxzZSkNCiAgICAgICAgXTsNCiAgICAgICAgcmVmSW5kZXggPSAwOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFByZXNldE9wdGlvbnMoc2VsZWN0ZWQsIGZpbHRlcikgew0KICAgICAgICB2YXIgaHRtbCA9ICcnOw0KICAgICAgICB2YXIgZiA9IChmaWx0ZXIgfHwgJycpLnRvTG93ZXJDYXNlKCk7DQogICAgICAgIE9iamVjdC5rZXlzKFBSRVNFVFMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBQUkVTRVRTW2tleV0ubmFtZTsNCiAgICAgICAgICAgIGlmIChmICYmIG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGYpID09PSAtMSkgcmV0dXJuOw0KICAgICAgICAgICAgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT0iJyArIGtleSArICciJyArIChrZXkgPT09IHNlbGVjdGVkID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPicgKyBuYW1lICsgJzwvb3B0aW9uPic7DQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4gaHRtbCB8fCAnPG9wdGlvbiB2YWx1ZT0iY3VzdG9tIj5DdXN0b20gTWF0ZXJpYWw8L29wdGlvbj4nOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNlY3Rpb25PcHRpb25zKHNlbGVjdGVkKSB7DQogICAgICAgIHZhciB0eXBlcyA9IFsNCiAgICAgICAgICAgIFsnc29saWRfcm91bmQnLCAnU29saWQgUm91bmQnXSwNCiAgICAgICAgICAgIFsnaG9sbG93X3JvdW5kJywgJ0hvbGxvdyBSb3VuZCddLA0KICAgICAgICAgICAgWydyZWN0YW5nbGUnLCAnUmVjdGFuZ2xlJ10sDQogICAgICAgICAgICBbJ2N1c3RvbV9hcmVhJywgJ0N1c3RvbSBBcmVhJ10NCiAgICAgICAgXTsNCiAgICAgICAgcmV0dXJuIHR5cGVzLm1hcChmdW5jdGlvbiAodCkgew0KICAgICAgICAgICAgcmV0dXJuICc8b3B0aW9uIHZhbHVlPSInICsgdFswXSArICciJyArICh0WzBdID09PSBzZWxlY3RlZCA\/ICcgc2VsZWN0ZWQnIDogJycpICsgJz4nICsgdFsxXSArICc8L29wdGlvbj4nOw0KICAgICAgICB9KS5qb2luKCcnKTsNCiAgICB9DQoNCiAgICBmdW5jdGlv\"+\"biByZW5kZXJNYXRlcmlhbENhcmQobWF0LCBpbmRleCkgew0KICAgICAgICB2YXIgdSA9IGdldFVuaXRzKCk7DQogICAgICAgIHZhciBzaG93R2VvbSA9IGVscy5nZW9tZXRyeU1vZGUudmFsdWUgPT09ICdjdXN0b20nOw0KICAgICAgICB2YXIgY2FyZCA9IGNyZWF0ZUVsKCdkaXYnKTsNCiAgICAgICAgY2FyZC5jbGFzc05hbWUgPSAnc3dyLW1hdGVyaWFsLWNhcmQnICsgKG1hdC5pc1JlZiA\/ICcgc3dyLXJlZicgOiAnJyk7DQogICAgICAgIGNhcmQuZGF0YXNldC5pbmRleCA9IGluZGV4Ow0KDQogICAgICAgIHZhciBnZW9tSHRtbCA9ICcnOw0KICAgICAgICBpZiAoc2hvd0dlb20pIHsNCiAgICAgICAgICAgIGdlb21IdG1sID0gJzxkaXYgY2xhc3M9InN3ci1ncmlkIHN3ci1tYXQtZ2VvbSI+JyArDQogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1maWVsZCBzd3Itc3Bhbi1mdWxsIj48bGFiZWw+Q3Jvc3MtU2VjdGlvbjwvbGFiZWw+JyArDQogICAgICAgICAgICAgICAgJzxzZWxlY3QgY2xhc3M9InN3ci1tYXQtc2VjdGlvbiIgZGF0YS1pZHg9IicgKyBpbmRleCArICciPicgKyBzZWN0aW9uT3B0aW9ucyhtYXQuZ2VvbS5zZWN0aW9uVHlwZSkgKyAnPC9zZWxlY3Q+PC9kaXY+JyArDQogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1maWVsZCBzd3ItbWdlb20tZmllbGQiIGRhdGEtc2VjdGlvbnM9InNvbGlkX3JvdW5kIiBkYXRhLWlkeD0iJyArIGluZGV4ICsgJyI+JyArDQogICAgICAgICAgICAgICAgJzxsYWJlbD5EaWFtZXRlciBkICgnICsgdS5sZW5ndGggKyAnKTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9InN3ci1tYXQtZGlhbWV0ZXIiIHZhbHVlPSInICsgbWF0Lmdlb20uZGlhbWV0ZXIgKyAnIiBtaW49IjAiIHN0ZXA9ImFueSI+PC9kaXY+JyArDQogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1maWVsZCBzd3ItbWdlb20tZmllbGQgc3dyLWhpZGRlbiIgZGF0YS1zZWN0aW9ucz0iaG9sbG93X3JvdW5kIiBkYXRhLWlkeD0iJyArIGluZGV4ICsgJyI+JyArDQogICAgICAgICAgICAgICAgJzxsYWJlbD5PdXRlciBEICgnICsgdS5sZW5ndGggKyAnKTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9InN3ci1tYXQtb3V0ZXJEIiB2YWx1ZT0iJyArIG1hdC5nZW9tLm91dGVyRGlhbWV0ZXIgKyAnIiBtaW49IjAiIHN0ZXA9ImFueSI+PC9kaXY+JyArDQogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1maWVsZCBzd3ItbWdlb20tZmllbGQgc3dyLWhpZGRlbiIgZGF0YS1zZWN0aW9ucz0iaG9sbG93X3JvdW5kIiBkYXRhLWlkeD0iJyArIGluZGV4ICsgJyI+JyArDQogICAgICAgICAgICAgICAgJzxsYWJlbD5Jbm5lciBkICgnICsgdS5sZW5ndGggKyAnKTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9InN3ci1tYXQtaW5uZXJEIiB2YWx1ZT0iJyArIG1hdC5nZW9tLmlubmVyRGlhbWV0ZXIgKyAnIiBtaW49IjAiIHN0ZXA9ImFueSI+PC9kaXY+JyAr\"+\"DQogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1maWVsZCBzd3ItbWdlb20tZmllbGQgc3dyLWhpZGRlbiIgZGF0YS1zZWN0aW9ucz0icmVjdGFuZ2xlIiBkYXRhLWlkeD0iJyArIGluZGV4ICsgJyI+JyArDQogICAgICAgICAgICAgICAgJzxsYWJlbD5XaWR0aCBiICgnICsgdS5sZW5ndGggKyAnKTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9InN3ci1tYXQtd2lkdGgiIHZhbHVlPSInICsgbWF0Lmdlb20ud2lkdGggKyAnIiBtaW49IjAiIHN0ZXA9ImFueSI+PC9kaXY+JyArDQogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1maWVsZCBzd3ItbWdlb20tZmllbGQgc3dyLWhpZGRlbiIgZGF0YS1zZWN0aW9ucz0icmVjdGFuZ2xlIiBkYXRhLWlkeD0iJyArIGluZGV4ICsgJyI+JyArDQogICAgICAgICAgICAgICAgJzxsYWJlbD5UaGlja25lc3MgdCAoJyArIHUubGVuZ3RoICsgJyk8L2xhYmVsPjxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJzd3ItbWF0LXRoaWNrbmVzcyIgdmFsdWU9IicgKyBtYXQuZ2VvbS50aGlja25lc3MgKyAnIiBtaW49IjAiIHN0ZXA9ImFueSI+PC9kaXY+JyArDQogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1maWVsZCBzd3ItbWdlb20tZmllbGQgc3dyLWhpZGRlbiIgZGF0YS1zZWN0aW9ucz0iY3VzdG9tX2FyZWEiIGRhdGEtaWR4PSInICsgaW5kZXggKyAnIj4nICsNCiAgICAgICAgICAgICAgICAnPGxhYmVsPkFyZWEgQSAoJyArIHUuYXJlYSArICcpPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0ic3dyLW1hdC1hcmVhIiB2YWx1ZT0iJyArIG1hdC5nZW9tLmN1c3RvbUFyZWEgKyAnIiBtaW49IjAiIHN0ZXA9ImFueSI+PC9kaXY+JyArDQogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1maWVsZCI+PGxhYmVsPkxlbmd0aCBMICgnICsgdS5sZW5ndGggKyAnKTwvbGFiZWw+JyArDQogICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJzd3ItbWF0LWxlbmd0aCIgdmFsdWU9IicgKyBtYXQuZ2VvbS5sZW5ndGggKyAnIiBtaW49IjAiIHN0ZXA9ImFueSI+PC9kaXY+PC9kaXY+JzsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBmaWx0ZXIgPSBlbHMucHJlc2V0U2VhcmNoID8gZWxzLnByZXNldFNlYXJjaC52YWx1ZSA6ICcnOw0KDQogICAgICAgIGNhcmQuaW5uZXJIVE1MID0NCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzd3ItbWF0ZXJpYWwtaGVhZGVyIj4nICsNCiAgICAgICAgICAgICc8aDQ+TWF0ZXJpYWwgJyArIChpbmRleCArIDEpICsgJzwvaDQ+JyArDQogICAgICAgICAgICAnPGRpdiBjbGFzcz0ic3dyLW1hdGVyaWFsLWNvbnRyb2xzIj4nICsNCiAgICAgICAgICAgICc8bGFiZWwgY2xhc3M9InN3ci1yZWYtbGFiZWwiPjxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ic3dyLXJlZk1hdGVyaWFsIiBjbGFzcz0ic3dyLXJlZi1yYWRpbyIgdmFsdWU9IicgKyBpbmRleCArICciJyArDQogICAgICAgICAg\"+\"ICAobWF0LmlzUmVmID8gJyBjaGVja2VkJyA6ICcnKSArICc+IFJlZmVyZW5jZTwvbGFiZWw+JyArDQogICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJzd3ItYnRuLWljb24gc3dyLWR1cC1tYXQiIGRhdGEtaWR4PSInICsgaW5kZXggKyAnIiB0aXRsZT0iRHVwbGljYXRlIj5Db3B5PC9idXR0b24+JyArDQogICAgICAgICAgICAoaW5kZXggPiAwID8gJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0ic3dyLWJ0bi1pY29uIHN3ci11cC1tYXQiIGRhdGEtaWR4PSInICsgaW5kZXggKyAnIiB0aXRsZT0iTW92ZSB1cCI+4oaRPC9idXR0b24+JyA6ICcnKSArDQogICAgICAgICAgICAoaW5kZXggPCBtYXRlcmlhbHMubGVuZ3RoIC0gMSA\/ICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InN3ci1idG4taWNvbiBzd3ItZG93bi1tYXQiIGRhdGEtaWR4PSInICsgaW5kZXggKyAnIiB0aXRsZT0iTW92ZSBkb3duIj7ihpM8L2J1dHRvbj4nIDogJycpICsNCiAgICAgICAgICAgIChtYXRlcmlhbHMubGVuZ3RoID4gMiA\/ICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InN3ci1idG4taWNvbiBzd3ItYnRuLXJlbW92ZSBzd3ItcmVtb3ZlLW1hdCIgZGF0YS1pZHg9IicgKyBpbmRleCArICciPlJlbW92ZTwvYnV0dG9uPicgOiAnJykgKw0KICAgICAgICAgICAgJzwvZGl2PjwvZGl2PicgKw0KICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1ncmlkIj4nICsNCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzd3ItZmllbGQiPjxsYWJlbD5QcmVzZXQ8L2xhYmVsPicgKw0KICAgICAgICAgICAgJzxzZWxlY3QgY2xhc3M9InN3ci1tYXQtcHJlc2V0IiBkYXRhLWlkeD0iJyArIGluZGV4ICsgJyI+JyArIGdldFByZXNldE9wdGlvbnMobWF0LnByZXNldCwgZmlsdGVyKSArICc8L3NlbGVjdD48L2Rpdj4nICsNCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzd3ItZmllbGQiPjxsYWJlbD5NYXRlcmlhbCBOYW1lPC9sYWJlbD4nICsNCiAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9InN3ci1tYXQtbmFtZSIgdmFsdWU9IicgKyBtYXQubmFtZSArICciPjwvZGl2PicgKw0KICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1maWVsZCI+PGxhYmVsPkRlbnNpdHkgz4EgKCcgKyB1LmRlbnNpdHkgKyAnKScgKw0KICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJzd3ItdGlwIiBkYXRhLXRpcD0iTWFzcyBwZXIgdW5pdCB2b2x1bWUg4oCUIHJlcXVpcmVkIGZvciBzcGVjaWZpYyBzdHJlbmd0aCBhbmQgY29tcG9uZW50IG1hc3MuIj4\/PC9zcGFuPjwvbGFiZWw+JyArDQogICAgICAgICAgICAnPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9InN3ci1tYXQtcmhvIiB2YWx1ZT0iJyArIG1hdC5yaG8gKyAnIiBtaW49IjAiIHN0ZXA9ImFueSI+PC9kaXY+JyArDQogICAgICAgICAgICAnPGRpdiBjbGFzcz0ic3dyLWZpZWxkIj48bGFiZWw+WWllbGQgU3RyZW5ndGggU3kgKCcgKyB1LnN0cmVzcyArICcpJyArDQogICAg\"+\"ICAgICAgICAnPHNwYW4gY2xhc3M9InN3ci10aXAiIGRhdGEtdGlwPSJTdHJlc3MgYXQgd2hpY2ggcGVybWFuZW50IGRlZm9ybWF0aW9uIGJlZ2lucy4iPj88L3NwYW4+PC9sYWJlbD4nICsNCiAgICAgICAgICAgICc8aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0ic3dyLW1hdC1zeSIgdmFsdWU9IicgKyBtYXQuc3kgKyAnIiBtaW49IjAiIHN0ZXA9ImFueSI+PC9kaXY+JyArDQogICAgICAgICAgICAnPGRpdiBjbGFzcz0ic3dyLWZpZWxkIj48bGFiZWw+VWx0aW1hdGUgVGVuc2lsZSBTdXQgKCcgKyB1LnN0cmVzcyArICcpJyArDQogICAgICAgICAgICAnPHNwYW4gY2xhc3M9InN3ci10aXAiIGRhdGEtdGlwPSJNYXhpbXVtIHRlbnNpbGUgc3RyZXNzIGJlZm9yZSBmcmFjdHVyZS4iPj88L3NwYW4+PC9sYWJlbD4nICsNCiAgICAgICAgICAgICc8aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0ic3dyLW1hdC1zdXQiIHZhbHVlPSInICsgbWF0LnN1dCArICciIG1pbj0iMCIgc3RlcD0iYW55Ij48L2Rpdj4nICsNCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzd3ItZmllbGQiPjxsYWJlbD5Db21wcmVzc2l2ZSBTYyAoJyArIHUuc3RyZXNzICsgJyk8L2xhYmVsPicgKw0KICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJzd3ItbWF0LXNjIiB2YWx1ZT0iJyArIG1hdC5zYyArICciIG1pbj0iMCIgc3RlcD0iYW55IiBwbGFjZWhvbGRlcj0iT3B0aW9uYWwiPjwvZGl2PicgKw0KICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1maWVsZCI+PGxhYmVsPkN1c3RvbSBTdHJlbmd0aCAoJyArIHUuc3RyZXNzICsgJyk8L2xhYmVsPicgKw0KICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJzd3ItbWF0LWN1c3RvbSIgdmFsdWU9IicgKyBtYXQuY3VzdG9tU3RyZW5ndGggKyAnIiBtaW49IjAiIHN0ZXA9ImFueSIgcGxhY2Vob2xkZXI9Ik9wdGlvbmFsIj48L2Rpdj4nICsNCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzd3ItZmllbGQiPjxsYWJlbD5TYWZldHkgRmFjdG9yIFNGJyArDQogICAgICAgICAgICAnPHNwYW4gY2xhc3M9InN3ci10aXAiIGRhdGEtdGlwPSJEZXNpZ24gZmFjdG9yOiBTYWxsb3cgPSBTcmVmIC8gU0YuIERlZmF1bHQgMi4wLiI+Pzwvc3Bhbj48L2xhYmVsPicgKw0KICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJzd3ItbWF0LXNmIiB2YWx1ZT0iJyArIG1hdC5zZiArICciIG1pbj0iMCIgc3RlcD0iYW55Ij48L2Rpdj4nICsNCiAgICAgICAgICAgICc8L2Rpdj4nICsgZ2VvbUh0bWw7DQoNCiAgICAgICAgcmV0dXJuIGNhcmQ7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVuZGVyTWF0ZXJpYWxzKCkgew0KICAgICAgICB2YXIgY29udGFpbmVyID0gZWxzLm1hdGVyaWFsc0NvbnRhaW5lcjsNCiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnOw0KICAgICAgICBtYXRlcmlhbHMuZm9yRWFjaChmdW5jdGlvbiAobWF0LCBpKSB7DQogICAgICAgICAgICBj\"+\"b250YWluZXIuYXBwZW5kQ2hpbGQocmVuZGVyTWF0ZXJpYWxDYXJkKG1hdCwgaSkpOw0KICAgICAgICB9KTsNCiAgICAgICAgdXBkYXRlTWF0R2VvbVZpc2liaWxpdHkoKTsNCiAgICAgICAgZWxzLmFkZE1hdGVyaWFsLmRpc2FibGVkID0gbWF0ZXJpYWxzLmxlbmd0aCA+PSA2Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlYWRNYXRlcmlhbHNGcm9tRE9NKCkgew0KICAgICAgICB2YXIgY2FyZHMgPSBlbHMubWF0ZXJpYWxzQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zd3ItbWF0ZXJpYWwtY2FyZCcpOw0KICAgICAgICB2YXIgdSA9IGdldFVuaXRzKCk7DQogICAgICAgIGNhcmRzLmZvckVhY2goZnVuY3Rpb24gKGNhcmQsIGkpIHsNCiAgICAgICAgICAgIGlmICghbWF0ZXJpYWxzW2ldKSByZXR1cm47DQogICAgICAgICAgICB2YXIgbSA9IG1hdGVyaWFsc1tpXTsNCiAgICAgICAgICAgIG0ubmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLnN3ci1tYXQtbmFtZScpLnZhbHVlIHx8IG0ubmFtZTsNCiAgICAgICAgICAgIG0ucHJlc2V0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcuc3dyLW1hdC1wcmVzZXQnKS52YWx1ZTsNCiAgICAgICAgICAgIG0ucmhvID0gcGFyc2VGbG9hdChjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5zd3ItbWF0LXJobycpLnZhbHVlKSB8fCAwOw0KICAgICAgICAgICAgbS5zeSA9IHBhcnNlRmxvYXQoY2FyZC5xdWVyeVNlbGVjdG9yKCcuc3dyLW1hdC1zeScpLnZhbHVlKSB8fCAwOw0KICAgICAgICAgICAgbS5zdXQgPSBwYXJzZUZsb2F0KGNhcmQucXVlcnlTZWxlY3RvcignLnN3ci1tYXQtc3V0JykudmFsdWUpIHx8IDA7DQogICAgICAgICAgICB2YXIgc2NFbCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnN3ci1tYXQtc2MnKTsNCiAgICAgICAgICAgIG0uc2MgPSBzY0VsICYmIHNjRWwudmFsdWUgIT09ICcnID8gcGFyc2VGbG9hdChzY0VsLnZhbHVlKSA6ICcnOw0KICAgICAgICAgICAgdmFyIGNzRWwgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5zd3ItbWF0LWN1c3RvbScpOw0KICAgICAgICAgICAgbS5jdXN0b21TdHJlbmd0aCA9IGNzRWwgJiYgY3NFbC52YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KGNzRWwudmFsdWUpIDogJyc7DQogICAgICAgICAgICBtLnNmID0gcGFyc2VGbG9hdChjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5zd3ItbWF0LXNmJykudmFsdWUpIHx8IDI7DQogICAgICAgICAgICBtLmlzUmVmID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcuc3dyLXJlZi1yYWRpbycpLmNoZWNrZWQ7DQoNCiAgICAgICAgICAgIGlmIChlbHMuZ2VvbWV0cnlNb2RlLnZhbHVlID09PSAnY3VzdG9tJykgew0KICAgICAgICAgICAgICAgIHZhciBzdCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnN3ci1tYXQtc2VjdGlvbicpOw0KICAgICAgICAgICAgICAgIGlmIChzdCkgbS5nZW9tLnNlY3Rpb25UeXBlID0gc3QudmFsdWU7DQogICAgICAgICAgICAgICAgdmFyIG51bVZhbCA9IGZ1bmN0aW9uIChzZWwpIHsgdmFyIGVsID0gY2FyZC5xdWVy\"+\"eVNlbGVjdG9yKHNlbCk7IHJldHVybiBlbCAmJiBlbC52YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KGVsLnZhbHVlKSA6ICcnOyB9Ow0KICAgICAgICAgICAgICAgIG0uZ2VvbS5kaWFtZXRlciA9IG51bVZhbCgnLnN3ci1tYXQtZGlhbWV0ZXInKSB8fCBtLmdlb20uZGlhbWV0ZXI7DQogICAgICAgICAgICAgICAgbS5nZW9tLm91dGVyRGlhbWV0ZXIgPSBudW1WYWwoJy5zd3ItbWF0LW91dGVyRCcpIHx8IG0uZ2VvbS5vdXRlckRpYW1ldGVyOw0KICAgICAgICAgICAgICAgIG0uZ2VvbS5pbm5lckRpYW1ldGVyID0gbnVtVmFsKCcuc3dyLW1hdC1pbm5lckQnKSB8fCBtLmdlb20uaW5uZXJEaWFtZXRlcjsNCiAgICAgICAgICAgICAgICBtLmdlb20ud2lkdGggPSBudW1WYWwoJy5zd3ItbWF0LXdpZHRoJykgfHwgbS5nZW9tLndpZHRoOw0KICAgICAgICAgICAgICAgIG0uZ2VvbS50aGlja25lc3MgPSBudW1WYWwoJy5zd3ItbWF0LXRoaWNrbmVzcycpIHx8IG0uZ2VvbS50aGlja25lc3M7DQogICAgICAgICAgICAgICAgbS5nZW9tLmN1c3RvbUFyZWEgPSBudW1WYWwoJy5zd3ItbWF0LWFyZWEnKTsNCiAgICAgICAgICAgICAgICBtLmdlb20ubGVuZ3RoID0gbnVtVmFsKCcuc3dyLW1hdC1sZW5ndGgnKSB8fCBtLmdlb20ubGVuZ3RoOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgbWF0ZXJpYWxzLmZvckVhY2goZnVuY3Rpb24gKG0sIGkpIHsgaWYgKG0uaXNSZWYpIHJlZkluZGV4ID0gaTsgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYXBwbHlQcmVzZXQoaW5kZXgsIHByZXNldEtleSkgew0KICAgICAgICB2YXIgcCA9IFBSRVNFVFNbcHJlc2V0S2V5XTsNCiAgICAgICAgaWYgKCFwIHx8IHByZXNldEtleSA9PT0gJ2N1c3RvbScpIHJldHVybjsNCiAgICAgICAgdmFyIG0gPSBtYXRlcmlhbHNbaW5kZXhdOw0KICAgICAgICBtLnByZXNldCA9IHByZXNldEtleTsNCiAgICAgICAgbS5uYW1lID0gcC5uYW1lOw0KICAgICAgICBtLnJobyA9IHAucmhvOw0KICAgICAgICBtLnN5ID0gcC5zeTsNCiAgICAgICAgbS5zdXQgPSBwLnN1dDsNCiAgICAgICAgbS5zYyA9IHAuc2MgfHwgJyc7DQogICAgICAgIG0uY3VzdG9tU3RyZW5ndGggPSBwLmN1c3RvbSB8fCAnJzsNCiAgICAgICAgcmVuZGVyTWF0ZXJpYWxzKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3luY0NvbXBvbmVudFR5cGUoKSB7DQogICAgICAgIHZhciBjdCA9IGVscy5jb21wb25lbnRUeXBlLnZhbHVlOw0KICAgICAgICB2YXIgc2VjdGlvbiA9IENPTVBPTkVOVF9NQVBbY3RdIHx8ICdzb2xpZF9yb3VuZCc7DQogICAgICAgIGlmIChzZWN0aW9uID09PSAnY3VzdG9tX3ZvbHVtZScpIHsNCiAgICAgICAgICAgIGVscy5zZWN0aW9uVHlwZS52YWx1ZSA9ICdjdXN0b21fYXJlYSc7DQogICAgICAgIH0gZWxzZSBpZiAoc2VjdGlvbiAhPT0gJ2Jsb2NrJykgew0KICAgICAgICAgICAgZWxzLnNlY3Rpb25UeXBlLnZhbHVlID0gc2VjdGlvbjsNCiAgICAgICAgfQ0KICAgICAg\"+\"ICB1cGRhdGVWaXNpYmlsaXR5KCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlVmlzaWJpbGl0eSgpIHsNCiAgICAgICAgdmFyIGdlb21Nb2RlID0gZWxzLmdlb21ldHJ5TW9kZS52YWx1ZTsNCiAgICAgICAgdmFyIGlzRXF1YWxMb2FkID0gZ2VvbU1vZGUgPT09ICdlcXVhbF9sb2FkJzsNCiAgICAgICAgdmFyIGlzRXF1YWxNYXNzID0gZ2VvbU1vZGUgPT09ICdlcXVhbF9tYXNzJzsNCiAgICAgICAgdmFyIHNoYXJlZEdlb20gPSBnZW9tTW9kZSA9PT0gJ3NhbWUnIHx8IGdlb21Nb2RlID09PSAnY3VzdG9tJzsNCg0KICAgICAgICBxc2EoJy5zd3ItbW9kZS1maWVsZCcpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICB2YXIgbW9kZXMgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZXMnKS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc3dyLWhpZGRlbicsIG1vZGVzLmluZGV4T2YoZ2VvbU1vZGUpID09PSAtMSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHZhciBnZW9tU2VjID0gcm9vdC5xdWVyeVNlbGVjdG9yKCcjc3dyLXNoYXJlZEdlb21ldHJ5Jyk7DQogICAgICAgIGlmIChnZW9tU2VjKSBnZW9tU2VjLmNsYXNzTGlzdC50b2dnbGUoJ3N3ci1oaWRkZW4nLCAhc2hhcmVkR2VvbSAmJiAhaXNFcXVhbExvYWQgJiYgIWlzRXF1YWxNYXNzKTsNCg0KICAgICAgICB2YXIgY3QgPSBlbHMuY29tcG9uZW50VHlwZS52YWx1ZTsNCiAgICAgICAgdmFyIHNlY3Rpb24gPSBjdCA9PT0gJ2Jsb2NrJyA\/ICdibG9jaycgOiAoY3QgPT09ICdjdXN0b20nID8gJ2N1c3RvbV92b2x1bWUnIDogZWxzLnNlY3Rpb25UeXBlLnZhbHVlKTsNCg0KICAgICAgICBxc2EoJy5zd3ItZ2VvbS1maWVsZCcpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICB2YXIgc2VjdGlvbnMgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2VjdGlvbnMnKS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgaWYgKGlzRXF1YWxMb2FkIHx8IGlzRXF1YWxNYXNzKSB7DQogICAgICAgICAgICAgICAgdmFyIGlzTGVuZ3RoRmllbGQgPSBzZWN0aW9ucy5sZW5ndGggPj0gNDsNCiAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdzd3ItaGlkZGVuJywgIWlzTGVuZ3RoRmllbGQpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdzd3ItaGlkZGVuJywgc2VjdGlvbnMuaW5kZXhPZihzZWN0aW9uKSA9PT0gLTEpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAoY3QgIT09ICdjdXN0b20nICYmIGN0ICE9PSAnYmxvY2snKSB7DQogICAgICAgICAgICBlbHMuc2VjdGlvblR5cGUudmFsdWUgPSBDT01QT05FTlRfTUFQW2N0XSB8fCAnc29saWRfcm91bmQnOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlTWF0R2VvbVZpc2liaWxpdHkoKSB7DQogICAgICAgIHFzYSgnLnN3ci1tZ2VvbS1maWVs\"+\"ZCcpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgICAgICB2YXIgY2FyZCA9IGVsLmNsb3Nlc3QoJy5zd3ItbWF0ZXJpYWwtY2FyZCcpOw0KICAgICAgICAgICAgaWYgKCFjYXJkKSByZXR1cm47DQogICAgICAgICAgICB2YXIgaWR4ID0gcGFyc2VJbnQoY2FyZC5kYXRhc2V0LmluZGV4LCAxMCk7DQogICAgICAgICAgICB2YXIgc2VjdGlvbiA9IG1hdGVyaWFsc1tpZHhdID8gbWF0ZXJpYWxzW2lkeF0uZ2VvbS5zZWN0aW9uVHlwZSA6ICdzb2xpZF9yb3VuZCc7DQogICAgICAgICAgICB2YXIgc2VjdGlvbnMgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2VjdGlvbnMnKS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnc3dyLWhpZGRlbicsIHNlY3Rpb25zLmluZGV4T2Yoc2VjdGlvbikgPT09IC0xKTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVhZFNoYXJlZEdlb21ldHJ5KCkgew0KICAgICAgICB2YXIgdSA9IGdldFVuaXRzKCk7DQogICAgICAgIHZhciBjdCA9IGVscy5jb21wb25lbnRUeXBlLnZhbHVlOw0KICAgICAgICB2YXIgc2VjdGlvbiA9IGN0ID09PSAnYmxvY2snID8gJ2Jsb2NrJyA6IChjdCA9PT0gJ2N1c3RvbScgPyAnY3VzdG9tX3ZvbHVtZScgOiBlbHMuc2VjdGlvblR5cGUudmFsdWUpOw0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgc2VjdGlvblR5cGU6IHNlY3Rpb24sDQogICAgICAgICAgICBkaWFtZXRlcjogcGFyc2VGbG9hdChlbHMuZGlhbWV0ZXIudmFsdWUpIHx8IDAsDQogICAgICAgICAgICBvdXRlckRpYW1ldGVyOiBwYXJzZUZsb2F0KGVscy5vdXRlckRpYW1ldGVyLnZhbHVlKSB8fCAwLA0KICAgICAgICAgICAgaW5uZXJEaWFtZXRlcjogcGFyc2VGbG9hdChlbHMuaW5uZXJEaWFtZXRlci52YWx1ZSkgfHwgMCwNCiAgICAgICAgICAgIHdpZHRoOiBwYXJzZUZsb2F0KGVscy53aWR0aC52YWx1ZSkgfHwgMCwNCiAgICAgICAgICAgIHRoaWNrbmVzczogcGFyc2VGbG9hdChlbHMudGhpY2tuZXNzLnZhbHVlKSB8fCAwLA0KICAgICAgICAgICAgYmxvY2tXaWR0aDogcGFyc2VGbG9hdChlbHMuYmxvY2tXaWR0aC52YWx1ZSkgfHwgMCwNCiAgICAgICAgICAgIGJsb2NrSGVpZ2h0OiBwYXJzZUZsb2F0KGVscy5ibG9ja0hlaWdodC52YWx1ZSkgfHwgMCwNCiAgICAgICAgICAgIGN1c3RvbUFyZWE6IGVscy5jdXN0b21BcmVhLnZhbHVlICE9PSAnJyA\/IHBhcnNlRmxvYXQoZWxzLmN1c3RvbUFyZWEudmFsdWUpIDogMCwNCiAgICAgICAgICAgIGN1c3RvbVZvbHVtZTogZWxzLmN1c3RvbVZvbHVtZS52YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KGVscy5jdXN0b21Wb2x1bWUudmFsdWUpIDogMCwNCiAgICAgICAgICAgIGxlbmd0aDogcGFyc2VGbG9hdChlbHMubGVuZ3RoLnZhbHVlKSB8fCAwLA0KICAgICAgICAgICAgdTogdQ0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNhbGNTZWN0aW9uUHJvcHMoZ2VvbSwgdSkgew0KICAgICAg\"+\"ICB2YXIgdHlwZSA9IGdlb20uc2VjdGlvblR5cGU7DQogICAgICAgIHZhciBBID0gMCwgViA9IDAsIEwgPSB1Lmxlbmd0aEZyb21JbnB1dChnZW9tLmxlbmd0aCB8fCAwKTsNCg0KICAgICAgICBpZiAodHlwZSA9PT0gJ3NvbGlkX3JvdW5kJykgew0KICAgICAgICAgICAgdmFyIGQgPSB1Lmxlbmd0aEZyb21JbnB1dChnZW9tLmRpYW1ldGVyKTsNCiAgICAgICAgICAgIEEgPSBNYXRoLlBJICogZCAqIGQgLyA0Ow0KICAgICAgICAgICAgViA9IEEgKiBMOw0KICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdob2xsb3dfcm91bmQnKSB7DQogICAgICAgICAgICB2YXIgRCA9IHUubGVuZ3RoRnJvbUlucHV0KGdlb20ub3V0ZXJEaWFtZXRlcik7DQogICAgICAgICAgICB2YXIgaWQgPSB1Lmxlbmd0aEZyb21JbnB1dChnZW9tLmlubmVyRGlhbWV0ZXIpOw0KICAgICAgICAgICAgQSA9IE1hdGguUEkgKiAoRCAqIEQgLSBpZCAqIGlkKSAvIDQ7DQogICAgICAgICAgICBWID0gQSAqIEw7DQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3JlY3RhbmdsZScpIHsNCiAgICAgICAgICAgIHZhciBiID0gdS5sZW5ndGhGcm9tSW5wdXQoZ2VvbS53aWR0aCk7DQogICAgICAgICAgICB2YXIgdCA9IHUubGVuZ3RoRnJvbUlucHV0KGdlb20udGhpY2tuZXNzIHx8IGdlb20uaGVpZ2h0KTsNCiAgICAgICAgICAgIEEgPSBiICogdDsNCiAgICAgICAgICAgIFYgPSBBICogTDsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYmxvY2snKSB7DQogICAgICAgICAgICB2YXIgVyA9IHUubGVuZ3RoRnJvbUlucHV0KGdlb20uYmxvY2tXaWR0aCB8fCBnZW9tLndpZHRoKTsNCiAgICAgICAgICAgIHZhciBIID0gdS5sZW5ndGhGcm9tSW5wdXQoZ2VvbS5ibG9ja0hlaWdodCB8fCBnZW9tLmhlaWdodCk7DQogICAgICAgICAgICBWID0gTCAqIFcgKiBIOw0KICAgICAgICAgICAgQSA9IFcgKiBIOw0KICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjdXN0b21fYXJlYScpIHsNCiAgICAgICAgICAgIEEgPSBnZW9tLmN1c3RvbUFyZWEgPyB1LmFyZWFGcm9tSW5wdXQoZ2VvbS5jdXN0b21BcmVhKSA6IDA7DQogICAgICAgICAgICBWID0gQSAqIEw7DQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2N1c3RvbV92b2x1bWUnKSB7DQogICAgICAgICAgICBWID0gZ2VvbS5jdXN0b21Wb2x1bWUgPyB1LnZvbHVtZUZyb21JbnB1dChnZW9tLmN1c3RvbVZvbHVtZSkgOiAwOw0KICAgICAgICAgICAgQSA9IEwgPiAwID8gViAvIEwgOiAwOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHsgQTogQSwgVjogViwgTDogTCB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFNlbGVjdGVkU3RyZW5ndGgobSwgYmFzaXMsIHUpIHsNCiAgICAgICAgdmFyIHMgPSAwOw0KICAgICAgICBpZiAoYmFzaXMgPT09ICd5aWVsZCcpIHMgPSB1LnN0cmVzc0Zyb21JbnB1dChtLnN5KTsNCiAgICAgICAgZWxzZSBpZiAoYmFzaXMgPT09ICd1bHRpbWF0ZScpIHMgPSB1LnN0cmVzc0Zy\"+\"b21JbnB1dChtLnN1dCk7DQogICAgICAgIGVsc2UgaWYgKGJhc2lzID09PSAnY29tcHJlc3NpdmUnKSBzID0gbS5zYyAhPT0gJycgPyB1LnN0cmVzc0Zyb21JbnB1dChtLnNjKSA6IDA7DQogICAgICAgIGVsc2UgaWYgKGJhc2lzID09PSAnY3VzdG9tJykgcyA9IG0uY3VzdG9tU3RyZW5ndGggIT09ICcnID8gdS5zdHJlc3NGcm9tSW5wdXQobS5jdXN0b21TdHJlbmd0aCkgOiAwOw0KICAgICAgICByZXR1cm4gczsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaXplRm9yRXF1YWxMb2FkKFNhbGxvdywgRnJlcXVpcmVkLCBnZW9tLCB1KSB7DQogICAgICAgIGlmIChTYWxsb3cgPD0gMCB8fCBGcmVxdWlyZWQgPD0gMCkgcmV0dXJuIHsgQTogMCwgVjogMCwgTDogZ2VvbS5sZW5ndGggPyB1Lmxlbmd0aEZyb21JbnB1dChnZW9tLmxlbmd0aCkgOiAwIH07DQogICAgICAgIHZhciBBcmVxID0gRnJlcXVpcmVkIC8gU2FsbG93Ow0KICAgICAgICB2YXIgdHlwZSA9IGdlb20uc2VjdGlvblR5cGU7DQogICAgICAgIHZhciBMID0gZ2VvbS5sZW5ndGggPyB1Lmxlbmd0aEZyb21JbnB1dChnZW9tLmxlbmd0aCkgOiAxMDAwOw0KICAgICAgICB2YXIgZCwgRCwgYiwgdCwgVywgSDsNCg0KICAgICAgICBpZiAodHlwZSA9PT0gJ3NvbGlkX3JvdW5kJykgew0KICAgICAgICAgICAgZCA9IE1hdGguc3FydCg0ICogQXJlcSAvIE1hdGguUEkpOw0KICAgICAgICAgICAgZ2VvbS5kaWFtZXRlciA9IHUubGVuZ3RoVG9EaXNwbGF5KGQpOw0KICAgICAgICAgICAgcmV0dXJuIGNhbGNTZWN0aW9uUHJvcHMoZ2VvbSwgdSk7DQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2hvbGxvd19yb3VuZCcpIHsNCiAgICAgICAgICAgIHZhciBvZCA9IGdlb20ub3V0ZXJEaWFtZXRlciA\/IHUubGVuZ3RoRnJvbUlucHV0KGdlb20ub3V0ZXJEaWFtZXRlcikgOiAzMDsNCiAgICAgICAgICAgIHZhciBpZCA9IE1hdGguc3FydChNYXRoLm1heChvZCAqIG9kIC0gNCAqIEFyZXEgLyBNYXRoLlBJLCAwKSk7DQogICAgICAgICAgICBnZW9tLmlubmVyRGlhbWV0ZXIgPSB1Lmxlbmd0aFRvRGlzcGxheShpZCk7DQogICAgICAgICAgICByZXR1cm4gY2FsY1NlY3Rpb25Qcm9wcyhnZW9tLCB1KTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncmVjdGFuZ2xlJykgew0KICAgICAgICAgICAgYiA9IGdlb20ud2lkdGggPyB1Lmxlbmd0aEZyb21JbnB1dChnZW9tLndpZHRoKSA6IDQwOw0KICAgICAgICAgICAgdCA9IEFyZXEgLyBiOw0KICAgICAgICAgICAgZ2VvbS50aGlja25lc3MgPSB1Lmxlbmd0aFRvRGlzcGxheSh0KTsNCiAgICAgICAgICAgIHJldHVybiBjYWxjU2VjdGlvblByb3BzKGdlb20sIHUpOw0KICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdibG9jaycpIHsNCiAgICAgICAgICAgIFcgPSBnZW9tLmJsb2NrV2lkdGggPyB1Lmxlbmd0aEZyb21JbnB1dChnZW9tLmJsb2NrV2lkdGgpIDogNTA7DQogICAgICAgICAgICBIID0gQXJlcSAvIFc7DQogICAgICAgICAgICBnZW9t\"+\"LmJsb2NrSGVpZ2h0ID0gdS5sZW5ndGhUb0Rpc3BsYXkoSCk7DQogICAgICAgICAgICByZXR1cm4gY2FsY1NlY3Rpb25Qcm9wcyhnZW9tLCB1KTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnY3VzdG9tX2FyZWEnKSB7DQogICAgICAgICAgICBnZW9tLmN1c3RvbUFyZWEgPSB1LmFyZWFUb0Rpc3BsYXkoQXJlcSk7DQogICAgICAgICAgICByZXR1cm4gY2FsY1NlY3Rpb25Qcm9wcyhnZW9tLCB1KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4geyBBOiBBcmVxLCBWOiBBcmVxICogTCwgTDogTCB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNpemVGb3JFcXVhbE1hc3ModGFyZ2V0TWFzcywgcmhvLCBnZW9tLCB1KSB7DQogICAgICAgIGlmIChyaG8gPD0gMCB8fCB0YXJnZXRNYXNzIDw9IDApIHJldHVybiB7IEE6IDAsIFY6IDAsIEw6IDAgfTsNCiAgICAgICAgdmFyIFYgPSB0YXJnZXRNYXNzIC8gcmhvOw0KICAgICAgICB2YXIgdHlwZSA9IGdlb20uc2VjdGlvblR5cGU7DQogICAgICAgIHZhciBMID0gZ2VvbS5sZW5ndGggPyB1Lmxlbmd0aEZyb21JbnB1dChnZW9tLmxlbmd0aCkgOiAxMDAwOw0KDQogICAgICAgIGlmICh0eXBlID09PSAnc29saWRfcm91bmQnKSB7DQogICAgICAgICAgICB2YXIgQSA9IFYgLyBMOw0KICAgICAgICAgICAgdmFyIGQgPSBNYXRoLnNxcnQoNCAqIEEgLyBNYXRoLlBJKTsNCiAgICAgICAgICAgIGdlb20uZGlhbWV0ZXIgPSB1Lmxlbmd0aFRvRGlzcGxheShkKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaG9sbG93X3JvdW5kJykgew0KICAgICAgICAgICAgdmFyIG9kID0gZ2VvbS5vdXRlckRpYW1ldGVyID8gdS5sZW5ndGhGcm9tSW5wdXQoZ2VvbS5vdXRlckRpYW1ldGVyKSA6IDMwOw0KICAgICAgICAgICAgdmFyIEEyID0gViAvIEw7DQogICAgICAgICAgICB2YXIgaWQgPSBNYXRoLnNxcnQoTWF0aC5tYXgob2QgKiBvZCAtIDQgKiBBMiAvIE1hdGguUEksIDApKTsNCiAgICAgICAgICAgIGdlb20uaW5uZXJEaWFtZXRlciA9IHUubGVuZ3RoVG9EaXNwbGF5KGlkKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncmVjdGFuZ2xlJykgew0KICAgICAgICAgICAgdmFyIGIgPSBnZW9tLndpZHRoID8gdS5sZW5ndGhGcm9tSW5wdXQoZ2VvbS53aWR0aCkgOiA0MDsNCiAgICAgICAgICAgIGdlb20udGhpY2tuZXNzID0gdS5sZW5ndGhUb0Rpc3BsYXkoViAvIChMICogYikpOw0KICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjdXN0b21fdm9sdW1lJykgew0KICAgICAgICAgICAgZ2VvbS5jdXN0b21Wb2x1bWUgPSB1LnZvbHVtZVRvRGlzcGxheShWKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYmxvY2snKSB7DQogICAgICAgICAgICB2YXIgVyA9IGdlb20uYmxvY2tXaWR0aCA\/IHUubGVuZ3RoRnJvbUlucHV0KGdlb20uYmxvY2tXaWR0aCkgOiA1MDsNCiAgICAgICAgICAgIGdlb20uYmxvY2tIZWlnaHQgPSB1Lmxlbmd0aFRvRGlzcGxheShWIC8gKEwgKiBXKSk7DQog\"+\"ICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2N1c3RvbV9hcmVhJykgew0KICAgICAgICAgICAgZ2VvbS5jdXN0b21BcmVhID0gdS5hcmVhVG9EaXNwbGF5KFYgLyBMKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gY2FsY1NlY3Rpb25Qcm9wcyhnZW9tLCB1KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2YWxpZGF0ZSh3YXJuaW5ncykgew0KICAgICAgICByZWFkTWF0ZXJpYWxzRnJvbURPTSgpOw0KICAgICAgICBpZiAobWF0ZXJpYWxzLmxlbmd0aCA8IDIpIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goJ0F0IGxlYXN0IHR3byBtYXRlcmlhbHMgYXJlIHJlcXVpcmVkIGZvciBjb21wYXJpc29uLicpOw0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIG9rID0gdHJ1ZTsNCiAgICAgICAgdmFyIGJhc2lzID0gZWxzLnN0cmVuZ3RoQmFzaXMudmFsdWU7DQoNCiAgICAgICAgbWF0ZXJpYWxzLmZvckVhY2goZnVuY3Rpb24gKG0pIHsNCiAgICAgICAgICAgIGlmIChtLnJobyA8PSAwKSB7IHdhcm5pbmdzLnB1c2gobS5uYW1lICsgJzogRGVuc2l0eSBtdXN0IGJlIHBvc2l0aXZlLicpOyBvayA9IGZhbHNlOyB9DQogICAgICAgICAgICBpZiAobS5zZiA8PSAwKSB7IHdhcm5pbmdzLnB1c2gobS5uYW1lICsgJzogU2FmZXR5IGZhY3RvciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOyBvayA9IGZhbHNlOyB9DQogICAgICAgICAgICBpZiAobS5zeSA8PSAwICYmIG0uc3V0IDw9IDApIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKG0ubmFtZSArICc6IEF0IGxlYXN0IG9uZSBzdHJlbmd0aCB2YWx1ZSAoeWllbGQgb3IgdWx0aW1hdGUpIGlzIHJlcXVpcmVkLicpOw0KICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYmFzaXMgPT09ICdjb21wcmVzc2l2ZScgJiYgKG0uc2MgPT09ICcnIHx8IG0uc2MgPD0gMCkpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKG0ubmFtZSArICc6IENvbXByZXNzaXZlIHN0cmVuZ3RoIGlzIHJlcXVpcmVkIGZvciBjb21wcmVzc2l2ZSBzdHJlbmd0aCBiYXNpcy4nKTsNCiAgICAgICAgICAgICAgICBvayA9IGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGJhc2lzID09PSAnY3VzdG9tJyAmJiAobS5jdXN0b21TdHJlbmd0aCA9PT0gJycgfHwgbS5jdXN0b21TdHJlbmd0aCA8PSAwKSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2gobS5uYW1lICsgJzogQ3VzdG9tIHN0cmVuZ3RoIGlzIHJlcXVpcmVkIGZvciBjdXN0b20gc3RyZW5ndGggYmFzaXMuJyk7DQogICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChQUkVTRVRTW20ucHJlc2V0XSAmJiBQUkVTRVRTW20ucHJlc2V0XS5hbmlzb3Ryb3BpYykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2gobS5uYW1lICsgJzogQW5pc290\"+\"cm9waWMgY29tcG9zaXRlIOKAlCBzY2FsYXIgc3RyZW5ndGggbWF5IG5vdCByZXByZXNlbnQgZGlyZWN0aW9uYWwgcHJvcGVydGllcy4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgdmFyIGdlb21Nb2RlID0gZWxzLmdlb21ldHJ5TW9kZS52YWx1ZTsNCiAgICAgICAgaWYgKGdlb21Nb2RlID09PSAnc2FtZScgfHwgZ2VvbU1vZGUgPT09ICdlcXVhbF9sb2FkJyB8fCBnZW9tTW9kZSA9PT0gJ2VxdWFsX21hc3MnKSB7DQogICAgICAgICAgICB2YXIgZyA9IHJlYWRTaGFyZWRHZW9tZXRyeSgpOw0KICAgICAgICAgICAgaWYgKGcuc2VjdGlvblR5cGUgIT09ICdjdXN0b21fdm9sdW1lJyAmJiBnLmxlbmd0aCA8PSAwICYmIGdlb21Nb2RlICE9PSAnZXF1YWxfbWFzcycpIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKCdDb21wb25lbnQgbGVuZ3RoIG11c3QgYmUgcG9zaXRpdmUuJyk7DQogICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChnLnNlY3Rpb25UeXBlID09PSAnaG9sbG93X3JvdW5kJyAmJiBnLmlubmVyRGlhbWV0ZXIgPj0gZy5vdXRlckRpYW1ldGVyKSB7DQogICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnSW5uZXIgZGlhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3V0ZXIgZGlhbWV0ZXIuJyk7DQogICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChnZW9tTW9kZSAhPT0gJ2VxdWFsX2xvYWQnICYmIGdlb21Nb2RlICE9PSAnZXF1YWxfbWFzcycpIHsNCiAgICAgICAgICAgICAgICB2YXIgc2VjID0gY2FsY1NlY3Rpb25Qcm9wcyhnLCBnLnUpOw0KICAgICAgICAgICAgICAgIGlmIChzZWMuQSA8PSAwICYmIGcuc2VjdGlvblR5cGUgIT09ICdjdXN0b21fdm9sdW1lJykgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKCdJbnZhbGlkIGNyb3NzLXNlY3Rpb24gZ2VvbWV0cnkg4oCUIGFyZWEgbXVzdCBiZSBwb3NpdGl2ZS4nKTsNCiAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBtYXRlcmlhbHMuZm9yRWFjaChmdW5jdGlvbiAobSkgew0KICAgICAgICAgICAgICAgIGlmIChtLmdlb20ubGVuZ3RoIDw9IDApIHsgd2FybmluZ3MucHVzaChtLm5hbWUgKyAnOiBMZW5ndGggbXVzdCBiZSBwb3NpdGl2ZS4nKTsgb2sgPSBmYWxzZTsgfQ0KICAgICAgICAgICAgICAgIGlmIChtLmdlb20uc2VjdGlvblR5cGUgPT09ICdob2xsb3dfcm91bmQnICYmIG0uZ2VvbS5pbm5lckRpYW1ldGVyID49IG0uZ2VvbS5vdXRlckRpYW1ldGVyKSB7DQogICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2gobS5uYW1lICsgJzogSW5uZXIgZGlhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3V0ZXIgZGlhbWV0ZXIuJyk7IG9rID0gZmFsc2U7DQogICAgICAgICAg\"+\"ICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZ2VvbU1vZGUgPT09ICdlcXVhbF9sb2FkJykgew0KICAgICAgICAgICAgdmFyIEZyZXEgPSBwYXJzZUZsb2F0KGVscy5yZXF1aXJlZExvYWQudmFsdWUpIHx8IDA7DQogICAgICAgICAgICBpZiAoRnJlcSA8PSAwKSB7IHdhcm5pbmdzLnB1c2goJ1JlcXVpcmVkIGxvYWQgY2FwYWNpdHkgbXVzdCBiZSBwb3NpdGl2ZS4nKTsgb2sgPSBmYWxzZTsgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChnZW9tTW9kZSA9PT0gJ2VxdWFsX21hc3MnKSB7DQogICAgICAgICAgICB2YXIgdG0gPSBwYXJzZUZsb2F0KGVscy50YXJnZXRNYXNzLnZhbHVlKSB8fCAwOw0KICAgICAgICAgICAgaWYgKHRtIDw9IDApIHsgd2FybmluZ3MucHVzaCgnVGFyZ2V0IGNvbXBvbmVudCBtYXNzIG11c3QgYmUgcG9zaXRpdmUuJyk7IG9rID0gZmFsc2U7IH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBzeVZhbHMgPSBtYXRlcmlhbHMubWFwKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLnN5OyB9KS5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgPiAwOyB9KTsNCiAgICAgICAgdmFyIHN1dFZhbHMgPSBtYXRlcmlhbHMubWFwKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLnN1dDsgfSkuZmlsdGVyKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ID4gMDsgfSk7DQogICAgICAgIGlmIChzeVZhbHMubGVuZ3RoICYmIHN1dFZhbHMubGVuZ3RoKSB7DQogICAgICAgICAgICB2YXIgcmF0aW9TcHJlYWQgPSBNYXRoLm1heC5hcHBseShudWxsLCBzdXRWYWxzKSAvIE1hdGgubWluLmFwcGx5KG51bGwsIHN5VmFscyk7DQogICAgICAgICAgICBpZiAocmF0aW9TcHJlYWQgPiA1KSB7DQogICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnTWF0ZXJpYWxzIHVzZSBtaXhlZCBzdHJlbmd0aCBkZWZpbml0aW9ucyDigJQgdmVyaWZ5IGNvbnNpc3RlbmN5IHdoZW4gY29tcGFyaW5nLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIG9rOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNvbXB1dGVSZXN1bHRzKCkgew0KICAgICAgICB2YXIgd2FybmluZ3MgPSBbXTsNCiAgICAgICAgaWYgKCF2YWxpZGF0ZSh3YXJuaW5ncykpIHJldHVybiB7IG9rOiBmYWxzZSwgd2FybmluZ3M6IHdhcm5pbmdzIH07DQoNCiAgICAgICAgdmFyIHUgPSBnZXRVbml0cygpOw0KICAgICAgICB2YXIgYmFzaXMgPSBlbHMuc3RyZW5ndGhCYXNpcy52YWx1ZTsNCiAgICAgICAgdmFyIGdlb21Nb2RlID0gZWxzLmdlb21ldHJ5TW9kZS52YWx1ZTsNCiAgICAgICAgdmFyIHNoYXJlZEdlb20gPSAoZ2VvbU1vZGUgPT09ICdzYW1lJyB8fCBnZW9tTW9kZSA9PT0gJ2VxdWFsX2xvYWQnIHx8IGdlb21Nb2RlID09PSAnZXF1YWxfbWFzcycpID8gcmVhZFNoYXJlZEdlb21ldHJ5KCkgOiBudWxsOw0KICAgICAgICB2YXIgRnJlcXVpcmVkID0gZ2VvbU1vZGUgPT09ICdlcXVhbF9sb2FkJyA\/IHUuZm9yY2VG\"+\"cm9tSW5wdXQocGFyc2VGbG9hdChlbHMucmVxdWlyZWRMb2FkLnZhbHVlKSB8fCAwKSA6IDA7DQogICAgICAgIHZhciB0YXJnZXRNYXNzID0gZ2VvbU1vZGUgPT09ICdlcXVhbF9tYXNzJyA\/IHUubWFzc0Zyb21JbnB1dChwYXJzZUZsb2F0KGVscy50YXJnZXRNYXNzLnZhbHVlKSB8fCAwKSA6IDA7DQoNCiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsNCiAgICAgICAgbWF0ZXJpYWxzLmZvckVhY2goZnVuY3Rpb24gKG0sIGkpIHsNCiAgICAgICAgICAgIHZhciBnZW9tID0gc2hhcmVkR2VvbSA\/IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2hhcmVkR2VvbSkpIDogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdlb20pKTsNCiAgICAgICAgICAgIGlmIChzaGFyZWRHZW9tKSBnZW9tLnNlY3Rpb25UeXBlID0gc2hhcmVkR2VvbS5zZWN0aW9uVHlwZTsNCg0KICAgICAgICAgICAgdmFyIHJobyA9IHUucmhvZnJvbUlucHV0KG0ucmhvKTsNCiAgICAgICAgICAgIHZhciBzeSA9IHUuc3RyZXNzRnJvbUlucHV0KG0uc3kpOw0KICAgICAgICAgICAgdmFyIHN1dCA9IHUuc3RyZXNzRnJvbUlucHV0KG0uc3V0KTsNCiAgICAgICAgICAgIHZhciBzYyA9IG0uc2MgIT09ICcnID8gdS5zdHJlc3NGcm9tSW5wdXQobS5zYykgOiAwOw0KICAgICAgICAgICAgdmFyIHNDdXN0b20gPSBtLmN1c3RvbVN0cmVuZ3RoICE9PSAnJyA\/IHUuc3RyZXNzRnJvbUlucHV0KG0uY3VzdG9tU3RyZW5ndGgpIDogMDsNCiAgICAgICAgICAgIHZhciBTcmVmID0gZ2V0U2VsZWN0ZWRTdHJlbmd0aChtLCBiYXNpcywgdSk7DQogICAgICAgICAgICB2YXIgU2FsbG93ID0gbS5zZiA+IDAgPyBTcmVmIC8gbS5zZiA6IDA7DQoNCiAgICAgICAgICAgIHZhciBzZWM7DQogICAgICAgICAgICBpZiAoZ2VvbU1vZGUgPT09ICdlcXVhbF9sb2FkJykgew0KICAgICAgICAgICAgICAgIHNlYyA9IHNpemVGb3JFcXVhbExvYWQoU2FsbG93LCBGcmVxdWlyZWQsIGdlb20sIHUpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChnZW9tTW9kZSA9PT0gJ2VxdWFsX21hc3MnKSB7DQogICAgICAgICAgICAgICAgc2VjID0gc2l6ZUZvckVxdWFsTWFzcyh0YXJnZXRNYXNzLCByaG8sIGdlb20sIHUpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBzZWMgPSBjYWxjU2VjdGlvblByb3BzKGdlb20sIHUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgQSA9IHNlYy5BLCBWID0gc2VjLlY7DQogICAgICAgICAgICB2YXIgbWFzcyA9IHJobyA+IDAgPyByaG8gKiBWICogMWUtOSA6IDA7DQogICAgICAgICAgICB2YXIgd2VpZ2h0Rm9yY2UgPSBtYXNzICogRzsNCg0KICAgICAgICAgICAgdmFyIHNwZWNpZmljWWllbGQgPSByaG8gPiAwID8gc3kgLyByaG8gOiAwOw0KICAgICAgICAgICAgdmFyIHNwZWNpZmljVGVuc2lsZSA9IHJobyA+IDAgPyBzdXQgLyByaG8gOiAwOw0KICAgICAgICAgICAgdmFyIHNwZWNpZmljQ29tcHJlc3NpdmUgPSByaG8gPiAwICYmIHNjID4g\"+\"MCA\/IHNjIC8gcmhvIDogMDsNCiAgICAgICAgICAgIHZhciBzcGVjaWZpY1NlbGVjdGVkID0gcmhvID4gMCAmJiBTcmVmID4gMCA\/IFNyZWYgLyByaG8gOiAwOw0KICAgICAgICAgICAgdmFyIGRlc2lnblNwZWNpZmljID0gcmhvID4gMCAmJiBTYWxsb3cgPiAwID8gU2FsbG93IC8gcmhvIDogMDsNCg0KICAgICAgICAgICAgdmFyIEZ5ID0gc3kgPiAwID8gc3kgKiBBIDogMDsNCiAgICAgICAgICAgIHZhciBGdXQgPSBzdXQgPiAwID8gc3V0ICogQSA6IDA7DQogICAgICAgICAgICB2YXIgRmMgPSBzYyA+IDAgPyBzYyAqIEEgOiAwOw0KICAgICAgICAgICAgdmFyIEZhbGxvdyA9IFNhbGxvdyA+IDAgPyBTYWxsb3cgKiBBIDogMDsNCiAgICAgICAgICAgIHZhciBsb2FkUGVyTWFzcyA9IG1hc3MgPiAwICYmIEZhbGxvdyA+IDAgPyBGYWxsb3cgLyBtYXNzIDogMDsNCg0KICAgICAgICAgICAgaWYgKGJhc2lzID09PSAnY29tcHJlc3NpdmUnICYmIHNlYy5MID4gMCAmJiBBID4gMCkgew0KICAgICAgICAgICAgICAgIHZhciBzbGVuZGVybmVzcyA9IHNlYy5MIC8gTWF0aC5zcXJ0KEEgLyBNYXRoLlBJKTsNCiAgICAgICAgICAgICAgICBpZiAoc2xlbmRlcm5lc3MgPiAxMDApIHsNCiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaChtLm5hbWUgKyAnOiBTbGVuZGVyIG1lbWJlciDigJQgYnVja2xpbmcgbWF5IGdvdmVybiBpbnN0ZWFkIG9mIGNvbXByZXNzaXZlIHN0cmVuZ3RoLicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsNCiAgICAgICAgICAgICAgICBpbmRleDogaSwNCiAgICAgICAgICAgICAgICBuYW1lOiBtLm5hbWUsDQogICAgICAgICAgICAgICAgaXNSZWY6IG0uaXNSZWYsDQogICAgICAgICAgICAgICAgcmhvOiByaG8sIHN5OiBzeSwgc3V0OiBzdXQsIHNjOiBzYywNCiAgICAgICAgICAgICAgICBTcmVmOiBTcmVmLCBTYWxsb3c6IFNhbGxvdywgc2Y6IG0uc2YsDQogICAgICAgICAgICAgICAgQTogQSwgVjogViwgbWFzczogbWFzcywgd2VpZ2h0Rm9yY2U6IHdlaWdodEZvcmNlLA0KICAgICAgICAgICAgICAgIHNwZWNpZmljWWllbGQ6IHNwZWNpZmljWWllbGQsDQogICAgICAgICAgICAgICAgc3BlY2lmaWNUZW5zaWxlOiBzcGVjaWZpY1RlbnNpbGUsDQogICAgICAgICAgICAgICAgc3BlY2lmaWNDb21wcmVzc2l2ZTogc3BlY2lmaWNDb21wcmVzc2l2ZSwNCiAgICAgICAgICAgICAgICBzcGVjaWZpY1NlbGVjdGVkOiBzcGVjaWZpY1NlbGVjdGVkLA0KICAgICAgICAgICAgICAgIGRlc2lnblNwZWNpZmljOiBkZXNpZ25TcGVjaWZpYywNCiAgICAgICAgICAgICAgICBGeTogRnksIEZ1dDogRnV0LCBGYzogRmMsIEZhbGxvdzogRmFsbG93LA0KICAgICAgICAgICAgICAgIGxvYWRQZXJNYXNzOiBsb2FkUGVyTWFzcw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHZhciByZWYgPSByZXN1bHRzW3JlZkluZGV4XSB8fCByZXN1bHRz\"+\"WzBdOw0KICAgICAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHIpIHsNCiAgICAgICAgICAgIHIucmVsYXRpdmVQZXJmID0gcmVmLnNwZWNpZmljU2VsZWN0ZWQgPiAwID8gci5zcGVjaWZpY1NlbGVjdGVkIC8gcmVmLnNwZWNpZmljU2VsZWN0ZWQgKiAxMDAgOiBudWxsOw0KICAgICAgICAgICAgci53ZWlnaHRTYXZpbmcgPSByZWYubWFzcyA+IDAgPyAocmVmLm1hc3MgLSByLm1hc3MpIC8gcmVmLm1hc3MgKiAxMDAgOiBudWxsOw0KICAgICAgICB9KTsNCg0KICAgICAgICB2YXIgY3JpdGVyaW9uID0gUkFOS19DUklURVJJQVtlbHMucmFua0NyaXRlcmlvbi52YWx1ZV0gfHwgUkFOS19DUklURVJJQS5zcGVjaWZpY1NlbGVjdGVkOw0KICAgICAgICB2YXIgc29ydGVkID0gcmVzdWx0cy5zbGljZSgpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsNCiAgICAgICAgICAgIHZhciB2YSA9IGFbY3JpdGVyaW9uLmtleV0sIHZiID0gYltjcml0ZXJpb24ua2V5XTsNCiAgICAgICAgICAgIGlmICh2YSA9PT0gbnVsbCB8fCB2YSA9PT0gdW5kZWZpbmVkIHx8ICFpc0Zpbml0ZSh2YSkpIHZhID0gY3JpdGVyaW9uLmhpZ2hlciA\/IC1JbmZpbml0eSA6IEluZmluaXR5Ow0KICAgICAgICAgICAgaWYgKHZiID09PSBudWxsIHx8IHZiID09PSB1bmRlZmluZWQgfHwgIWlzRmluaXRlKHZiKSkgdmIgPSBjcml0ZXJpb24uaGlnaGVyID8gLUluZmluaXR5IDogSW5maW5pdHk7DQogICAgICAgICAgICByZXR1cm4gY3JpdGVyaW9uLmhpZ2hlciA\/IHZiIC0gdmEgOiB2YSAtIHZiOw0KICAgICAgICB9KTsNCiAgICAgICAgc29ydGVkLmZvckVhY2goZnVuY3Rpb24gKHIsIHJhbmspIHsNCiAgICAgICAgICAgIHJlc3VsdHNbci5pbmRleF0ucmFuayA9IHJhbmsgKyAxOw0KICAgICAgICB9KTsNCg0KICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgd2FybmluZ3M6IHdhcm5pbmdzLCByZXN1bHRzOiByZXN1bHRzLCByZWY6IHJlZiwgY3JpdGVyaW9uOiBjcml0ZXJpb24gfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByZW5kZXJXYXJuaW5ncyh3YXJuaW5ncykgew0KICAgICAgICB2YXIgZWwgPSBlbHMud2FybmluZ3M7DQogICAgICAgIGlmICghd2FybmluZ3MubGVuZ3RoKSB7IGVsLmhpZGRlbiA9IHRydWU7IGVsLmlubmVySFRNTCA9ICcnOyByZXR1cm47IH0NCiAgICAgICAgZWwuaGlkZGVuID0gZmFsc2U7DQogICAgICAgIGVsLmlubmVySFRNTCA9ICc8c3Ryb25nPldhcm5pbmdzOjwvc3Ryb25nPjx1bD4nICsNCiAgICAgICAgICAgIHdhcm5pbmdzLm1hcChmdW5jdGlvbiAodykgeyByZXR1cm4gJzxsaT4nICsgdyArICc8L2xpPic7IH0pLmpvaW4oJycpICsgJzwvdWw+JzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByZW5kZXJDbGFzc2lmaWNhdGlvbnMoZGF0YSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IGRhdGEucmVzdWx0czsNCiAgICAgICAgdmFyIGMgPSBkYXRhLmNyaXRlcmlvbjsNCiAgICAgICAgdmFyIGJlc3QgPSByZXN1bHRzLnJlZHVjZShmdW5jdGlvbiAo\"+\"YSwgYikgew0KICAgICAgICAgICAgdmFyIHZhID0gYVtjLmtleV0sIHZiID0gYltjLmtleV07DQogICAgICAgICAgICBpZiAodmEgPT09IG51bGwgfHwgIWlzRmluaXRlKHZhKSkgcmV0dXJuIGI7DQogICAgICAgICAgICBpZiAodmIgPT09IG51bGwgfHwgIWlzRmluaXRlKHZiKSkgcmV0dXJuIGE7DQogICAgICAgICAgICByZXR1cm4gYy5oaWdoZXIgPyAodmEgPj0gdmIgPyBhIDogYikgOiAodmEgPD0gdmIgPyBhIDogYik7DQogICAgICAgIH0pOw0KICAgICAgICB2YXIgYmVzdFNwZWMgPSByZXN1bHRzLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgew0KICAgICAgICAgICAgcmV0dXJuIChiLnNwZWNpZmljU2VsZWN0ZWQgfHwgMCkgPiAoYS5zcGVjaWZpY1NlbGVjdGVkIHx8IDApID8gYiA6IGE7DQogICAgICAgIH0pOw0KICAgICAgICB2YXIgbGlnaHRlc3QgPSByZXN1bHRzLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgew0KICAgICAgICAgICAgcmV0dXJuIChiLm1hc3MgfHwgSW5maW5pdHkpIDwgKGEubWFzcyB8fCBJbmZpbml0eSkgPyBiIDogYTsNCiAgICAgICAgfSk7DQogICAgICAgIHZhciBiZXN0TG9hZE1hc3MgPSByZXN1bHRzLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgew0KICAgICAgICAgICAgcmV0dXJuIChiLmxvYWRQZXJNYXNzIHx8IDApID4gKGEubG9hZFBlck1hc3MgfHwgMCkgPyBiIDogYTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZWxzLmNsYXNzaWZpY2F0aW9ucy5pbm5lckhUTUwgPQ0KICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN3ci1jbGFzcy1jYXJkIj48c3BhbiBjbGFzcz0ic3dyLWNsYXNzLWxhYmVsIj5CZXN0ICcgKyBjLmxhYmVsICsgJzwvc3Bhbj4nICsNCiAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ic3dyLWNsYXNzLXZhbHVlIj4nICsgYmVzdC5uYW1lICsgJzwvc3Bhbj48L2Rpdj4nICsNCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzd3ItY2xhc3MtY2FyZCI+PHNwYW4gY2xhc3M9InN3ci1jbGFzcy1sYWJlbCI+SGlnaGVzdCBTcGVjaWZpYyBTdHJlbmd0aDwvc3Bhbj4nICsNCiAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ic3dyLWNsYXNzLXZhbHVlIj4nICsgYmVzdFNwZWMubmFtZSArICc8L3NwYW4+PC9kaXY+JyArDQogICAgICAgICAgICAnPGRpdiBjbGFzcz0ic3dyLWNsYXNzLWNhcmQiPjxzcGFuIGNsYXNzPSJzd3ItY2xhc3MtbGFiZWwiPkxpZ2h0ZXN0IENvbXBvbmVudDwvc3Bhbj4nICsNCiAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ic3dyLWNsYXNzLXZhbHVlIj4nICsgbGlnaHRlc3QubmFtZSArICc8L3NwYW4+PC9kaXY+JyArDQogICAgICAgICAgICAnPGRpdiBjbGFzcz0ic3dyLWNsYXNzLWNhcmQiPjxzcGFuIGNsYXNzPSJzd3ItY2xhc3MtbGFiZWwiPkJlc3QgTG9hZCBwZXIgTWFzczwvc3Bhbj4nICsNCiAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ic3dyLWNsYXNzLXZhbHVlIj4nICsgYmVzdExvYWRNYXNzLm5hbWUgKyAnPC9zcGFuPjwvZGl2Pic7DQogICAgfQ0KDQogICAgZnVuY3Rp\"+\"b24gaXNCZXN0KHJlc3VsdHMsIGtleSwgcikgew0KICAgICAgICB2YXIgaGlnaGVyS2V5cyA9IFsnc3BlY2lmaWNZaWVsZCcsICdzcGVjaWZpY1RlbnNpbGUnLCAnc3BlY2lmaWNDb21wcmVzc2l2ZScsICdzcGVjaWZpY1NlbGVjdGVkJywNCiAgICAgICAgICAgICdkZXNpZ25TcGVjaWZpYycsICdGeScsICdGdXQnLCAnRmMnLCAnRmFsbG93JywgJ2xvYWRQZXJNYXNzJywgJ3JlbGF0aXZlUGVyZicsICd3ZWlnaHRTYXZpbmcnXTsNCiAgICAgICAgdmFyIGxvd2VyS2V5cyA9IFsnbWFzcyddOw0KICAgICAgICB2YXIgdmFscyA9IHJlc3VsdHMubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4W2tleV07IH0pLmZpbHRlcihmdW5jdGlvbiAodikgeyByZXR1cm4gdiAhPT0gbnVsbCAmJiBpc0Zpbml0ZSh2KTsgfSk7DQogICAgICAgIGlmICghdmFscy5sZW5ndGgpIHJldHVybiBmYWxzZTsNCiAgICAgICAgdmFyIHZhbCA9IHJba2V5XTsNCiAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCAhaXNGaW5pdGUodmFsKSkgcmV0dXJuIGZhbHNlOw0KICAgICAgICBpZiAoaGlnaGVyS2V5cy5pbmRleE9mKGtleSkgIT09IC0xKSByZXR1cm4gdmFsID49IE1hdGgubWF4LmFwcGx5KG51bGwsIHZhbHMpOw0KICAgICAgICBpZiAobG93ZXJLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHJldHVybiB2YWwgPD0gTWF0aC5taW4uYXBwbHkobnVsbCwgdmFscyk7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByZW5kZXJUYWJsZShkYXRhKSB7DQogICAgICAgIHZhciB1ID0gZ2V0VW5pdHMoKTsNCiAgICAgICAgdmFyIHJlc3VsdHMgPSBkYXRhLnJlc3VsdHM7DQogICAgICAgIHZhciBtb2RlID0gZWxzLmNhbGNNb2RlLnZhbHVlOw0KICAgICAgICB2YXIgaGlnaGxpZ2h0Um93cyA9IE1PREVfUk9XU1ttb2RlXSB8fCBbXTsNCiAgICAgICAgdmFyIGJhc2lzID0gZWxzLnN0cmVuZ3RoQmFzaXMudmFsdWU7DQogICAgICAgIHZhciBiYXNpc0xhYmVsID0geyB5aWVsZDogJ1lpZWxkJywgdWx0aW1hdGU6ICdVbHRpbWF0ZSBUZW5zaWxlJywgY29tcHJlc3NpdmU6ICdDb21wcmVzc2l2ZScsIGN1c3RvbTogJ0N1c3RvbScgfVtiYXNpc107DQoNCiAgICAgICAgdmFyIHJvd0RlZnMgPSBbDQogICAgICAgICAgICB7IGtleTogJ3JobycsIGxhYmVsOiAnRGVuc2l0eScsIGZtdDogZnVuY3Rpb24gKHIpIHsgcmV0dXJuIGZtdCh1LnJob3RvRGlzcGxheShyLnJobyksIDEpICsgJyAnICsgdS5kZW5zaXR5OyB9IH0sDQogICAgICAgICAgICB7IGtleTogJ1NyZWYnLCBsYWJlbDogJ1NlbGVjdGVkIFN0cmVuZ3RoICgnICsgYmFzaXNMYWJlbCArICcpJywgZm10OiBmdW5jdGlvbiAocikgeyByZXR1cm4gZm10KHUuc3RyZXNzVG9EaXNwbGF5KHIuU3JlZiksIDEpICsgJyAnICsgdS5zdHJlc3M7IH0gfSwNCiAgICAgICAgICAgIHsga2V5OiAnc3BlY2lmaWNTZWxlY3RlZCcsIGxhYmVsOiAnU3BlY2lmaWMgU3RyZW5ndGggKFMvz4EpJywgZm10OiBmdW5j\"+\"dGlvbiAocikgeyByZXR1cm4gci5zcGVjaWZpY1NlbGVjdGVkID4gMCA\/IGZtdCh1LnNwZWNpZmljVG9EaXNwbGF5KHIuc3BlY2lmaWNTZWxlY3RlZCksIDIpICsgJyAnICsgdS5zcGVjaWZpY1VuaXQgOiAn4oCUJzsgfSB9LA0KICAgICAgICAgICAgeyBrZXk6ICdkZXNpZ25TcGVjaWZpYycsIGxhYmVsOiAnRGVzaWduIFNwZWNpZmljIFN0cmVuZ3RoJywgZm10OiBmdW5jdGlvbiAocikgeyByZXR1cm4gci5kZXNpZ25TcGVjaWZpYyA+IDAgPyBmbXQodS5zcGVjaWZpY1RvRGlzcGxheShyLmRlc2lnblNwZWNpZmljKSwgMikgKyAnICcgKyB1LnNwZWNpZmljVW5pdCA6ICfigJQnOyB9IH0sDQogICAgICAgICAgICB7IGtleTogJ3NwZWNpZmljWWllbGQnLCBsYWJlbDogJ1NwZWNpZmljIFlpZWxkIChTeS\/PgSknLCBmbXQ6IGZ1bmN0aW9uIChyKSB7IHJldHVybiByLnNwZWNpZmljWWllbGQgPiAwID8gZm10KHUuc3BlY2lmaWNUb0Rpc3BsYXkoci5zcGVjaWZpY1lpZWxkKSwgMikgKyAnICcgKyB1LnNwZWNpZmljVW5pdCA6ICfigJQnOyB9IH0sDQogICAgICAgICAgICB7IGtleTogJ3NwZWNpZmljVGVuc2lsZScsIGxhYmVsOiAnU3BlY2lmaWMgVGVuc2lsZSAoU3V0L8+BKScsIGZtdDogZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIuc3BlY2lmaWNUZW5zaWxlID4gMCA\/IGZtdCh1LnNwZWNpZmljVG9EaXNwbGF5KHIuc3BlY2lmaWNUZW5zaWxlKSwgMikgKyAnICcgKyB1LnNwZWNpZmljVW5pdCA6ICfigJQnOyB9IH0sDQogICAgICAgICAgICB7IGtleTogJ3NwZWNpZmljQ29tcHJlc3NpdmUnLCBsYWJlbDogJ1NwZWNpZmljIENvbXByZXNzaXZlIChTYy\/PgSknLCBmbXQ6IGZ1bmN0aW9uIChyKSB7IHJldHVybiByLnNwZWNpZmljQ29tcHJlc3NpdmUgPiAwID8gZm10KHUuc3BlY2lmaWNUb0Rpc3BsYXkoci5zcGVjaWZpY0NvbXByZXNzaXZlKSwgMikgKyAnICcgKyB1LnNwZWNpZmljVW5pdCA6ICfigJQnOyB9IH0sDQogICAgICAgICAgICB7IGtleTogJ1YnLCBsYWJlbDogJ0NvbXBvbmVudCBWb2x1bWUnLCBmbXQ6IGZ1bmN0aW9uIChyKSB7IHJldHVybiBmbXQodS52b2x1bWVUb0Rpc3BsYXkoci5WKSwgMikgKyAnICcgKyB1LnZvbHVtZTsgfSB9LA0KICAgICAgICAgICAgeyBrZXk6ICdtYXNzJywgbGFiZWw6ICdDb21wb25lbnQgTWFzcycsIGZtdDogZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIubWFzcyA+IDAgPyBmbXQodS5tYXNzVG9EaXNwbGF5KHIubWFzcyksIDQpICsgJyAnICsgdS5tYXNzIDogJ+KAlCc7IH0gfSwNCiAgICAgICAgICAgIHsga2V5OiAnRnknLCBsYWJlbDogJ1lpZWxkIExvYWQnLCBmbXQ6IGZ1bmN0aW9uIChyKSB7IHJldHVybiByLkZ5ID4gMCA\/IGZtdCh1LmZvcmNlVG9EaXNwbGF5KHIuRnkpLCAyKSArICcgJyArIHUuZm9yY2UgOiAn4oCUJzsgfSB9LA0KICAgICAgICAgICAgeyBrZXk6ICdGdXQnLCBsYWJlbDogJ1VsdGltYXRlIExvYWQnLCBmbXQ6IGZ1bmN0aW9uIChyKSB7IHJldHVybiByLkZ1dCA+IDAgPyBmbXQodS5m\"+\"b3JjZVRvRGlzcGxheShyLkZ1dCksIDIpICsgJyAnICsgdS5mb3JjZSA6ICfigJQnOyB9IH0sDQogICAgICAgICAgICB7IGtleTogJ0ZhbGxvdycsIGxhYmVsOiAnQWxsb3dhYmxlIExvYWQnLCBmbXQ6IGZ1bmN0aW9uIChyKSB7IHJldHVybiByLkZhbGxvdyA+IDAgPyBmbXQodS5mb3JjZVRvRGlzcGxheShyLkZhbGxvdyksIDIpICsgJyAnICsgdS5mb3JjZSA6ICfigJQnOyB9IH0sDQogICAgICAgICAgICB7IGtleTogJ2xvYWRQZXJNYXNzJywgbGFiZWw6ICdMb2FkIENhcGFjaXR5IHBlciBNYXNzJywgZm10OiBmdW5jdGlvbiAocikgeyByZXR1cm4gci5sb2FkUGVyTWFzcyA+IDAgPyBmbXQodS5sb2FkUGVyTWFzc1RvRGlzcGxheShyLmxvYWRQZXJNYXNzKSwgMikgKyAnICcgKyB1LmxvYWRQZXJNYXNzVW5pdCA6ICfigJQnOyB9IH0sDQogICAgICAgICAgICB7IGtleTogJ3JlbGF0aXZlUGVyZicsIGxhYmVsOiAnUmVsYXRpdmUgUGVyZm9ybWFuY2UgKCUpJywgZm10OiBmdW5jdGlvbiAocikgeyByZXR1cm4gci5yZWxhdGl2ZVBlcmYgIT09IG51bGwgPyBmbXQoci5yZWxhdGl2ZVBlcmYsIDEpICsgJyUnIDogJ+KAlCc7IH0gfSwNCiAgICAgICAgICAgIHsga2V5OiAnd2VpZ2h0U2F2aW5nJywgbGFiZWw6ICdXZWlnaHQgU2F2aW5nICglKScsIGZtdDogZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIud2VpZ2h0U2F2aW5nICE9PSBudWxsID8gZm10KHIud2VpZ2h0U2F2aW5nLCAxKSArICclJyA6ICfigJQnOyB9IH0sDQogICAgICAgICAgICB7IGtleTogJ3JhbmsnLCBsYWJlbDogJ01hdGVyaWFsIFJhbmtpbmcnLCBmbXQ6IGZ1bmN0aW9uIChyKSB7IHJldHVybiBvcmRpbmFsKHIucmFuayk7IH0gfQ0KICAgICAgICBdOw0KDQogICAgICAgIHZhciB0aGVhZCA9ICc8dHI+PHRoPk1ldHJpYzwvdGg+JyArIHJlc3VsdHMubWFwKGZ1bmN0aW9uIChyKSB7DQogICAgICAgICAgICByZXR1cm4gJzx0aD4nICsgci5uYW1lICsgKHIuaXNSZWYgPyAnIOKYhScgOiAnJykgKyAnPC90aD4nOw0KICAgICAgICB9KS5qb2luKCcnKSArICc8L3RyPic7DQoNCiAgICAgICAgdmFyIHRib2R5ID0gcm93RGVmcy5tYXAoZnVuY3Rpb24gKHJvdykgew0KICAgICAgICAgICAgdmFyIGNscyA9IGhpZ2hsaWdodFJvd3MuaW5kZXhPZihyb3cua2V5KSAhPT0gLTEgPyAnIGNsYXNzPSJzd3ItaGlnaGxpZ2h0IicgOiAnJzsNCiAgICAgICAgICAgIHZhciBjZWxscyA9IHJlc3VsdHMubWFwKGZ1bmN0aW9uIChyKSB7DQogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHJvdy5mbXQocik7DQogICAgICAgICAgICAgICAgdmFyIGJlc3QgPSBpc0Jlc3QocmVzdWx0cywgcm93LmtleSwgcik7DQogICAgICAgICAgICAgICAgcmV0dXJuICc8dGQnICsgKGJlc3QgPyAnIGNsYXNzPSJzd3ItYmVzdCInIDogJycpICsgJz4nICsgdmFsICsgJzwvdGQ+JzsNCiAgICAgICAgICAgIH0pLmpvaW4oJycpOw0KICAgICAgICAgICAgcmV0dXJuICc8dHInICsgY2xzICsgJz48dGQ+JyArIHJvdy5sYWJl\"+\"bCArICc8L3RkPicgKyBjZWxscyArICc8L3RyPic7DQogICAgICAgIH0pLmpvaW4oJycpOw0KDQogICAgICAgIGVscy5yZXN1bHRzVGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKS5pbm5lckhUTUwgPSB0aGVhZDsNCiAgICAgICAgZWxzLnJlc3VsdHNUYWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpLmlubmVySFRNTCA9IHRib2R5Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsNCiAgICAgICAgdmFyIGRhdGEgPSBjb21wdXRlUmVzdWx0cygpOw0KICAgICAgICBpZiAoIWRhdGEub2spIHsNCiAgICAgICAgICAgIHJlbmRlcldhcm5pbmdzKGRhdGEud2FybmluZ3MpOw0KICAgICAgICAgICAgZWxzLnJlc3VsdHNQYW5lbC5jbGFzc0xpc3QuYWRkKCdzd3ItaGlkZGVuJyk7DQogICAgICAgICAgICBpZiAoZGF0YS53YXJuaW5ncy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICBlbHMud2FybmluZ3Muc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICByZW5kZXJDbGFzc2lmaWNhdGlvbnMoZGF0YSk7DQogICAgICAgIHJlbmRlclRhYmxlKGRhdGEpOw0KICAgICAgICBpZiAoZGF0YS53YXJuaW5ncy5sZW5ndGgpIHsNCiAgICAgICAgICAgIHJlbmRlcldhcm5pbmdzKGRhdGEud2FybmluZ3MpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZWxzLndhcm5pbmdzLmhpZGRlbiA9IHRydWU7DQogICAgICAgICAgICBlbHMud2FybmluZ3MuaW5uZXJIVE1MID0gJyc7DQogICAgICAgIH0NCiAgICAgICAgZWxzLnJlc3VsdHNQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCdzd3ItaGlkZGVuJyk7DQogICAgICAgIGVscy5yZXN1bHRzUGFuZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7DQogICAgICAgIGVscy51bml0U3lzdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICAgICAgICAgIHJlbmRlck1hdGVyaWFscygpOw0KICAgICAgICB9KTsNCiAgICAgICAgZWxzLmdlb21ldHJ5TW9kZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZW5kZXJNYXRlcmlhbHMoKTsNCiAgICAgICAgICAgIHVwZGF0ZVZpc2liaWxpdHkoKTsNCiAgICAgICAgfSk7DQogICAgICAgIGVscy5jb21wb25lbnRUeXBlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHN5bmNDb21wb25lbnRUeXBlKTsNCiAgICAgICAgZWxzLnNlY3Rpb25UeXBlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZVZpc2liaWxpdHkpOw0KDQogICAgICAgIGVscy5hZGRNYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0\"+\"aW9uICgpIHsNCiAgICAgICAgICAgIGlmIChtYXRlcmlhbHMubGVuZ3RoID49IDYpIHJldHVybjsNCiAgICAgICAgICAgIG1hdGVyaWFscy5wdXNoKGNyZWF0ZU1hdGVyaWFsKCdjdXN0b20nLCBmYWxzZSkpOw0KICAgICAgICAgICAgcmVuZGVyTWF0ZXJpYWxzKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGlmIChlbHMucHJlc2V0U2VhcmNoKSB7DQogICAgICAgICAgICBlbHMucHJlc2V0U2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHFzYSgnLnN3ci1tYXQtcHJlc2V0JykuZm9yRWFjaChmdW5jdGlvbiAoc2VsLCBpKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gbWF0ZXJpYWxzW2ldID8gbWF0ZXJpYWxzW2ldLnByZXNldCA6ICdjdXN0b20nOw0KICAgICAgICAgICAgICAgICAgICBzZWwuaW5uZXJIVE1MID0gZ2V0UHJlc2V0T3B0aW9ucyhjdXJyZW50LCBlbHMucHJlc2V0U2VhcmNoLnZhbHVlKTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgZWxzLm1hdGVyaWFsc0NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgdmFyIHQgPSBlLnRhcmdldDsNCiAgICAgICAgICAgIGlmICh0LmNsYXNzTGlzdC5jb250YWlucygnc3dyLW1hdC1wcmVzZXQnKSkgew0KICAgICAgICAgICAgICAgIGFwcGx5UHJlc2V0KHBhcnNlSW50KHQuZGF0YXNldC5pZHgsIDEwKSwgdC52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodC5jbGFzc0xpc3QuY29udGFpbnMoJ3N3ci1tYXQtc2VjdGlvbicpKSB7DQogICAgICAgICAgICAgICAgdmFyIGlkeCA9IHBhcnNlSW50KHQuZGF0YXNldC5pZHgsIDEwKTsNCiAgICAgICAgICAgICAgICBtYXRlcmlhbHNbaWR4XS5nZW9tLnNlY3Rpb25UeXBlID0gdC52YWx1ZTsNCiAgICAgICAgICAgICAgICB1cGRhdGVNYXRHZW9tVmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzd3ItcmVmLXJhZGlvJykpIHsNCiAgICAgICAgICAgICAgICBtYXRlcmlhbHMuZm9yRWFjaChmdW5jdGlvbiAobSwgaSkgeyBtLmlzUmVmID0gKGkgPT09IHBhcnNlSW50KHQudmFsdWUsIDEwKSk7IH0pOw0KICAgICAgICAgICAgICAgIHJlZkluZGV4ID0gcGFyc2VJbnQodC52YWx1ZSwgMTApOw0KICAgICAgICAgICAgICAgIHFzYSgnLnN3ci1tYXRlcmlhbC1jYXJkJykuZm9yRWFjaChmdW5jdGlvbiAoYywgaSkgew0KICAgICAgICAgICAgICAgICAgICBjLmNsYXNzTGlzdC50b2dnbGUoJ3N3ci1yZWYnLCBpID09PSByZWZJbmRleCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy5tYXRlcmlhbHNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlv\"+\"biAoZSkgew0KICAgICAgICAgICAgdmFyIHQgPSBlLnRhcmdldDsNCiAgICAgICAgICAgIGlmICh0LmNsYXNzTGlzdC5jb250YWlucygnc3dyLXJlbW92ZS1tYXQnKSkgew0KICAgICAgICAgICAgICAgIHZhciBpZHggPSBwYXJzZUludCh0LmRhdGFzZXQuaWR4LCAxMCk7DQogICAgICAgICAgICAgICAgaWYgKG1hdGVyaWFscy5sZW5ndGggPD0gMikgcmV0dXJuOw0KICAgICAgICAgICAgICAgIHJlYWRNYXRlcmlhbHNGcm9tRE9NKCk7DQogICAgICAgICAgICAgICAgbWF0ZXJpYWxzLnNwbGljZShpZHgsIDEpOw0KICAgICAgICAgICAgICAgIGlmIChyZWZJbmRleCA+PSBtYXRlcmlhbHMubGVuZ3RoKSByZWZJbmRleCA9IDA7DQogICAgICAgICAgICAgICAgbWF0ZXJpYWxzW3JlZkluZGV4XS5pc1JlZiA9IHRydWU7DQogICAgICAgICAgICAgICAgcmVuZGVyTWF0ZXJpYWxzKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodC5jbGFzc0xpc3QuY29udGFpbnMoJ3N3ci1kdXAtbWF0JykpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGkgPSBwYXJzZUludCh0LmRhdGFzZXQuaWR4LCAxMCk7DQogICAgICAgICAgICAgICAgcmVhZE1hdGVyaWFsc0Zyb21ET00oKTsNCiAgICAgICAgICAgICAgICB2YXIgY29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobWF0ZXJpYWxzW2RpXSkpOw0KICAgICAgICAgICAgICAgIGNvcHkuaWQgPSBuZXh0SWQrKzsNCiAgICAgICAgICAgICAgICBjb3B5LmlzUmVmID0gZmFsc2U7DQogICAgICAgICAgICAgICAgbWF0ZXJpYWxzLnNwbGljZShkaSArIDEsIDAsIGNvcHkpOw0KICAgICAgICAgICAgICAgIHJlbmRlck1hdGVyaWFscygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzd3ItdXAtbWF0JykpIHsNCiAgICAgICAgICAgICAgICB2YXIgdWkgPSBwYXJzZUludCh0LmRhdGFzZXQuaWR4LCAxMCk7DQogICAgICAgICAgICAgICAgaWYgKHVpIDw9IDApIHJldHVybjsNCiAgICAgICAgICAgICAgICByZWFkTWF0ZXJpYWxzRnJvbURPTSgpOw0KICAgICAgICAgICAgICAgIHZhciB0bXAgPSBtYXRlcmlhbHNbdWldOw0KICAgICAgICAgICAgICAgIG1hdGVyaWFsc1t1aV0gPSBtYXRlcmlhbHNbdWkgLSAxXTsNCiAgICAgICAgICAgICAgICBtYXRlcmlhbHNbdWkgLSAxXSA9IHRtcDsNCiAgICAgICAgICAgICAgICBpZiAocmVmSW5kZXggPT09IHVpKSByZWZJbmRleCA9IHVpIC0gMTsNCiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZJbmRleCA9PT0gdWkgLSAxKSByZWZJbmRleCA9IHVpOw0KICAgICAgICAgICAgICAgIHJlbmRlck1hdGVyaWFscygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzd3ItZG93bi1tYXQnKSkgew0KICAgICAgICAgICAgICAgIHZhciBkbmkgPSBwYXJzZUludCh0LmRhdGFzZXQuaWR4LCAxMCk7DQogICAgICAgICAgICAgICAgaWYgKGRuaSA+PSBtYXRlcmlh\"+\"bHMubGVuZ3RoIC0gMSkgcmV0dXJuOw0KICAgICAgICAgICAgICAgIHJlYWRNYXRlcmlhbHNGcm9tRE9NKCk7DQogICAgICAgICAgICAgICAgdmFyIHRtcDIgPSBtYXRlcmlhbHNbZG5pXTsNCiAgICAgICAgICAgICAgICBtYXRlcmlhbHNbZG5pXSA9IG1hdGVyaWFsc1tkbmkgKyAxXTsNCiAgICAgICAgICAgICAgICBtYXRlcmlhbHNbZG5pICsgMV0gPSB0bXAyOw0KICAgICAgICAgICAgICAgIGlmIChyZWZJbmRleCA9PT0gZG5pKSByZWZJbmRleCA9IGRuaSArIDE7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmSW5kZXggPT09IGRuaSArIDEpIHJlZkluZGV4ID0gZG5pOw0KICAgICAgICAgICAgICAgIHJlbmRlck1hdGVyaWFscygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICBlbHMuY2FsY0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNhbGN1bGF0ZSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaW5pdCgpIHsNCiAgICAgICAgaWYgKCFjYWNoZUVsZW1lbnRzKCkpIHJldHVybjsNCiAgICAgICAgaWYgKHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXN3ci1yZWFkeScpID09PSAnMScpIHJldHVybjsNCiAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3dyLXJlYWR5JywgJzEnKTsNCiAgICAgICAgaW5pdE1hdGVyaWFscygpOw0KICAgICAgICByZW5kZXJNYXRlcmlhbHMoKTsNCiAgICAgICAgc3luY0NvbXBvbmVudFR5cGUoKTsNCiAgICAgICAgdXBkYXRlVmlzaWJpbGl0eSgpOw0KICAgICAgICB1cGRhdGVVbml0TGFiZWxzKCk7DQogICAgICAgIGJpbmRFdmVudHMoKTsNCiAgICB9DQoNCiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7DQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbml0KTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBpbml0KCk7DQogICAgfQ0KfSkoKTsNCg==\";\n  try{(new Function(atob(b)))();}catch(e){}\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Strength-to-Weight Ratio Calcilator is a practical engineering tool designed to compare material strength relative to weight and density. It helps engineers evaluate specific tensile&#8230;<\/p>","protected":false},"author":2,"featured_media":24811,"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":[8675,8487,8678,8677],"class_list":["post-24810","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-lightweight-design","tag-material-strength","tag-specific-strength","tag-weight-ratio","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/09\/Strength-to-Weight-Ratio-Calcilator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts\/24810","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/comments?post=24810"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts\/24810\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/media\/24811"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/media?parent=24810"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/categories?post=24810"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/tags?post=24810"}],"curies":[{"name":"\u0648\u0648\u0631\u062f\u0628\u0631\u064a\u0633","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}