{"id":24685,"date":"2026-08-18T05:50:44","date_gmt":"2026-08-18T05:50:44","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24685"},"modified":"2026-08-18T05:50:47","modified_gmt":"2026-08-18T05:50:47","slug":"bolt-tensile-strength-check-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/pt\/bolt-tensile-strength-check-calculator\/","title":{"rendered":"Bolt Tensile Strength Check Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Bolt Tensile Strength Check Calculator<\/strong> is a professional engineering tool designed to evaluate the tensile strength and load-bearing capacity of bolts under different working conditions. By analyzing key parameters such as bolt diameter, material strength, applied tensile load, and safety factor, it helps engineers verify whether a bolt can safely withstand the required force. The Bolt Tensile Strength Check Calculator supports fastener selection, mechanical design, and structural safety evaluation while reducing the risks of bolt fracture, excessive stress, and connection failure.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <meta name=\"description\" content=\"Bolt Tensile Strength Check Calculator for engineers. Calculate bolt tensile stress, load capacity, allowable tensile load, and safety factor. Bolt Stress Calculator and Fastener Strength Analysis Tool with metric and imperial units.\" \/>\n  <title>Bolt Tensile Strength Check Calculator | Bolt Load Capacity &amp; Safety Factor<\/title>\n  <style>\n    body:has(> #bts-root:only-child) { margin: 0; padding: 0; background: #e8eef4; }\n  <\/style>\n<\/head>\n<body>\n<!--\n  WordPress embed: copy the entire #bts-root div (style + markup + script)\n  into a Custom HTML block. Paste the whole #bts-root block in Code Editor mode and replace any old copy. Do not re-save in Visual mode. If a cache plugin delays scripts, exclude bts-js-b64 and bts-boot-script.\n  All CSS is scoped to #bts-root and will not affect theme header, footer, or other content.\n-->\n<div id=\"bts-root\">\n<style id=\"bts-calc-styles\">\n\/*\n * WordPress-safe: every rule is scoped under #bts-root.\n * This stylesheet must not restyle theme header, footer, or content\n * outside the calculator. No html\/body\/universal selectors.\n *\/\n\n#bts-root {\n  all: revert;\n  --bts-bg: transparent;\n  --bts-surface: #ffffff;\n  --bts-surface-2: #f4f7fa;\n  --bts-ink: #0f172a;\n  --bts-muted: #64748b;\n  --bts-line: #d4dde8;\n  --bts-accent: #0369a1;\n  --bts-accent-2: #0284c7;\n  --bts-steel: #1e293b;\n  --bts-ok: #059669;\n  --bts-ok-bg: #ecfdf5;\n  --bts-warn: #d97706;\n  --bts-warn-bg: #fffbeb;\n  --bts-risk: #dc2626;\n  --bts-risk-bg: #fef2f2;\n  --bts-radius: 10px;\n  --bts-shadow: 0 1px 3px rgba(15, 23, 42, 0.06), 0 8px 24px rgba(15, 23, 42, 0.06);\n  --bts-mono: ui-monospace, \"Cascadia Mono\", \"Segoe UI Mono\", Consolas, monospace;\n  --bts-sans: \"Segoe UI\", system-ui, -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif;\n\n  box-sizing: border-box;\n  display: block;\n  isolation: isolate;\n  contain: layout style;\n  float: none;\n  position: relative;\n  z-index: auto;\n  font-family: var(--bts-sans);\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.5;\n  color: var(--bts-ink);\n  background: var(--bts-bg);\n  width: 1000px;\n  max-width: 100%;\n  margin: 0 auto;\n  padding: 1.25rem 1rem 2rem;\n  text-align: left;\n  letter-spacing: normal;\n  text-transform: none;\n}\n\n#bts-root *,\n#bts-root *::before,\n#bts-root *::after { box-sizing: border-box; }\n\n#bts-root h1, #bts-root h2, #bts-root h3, #bts-root h4,\n#bts-root p, #bts-root ul, #bts-root ol, #bts-root li,\n#bts-root figure, #bts-root blockquote, #bts-root section,\n#bts-root header, #bts-root footer, #bts-root div, #bts-root span,\n#bts-root strong, #bts-root em, #bts-root i, #bts-root b {\n  margin: 0; padding: 0; border: none; background: none; box-shadow: none;\n  font-family: inherit; font-size: inherit; font-weight: inherit; font-style: inherit;\n  line-height: inherit; color: inherit; letter-spacing: inherit; text-transform: none;\n  text-decoration: none; float: none;\n}\n\n#bts-root button, #bts-root input, #bts-root select, #bts-root textarea, #bts-root label {\n  font: inherit; color: inherit; margin: 0; max-width: none; min-width: 0; float: none;\n}\n#bts-root button {\n  cursor: pointer; background: transparent; border: none; padding: 0;\n  box-shadow: none; text-decoration: none; appearance: none; -webkit-appearance: none;\n}\n#bts-root img, #bts-root svg { display: block; max-width: 100%; height: auto; }\n#bts-root a { color: var(--bts-accent); text-decoration: none; }\n#bts-root a:hover { text-decoration: underline; }\n#bts-root ul, #bts-root ol { padding-left: 1.2rem; }\n#bts-root li { margin: 0.28rem 0; }\n#bts-root strong { font-weight: 700; }\n#bts-root sub, #bts-root sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }\n#bts-root sub { bottom: -0.2em; }\n#bts-root sup { top: -0.45em; }\n#bts-root .bts-mono { font-family: var(--bts-mono); }\n#bts-root #bts-js-b64 {\n  display: none !important;\n  width: 0 !important;\n  height: 0 !important;\n  border: 0 !important;\n  padding: 0 !important;\n  position: absolute !important;\n  left: -9999px !important;\n}\n#bts-root .bts-hidden { display: none !important; }\n\n#bts-root .bts-layout {\n  display: flex;\n  flex-direction: column;\n  gap: 1.15rem;\n}\n\n#bts-root .bts-card {\n  background: var(--bts-surface);\n  border: 1px solid var(--bts-line);\n  border-radius: var(--bts-radius);\n  box-shadow: var(--bts-shadow);\n  overflow: visible;\n}\n#bts-root .bts-card-h {\n  display: flex !important; align-items: center !important; justify-content: space-between !important; gap: 0.75rem !important;\n  padding: 0.72rem 1rem;\n  background: linear-gradient(180deg, #f8fafc, #f1f5f9);\n  border-bottom: 1px solid var(--bts-line);\n  flex-wrap: wrap;\n  position: relative;\n  z-index: 2;\n  overflow: visible;\n}\n#bts-root .bts-card-h h2 {\n  font-size: 0.72rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;\n  color: var(--bts-steel);\n  width: auto !important; max-width: none !important; flex: 0 1 auto !important;\n  position: static !important; pointer-events: none;\n}\n#bts-root .bts-card-b { padding: 0.95rem 1rem 1.1rem; }\n\n#bts-root .bts-section {\n  font-size: 0.78rem; font-weight: 700; color: var(--bts-ink);\n  margin: 1.05rem 0 0.65rem; padding: 0 0 0.3rem;\n  border-bottom: 1px dashed var(--bts-line);\n  display: flex; align-items: center; gap: 0.45rem;\n}\n#bts-root .bts-section:first-child { margin-top: 0; }\n#bts-root .bts-badge {\n  width: 1.35rem; height: 1.35rem; border-radius: 999px; flex-shrink: 0;\n  display: inline-flex; align-items: center; justify-content: center;\n  background: linear-gradient(135deg, #0f172a, #334155); color: #fff;\n  font-size: 0.65rem; font-weight: 700;\n}\n\n#bts-root .bts-grid { display: grid; gap: 0.7rem 0.75rem; }\n#bts-root .bts-g-2 { grid-template-columns: 1fr 1fr; }\n#bts-root .bts-g-3 { grid-template-columns: 1fr 1fr 1fr; }\n@media (max-width: 640px) {\n  #bts-root .bts-g-2, #bts-root .bts-g-3 { grid-template-columns: 1fr; }\n}\n\n#bts-root label.bts-fld { display: flex; flex-direction: column; gap: 0.28rem; min-width: 0; }\n#bts-root label.bts-fld > span.bts-lbl {\n  font-size: 0.75rem; font-weight: 600; color: #334155;\n  display: flex; align-items: center; gap: 0.3rem; flex-wrap: wrap;\n}\n#bts-root .bts-hint { font-size: 0.68rem; color: var(--bts-muted); font-weight: 400; }\n\n#bts-root input[type=\"number\"],\n#bts-root input[type=\"text\"] {\n  appearance: none; -webkit-appearance: none; width: 100%;\n  border: 1px solid #cbd5e1; border-radius: 8px;\n  padding: 0.5rem 0.7rem; font-size: 0.8125rem; background: #fff; color: #0f172a;\n  font-family: var(--bts-mono); box-shadow: none; line-height: 1.25;\n}\n#bts-root input[type=\"number\"]::-webkit-outer-spin-button,\n#bts-root input[type=\"number\"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }\n#bts-root input[type=\"number\"] { -moz-appearance: textfield; appearance: textfield; }\n\n#bts-root select {\n  display: block !important; width: 100% !important; min-height: 2.45rem !important;\n  margin: 0 !important; padding: 0.48rem 2rem 0.48rem 0.7rem !important;\n  border: 1px solid #cbd5e1 !important; border-radius: 8px !important;\n  background-color: #fff !important; color: #0f172a !important;\n  font-size: 0.8125rem !important; font-family: var(--bts-mono) !important;\n  line-height: 1.25 !important; box-shadow: none !important;\n  appearance: auto !important; -webkit-appearance: menulist !important;\n}\n#bts-root input:focus, #bts-root select:focus {\n  outline: 2px solid #38bdf8; outline-offset: 0; border-color: #0ea5e9;\n}\n#bts-root input:disabled, #bts-root input[readonly] { background: #f8fafc; color: #0f172a; }\n#bts-root input.bts-invalid { border-color: #ef4444; background: #fef2f2; }\n#bts-root .bts-err {\n  font-size: 0.68rem; color: var(--bts-risk); min-height: 0.85rem; line-height: 1.3;\n}\n\n#bts-root .bts-input-row {\n  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.4rem; align-items: stretch;\n}\n#bts-root .bts-unit-pill {\n  display: inline-flex; align-items: center; justify-content: center;\n  min-width: 3.4rem; padding: 0 0.55rem; border: 1px solid #cbd5e1; border-radius: 8px;\n  background: #f8fafc; color: var(--bts-muted); font-size: 0.72rem; font-weight: 600;\n  font-family: var(--bts-mono); white-space: nowrap;\n}\n\n#bts-root .bts-check {\n  display: flex; align-items: center; gap: 0.45rem;\n  font-size: 0.75rem; color: #334155; font-weight: 500; margin-top: 0.15rem;\n}\n#bts-root .bts-check input { width: 0.95rem; height: 0.95rem; accent-color: #0284c7; flex-shrink: 0; }\n\n#bts-root .bts-tools {\n  display: flex !important; align-items: center !important; gap: 0.5rem !important; flex-shrink: 0 !important;\n  position: relative !important; z-index: 5 !important; margin-left: auto;\n  pointer-events: auto !important;\n}\n#bts-root .bts-unit-switch {\n  display: inline-flex !important; align-items: center !important; gap: 2px !important; padding: 3px !important;\n  border-radius: 8px !important; background: #0f172a !important; border: 1px solid #1e293b !important;\n  position: relative !important; z-index: 6 !important; pointer-events: auto !important;\n}\n#bts-root .bts-unit-switch .bts-unit-btn {\n  appearance: none !important; -webkit-appearance: none !important;\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  margin: 0 !important; padding: 0.4rem 0.85rem !important; border: none !important; border-radius: 6px !important;\n  background: transparent !important; color: #cbd5e1 !important; font-size: 0.8125rem !important; font-weight: 500 !important;\n  font-family: inherit !important; cursor: pointer !important; line-height: 1.25 !important;\n  pointer-events: auto !important; position: relative !important; z-index: 7 !important;\n}\n#bts-root .bts-unit-switch .bts-unit-btn:hover { color: #fff !important; }\n#bts-root .bts-unit-switch .bts-unit-btn.bts-is-active { background: #0ea5e9 !important; color: #fff !important; font-weight: 600 !important; }\n\n#bts-root .bts-reset-btn {\n  appearance: none !important; -webkit-appearance: none !important;\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  margin: 0 !important; padding: 0.4rem 0.85rem !important; border-radius: 6px !important; border: 1px solid #d1d5db !important;\n  background: #ffffff !important; color: #0f172a !important; font-size: 0.8125rem !important; font-weight: 500 !important;\n  font-family: inherit !important; cursor: pointer !important; line-height: 1.25 !important;\n  pointer-events: auto !important; position: relative !important; z-index: 7 !important;\n}\n#bts-root .bts-reset-btn:hover { background: #f8fafc !important; border-color: #94a3b8 !important; }\n\n#bts-root .bts-chip-row { display: flex; flex-wrap: wrap; gap: 0.35rem; }\n#bts-root .bts-chip {\n  appearance: none !important; display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  padding: 0.32rem 0.55rem !important; border-radius: 6px !important;\n  border: 1px solid #cbd5e1 !important; background: #fff !important; color: #334155 !important;\n  font-size: 0.72rem !important; font-weight: 600 !important; font-family: var(--bts-mono) !important;\n  cursor: pointer !important; line-height: 1.25 !important; margin: 0 !important;\n}\n#bts-root .bts-chip:hover { border-color: #38bdf8 !important; }\n#bts-root .bts-chip.bts-is-active { background: #0284c7 !important; color: #fff !important; border-color: #0284c7 !important; }\n\n#bts-root .bts-note {\n  font-size: 0.72rem; color: var(--bts-muted); background: var(--bts-surface-2);\n  border: 1px solid var(--bts-line); border-radius: 8px; padding: 0.5rem 0.65rem; line-height: 1.45;\n}\n\n#bts-root .bts-actions {\n  display: flex; justify-content: center; gap: 0.65rem; flex-wrap: wrap;\n  margin-top: 1.15rem; padding-top: 0.9rem; border-top: 1px solid var(--bts-line);\n}\n#bts-root #btsBtnCalculate.bts-calc-btn {\n  appearance: none !important; display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  min-width: 220px !important; padding: 0.85rem 2.5rem !important; border: none !important; border-radius: 10px !important;\n  background: #0077c2 !important; color: #ffffff !important; font-size: 1rem !important; font-weight: 700 !important;\n  font-family: inherit !important; cursor: pointer !important; letter-spacing: 0.01em !important;\n}\n#bts-root #btsBtnCalculate.bts-calc-btn:hover { background: #0066a8 !important; }\n#bts-root #btsBtnCalculate.bts-calc-btn:active { background: #005a94 !important; }\n\n#bts-root .bts-tip {\n  position: relative; display: inline-flex; align-items: center; justify-content: center;\n  width: 0.95rem; height: 0.95rem; border-radius: 999px;\n  background: #e2e8f0; color: #475569; font-size: 0.62rem; font-weight: 700;\n  cursor: help; flex-shrink: 0; line-height: 1;\n}\n#bts-root .bts-tip:hover, #bts-root .bts-tip:focus { background: #0284c7; color: #fff; outline: none; }\n#bts-root .bts-tip-box {\n  display: none; position: absolute; left: 50%; bottom: calc(100% + 8px); transform: translateX(-50%);\n  width: 16.5rem; padding: 0.55rem 0.65rem; border-radius: 8px; z-index: 20;\n  background: #0f172a; color: #e2e8f0; font-size: 0.7rem; font-weight: 400; line-height: 1.4;\n  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.25); text-align: left; text-transform: none; letter-spacing: normal;\n}\n#bts-root .bts-tip-box::after {\n  content: \"\"; position: absolute; left: 50%; top: 100%; transform: translateX(-50%);\n  border: 6px solid transparent; border-top-color: #0f172a;\n}\n#bts-root .bts-tip:hover .bts-tip-box,\n#bts-root .bts-tip:focus .bts-tip-box { display: block; }\n\n#bts-root .bts-banner {\n  border-radius: 10px; padding: 0.85rem 1rem; color: #fff; margin-bottom: 0.85rem;\n  display: flex; align-items: flex-start; gap: 0.75rem;\n}\n#bts-root .bts-banner .bts-dot {\n  width: 0.7rem; height: 0.7rem; border-radius: 999px; background: #fff; flex-shrink: 0; margin-top: 0.28rem;\n}\n#bts-root .bts-banner-kicker {\n  font-size: 0.65rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; opacity: 0.85;\n}\n#bts-root .bts-banner-title { font-size: 1.15rem; font-weight: 750; margin: 0.1rem 0 0.2rem; }\n#bts-root .bts-banner-note { font-size: 0.75rem; opacity: 0.92; line-height: 1.45; }\n#bts-root .bts-banner-ok { background: linear-gradient(90deg, #14532d, #166534); }\n#bts-root .bts-banner-caution { background: linear-gradient(90deg, #854d0e, #a16207); }\n#bts-root .bts-banner-risk { background: linear-gradient(90deg, #7f1d1d, #991b1b); }\n#bts-root .bts-banner-idle { background: linear-gradient(90deg, #334155, #475569); }\n\n#bts-root .bts-hero {\n  display: grid; grid-template-columns: 1fr 1fr; gap: 0.65rem; margin-bottom: 0.75rem;\n}\n@media (max-width: 520px) { #bts-root .bts-hero { grid-template-columns: 1fr; } }\n\n#bts-root .bts-hero-card {\n  border: 1px solid var(--bts-line); border-radius: 10px; padding: 0.8rem 0.85rem;\n  background: linear-gradient(180deg, #fff, #f8fafc);\n}\n#bts-root .bts-hero-card.bts-is-accent {\n  border-color: #7dd3fc; background: linear-gradient(180deg, #f0f9ff, #fff);\n}\n#bts-root .bts-hero-k {\n  font-size: 0.65rem; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase; color: var(--bts-muted);\n}\n#bts-root .bts-hero-v {\n  font-family: var(--bts-mono); font-size: 1.35rem; font-weight: 700; color: #0f172a; margin-top: 0.2rem; line-height: 1.2;\n}\n#bts-root .bts-hero-u { font-size: 0.7rem; color: var(--bts-muted); margin-top: 0.15rem; }\n\n#bts-root .bts-viz {\n  display: grid; grid-template-columns: 180px 1fr; gap: 0.75rem; align-items: center;\n  margin-bottom: 0.75rem;\n}\n@media (max-width: 640px) { #bts-root .bts-viz { grid-template-columns: 1fr; } }\n\n#bts-root .bts-sch-wrap {\n  border: 1px solid var(--bts-line); border-radius: 10px; padding: 0.45rem 0.4rem 0.35rem;\n  background: linear-gradient(180deg, #f8fafc, #fff);\n}\n#bts-root .bts-schematic { width: 100%; max-width: 180px; margin: 0 auto; }\n#bts-root .bts-schematic .bts-sch-bolt { fill: #64748b; stroke: #334155; }\n#bts-root .bts-schematic .bts-sch-plate { fill: #cbd5e1; stroke: #94a3b8; }\n#bts-root .bts-schematic .bts-sch-force { fill: none; stroke: #0369a1; }\n#bts-root .bts-schematic .bts-sch-arrow { fill: #0369a1; }\n#bts-root .bts-schematic .bts-sch-label { fill: #334155; font-size: 11px; font-family: var(--bts-sans); }\n#bts-root .bts-schematic[data-status=\"ok\"] .bts-sch-bolt { fill: #0f766e; stroke: #115e59; }\n#bts-root .bts-schematic[data-status=\"ok\"] .bts-sch-force { stroke: #059669; }\n#bts-root .bts-schematic[data-status=\"ok\"] .bts-sch-arrow { fill: #059669; }\n#bts-root .bts-schematic[data-status=\"caution\"] .bts-sch-bolt { fill: #b45309; stroke: #92400e; }\n#bts-root .bts-schematic[data-status=\"caution\"] .bts-sch-force { stroke: #d97706; }\n#bts-root .bts-schematic[data-status=\"caution\"] .bts-sch-arrow { fill: #d97706; }\n#bts-root .bts-schematic[data-status=\"risk\"] .bts-sch-bolt { fill: #b91c1c; stroke: #7f1d1d; }\n#bts-root .bts-schematic[data-status=\"risk\"] .bts-sch-force { stroke: #dc2626; }\n#bts-root .bts-schematic[data-status=\"risk\"] .bts-sch-arrow { fill: #dc2626; }\n\n#bts-root .bts-gauge-row {\n  display: grid; grid-template-columns: 150px 1fr; gap: 0.75rem; align-items: center;\n  border: 1px solid var(--bts-line); border-radius: 10px; padding: 0.55rem 0.75rem 0.4rem;\n  background: #fff;\n}\n@media (max-width: 520px) { #bts-root .bts-gauge-row { grid-template-columns: 1fr; } }\n#bts-root .bts-gauge-svg { width: 150px; height: auto; }\n#bts-root .bts-gauge-readout { font-family: var(--bts-mono); font-size: 1.05rem; font-weight: 700; }\n#bts-root .bts-gauge-label { font-size: 0.68rem; color: var(--bts-muted); }\n\n#bts-root .bts-util { margin-bottom: 0.85rem; }\n#bts-root .bts-util-head {\n  display: flex; justify-content: space-between; gap: 0.5rem; font-size: 0.72rem; margin-bottom: 0.35rem;\n}\n#bts-root .bts-util-head strong { font-weight: 700; }\n#bts-root .bts-util-track {\n  position: relative; height: 14px; border-radius: 999px; overflow: hidden; background: #e2e8f0;\n}\n#bts-root .bts-util-zones { display: flex; height: 100%; width: 100%; }\n#bts-root .bts-util-zones span { display: block; height: 100%; }\n#bts-root .bts-z-ok { width: 85%; background: #6ee7b7; }\n#bts-root .bts-z-hi { width: 15%; background: #fcd34d; }\n#bts-root .bts-util-fill {\n  position: absolute; left: 0; top: 0; bottom: 0; width: 0;\n  background: linear-gradient(90deg, #0284c7, #0369a1); border-radius: 999px;\n  transition: width 0.25s ease;\n}\n#bts-root .bts-util-fill.bts-is-ok { background: linear-gradient(90deg, #059669, #047857); }\n#bts-root .bts-util-fill.bts-is-caution { background: linear-gradient(90deg, #d97706, #b45309); }\n#bts-root .bts-util-fill.bts-is-risk { background: linear-gradient(90deg, #dc2626, #b91c1c); }\n#bts-root .bts-util-legend {\n  display: flex; flex-wrap: wrap; gap: 0.65rem 1rem; margin-top: 0.35rem;\n  font-size: 0.65rem; color: var(--bts-muted);\n}\n#bts-root .bts-util-legend i {\n  display: inline-block; width: 0.65rem; height: 0.65rem; border-radius: 2px; margin-right: 0.25rem;\n  vertical-align: -1px; font-style: normal;\n}\n\n#bts-root .bts-chart {\n  border: 1px solid var(--bts-line); border-radius: 10px; padding: 0.7rem 0.8rem 0.8rem;\n  background: #fff; margin-bottom: 0.75rem;\n}\n#bts-root .bts-chart-title {\n  font-size: 0.68rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;\n  color: var(--bts-muted); margin-bottom: 0.55rem;\n}\n#bts-root .bts-bar-row {\n  display: grid; grid-template-columns: 7.2rem 1fr auto; gap: 0.45rem; align-items: center;\n  margin-top: 0.4rem;\n}\n#bts-root .bts-bar-k { font-size: 0.7rem; color: #334155; }\n#bts-root .bts-bar-track { height: 10px; background: #e2e8f0; border-radius: 999px; overflow: hidden; }\n#bts-root .bts-bar-fill { height: 100%; width: 0; border-radius: 999px; background: #0284c7; transition: width 0.25s ease; }\n#bts-root .bts-bar-fill.bts-is-ok { background: #059669; }\n#bts-root .bts-bar-fill.bts-is-caution { background: #d97706; }\n#bts-root .bts-bar-fill.bts-is-risk { background: #dc2626; }\n#bts-root .bts-bar-sa { background: #0ea5e9; }\n#bts-root .bts-bar-sy { background: #64748b; }\n#bts-root .bts-bar-sut { background: #1e293b; }\n#bts-root .bts-bar-v { font-family: var(--bts-mono); font-size: 0.7rem; color: var(--bts-muted); min-width: 5.5rem; text-align: right; }\n\n#bts-root .bts-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 0.55rem; }\n@media (min-width: 720px) {\n  #bts-root .bts-tiles { grid-template-columns: repeat(3, 1fr); }\n}\n#bts-root .bts-tile {\n  background: linear-gradient(180deg, #fff, #f8fafc);\n  border: 1px solid var(--bts-line); border-radius: 8px; padding: 0.6rem 0.7rem;\n}\n#bts-root .bts-tile .bts-k { font-size: 0.62rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--bts-muted); }\n#bts-root .bts-tile .bts-v { font-family: var(--bts-mono); font-size: 0.98rem; font-weight: 700; color: #0f172a; margin-top: 0.12rem; }\n#bts-root .bts-tile .bts-u { font-size: 0.68rem; color: var(--bts-muted); }\n\n#bts-root .bts-alerts { display: flex; flex-direction: column; gap: 0.4rem; margin-top: 0.75rem; }\n#bts-root .bts-alert {\n  border-radius: 8px; padding: 0.5rem 0.7rem; font-size: 0.75rem; border: 1px solid; line-height: 1.4;\n}\n#bts-root .bts-alert-ok { background: #ecfdf5; border-color: #a7f3d0; color: #065f46; }\n#bts-root .bts-alert-warn { background: #fffbeb; border-color: #fcd34d; color: #92400e; }\n#bts-root .bts-alert-risk { background: #fef2f2; border-color: #fca5a5; color: #991b1b; }\n\n@media print {\n  #bts-root { max-width: none; padding: 0; background: #fff; }\n  #bts-root .bts-no-print { display: none !important; }\n  #bts-root .bts-layout { display: block; }\n  #bts-root .bts-card { break-inside: avoid; box-shadow: none; }\n}\n<\/style>\n\n  <div class=\"bts-layout\">\n    <section class=\"bts-card\" id=\"btsInputs\">\n      <div class=\"bts-card-h\">\n        <h2>Input parameters<\/h2>\n        <div class=\"bts-tools bts-no-print\">\n          <div class=\"bts-unit-switch\" role=\"group\" aria-label=\"Unit system\">\n            <button type=\"button\" class=\"bts-unit-btn bts-is-active\" id=\"btsBtnMetric\" data-unit=\"metric\" onclick=\"(function(){if(window.btsSwitchUnit){window.btsSwitchUnit('metric');return false;}var t=document.getElementById('bts-js-b64');if(!t){return false;}var c=t.value;if(!c){c=t.textContent;}if(!c){return false;}c=c.replace(\/\\s\/g,'');var s=document.createElement('script');s.type='text\/javascript';s.text=atob(c);(document.body||document.getElementsByTagName('head')[0]).appendChild(s);setTimeout(function(){if(window.btsSwitchUnit){window.btsSwitchUnit('metric');}},150);return false;})()\">Metric<\/button>\n            <button type=\"button\" class=\"bts-unit-btn\" id=\"btsBtnImperial\" data-unit=\"imperial\" onclick=\"(function(){if(window.btsSwitchUnit){window.btsSwitchUnit('imperial');return false;}var t=document.getElementById('bts-js-b64');if(!t){return false;}var c=t.value;if(!c){c=t.textContent;}if(!c){return false;}c=c.replace(\/\\s\/g,'');var s=document.createElement('script');s.type='text\/javascript';s.text=atob(c);(document.body||document.getElementsByTagName('head')[0]).appendChild(s);setTimeout(function(){if(window.btsSwitchUnit){window.btsSwitchUnit('imperial');}},150);return false;})()\">Imperial<\/button>\n          <\/div>\n          <button type=\"button\" class=\"bts-reset-btn\" id=\"btsBtnReset\" onclick=\"(function(){if(window.btsReset){window.btsReset();return false;}var t=document.getElementById('bts-js-b64');if(!t){return false;}var c=t.value;if(!c){c=t.textContent;}if(!c){return false;}c=c.replace(\/\\s\/g,'');var s=document.createElement('script');s.type='text\/javascript';s.text=atob(c);(document.body||document.getElementsByTagName('head')[0]).appendChild(s);setTimeout(function(){if(window.btsReset){window.btsReset();}},150);return false;})()\">Reset<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"bts-card-b\">\n\n        <div class=\"bts-section\"><span class=\"bts-badge\">1<\/span> Bolt geometry<\/div>\n        <div class=\"bts-chip-row bts-no-print\" id=\"btsSizeChips\" aria-label=\"Common bolt sizes\"><\/div>\n        <div class=\"bts-grid bts-g-2\" style=\"margin-top:0.65rem\">\n          <label class=\"bts-fld\">\n            <span class=\"bts-lbl\">\n              Bolt diameter\n              <span class=\"bts-tip\" tabindex=\"0\">?<span class=\"bts-tip-box\">Nominal major diameter d. For metric bolts this is the M-size (12 mm for M12). For UN bolts enter the nominal inch size. Used to estimate tensile stress area At.<\/span><\/span>\n            <\/span>\n            <div class=\"bts-input-row\">\n              <input id=\"btsD\" type=\"number\" min=\"0\" step=\"any\" value=\"12\" inputmode=\"decimal\" \/>\n              <span class=\"bts-unit-pill\" data-unit=\"d\">mm<\/span>\n            <\/div>\n            <span class=\"bts-err\" id=\"btsErrD\"><\/span>\n          <\/label>\n          <label class=\"bts-fld\">\n            <span class=\"bts-lbl\">\n              Thread pitch\n              <span class=\"bts-tip\" tabindex=\"0\">?<span class=\"bts-tip-box\">Metric: distance between threads in mm (M12 coarse = 1.75 mm). Imperial: threads per inch (TPI), e.g. 13 for \u00bd\u2033-13 UNC. Required to auto-calculate tensile stress area.<\/span><\/span>\n            <\/span>\n            <div class=\"bts-input-row\">\n              <input id=\"btsP\" type=\"number\" min=\"0\" step=\"any\" value=\"1.75\" inputmode=\"decimal\" \/>\n              <span class=\"bts-unit-pill\" data-unit=\"p\">mm<\/span>\n            <\/div>\n            <span class=\"bts-err\" id=\"btsErrP\"><\/span>\n          <\/label>\n        <\/div>\n        <div class=\"bts-grid bts-g-2\" style=\"margin-top:0.15rem\">\n          <label class=\"bts-fld\">\n            <span class=\"bts-lbl\">\n              Tensile stress area A<sub>t<\/sub>\n              <span class=\"bts-tip\" tabindex=\"0\">?<span class=\"bts-tip-box\">Effective tensile area of the threaded section. Auto-calculated from diameter and pitch, or enter a catalog \/ ISO 898 value manually. Stress is \u03c3 = F \/ At.<\/span><\/span>\n            <\/span>\n            <div class=\"bts-input-row\">\n              <input id=\"btsAt\" type=\"number\" min=\"0\" step=\"any\" value=\"84.3\" inputmode=\"decimal\" readonly \/>\n              <span class=\"bts-unit-pill\" data-unit=\"at\">mm\u00b2<\/span>\n            <\/div>\n            <span class=\"bts-check\"><input type=\"checkbox\" id=\"btsAtManual\" \/> Enter A<sub>t<\/sub> manually<\/span>\n            <span class=\"bts-err\" id=\"btsErrAt\"><\/span>\n          <\/label>\n          <div class=\"bts-note\" style=\"align-self:end\">\n            Metric: A<sub>t<\/sub> = \u03c0\/4 \u00d7 (d \u2212 0.9382 p)\u00b2. UN: A<sub>t<\/sub> = \u03c0\/4 \u00d7 (d \u2212 0.9743\/n)\u00b2. ISO 898-1 M12 coarse is 84.3 mm\u00b2.\n          <\/div>\n        <\/div>\n\n        <div class=\"bts-section\"><span class=\"bts-badge\">2<\/span> Material strength<\/div>\n        <label class=\"bts-fld\">\n          <span class=\"bts-lbl\">\n            Bolt material grade\n            <span class=\"bts-tip\" tabindex=\"0\">?<span class=\"bts-tip-box\">ISO 898-1 property classes use nominal Sut = class \u00d7 100 MPa and Sy = second digit \u00d7 Sut \/ 10. Stainless uses A2-70 (700 \/ 450 MPa). Choose Custom Material to type catalog values.<\/span><\/span>\n          <\/span>\n          <select id=\"btsGrade\">\n            <option value=\"4.6\">Grade 4.6<\/option>\n            <option value=\"5.8\">Grade 5.8<\/option>\n            <option value=\"8.8\">Grade 8.8<\/option>\n            <option value=\"10.9\" selected>Grade 10.9<\/option>\n            <option value=\"12.9\">Grade 12.9<\/option>\n            <option value=\"ss\">Stainless Steel<\/option>\n            <option value=\"custom\">Custom Material<\/option>\n          <\/select>\n        <\/label>\n        <div class=\"bts-grid bts-g-2\" style=\"margin-top:0.65rem\">\n          <label class=\"bts-fld\">\n            <span class=\"bts-lbl\">\n              Ultimate tensile strength S<sub>ut<\/sub>\n              <span class=\"bts-tip\" tabindex=\"0\">?<span class=\"bts-tip-box\">Minimum ultimate tensile strength of the bolt. Grade 10.9 nominal Sut is 1000 MPa. Maximum tensile capacity Ft = At \u00d7 Sut.<\/span><\/span>\n            <\/span>\n            <div class=\"bts-input-row\">\n              <input id=\"btsSut\" type=\"number\" min=\"0\" step=\"any\" value=\"1000\" inputmode=\"decimal\" readonly \/>\n              <span class=\"bts-unit-pill\" data-unit=\"s\">MPa<\/span>\n            <\/div>\n            <span class=\"bts-err\" id=\"btsErrSut\"><\/span>\n          <\/label>\n          <label class=\"bts-fld\">\n            <span class=\"bts-lbl\">\n              Yield strength S<sub>y<\/sub>\n              <span class=\"bts-tip\" tabindex=\"0\">?<span class=\"bts-tip-box\">Minimum yield or 0.2% proof stress. Grade 10.9 nominal Sy is 900 MPa. Allowable stress Sa = Sy \/ design safety factor.<\/span><\/span>\n            <\/span>\n            <div class=\"bts-input-row\">\n              <input id=\"btsSy\" type=\"number\" min=\"0\" step=\"any\" value=\"900\" inputmode=\"decimal\" readonly \/>\n              <span class=\"bts-unit-pill\" data-unit=\"s\">MPa<\/span>\n            <\/div>\n            <span class=\"bts-err\" id=\"btsErrSy\"><\/span>\n          <\/label>\n        <\/div>\n\n        <div class=\"bts-section\"><span class=\"bts-badge\">3<\/span> Applied tensile load<\/div>\n        <div class=\"bts-grid bts-g-2\">\n          <label class=\"bts-fld\">\n            <span class=\"bts-lbl\">\n              Applied tensile load\n              <span class=\"bts-tip\" tabindex=\"0\">?<span class=\"bts-tip-box\">External pulling force on the joint. For multiple bolts this is the total load; the calculator splits it equally as F \/ n. Do not enter a negative or zero value.<\/span><\/span>\n            <\/span>\n            <div class=\"bts-input-row\">\n              <input id=\"btsF\" type=\"number\" min=\"0\" step=\"any\" value=\"30000\" inputmode=\"decimal\" \/>\n              <select id=\"btsFUnit\" aria-label=\"Load unit\" style=\"min-width:4.6rem;width:auto;padding-right:1.6rem!important\">\n                <option value=\"N\" selected>N<\/option>\n                <option value=\"kN\">kN<\/option>\n                <option value=\"lbf\">lbf<\/option>\n              <\/select>\n            <\/div>\n            <span class=\"bts-err\" id=\"btsErrF\"><\/span>\n          <\/label>\n          <label class=\"bts-fld\">\n            <span class=\"bts-lbl\">\n              Number of bolts\n              <span class=\"bts-tip\" tabindex=\"0\">?<span class=\"bts-tip-box\">Bolts assumed to share the tensile load equally. Load per bolt = total load \/ n. Eccentric patterns and prying can increase the peak bolt load.<\/span><\/span>\n            <\/span>\n            <input id=\"btsNbolts\" type=\"number\" min=\"1\" step=\"1\" value=\"1\" inputmode=\"numeric\" \/>\n            <span class=\"bts-err\" id=\"btsErrNbolts\"><\/span>\n          <\/label>\n        <\/div>\n        <label class=\"bts-fld\" style=\"margin-top:0.15rem\">\n          <span class=\"bts-lbl\">\n            Design safety factor\n            <span class=\"bts-tip\" tabindex=\"0\">?<span class=\"bts-tip-box\">Divides yield strength to obtain allowable tensile stress Sa = Sy \/ n. Default 2.0 is a common static-design starting point. Critical or fatigue joints often need a higher factor from the governing standard.<\/span><\/span>\n          <\/span>\n          <input id=\"btsNsf\" type=\"number\" min=\"0\" step=\"any\" value=\"2.0\" inputmode=\"decimal\" \/>\n          <span class=\"bts-err\" id=\"btsErrNsf\"><\/span>\n        <\/label>\n        <p class=\"bts-note\" style=\"margin-top:0.55rem\">\n          Allowable tensile stress S<sub>a<\/sub> = S<sub>y<\/sub> \/ n. This Bolt Safety Factor Calculator then reports\n          Safety Factor = allowable load \/ applied load per bolt.\n        <\/p>\n\n        <div class=\"bts-actions bts-no-print\">\n          <button type=\"button\" class=\"bts-calc-btn\" id=\"btsBtnCalculate\" onclick=\"(function(){if(window.btsCalculate){window.btsCalculate();return false;}var t=document.getElementById('bts-js-b64');if(!t){return false;}var c=t.value;if(!c){c=t.textContent;}if(!c){return false;}c=c.replace(\/\\s\/g,'');var s=document.createElement('script');s.type='text\/javascript';s.text=atob(c);(document.body||document.getElementsByTagName('head')[0]).appendChild(s);setTimeout(function(){if(window.btsCalculate){window.btsCalculate();}},150);return false;})()\">Calculate<\/button>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <aside class=\"bts-results-wrap bts-hidden\" id=\"btsResults\">\n      <section class=\"bts-card\">\n        <div class=\"bts-card-h\">\n          <h2>Calculated results<\/h2>\n        <\/div>\n        <div class=\"bts-card-b\">\n          <div class=\"bts-banner bts-banner-idle\" id=\"btsBanner\">\n            <span class=\"bts-dot\" aria-hidden=\"true\"><\/span>\n            <div>\n              <div class=\"bts-banner-kicker\">Bolt strength status<\/div>\n              <div class=\"bts-banner-title\" id=\"btsStatusTitle\">Ready<\/div>\n              <p class=\"bts-banner-note\" id=\"btsStatusNote\">Enter bolt data and press Calculate.<\/p>\n            <\/div>\n          <\/div>\n\n          <div class=\"bts-hero\">\n            <div class=\"bts-hero-card bts-is-accent\">\n              <div class=\"bts-hero-k\">Bolt tensile stress<\/div>\n              <div class=\"bts-hero-v\" id=\"btsOutStress\">\u2014<\/div>\n              <div class=\"bts-hero-u\" id=\"btsOutStressSub\">\u03c3 = F \/ A<sub>t<\/sub><\/div>\n            <\/div>\n            <div class=\"bts-hero-card bts-is-accent\">\n              <div class=\"bts-hero-k\">Safety factor<\/div>\n              <div class=\"bts-hero-v\" id=\"btsOutSf\">\u2014<\/div>\n              <div class=\"bts-hero-u\" id=\"btsOutSfSub\">Allowable load \/ applied load<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"bts-viz\">\n            <div class=\"bts-sch-wrap\">\n              <svg class=\"bts-schematic\" id=\"btsSchematic\" viewBox=\"0 0 180 250\" role=\"img\" aria-label=\"Bolt tensile load diagram\" data-status=\"idle\">\n                <text class=\"bts-sch-label\" x=\"90\" y=\"14\" text-anchor=\"middle\">Tensile load F<\/text>\n                <line class=\"bts-sch-force\" x1=\"90\" y1=\"38\" x2=\"90\" y2=\"18\" stroke-width=\"2.5\" \/>\n                <polygon class=\"bts-sch-arrow\" points=\"84,26 90,16 96,26\" \/>\n                <rect class=\"bts-sch-plate\" x=\"38\" y=\"72\" width=\"104\" height=\"18\" rx=\"1.5\" stroke-width=\"1\" \/>\n                <rect class=\"bts-sch-plate\" x=\"38\" y=\"94\" width=\"104\" height=\"18\" rx=\"1.5\" stroke-width=\"1\" \/>\n                <path class=\"bts-sch-bolt\" d=\"M72 48 h36 l6 16 h-48 z\" stroke-width=\"1.2\" \/>\n                <rect class=\"bts-sch-bolt\" x=\"82\" y=\"64\" width=\"16\" height=\"92\" stroke-width=\"1.2\" \/>\n                <path class=\"bts-sch-bolt\" d=\"M82 156 l4 10 h8 l4-10 z\" stroke-width=\"1.2\" \/>\n                <path class=\"bts-sch-bolt\" d=\"M78 148 h24 v10 h-24 z\" stroke-width=\"1.2\" \/>\n                <path d=\"M84 120 l12 6 m-12 6 l12 6 m-12 6 l12 6\" fill=\"none\" stroke=\"#e2e8f0\" stroke-width=\"1.4\" \/>\n                <line class=\"bts-sch-force\" x1=\"90\" y1=\"176\" x2=\"90\" y2=\"210\" stroke-width=\"2.5\" \/>\n                <polygon class=\"bts-sch-arrow\" points=\"84,200 90,212 96,200\" \/>\n                <text class=\"bts-sch-label\" id=\"btsSchForce\" x=\"90\" y=\"228\" text-anchor=\"middle\">\u2014<\/text>\n                <text class=\"bts-sch-label\" x=\"90\" y=\"244\" text-anchor=\"middle\" style=\"font-size:10px\">load per bolt<\/text>\n              <\/svg>\n            <\/div>\n            <div class=\"bts-gauge-row\">\n              <svg class=\"bts-gauge-svg\" viewBox=\"0 0 240 140\" aria-hidden=\"true\">\n                <defs>\n                  <linearGradient id=\"btsGaugeGrad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n                    <stop offset=\"0%\" stop-color=\"#dc2626\" \/>\n                    <stop offset=\"25%\" stop-color=\"#d97706\" \/>\n                    <stop offset=\"55%\" stop-color=\"#059669\" \/>\n                    <stop offset=\"100%\" stop-color=\"#047857\" \/>\n                  <\/linearGradient>\n                <\/defs>\n                <path d=\"M 30 118 A 90 90 0 0 1 210 118\" fill=\"none\" stroke=\"#e2e8f0\" stroke-width=\"14\" stroke-linecap=\"round\" \/>\n                <path id=\"btsGaugeArc\" d=\"M 30 118 A 90 90 0 0 1 210 118\" fill=\"none\" stroke=\"url(#btsGaugeGrad)\" stroke-width=\"14\" stroke-linecap=\"round\" stroke-dasharray=\"282.7\" stroke-dashoffset=\"282.7\" \/>\n                <g id=\"btsNeedle\" transform=\"rotate(-90 120 118)\">\n                  <line x1=\"120\" y1=\"118\" x2=\"120\" y2=\"44\" stroke=\"#0f172a\" stroke-width=\"3\" stroke-linecap=\"round\" \/>\n                  <circle cx=\"120\" cy=\"118\" r=\"6\" fill=\"#0f172a\" \/>\n                <\/g>\n              <\/svg>\n              <div>\n                <div class=\"bts-gauge-label\">Safety factor gauge<\/div>\n                <div class=\"bts-gauge-readout\" id=\"btsGaugeRead\">\u2014<\/div>\n                <div class=\"bts-gauge-label\" id=\"btsGaugeNote\" style=\"margin-top:0.25rem\">Fa \/ F per bolt  (scale 0\u20134)<\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"bts-util\">\n            <div class=\"bts-util-head\">\n              <span>Load utilization percentage<\/span>\n              <strong id=\"btsOutUtil\">\u2014<\/strong>\n            <\/div>\n            <div class=\"bts-util-track\" aria-hidden=\"true\">\n              <div class=\"bts-util-zones\"><span class=\"bts-z-ok\"><\/span><span class=\"bts-z-hi\"><\/span><\/div>\n              <div class=\"bts-util-fill\" id=\"btsUtilFill\"><\/div>\n            <\/div>\n            <div class=\"bts-util-legend\">\n              <span><i style=\"background:#6ee7b7\"><\/i> \u2264 85% allowable<\/span>\n              <span><i style=\"background:#fcd34d\"><\/i> 85\u2013100% warning<\/span>\n              <span><i style=\"background:#fca5a5\"><\/i> &gt; 100% failure risk<\/span>\n            <\/div>\n          <\/div>\n\n          <div class=\"bts-chart\">\n            <div class=\"bts-chart-title\">Strength comparison chart<\/div>\n            <div class=\"bts-bar-row\">\n              <span class=\"bts-bar-k\">Applied stress \u03c3<\/span>\n              <div class=\"bts-bar-track\"><div class=\"bts-bar-fill\" id=\"btsBarSigma\"><\/div><\/div>\n              <span class=\"bts-bar-v\" id=\"btsBarSigmaVal\">\u2014<\/span>\n            <\/div>\n            <div class=\"bts-bar-row\">\n              <span class=\"bts-bar-k\">Allowable S<sub>a<\/sub><\/span>\n              <div class=\"bts-bar-track\"><div class=\"bts-bar-fill bts-bar-sa\" id=\"btsBarSa\"><\/div><\/div>\n              <span class=\"bts-bar-v\" id=\"btsBarSaVal\">\u2014<\/span>\n            <\/div>\n            <div class=\"bts-bar-row\">\n              <span class=\"bts-bar-k\">Yield S<sub>y<\/sub><\/span>\n              <div class=\"bts-bar-track\"><div class=\"bts-bar-fill bts-bar-sy\" id=\"btsBarSy\"><\/div><\/div>\n              <span class=\"bts-bar-v\" id=\"btsBarSyVal\">\u2014<\/span>\n            <\/div>\n            <div class=\"bts-bar-row\">\n              <span class=\"bts-bar-k\">Ultimate S<sub>ut<\/sub><\/span>\n              <div class=\"bts-bar-track\"><div class=\"bts-bar-fill bts-bar-sut\" id=\"btsBarSut\"><\/div><\/div>\n              <span class=\"bts-bar-v\" id=\"btsBarSutVal\">\u2014<\/span>\n            <\/div>\n          <\/div>\n\n          <div class=\"bts-tiles\">\n            <div class=\"bts-tile\">\n              <div class=\"bts-k\">Maximum tensile capacity<\/div>\n              <div class=\"bts-v\" id=\"btsOutFt\">\u2014<\/div>\n              <div class=\"bts-u\" id=\"btsOutFtSub\">F<sub>t<\/sub> = A<sub>t<\/sub> \u00d7 S<sub>ut<\/sub><\/div>\n            <\/div>\n            <div class=\"bts-tile\">\n              <div class=\"bts-k\">Allowable tensile load<\/div>\n              <div class=\"bts-v\" id=\"btsOutFa\">\u2014<\/div>\n              <div class=\"bts-u\" id=\"btsOutFaSub\">F<sub>a<\/sub> = A<sub>t<\/sub> \u00d7 S<sub>a<\/sub><\/div>\n            <\/div>\n            <div class=\"bts-tile\">\n              <div class=\"bts-k\">Load per bolt<\/div>\n              <div class=\"bts-v\" id=\"btsOutFb\">\u2014<\/div>\n              <div class=\"bts-u\" id=\"btsOutFbNote\">F \/ n<\/div>\n            <\/div>\n            <div class=\"bts-tile\">\n              <div class=\"bts-k\">Tensile stress area<\/div>\n              <div class=\"bts-v\" id=\"btsOutAt\">\u2014<\/div>\n              <div class=\"bts-u\" id=\"btsOutAtNote\">from d and pitch<\/div>\n            <\/div>\n            <div class=\"bts-tile\">\n              <div class=\"bts-k\">Allowable stress S<sub>a<\/sub><\/div>\n              <div class=\"bts-v\" id=\"btsOutSa\">\u2014<\/div>\n              <div class=\"bts-u\">S<sub>y<\/sub> \/ design n<\/div>\n            <\/div>\n            <div class=\"bts-tile\">\n              <div class=\"bts-k\">Yield strength<\/div>\n              <div class=\"bts-v\" id=\"btsOutSy\">\u2014<\/div>\n              <div class=\"bts-u\">material S<sub>y<\/sub><\/div>\n            <\/div>\n            <div class=\"bts-tile\">\n              <div class=\"bts-k\">Ultimate strength<\/div>\n              <div class=\"bts-v\" id=\"btsOutSut\">\u2014<\/div>\n              <div class=\"bts-u\">material S<sub>ut<\/sub><\/div>\n            <\/div>\n            <div class=\"bts-tile\">\n              <div class=\"bts-k\">SF vs yield<\/div>\n              <div class=\"bts-v\" id=\"btsOutNyield\">\u2014<\/div>\n              <div class=\"bts-u\">S<sub>y<\/sub> \/ \u03c3<\/div>\n            <\/div>\n            <div class=\"bts-tile\">\n              <div class=\"bts-k\">SF vs ultimate<\/div>\n              <div class=\"bts-v\" id=\"btsOutNult\">\u2014<\/div>\n              <div class=\"bts-u\">S<sub>ut<\/sub> \/ \u03c3<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"bts-alerts\" id=\"btsAlerts\"><\/div>\n        <\/div>\n      <\/section>\n    <\/aside>\n  <\/div>\n\n\n<textarea id=\"bts-js-b64\" aria-hidden=\"true\" style=\"display:none!important;width:0;height:0;border:0;padding:0;position:absolute;left:-9999px\">KGZ1bmN0aW9uICgpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0cy1yb290Iik7CiAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCJkYXRhLWJ0cy1yZWFkeSIpID09PSAiMSIpIHJldHVybjsKICByb290LnNldEF0dHJpYnV0ZSgiZGF0YS1idHMtcmVhZHkiLCAiMSIpOwoKICB2YXIgQVJDX0xFTiA9IDI4Mi43NDM7CiAgdmFyIE1NX1BFUl9JTiA9IDI1LjQ7CiAgdmFyIE1NMl9QRVJfSU4yID0gNjQ1LjE2OwogIHZhciBQU0lfUEVSX01QQSA9IDE0NS4wMzc3Mzc3MzsKICB2YXIgTEJGX1BFUl9OID0gMC4yMjQ4MDg5NDM7CgogIHZhciBTSVpFU19NID0gWwogICAgeyBsYWJlbDogIk02IiwgZDogNiwgcDogMSB9LAogICAgeyBsYWJlbDogIk04IiwgZDogOCwgcDogMS4yNSB9LAogICAgeyBsYWJlbDogIk0xMCIsIGQ6IDEwLCBwOiAxLjUgfSwKICAgIHsgbGFiZWw6ICJNMTIiLCBkOiAxMiwgcDogMS43NSB9LAogICAgeyBsYWJlbDogIk0xNiIsIGQ6IDE2LCBwOiAyIH0sCiAgICB7IGxhYmVsOiAiTTIwIiwgZDogMjAsIHA6IDIuNSB9LAogICAgeyBsYWJlbDogIk0yNCIsIGQ6IDI0LCBwOiAzIH0KICBdOwogIHZhciBTSVpFU19JTiA9IFsKICAgIHsgbGFiZWw6ICIxLzQtMjAiLCBkOiAwLjI1LCB0cGk6IDIwIH0sCiAgICB7IGxhYmVsOiAiNS8xNi0xOCIsIGQ6IDAuMzEyNSwgdHBpOiAxOCB9LAogICAgeyBsYWJlbDogIjMvOC0xNiIsIGQ6IDAuMzc1LCB0cGk6IDE2IH0sCiAgICB7IGxhYmVsOiAiMS8yLTEzIiwgZDogMC41LCB0cGk6IDEzIH0sCiAgICB7IGxhYmVsOiAiNS84LTExIiwgZDogMC42MjUsIHRwaTogMTEgfSwKICAgIHsgbGFiZWw6ICIzLzQtMTAiLCBkOiAwLjc1LCB0cGk6IDEwIH0KICBdOwoKICB2YXIgR1JBREVTID0gewogICAgIjQuNiI6ICB7IHN1dDogNDAwLCBzeTogMjQwLCBsYWJlbDogIkdyYWRlIDQuNiIgfSwKICAgICI1LjgiOiAgeyBzdXQ6IDUwMCwgc3k6IDQwMCwgbGFiZWw6ICJHcmFkZSA1LjgiIH0sCiAgICAiOC44IjogIHsgc3V0OiA4MDAsIHN5OiA2NDAsIGxhYmVsOiAiR3JhZGUgOC44IiB9LAogICAgIjEwLjkiOiB7IHN1dDogMTAwMCwgc3k6IDkwMCwgbGFiZWw6ICJHcmFkZSAxMC45IiB9LAogICAgIjEyLjkiOiB7IHN1dDogMTIwMCwgc3k6IDEwODAsIGxhYmVsOiAiR3JhZGUgMTIuOSIgfSwKICAgIHNzOiAgICAgeyBzdXQ6IDcwMCwgc3k6IDQ1MCwgbGFiZWw6ICJTdGFpbmxlc3Mgc3RlZWwgQTItNzAiIH0sCiAgICBjdXN0b206IG51bGwKICB9OwoKICB2YXIgREVGQVVMVFMgPSB7CiAgICB1bml0OiAibWV0cmljIiwKICAgIGQ6IDEyLAogICAgcDogMS43NSwKICAgIGF0TWFudWFsOiBmYWxzZSwKICAgIGdyYWRlOiAiMTAuOSIsCiAgICBzdXQ6IDEwMDAsCiAgICBzeTogOTAwLAogICAgRjogMzAwMDAsCiAgICBmVW5pdDogIk4iLAogICAgbnNmOiAyLAogICAgbmJvbHRzOiAxLAogICAgc2l6ZTogIk0xMiIKICB9OwoKICB2YXIgZWwgPSB7CiAgICBkOiBieUlkKCJidHNEIiksCiAgICBwOiBieUlkKCJidHNQIiksCiAgICBhdDogYnlJZCgiYnRzQXQiKSwKICAgIGF0TWFudWFsOiBieUlkKCJidHNBdE1hbnVhbCIpLAogICAgZ3JhZGU6IGJ5SWQoImJ0c0dyYWRlIiksCiAgICBzdXQ6IGJ5SWQoImJ0c1N1dCIpLAogICAgc3k6IGJ5SWQoImJ0c1N5IiksCiAgICBGOiBieUlkKCJidHNGIiksCiAgICBmVW5pdDogYnlJZCgiYnRzRlVuaXQiKSwKICAgIG5zZjogYnlJZCgiYnRzTnNmIiksCiAgICBuYm9sdHM6IGJ5SWQoImJ0c05ib2x0cyIpLAogICAgYnRuTWV0cmljOiBieUlkKCJidHNCdG5NZXRyaWMiKSwKICAgIGJ0bkltcGVyaWFsOiBieUlkKCJidHNCdG5JbXBlcmlhbCIpLAogICAgYnRuUmVzZXQ6IGJ5SWQoImJ0c0J0blJlc2V0IiksCiAgICBidG5DYWxjOiBieUlkKCJidHNCdG5DYWxjdWxhdGUiKSwKICAgIHJlc3VsdHM6IGJ5SWQoImJ0c1Jlc3VsdHMiKSwKICAgIHNpemVDaGlwczogYnlJZCgiYnRzU2l6ZUNoaXBzIiksCiAgICBiYW5uZXI6IGJ5SWQoImJ0c0Jhbm5lciIpLAogICAgc3RhdHVzVGl0bGU6IGJ5SWQoImJ0c1N0YXR1c1RpdGxlIiksCiAgICBzdGF0dXNOb3RlOiBieUlkKCJidHNTdGF0dXNOb3RlIiksCiAgICBvdXRTdHJlc3M6IGJ5SWQoImJ0c091dFN0cmVzcyIpLAogICAgb3V0U3RyZXNzU3ViOiBieUlkKCJidHNPdXRTdHJlc3NTdWIiKSwKICAgIG91dEZ0OiBieUlkKCJidHNPdXRGdCIpLAogICAgb3V0RnRTdWI6IGJ5SWQoImJ0c091dEZ0U3ViIiksCiAgICBvdXRGYTogYnlJZCgiYnRzT3V0RmEiKSwKICAgIG91dEZhU3ViOiBieUlkKCJidHNPdXRGYVN1YiIpLAogICAgb3V0U2Y6IGJ5SWQoImJ0c091dFNmIiksCiAgICBvdXRTZlN1YjogYnlJZCgiYnRzT3V0U2ZTdWIiKSwKICAgIG91dFV0aWw6IGJ5SWQoImJ0c091dFV0aWwiKSwKICAgIHV0aWxGaWxsOiBieUlkKCJidHNVdGlsRmlsbCIpLAogICAgb3V0QXQ6IGJ5SWQoImJ0c091dEF0IiksCiAgICBvdXRBdE5vdGU6IGJ5SWQoImJ0c091dEF0Tm90ZSIpLAogICAgb3V0RmI6IGJ5SWQoImJ0c091dEZiIiksCiAgICBvdXRGYk5vdGU6IGJ5SWQoImJ0c091dEZiTm90ZSIpLAogICAgb3V0U2E6IGJ5SWQoImJ0c091dFNhIiksCiAgICBvdXRTeTogYnlJZCgiYnRzT3V0U3kiKSwKICAgIG91dFN1dDogYnlJZCgiYnRzT3V0U3V0IiksCiAgICBvdXROeWllbGQ6IGJ5SWQoImJ0c091dE55aWVsZCIpLAogICAgb3V0TnVsdDogYnlJZCgiYnRzT3V0TnVsdCIpLAogICAgYWxlcnRzOiBieUlkKCJidHNBbGVydHMiKSwKICAgIGdhdWdlQXJjOiBieUlkKCJidHNHYXVnZUFyYyIpLAogICAgbmVlZGxlOiBieUlkKCJidHNOZWVkbGUiKSwKICAgIGdhdWdlUmVhZDogYnlJZCgiYnRzR2F1Z2VSZWFkIiksCiAgICBnYXVnZU5vdGU6IGJ5SWQoImJ0c0dhdWdlTm90ZSIpLAogICAgc2NoZW1hdGljOiBieUlkKCJidHNTY2hlbWF0aWMiKSwKICAgIHNjaEZvcmNlOiBieUlkKCJidHNTY2hGb3JjZSIpLAogICAgYmFyU2lnbWE6IGJ5SWQoImJ0c0JhclNpZ21hIiksCiAgICBiYXJTYTogYnlJZCgiYnRzQmFyU2EiKSwKICAgIGJhclN5OiBieUlkKCJidHNCYXJTeSIpLAogICAgYmFyU3V0OiBieUlkKCJidHNCYXJTdXQiKSwKICAgIGJhclNpZ21hVmFsOiBieUlkKCJidHNCYXJTaWdtYVZhbCIpLAogICAgYmFyU2FWYWw6IGJ5SWQoImJ0c0JhclNhVmFsIiksCiAgICBiYXJTeVZhbDogYnlJZCgiYnRzQmFyU3lWYWwiKSwKICAgIGJhclN1dFZhbDogYnlJZCgiYnRzQmFyU3V0VmFsIikKICB9OwoKICB2YXIgc3RhdGUgPSB7CiAgICB1bml0OiAibWV0cmljIiwKICAgIHNpemVJZDogIk0xMiIsCiAgICBhcHBseWluZzogZmFsc2UsCiAgICBsaXZlOiBmYWxzZQogIH07CiAgdmFyIGxhc3RGVW5pdCA9IGVsLmZVbml0ID8gZWwuZlVuaXQudmFsdWUgOiAiTiI7CgogIGZ1bmN0aW9uIGJ5SWQoaWQpIHsgcmV0dXJuIHJvb3QucXVlcnlTZWxlY3RvcigiIyIgKyBpZCk7IH0KCiAgZnVuY3Rpb24gbnVtKG5vZGUpIHsKICAgIGlmICghbm9kZSkgcmV0dXJuIE5hTjsKICAgIHZhciB2ID0gcGFyc2VGbG9hdChTdHJpbmcobm9kZS52YWx1ZSkucmVwbGFjZSgiLCIsICIuIikpOwogICAgcmV0dXJuIGlzRmluaXRlKHYpID8gdiA6IE5hTjsKICB9CgogIGZ1bmN0aW9uIGNsYW1wKHYsIGEsIGIpIHsgcmV0dXJuIE1hdGgubWF4KGEsIE1hdGgubWluKGIsIHYpKTsgfQoKICBmdW5jdGlvbiByb3VuZFNtYXJ0KHYpIHsKICAgIGlmICghaXNGaW5pdGUodikpIHJldHVybiAiIjsKICAgIHZhciBhID0gTWF0aC5hYnModik7CiAgICB2YXIgZCA9IGEgPj0gMTAwID8gMiA6IGEgPj0gMTAgPyAzIDogYSA+PSAxID8gNCA6IDU7CiAgICByZXR1cm4gU3RyaW5nKE51bWJlcih2LnRvRml4ZWQoZCkpKTsKICB9CgogIGZ1bmN0aW9uIGZtdCh2LCBkKSB7CiAgICBpZiAoIWlzRmluaXRlKHYpKSByZXR1cm4gIi0iOwogICAgcmV0dXJuIHYudG9Mb2NhbGVTdHJpbmcoImVuLVVTIiwgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGQsIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMCB9KTsKICB9CgogIGZ1bmN0aW9uIHNldEVycihrZXksIG1zZykgewogICAgdmFyIG5vZGUgPSBieUlkKCJidHNFcnIiICsga2V5KTsKICAgIHZhciBtYXAgPSB7IEQ6IGVsLmQsIFA6IGVsLnAsIEF0OiBlbC5hdCwgU3V0OiBlbC5zdXQsIFN5OiBlbC5zeSwgRjogZWwuRiwgTnNmOiBlbC5uc2YsIE5ib2x0czogZWwubmJvbHRzIH07CiAgICB2YXIgaW5wdXQgPSBtYXBba2V5XTsKICAgIGlmIChub2RlKSBub2RlLnRleHRDb250ZW50ID0gbXNnIHx8ICIiOwogICAgaWYgKGlucHV0KSB7CiAgICAgIGlmIChtc2cpIGlucHV0LmNsYXNzTGlzdC5hZGQoImJ0cy1pbnZhbGlkIik7CiAgICAgIGVsc2UgaW5wdXQuY2xhc3NMaXN0LnJlbW92ZSgiYnRzLWludmFsaWQiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNsZWFyRXJycygpIHsKICAgIFsiRCIsICJQIiwgIkF0IiwgIlN1dCIsICJTeSIsICJGIiwgIk5zZiIsICJOYm9sdHMiXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IHNldEVycihrLCAiIik7IH0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlVW5pdExhYmVscygpIHsKICAgIHZhciBtZXRyaWMgPSBzdGF0ZS51bml0ID09PSAibWV0cmljIjsKICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdW5pdD0nZCddIikuZm9yRWFjaChmdW5jdGlvbiAobikgeyBuLnRleHRDb250ZW50ID0gbWV0cmljID8gIm1tIiA6ICJpbiI7IH0pOwogICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS11bml0PSdwJ10iKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7IG4udGV4dENvbnRlbnQgPSBtZXRyaWMgPyAibW0iIDogIlRQSSI7IH0pOwogICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS11bml0PSdhdCddIikuZm9yRWFjaChmdW5jdGlvbiAobikgeyBuLnRleHRDb250ZW50ID0gbWV0cmljID8gIm1tXHUwMGIyIiA6ICJpblx1MDBiMiI7IH0pOwogICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS11bml0PSdzJ10iKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7IG4udGV4dENvbnRlbnQgPSBtZXRyaWMgPyAiTVBhIiA6ICJwc2kiOyB9KTsKICAgIGlmIChlbC5idG5NZXRyaWMpIGVsLmJ0bk1ldHJpYy5jbGFzc0xpc3QudG9nZ2xlKCJidHMtaXMtYWN0aXZlIiwgbWV0cmljKTsKICAgIGlmIChlbC5idG5JbXBlcmlhbCkgZWwuYnRuSW1wZXJpYWwuY2xhc3NMaXN0LnRvZ2dsZSgiYnRzLWlzLWFjdGl2ZSIsICFtZXRyaWMpOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyU2l6ZUNoaXBzKCkgewogICAgaWYgKCFlbC5zaXplQ2hpcHMpIHJldHVybjsKICAgIHZhciBsaXN0ID0gc3RhdGUudW5pdCA9PT0gIm1ldHJpYyIgPyBTSVpFU19NIDogU0laRVNfSU47CiAgICBlbC5zaXplQ2hpcHMuaW5uZXJIVE1MID0gIiI7CiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKHMpIHsKICAgICAgdmFyIGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBidG4udHlwZSA9ICJidXR0b24iOwogICAgICBidG4uY2xhc3NOYW1lID0gImJ0cy1jaGlwIiArIChzdGF0ZS5zaXplSWQgPT09IHMubGFiZWwgPyAiIGJ0cy1pcy1hY3RpdmUiIDogIiIpOwogICAgICBidG4udGV4dENvbnRlbnQgPSBzLmxhYmVsOwogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3RhdGUuc2l6ZUlkID0gcy5sYWJlbDsKICAgICAgICBlbC5kLnZhbHVlID0gU3RyaW5nKHMuZCk7CiAgICAgICAgZWwucC52YWx1ZSA9IFN0cmluZyhzdGF0ZS51bml0ID09PSAibWV0cmljIiA\/IHMucCA6IHMudHBpKTsKICAgICAgICBpZiAoIWVsLmF0TWFudWFsLmNoZWNrZWQpIHJlZnJlc2hBdCgpOwogICAgICAgIHBhaW50Q2hpcHMoKTsKICAgICAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsKICAgICAgfSk7CiAgICAgIGVsLnNpemVDaGlwcy5hcHBlbmRDaGlsZChidG4pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBwYWludENoaXBzKCkgewogICAgaWYgKCFlbC5zaXplQ2hpcHMpIHJldHVybjsKICAgIGVsLnNpemVDaGlwcy5xdWVyeVNlbGVjdG9yQWxsKCIuYnRzLWNoaXAiKS5mb3JFYWNoKGZ1bmN0aW9uIChidG4pIHsKICAgICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoImJ0cy1pcy1hY3RpdmUiLCBidG4udGV4dENvbnRlbnQgPT09IHN0YXRlLnNpemVJZCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHRlbnNpbGVBcmVhKGREaXNwLCBwRGlzcCwgdW5pdCkgewogICAgaWYgKCEoZERpc3AgPiAwKSB8fCAhKHBEaXNwID4gMCkpIHJldHVybiBOYU47CiAgICB2YXIgY29yZSA9IHVuaXQgPT09ICJtZXRyaWMiID8gZERpc3AgLSAwLjkzODIgKiBwRGlzcCA6IGREaXNwIC0gMC45NzQzIC8gcERpc3A7CiAgICBpZiAoIShjb3JlID4gMCkpIHJldHVybiBOYU47CiAgICByZXR1cm4gTWF0aC5QSSAvIDQgKiBjb3JlICogY29yZTsKICB9CgogIGZ1bmN0aW9uIHJlZnJlc2hBdCgpIHsKICAgIGlmIChlbC5hdE1hbnVhbC5jaGVja2VkKSByZXR1cm47CiAgICB2YXIgYXQgPSB0ZW5zaWxlQXJlYShudW0oZWwuZCksIG51bShlbC5wKSwgc3RhdGUudW5pdCk7CiAgICBpZiAoaXNGaW5pdGUoYXQpKSBlbC5hdC52YWx1ZSA9IGF0ID49IDEwID8gYXQudG9GaXhlZCgxKSA6IGF0LnRvRml4ZWQoNCk7CiAgfQoKICBmdW5jdGlvbiBhcHBseUdyYWRlKCkgewogICAgdmFyIGcgPSBHUkFERVNbZWwuZ3JhZGUudmFsdWVdOwogICAgaWYgKCFnKSB7CiAgICAgIGVsLnN1dC5yZWFkT25seSA9IGZhbHNlOwogICAgICBlbC5zeS5yZWFkT25seSA9IGZhbHNlOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdGF0ZS5hcHBseWluZyA9IHRydWU7CiAgICB2YXIgbWV0cmljID0gc3RhdGUudW5pdCA9PT0gIm1ldHJpYyI7CiAgICBlbC5zdXQudmFsdWUgPSBtZXRyaWMgPyBTdHJpbmcoZy5zdXQpIDogcm91bmRTbWFydChnLnN1dCAqIFBTSV9QRVJfTVBBKTsKICAgIGVsLnN5LnZhbHVlID0gbWV0cmljID8gU3RyaW5nKGcuc3kpIDogcm91bmRTbWFydChnLnN5ICogUFNJX1BFUl9NUEEpOwogICAgZWwuc3V0LnJlYWRPbmx5ID0gdHJ1ZTsKICAgIGVsLnN5LnJlYWRPbmx5ID0gdHJ1ZTsKICAgIHN0YXRlLmFwcGx5aW5nID0gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBtYXJrQ3VzdG9tR3JhZGUoKSB7CiAgICBpZiAoc3RhdGUuYXBwbHlpbmcpIHJldHVybjsKICAgIGlmIChlbC5ncmFkZS52YWx1ZSAhPT0gImN1c3RvbSIpIGVsLmdyYWRlLnZhbHVlID0gImN1c3RvbSI7CiAgICBlbC5zdXQucmVhZE9ubHkgPSBmYWxzZTsKICAgIGVsLnN5LnJlYWRPbmx5ID0gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBmb3JjZVRvTigpIHsKICAgIHZhciB2ID0gbnVtKGVsLkYpOwogICAgaWYgKCFpc0Zpbml0ZSh2KSkgcmV0dXJuIE5hTjsKICAgIHZhciB1ID0gZWwuZlVuaXQudmFsdWU7CiAgICBpZiAodSA9PT0gImtOIikgcmV0dXJuIHYgKiAxMDAwOwogICAgaWYgKHUgPT09ICJsYmYiKSByZXR1cm4gdiAvIExCRl9QRVJfTjsKICAgIHJldHVybiB2OwogIH0KCiAgZnVuY3Rpb24gY29udmVydEZvcmNlVW5pdFZhbHVlKHZhbHVlLCBmcm9tVSwgdG9VKSB7CiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIHZhbHVlOwogICAgdmFyIG4gPSB2YWx1ZTsKICAgIGlmIChmcm9tVSA9PT0gImtOIikgbiAqPSAxMDAwOwogICAgaWYgKGZyb21VID09PSAibGJmIikgbiAvPSBMQkZfUEVSX047CiAgICBpZiAodG9VID09PSAia04iKSByZXR1cm4gbiAvIDEwMDA7CiAgICBpZiAodG9VID09PSAibGJmIikgcmV0dXJuIG4gKiBMQkZfUEVSX047CiAgICByZXR1cm4gbjsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdEZvcmNlKE4pIHsKICAgIGlmICghaXNGaW5pdGUoTikpIHJldHVybiB7IHByaW1hcnk6ICItIiwgc2Vjb25kYXJ5OiAiIiB9OwogICAgaWYgKHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIpIHsKICAgICAgcmV0dXJuIHsgcHJpbWFyeTogZm10KE4gKiBMQkZfUEVSX04sIDEpICsgIiBsYmYiLCBzZWNvbmRhcnk6IGZtdChOIC8gMTAwMCwgMikgKyAiIGtOICAvICAiICsgZm10KE4sIDApICsgIiBOIiB9OwogICAgfQogICAgaWYgKE1hdGguYWJzKE4pID49IDEwMDApIHsKICAgICAgcmV0dXJuIHsgcHJpbWFyeTogZm10KE4gLyAxMDAwLCAyKSArICIga04iLCBzZWNvbmRhcnk6IGZtdChOLCAwKSArICIgTiAgLyAgIiArIGZtdChOICogTEJGX1BFUl9OLCAxKSArICIgbGJmIiB9OwogICAgfQogICAgcmV0dXJuIHsgcHJpbWFyeTogZm10KE4sIDEpICsgIiBOIiwgc2Vjb25kYXJ5OiBmbXQoTiAqIExCRl9QRVJfTiwgMSkgKyAiIGxiZiIgfTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFN0cmVzcyhNUGEpIHsKICAgIGlmICghaXNGaW5pdGUoTVBhKSkgcmV0dXJuIHsgcHJpbWFyeTogIi0iLCBzZWNvbmRhcnk6ICIiIH07CiAgICBpZiAoc3RhdGUudW5pdCA9PT0gImltcGVyaWFsIikgewogICAgICByZXR1cm4geyBwcmltYXJ5OiBmbXQoTVBhICogUFNJX1BFUl9NUEEsIDApICsgIiBwc2kiLCBzZWNvbmRhcnk6IGZtdChNUGEsIDEpICsgIiBNUGEiIH07CiAgICB9CiAgICByZXR1cm4geyBwcmltYXJ5OiBmbXQoTVBhLCAxKSArICIgTVBhIiwgc2Vjb25kYXJ5OiBmbXQoTVBhICogUFNJX1BFUl9NUEEsIDApICsgIiBwc2kiIH07CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRBcmVhKG1tMikgewogICAgaWYgKCFpc0Zpbml0ZShtbTIpKSByZXR1cm4gIi0iOwogICAgaWYgKHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIpIHJldHVybiBmbXQobW0yIC8gTU0yX1BFUl9JTjIsIDQpICsgIiBpblx1MDBiMiI7CiAgICByZXR1cm4gZm10KG1tMiwgMSkgKyAiIG1tXHUwMGIyIjsKICB9CgogIGZ1bmN0aW9uIHN3aXRjaFVuaXQobmV4dCkgewogICAgaWYgKG5leHQgPT09IHN0YXRlLnVuaXQpIHJldHVybjsKICAgIHZhciBkID0gbnVtKGVsLmQpOwogICAgdmFyIHAgPSBudW0oZWwucCk7CiAgICB2YXIgYXQgPSBudW0oZWwuYXQpOwogICAgdmFyIHN1dCA9IG51bShlbC5zdXQpOwogICAgdmFyIHN5ID0gbnVtKGVsLnN5KTsKICAgIHZhciBGID0gbnVtKGVsLkYpOwogICAgdmFyIGZyb21GVSA9IGVsLmZVbml0LnZhbHVlOwogICAgdmFyIHRvRlUgPSBuZXh0ID09PSAiaW1wZXJpYWwiID8gImxiZiIgOiAiTiI7CgogICAgaWYgKG5leHQgPT09ICJpbXBlcmlhbCIpIHsKICAgICAgaWYgKGlzRmluaXRlKGQpKSBlbC5kLnZhbHVlID0gcm91bmRTbWFydChkIC8gTU1fUEVSX0lOKTsKICAgICAgaWYgKGlzRmluaXRlKHApICYmIHAgPiAwKSBlbC5wLnZhbHVlID0gcm91bmRTbWFydChNTV9QRVJfSU4gLyBwKTsKICAgICAgaWYgKGlzRmluaXRlKGF0KSkgZWwuYXQudmFsdWUgPSByb3VuZFNtYXJ0KGF0IC8gTU0yX1BFUl9JTjIpOwogICAgICBpZiAoaXNGaW5pdGUoc3V0KSkgZWwuc3V0LnZhbHVlID0gcm91bmRTbWFydChzdXQgKiBQU0lfUEVSX01QQSk7CiAgICAgIGlmIChpc0Zpbml0ZShzeSkpIGVsLnN5LnZhbHVlID0gcm91bmRTbWFydChzeSAqIFBTSV9QRVJfTVBBKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc0Zpbml0ZShkKSkgZWwuZC52YWx1ZSA9IHJvdW5kU21hcnQoZCAqIE1NX1BFUl9JTik7CiAgICAgIGlmIChpc0Zpbml0ZShwKSAmJiBwID4gMCkgZWwucC52YWx1ZSA9IHJvdW5kU21hcnQoTU1fUEVSX0lOIC8gcCk7CiAgICAgIGlmIChpc0Zpbml0ZShhdCkpIGVsLmF0LnZhbHVlID0gcm91bmRTbWFydChhdCAqIE1NMl9QRVJfSU4yKTsKICAgICAgaWYgKGlzRmluaXRlKHN1dCkpIGVsLnN1dC52YWx1ZSA9IHJvdW5kU21hcnQoc3V0IC8gUFNJX1BFUl9NUEEpOwogICAgICBpZiAoaXNGaW5pdGUoc3kpKSBlbC5zeS52YWx1ZSA9IHJvdW5kU21hcnQoc3kgLyBQU0lfUEVSX01QQSk7CiAgICB9CgogICAgZWwuZlVuaXQudmFsdWUgPSB0b0ZVOwogICAgbGFzdEZVbml0ID0gdG9GVTsKICAgIGlmIChpc0Zpbml0ZShGKSkgZWwuRi52YWx1ZSA9IHJvdW5kU21hcnQoY29udmVydEZvcmNlVW5pdFZhbHVlKEYsIGZyb21GVSwgdG9GVSkpOwogICAgc3RhdGUuc2l6ZUlkID0gIiI7CiAgICBzdGF0ZS51bml0ID0gbmV4dDsKICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsKICAgIHJlbmRlclNpemVDaGlwcygpOwogICAgaWYgKCFlbC5hdE1hbnVhbC5jaGVja2VkKSByZWZyZXNoQXQoKTsKICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogIH0KCiAgZnVuY3Rpb24gdG9TSSgpIHsKICAgIHZhciBtZXRyaWMgPSBzdGF0ZS51bml0ID09PSAibWV0cmljIjsKICAgIHZhciBkID0gbnVtKGVsLmQpOwogICAgdmFyIHAgPSBudW0oZWwucCk7CiAgICB2YXIgYXQgPSBudW0oZWwuYXQpOwogICAgdmFyIHN1dCA9IG51bShlbC5zdXQpOwogICAgdmFyIHN5ID0gbnVtKGVsLnN5KTsKICAgIHJldHVybiB7CiAgICAgIGQ6IGQsCiAgICAgIHA6IHAsCiAgICAgIGF0OiBhdCwKICAgICAgc3V0OiBzdXQsCiAgICAgIHN5OiBzeSwKICAgICAgZF9tbTogbWV0cmljID8gZCA6IGQgKiBNTV9QRVJfSU4sCiAgICAgIHBfbW06IG1ldHJpYyA\/IHAgOiAocCA+IDAgPyBNTV9QRVJfSU4gLyBwIDogTmFOKSwKICAgICAgYXRfbW0yOiBtZXRyaWMgPyBhdCA6IGF0ICogTU0yX1BFUl9JTjIsCiAgICAgIHN1dF9NUGE6IG1ldHJpYyA\/IHN1dCA6IHN1dCAvIFBTSV9QRVJfTVBBLAogICAgICBzeV9NUGE6IG1ldHJpYyA\/IHN5IDogc3kgLyBQU0lfUEVSX01QQSwKICAgICAgRl9OOiBmb3JjZVRvTigpLAogICAgICBuc2Y6IG51bShlbC5uc2YpLAogICAgICBuYm9sdHM6IG51bShlbC5uYm9sdHMpCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZW1wdHkobm9kZSkgewogICAgcmV0dXJuICFub2RlIHx8IFN0cmluZyhub2RlLnZhbHVlKS50cmltKCkgPT09ICIiOwogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGUoc2kpIHsKICAgIHZhciBvayA9IHRydWU7CiAgICBjbGVhckVycnMoKTsKCiAgICBpZiAoZW1wdHkoZWwuZCkgfHwgIWlzRmluaXRlKG51bShlbC5kKSkpIHsgc2V0RXJyKCJEIiwgIkVudGVyIGEgYm9sdCBkaWFtZXRlci4iKTsgb2sgPSBmYWxzZTsgfQogICAgZWxzZSBpZiAoIShzaS5kID4gMCkpIHsgc2V0RXJyKCJEIiwgIkRpYW1ldGVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7IG9rID0gZmFsc2U7IH0KICAgIGVsc2UgaWYgKHNpLmRfbW0gPCAxLjUgfHwgc2kuZF9tbSA+IDE1MCkgeyBzZXRFcnIoIkQiLCAiRGlhbWV0ZXIgbG9va3MgdW5yZWFsaXN0aWMuIFR5cGljYWwgcmFuZ2UgaXMgYWJvdXQgMiBtbSB0byAxNTAgbW0uIik7IG9rID0gZmFsc2U7IH0KCiAgICBpZiAoZW1wdHkoZWwucCkgfHwgIWlzRmluaXRlKG51bShlbC5wKSkpIHsKICAgICAgc2V0RXJyKCJQIiwgc3RhdGUudW5pdCA9PT0gIm1ldHJpYyIgPyAiRW50ZXIgdGhyZWFkIHBpdGNoLiIgOiAiRW50ZXIgdGhyZWFkcyBwZXIgaW5jaCAoVFBJKS4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoIShzaS5wID4gMCkpIHsKICAgICAgc2V0RXJyKCJQIiwgc3RhdGUudW5pdCA9PT0gIm1ldHJpYyIgPyAiUGl0Y2ggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iIDogIlRQSSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChzdGF0ZS51bml0ID09PSAibWV0cmljIiAmJiBzaS5kID4gMCAmJiBzaS5wID49IHNpLmQpIHsKICAgICAgc2V0RXJyKCJQIiwgIlBpdGNoIG11c3QgYmUgc21hbGxlciB0aGFuIHRoZSBib2x0IGRpYW1ldGVyLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChzaS5kX21tID4gMCAmJiBzaS5wX21tID4gMCAmJiAoc2kuZF9tbSAtIDAuOTM4MiAqIHNpLnBfbW0pIDw9IDApIHsKICAgICAgc2V0RXJyKCJQIiwgIlBpdGNoIGlzIHRvbyBsYXJnZSBmb3IgdGhpcyBkaWFtZXRlcjsgdGVuc2lsZSBzdHJlc3MgYXJlYSB3b3VsZCBiZSB6ZXJvLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfQoKICAgIGlmIChlbXB0eShlbC5hdCkgfHwgIWlzRmluaXRlKG51bShlbC5hdCkpKSB7IHNldEVycigiQXQiLCAiRW50ZXIgdGVuc2lsZSBzdHJlc3MgYXJlYSwgb3IgdW5jaGVjayBtYW51YWwgaW5wdXQgdG8gYXV0by1jYWxjdWxhdGUuIik7IG9rID0gZmFsc2U7IH0KICAgIGVsc2UgaWYgKCEoc2kuYXQgPiAwKSkgeyBzZXRFcnIoIkF0IiwgIlRlbnNpbGUgc3RyZXNzIGFyZWEgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsgb2sgPSBmYWxzZTsgfQoKICAgIGlmIChlbXB0eShlbC5GKSB8fCAhaXNGaW5pdGUobnVtKGVsLkYpKSkgeyBzZXRFcnIoIkYiLCAiRW50ZXIgdGhlIGFwcGxpZWQgdGVuc2lsZSBsb2FkLiIpOyBvayA9IGZhbHNlOyB9CiAgICBlbHNlIGlmICghKHNpLkZfTiA+IDApKSB7IHNldEVycigiRiIsICJBcHBsaWVkIHRlbnNpbGUgbG9hZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOyBvayA9IGZhbHNlOyB9CgogICAgaWYgKGVtcHR5KGVsLnN1dCkgfHwgIWlzRmluaXRlKG51bShlbC5zdXQpKSkgeyBzZXRFcnIoIlN1dCIsICJFbnRlciB1bHRpbWF0ZSB0ZW5zaWxlIHN0cmVuZ3RoLiIpOyBvayA9IGZhbHNlOyB9CiAgICBlbHNlIGlmICghKHNpLnN1dCA+IDApKSB7IHNldEVycigiU3V0IiwgIlVsdGltYXRlIHRlbnNpbGUgc3RyZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsgb2sgPSBmYWxzZTsgfQogICAgZWxzZSBpZiAoc2kuc3V0X01QYSA8IDIwMCB8fCBzaS5zdXRfTVBhID4gMjUwMCkgewogICAgICBzZXRFcnIoIlN1dCIsICJWYWx1ZSBsb29rcyB1bnJlYWxpc3RpYyBmb3IgYSBzdGVlbCBib2x0ICh0eXBpY2FsIDI1MOKAkzIyMDAgTVBhIC8gMzbigJMzMjAga3NpKS4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAoZW1wdHkoZWwuc3kpIHx8ICFpc0Zpbml0ZShudW0oZWwuc3kpKSkgeyBzZXRFcnIoIlN5IiwgIkVudGVyIHlpZWxkIHN0cmVuZ3RoLiIpOyBvayA9IGZhbHNlOyB9CiAgICBlbHNlIGlmICghKHNpLnN5ID4gMCkpIHsgc2V0RXJyKCJTeSIsICJZaWVsZCBzdHJlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOyBvayA9IGZhbHNlOyB9CiAgICBlbHNlIGlmIChzaS5zeV9NUGEgPCA4MCB8fCBzaS5zeV9NUGEgPiAyMjAwKSB7CiAgICAgIHNldEVycigiU3kiLCAiWWllbGQgc3RyZW5ndGggbG9va3MgdW5yZWFsaXN0aWMgZm9yIGEgc3RlZWwgYm9sdC4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoaXNGaW5pdGUoc2kuc3V0X01QYSkgJiYgc2kuc3lfTVBhID4gc2kuc3V0X01QYSkgewogICAgICBzZXRFcnIoIlN5IiwgIllpZWxkIHN0cmVuZ3RoIGNhbm5vdCBleGNlZWQgdWx0aW1hdGUgdGVuc2lsZSBzdHJlbmd0aC4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAoZW1wdHkoZWwubnNmKSB8fCAhaXNGaW5pdGUobnVtKGVsLm5zZikpKSB7IHNldEVycigiTnNmIiwgIkVudGVyIGEgZGVzaWduIHNhZmV0eSBmYWN0b3IuIik7IG9rID0gZmFsc2U7IH0KICAgIGVsc2UgaWYgKCEoc2kubnNmID4gMCkpIHsgc2V0RXJyKCJOc2YiLCAiRGVzaWduIHNhZmV0eSBmYWN0b3IgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsgb2sgPSBmYWxzZTsgfQogICAgZWxzZSBpZiAoc2kubnNmIDwgMSB8fCBzaS5uc2YgPiAxMikgeyBzZXRFcnIoIk5zZiIsICJFbnRlciBhIGRlc2lnbiBzYWZldHkgZmFjdG9yIGJldHdlZW4gMSBhbmQgMTIuIik7IG9rID0gZmFsc2U7IH0KCiAgICBpZiAoZW1wdHkoZWwubmJvbHRzKSB8fCAhaXNGaW5pdGUobnVtKGVsLm5ib2x0cykpKSB7IHNldEVycigiTmJvbHRzIiwgIkVudGVyIHRoZSBudW1iZXIgb2YgYm9sdHMuIik7IG9rID0gZmFsc2U7IH0KICAgIGVsc2UgaWYgKCEoc2kubmJvbHRzID49IDEpIHx8IE1hdGguZmxvb3Ioc2kubmJvbHRzKSAhPT0gc2kubmJvbHRzKSB7CiAgICAgIHNldEVycigiTmJvbHRzIiwgIk51bWJlciBvZiBib2x0cyBtdXN0IGJlIGFuIGludGVnZXIgXHUyMjY1IDEuIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIG9rOwogIH0KCiAgZnVuY3Rpb24gc2V0R2F1Z2Uoc2YpIHsKICAgIHZhciBmcmFjID0gY2xhbXAoKGlzRmluaXRlKHNmKSA\/IHNmIDogMCkgLyA0LCAwLCAxKTsKICAgIGlmIChlbC5nYXVnZUFyYykgZWwuZ2F1Z2VBcmMuc2V0QXR0cmlidXRlKCJzdHJva2UtZGFzaG9mZnNldCIsIFN0cmluZyhBUkNfTEVOICogKDEgLSBmcmFjKSkpOwogICAgdmFyIGFuZyA9IC05MCArIGZyYWMgKiAxODA7CiAgICBpZiAoZWwubmVlZGxlKSBlbC5uZWVkbGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCAicm90YXRlKCIgKyBhbmcgKyAiIDEyMCAxMTgpIik7CiAgfQoKICBmdW5jdGlvbiBzZXRTY2hlbWF0aWMoc3RhdHVzKSB7CiAgICBpZiAoIWVsLnNjaGVtYXRpYykgcmV0dXJuOwogICAgZWwuc2NoZW1hdGljLnNldEF0dHJpYnV0ZSgiZGF0YS1zdGF0dXMiLCBzdGF0dXMgfHwgImlkbGUiKTsKICB9CgogIGZ1bmN0aW9uIHNldEJhcihub2RlLCBwY3QpIHsKICAgIGlmICghbm9kZSkgcmV0dXJuOwogICAgbm9kZS5zdHlsZS53aWR0aCA9IGNsYW1wKHBjdCwgMCwgMTAwKSArICIlIjsKICB9CgogIGZ1bmN0aW9uIGNhbGN1bGF0ZShzY3JvbGwpIHsKICAgIHJlZnJlc2hBdCgpOwogICAgdmFyIHNpID0gdG9TSSgpOwogICAgdmFyIG9rID0gdmFsaWRhdGUoc2kpOwogICAgaWYgKGVsLnJlc3VsdHMpIGVsLnJlc3VsdHMuY2xhc3NMaXN0LnJlbW92ZSgiYnRzLWhpZGRlbiIpOwoKICAgIGlmICghb2spIHsKICAgICAgc3RhdGUubGl2ZSA9IGZhbHNlOwogICAgICBlbC5zdGF0dXNUaXRsZS50ZXh0Q29udGVudCA9ICJDaGVjayBpbnB1dHMiOwogICAgICBlbC5zdGF0dXNOb3RlLnRleHRDb250ZW50ID0gIkNvcnJlY3QgdGhlIGhpZ2hsaWdodGVkIGZpZWxkcywgdGhlbiBjYWxjdWxhdGUgYWdhaW4uIEVtcHR5LCB6ZXJvLCBvciBuZWdhdGl2ZSB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkLiI7CiAgICAgIGVsLmJhbm5lci5jbGFzc05hbWUgPSAiYnRzLWJhbm5lciBidHMtYmFubmVyLWNhdXRpb24iOwogICAgICBzZXRHYXVnZSgwKTsKICAgICAgc2V0U2NoZW1hdGljKCJpZGxlIik7CiAgICAgIGlmIChzY3JvbGwpIHsKICAgICAgICB0cnkgeyBlbC5yZXN1bHRzLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICJzbW9vdGgiLCBibG9jazogIm5lYXJlc3QiIH0pOyB9IGNhdGNoIChlKSB7fQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgQXQgPSBzaS5hdF9tbTI7CiAgICB2YXIgbkJvbHRzID0gc2kubmJvbHRzOwogICAgdmFyIEZ0b3RhbCA9IHNpLkZfTjsKICAgIHZhciBGYiA9IEZ0b3RhbCAvIG5Cb2x0czsKICAgIHZhciBzaWdtYSA9IEZiIC8gQXQ7CiAgICB2YXIgU3V0ID0gc2kuc3V0X01QYTsKICAgIHZhciBTeSA9IHNpLnN5X01QYTsKICAgIHZhciBuc2YgPSBzaS5uc2Y7CiAgICB2YXIgU2EgPSBTeSAvIG5zZjsKICAgIHZhciBGdCA9IEF0ICogU3V0OwogICAgdmFyIEZhID0gQXQgKiBTYTsKICAgIHZhciBGeSA9IEF0ICogU3k7CiAgICB2YXIgc2ZBbGxvdyA9IEZhIC8gRmI7CiAgICB2YXIgc2ZZaWVsZCA9IFN5IC8gc2lnbWE7CiAgICB2YXIgc2ZVbHQgPSBTdXQgLyBzaWdtYTsKICAgIHZhciB1dGlsID0gKEZiIC8gRmEpICogMTAwOwoKICAgIHZhciBhbGVydHMgPSBbXTsKICAgIHZhciBzdGF0dXMgPSAic2FmZSI7CiAgICB2YXIgdGl0bGUgPSAiU2FmZSI7CiAgICB2YXIgbm90ZSA9ICJUZW5zaWxlIHN0cmVzcyBpcyB3aXRoaW4gdGhlIGFsbG93YWJsZSByYW5nZSBmb3IgdGhlIHNlbGVjdGVkIGRlc2lnbiBzYWZldHkgZmFjdG9yLiI7CgogICAgaWYgKGVsLmF0TWFudWFsLmNoZWNrZWQpIHsKICAgICAgdmFyIGF0QXV0byA9IHRlbnNpbGVBcmVhKHNpLmQsIHNpLnAsIHN0YXRlLnVuaXQpOwogICAgICBpZiAoaXNGaW5pdGUoYXRBdXRvKSAmJiBNYXRoLmFicyhzaS5hdCAtIGF0QXV0bykgLyBhdEF1dG8gPiAwLjE1KSB7CiAgICAgICAgYWxlcnRzLnB1c2goeyB0eXBlOiAid2FybiIsIHRleHQ6ICJNYW51YWwgdGVuc2lsZSBzdHJlc3MgYXJlYSBkaWZmZXJzIGJ5IG1vcmUgdGhhbiAxNSUgZnJvbSB0aGUgcGl0Y2ggZm9ybXVsYS4gQ29uZmlybSB0aGUgY2F0YWxvZyBBdCB2YWx1ZSB1c2VkIGluIHRoaXMgQm9sdCBTdHJlc3MgQ2FsY3VsYXRvci4iIH0pOwogICAgICB9CiAgICB9CiAgICBpZiAoU3kgLyBTdXQgPiAwLjk1KSB7CiAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogIndhcm4iLCB0ZXh0OiAiWWllbGQgaXMgbW9yZSB0aGFuIDk1JSBvZiB1bHRpbWF0ZSB0ZW5zaWxlIHN0cmVuZ3RoLiBIaWdoLXN0cmVuZ3RoIGJvbHRzIGhhdmUgbGltaXRlZCBkdWN0aWxpdHk7IGNoZWNrIHRoZSBtYXRlcmlhbCBjZXJ0aWZpY2F0ZS4iIH0pOwogICAgfSBlbHNlIGlmIChTeSAvIFN1dCA8IDAuNDUpIHsKICAgICAgYWxlcnRzLnB1c2goeyB0eXBlOiAid2FybiIsIHRleHQ6ICJZaWVsZCBpcyB1bnVzdWFsbHkgbG93IGNvbXBhcmVkIHdpdGggdWx0aW1hdGUgc3RyZW5ndGguIENvbmZpcm0gdGhlIGdyYWRlIGFuZCB1bml0cy4iIH0pOwogICAgfQogICAgaWYgKG5Cb2x0cyA+IDEpIHsKICAgICAgYWxlcnRzLnB1c2goeyB0eXBlOiAib2siLCB0ZXh0OiAiTG9hZCBwZXIgYm9sdCA9IHRvdGFsIGxvYWQgLyAiICsgbkJvbHRzICsgIiAoZXF1YWwgc2hhcmUpLiBQYXR0ZXJuIGdlb21ldHJ5IGFuZCBwcnlpbmcgY2FuIG92ZXJsb2FkIHRoZSBtb3N0IGhpZ2hseSBsb2FkZWQgZmFzdGVuZXIuIiB9KTsKICAgIH0KICAgIGlmIChzaWdtYSA+PSBTeSkgewogICAgICBhbGVydHMucHVzaCh7IHR5cGU6ICJyaXNrIiwgdGV4dDogIkJvbHQgdGVuc2lsZSBzdHJlc3MgZXhjZWVkcyB5aWVsZCBzdHJlbmd0aC4gUGVybWFuZW50IGVsb25nYXRpb24gb3IgZnJhY3R1cmUgaXMgbGlrZWx5LiIgfSk7CiAgICB9IGVsc2UgaWYgKHNpZ21hID49IDAuOTAgKiBTeSkgewogICAgICBhbGVydHMucHVzaCh7IHR5cGU6ICJ3YXJuIiwgdGV4dDogIkJvbHQgdGVuc2lsZSBzdHJlc3MgYXBwcm9hY2hlcyB5aWVsZCAoIiArIGZtdChzaWdtYSAvIFN5ICogMTAwLCAxKSArICIlIG9mIFN5KS4gUmVkdWNlIGxvYWQgb3IgdXNlIGEgbGFyZ2VyIC8gaGlnaGVyLWdyYWRlIGJvbHQuIiB9KTsKICAgIH0KICAgIGlmIChzaWdtYSA+PSBTdXQpIHsKICAgICAgYWxlcnRzLnB1c2goeyB0eXBlOiAicmlzayIsIHRleHQ6ICJCb2x0IHRlbnNpbGUgc3RyZXNzIG1lZXRzIG9yIGV4Y2VlZHMgdWx0aW1hdGUgdGVuc2lsZSBzdHJlbmd0aC4gRnJhY3R1cmUgcmlzayBpcyBoaWdoLiIgfSk7CiAgICB9CgogICAgaWYgKHV0aWwgPiAxMDAgfHwgc2lnbWEgPj0gU3kgfHwgRmIgPj0gRmEpIHsKICAgICAgc3RhdHVzID0gInJpc2siOwogICAgICB0aXRsZSA9ICJGYWlsdXJlIFJpc2siOwogICAgICBub3RlID0gIkFwcGxpZWQgdGVuc2lsZSBsb2FkIGV4Y2VlZHMgdGhlIGFsbG93YWJsZSB0ZW5zaWxlIGNhcGFjaXR5LiBJbmNyZWFzZSBib2x0IHNpemUgb3IgZ3JhZGUsIGFkZCBmYXN0ZW5lcnMsIG9yIHJlZHVjZSB0aGUgbG9hZCBiZWZvcmUgdXNpbmcgdGhpcyBjb25uZWN0aW9uLiI7CiAgICAgIGFsZXJ0cy51bnNoaWZ0KHsgdHlwZTogInJpc2siLCB0ZXh0OiAiQXBwbGllZCBsb2FkIHBlciBib2x0ICIgKyBmb3JtYXRGb3JjZShGYikucHJpbWFyeSArICIgZXhjZWVkcyBhbGxvd2FibGUgdGVuc2lsZSBsb2FkICIgKyBmb3JtYXRGb3JjZShGYSkucHJpbWFyeSArICIuIiB9KTsKICAgIH0gZWxzZSBpZiAodXRpbCA+PSA4NSB8fCBzaWdtYSA+PSAwLjkwICogU3kgfHwgc2ZBbGxvdyA8IDEuMTUpIHsKICAgICAgc3RhdHVzID0gImNhdXRpb24iOwogICAgICB0aXRsZSA9ICJXYXJuaW5nIjsKICAgICAgbm90ZSA9ICJTdHJlc3MgYXBwcm9hY2hlcyB0aGUgYWxsb3dhYmxlIGRlc2lnbiBsaW1pdC4gQ29uZmlybSBpbnN0YWxsYXRpb24sIHRocmVhZCBjb25kaXRpb24sIGFuZCBhcHBsaWNhYmxlIHN0YW5kYXJkcyBiZWZvcmUgYWNjZXB0aW5nIHRoaXMgcmVzdWx0IGZyb20gdGhlIEJvbHQgVGVuc2lsZSBTdHJlbmd0aCBDYWxjdWxhdG9yLiI7CiAgICAgIGFsZXJ0cy51bnNoaWZ0KHsgdHlwZTogIndhcm4iLCB0ZXh0OiAiTG9hZCB1dGlsaXphdGlvbiBpcyAiICsgZm10KHV0aWwsIDEpICsgIiUgb2YgYWxsb3dhYmxlIGNhcGFjaXR5LiBSZW1haW5pbmcgbWFyZ2luIGlzIHNtYWxsLiIgfSk7CiAgICB9IGVsc2UgewogICAgICBzdGF0dXMgPSAic2FmZSI7CiAgICAgIHRpdGxlID0gIlNhZmUiOwogICAgICBub3RlID0gIlRlbnNpbGUgc3RyZXNzIGlzIHdpdGhpbiB0aGUgYWxsb3dhYmxlIHJhbmdlLiBTYWZldHkgZmFjdG9yIHZlcnN1cyBhbGxvd2FibGUgbG9hZCBpcyAiICsgZm10KHNmQWxsb3csIDIpICsgIi4iOwogICAgICBhbGVydHMudW5zaGlmdCh7IHR5cGU6ICJvayIsIHRleHQ6ICJCb2x0IHN0cmVuZ3RoIHN0YXR1cyBpcyBTYWZlLiBBY3R1YWwgc2FmZXR5IGZhY3RvciB2cyB5aWVsZCBpcyAiICsgZm10KHNmWWllbGQsIDIpICsgIiAoU3kgLyBcdTAzYzMpLiIgfSk7CiAgICB9CgogICAgdmFyIHNGbXQgPSBmb3JtYXRTdHJlc3Moc2lnbWEpOwogICAgdmFyIGZ0Rm10ID0gZm9ybWF0Rm9yY2UoRnQpOwogICAgdmFyIGZhRm10ID0gZm9ybWF0Rm9yY2UoRmEpOwogICAgdmFyIGZiRm10ID0gZm9ybWF0Rm9yY2UoRmIpOwoKICAgIGVsLm91dFN0cmVzcy50ZXh0Q29udGVudCA9IHNGbXQucHJpbWFyeTsKICAgIGVsLm91dFN0cmVzc1N1Yi50ZXh0Q29udGVudCA9IChzRm10LnNlY29uZGFyeSA\/IHNGbXQuc2Vjb25kYXJ5ICsgIiAgXHUyMDE0ICAiIDogIiIpICsgIlx1MDNjMyA9IEYgLyBBdCI7CiAgICBlbC5vdXRGdC50ZXh0Q29udGVudCA9IGZ0Rm10LnByaW1hcnk7CiAgICBlbC5vdXRGdFN1Yi50ZXh0Q29udGVudCA9IGZ0Rm10LnNlY29uZGFyeSB8fCAiRnQgPSBBdCBcdTAwZDcgU3V0IjsKICAgIGVsLm91dEZhLnRleHRDb250ZW50ID0gZmFGbXQucHJpbWFyeTsKICAgIGVsLm91dEZhU3ViLnRleHRDb250ZW50ID0gZmFGbXQuc2Vjb25kYXJ5IHx8ICJGYSA9IEF0IFx1MDBkNyBTYSI7CiAgICBlbC5vdXRTZi50ZXh0Q29udGVudCA9IGZtdChzZkFsbG93LCAyKTsKICAgIGVsLm91dFNmU3ViLnRleHRDb250ZW50ID0gIkFsbG93YWJsZSBsb2FkIC8gYXBwbGllZCBsb2FkIHBlciBib2x0IjsKCiAgICBlbC5vdXRVdGlsLnRleHRDb250ZW50ID0gZm10KHV0aWwsIDEpICsgIiUgb2YgYWxsb3dhYmxlIjsKICAgIGVsLnV0aWxGaWxsLnN0eWxlLndpZHRoID0gY2xhbXAodXRpbCwgMCwgMTAwKSArICIlIjsKICAgIGVsLnV0aWxGaWxsLmNsYXNzTmFtZSA9ICJidHMtdXRpbC1maWxsIiArIChzdGF0dXMgPT09ICJyaXNrIiA\/ICIgYnRzLWlzLXJpc2siIDogc3RhdHVzID09PSAiY2F1dGlvbiIgPyAiIGJ0cy1pcy1jYXV0aW9uIiA6ICIgYnRzLWlzLW9rIik7CgogICAgZWwub3V0QXQudGV4dENvbnRlbnQgPSBmb3JtYXRBcmVhKEF0KTsKICAgIGVsLm91dEF0Tm90ZS50ZXh0Q29udGVudCA9IGVsLmF0TWFudWFsLmNoZWNrZWQgPyAibWFudWFsIGlucHV0IiA6IChzdGF0ZS51bml0ID09PSAibWV0cmljIiA\/ICJmcm9tIGQgYW5kIHBpdGNoIiA6ICJmcm9tIGQgYW5kIFRQSSIpOwogICAgZWwub3V0RmIudGV4dENvbnRlbnQgPSBmYkZtdC5wcmltYXJ5OwogICAgZWwub3V0RmJOb3RlLnRleHRDb250ZW50ID0gbkJvbHRzID4gMSA\/ICJ0b3RhbCAiICsgZm9ybWF0Rm9yY2UoRnRvdGFsKS5wcmltYXJ5ICsgIiAvICIgKyBuQm9sdHMgOiAic2luZ2xlIGJvbHQiOwogICAgZWwub3V0U2EudGV4dENvbnRlbnQgPSBmb3JtYXRTdHJlc3MoU2EpLnByaW1hcnk7CiAgICBlbC5vdXRTeS50ZXh0Q29udGVudCA9IGZvcm1hdFN0cmVzcyhTeSkucHJpbWFyeTsKICAgIGVsLm91dFN1dC50ZXh0Q29udGVudCA9IGZvcm1hdFN0cmVzcyhTdXQpLnByaW1hcnk7CiAgICBlbC5vdXROeWllbGQudGV4dENvbnRlbnQgPSBmbXQoc2ZZaWVsZCwgMik7CiAgICBlbC5vdXROdWx0LnRleHRDb250ZW50ID0gZm10KHNmVWx0LCAyKTsKCiAgICBpZiAoZWwuZ2F1Z2VSZWFkKSBlbC5nYXVnZVJlYWQudGV4dENvbnRlbnQgPSBmbXQoc2ZBbGxvdywgMik7CiAgICBpZiAoZWwuZ2F1Z2VOb3RlKSBlbC5nYXVnZU5vdGUudGV4dENvbnRlbnQgPSAidnMgZGVzaWduIGFsbG93YWJsZSAobiA9ICIgKyBmbXQobnNmLCAyKSArICIpIjsKICAgIHNldEdhdWdlKHNmQWxsb3cpOwoKICAgIGlmIChlbC5zY2hGb3JjZSkgZWwuc2NoRm9yY2UudGV4dENvbnRlbnQgPSBmYkZtdC5wcmltYXJ5OwogICAgc2V0U2NoZW1hdGljKHN0YXR1cyA9PT0gInJpc2siID8gInJpc2siIDogc3RhdHVzID09PSAiY2F1dGlvbiIgPyAiY2F1dGlvbiIgOiAib2siKTsKCiAgICB2YXIgc2NhbGUgPSBNYXRoLm1heChTdXQsIFN5LCBTYSwgc2lnbWEsIDEpOwogICAgc2V0QmFyKGVsLmJhclNpZ21hLCBzaWdtYSAvIHNjYWxlICogMTAwKTsKICAgIHNldEJhcihlbC5iYXJTYSwgU2EgLyBzY2FsZSAqIDEwMCk7CiAgICBzZXRCYXIoZWwuYmFyU3ksIFN5IC8gc2NhbGUgKiAxMDApOwogICAgc2V0QmFyKGVsLmJhclN1dCwgU3V0IC8gc2NhbGUgKiAxMDApOwogICAgaWYgKGVsLmJhclNpZ21hVmFsKSBlbC5iYXJTaWdtYVZhbC50ZXh0Q29udGVudCA9IHNGbXQucHJpbWFyeTsKICAgIGlmIChlbC5iYXJTYVZhbCkgZWwuYmFyU2FWYWwudGV4dENvbnRlbnQgPSBmb3JtYXRTdHJlc3MoU2EpLnByaW1hcnk7CiAgICBpZiAoZWwuYmFyU3lWYWwpIGVsLmJhclN5VmFsLnRleHRDb250ZW50ID0gZm9ybWF0U3RyZXNzKFN5KS5wcmltYXJ5OwogICAgaWYgKGVsLmJhclN1dFZhbCkgZWwuYmFyU3V0VmFsLnRleHRDb250ZW50ID0gZm9ybWF0U3RyZXNzKFN1dCkucHJpbWFyeTsKICAgIGlmIChlbC5iYXJTaWdtYSkgewogICAgICBlbC5iYXJTaWdtYS5jbGFzc05hbWUgPSAiYnRzLWJhci1maWxsIiArIChzdGF0dXMgPT09ICJyaXNrIiA\/ICIgYnRzLWlzLXJpc2siIDogc3RhdHVzID09PSAiY2F1dGlvbiIgPyAiIGJ0cy1pcy1jYXV0aW9uIiA6ICIgYnRzLWlzLW9rIik7CiAgICB9CgogICAgZWwuc3RhdHVzVGl0bGUudGV4dENvbnRlbnQgPSB0aXRsZTsKICAgIGVsLnN0YXR1c05vdGUudGV4dENvbnRlbnQgPSBub3RlOwogICAgZWwuYmFubmVyLmNsYXNzTmFtZSA9ICJidHMtYmFubmVyIGJ0cy1iYW5uZXItIiArIChzdGF0dXMgPT09ICJzYWZlIiA\/ICJvayIgOiBzdGF0dXMgPT09ICJyaXNrIiA\/ICJyaXNrIiA6ICJjYXV0aW9uIik7CgogICAgZWwuYWxlcnRzLmlubmVySFRNTCA9ICIiOwogICAgYWxlcnRzLmZvckVhY2goZnVuY3Rpb24gKGEpIHsKICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICBkaXYuY2xhc3NOYW1lID0gImJ0cy1hbGVydCBidHMtYWxlcnQtIiArIChhLnR5cGUgPT09ICJyaXNrIiA\/ICJyaXNrIiA6IGEudHlwZSA9PT0gIm9rIiA\/ICJvayIgOiAid2FybiIpOwogICAgICBkaXYudGV4dENvbnRlbnQgPSBhLnRleHQ7CiAgICAgIGVsLmFsZXJ0cy5hcHBlbmRDaGlsZChkaXYpOwogICAgfSk7CgogICAgc3RhdGUubGl2ZSA9IHRydWU7CiAgICBpZiAoc2Nyb2xsKSB7CiAgICAgIHRyeSB7IGVsLmJhbm5lci5jbG9zZXN0KCIuYnRzLWNhcmQiKS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAic21vb3RoIiwgYmxvY2s6ICJuZWFyZXN0IiB9KTsgfSBjYXRjaCAoZSkge30KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc2V0QWxsKCkgewogICAgc3RhdGUudW5pdCA9ICJtZXRyaWMiOwogICAgc3RhdGUuc2l6ZUlkID0gREVGQVVMVFMuc2l6ZTsKICAgIHN0YXRlLmxpdmUgPSBmYWxzZTsKICAgIGVsLmQudmFsdWUgPSBTdHJpbmcoREVGQVVMVFMuZCk7CiAgICBlbC5wLnZhbHVlID0gU3RyaW5nKERFRkFVTFRTLnApOwogICAgZWwuYXRNYW51YWwuY2hlY2tlZCA9IGZhbHNlOwogICAgZWwuYXQucmVhZE9ubHkgPSB0cnVlOwogICAgZWwuZ3JhZGUudmFsdWUgPSBERUZBVUxUUy5ncmFkZTsKICAgIGVsLm5zZi52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy5uc2YpOwogICAgZWwubmJvbHRzLnZhbHVlID0gU3RyaW5nKERFRkFVTFRTLm5ib2x0cyk7CiAgICBlbC5mVW5pdC52YWx1ZSA9IERFRkFVTFRTLmZVbml0OwogICAgbGFzdEZVbml0ID0gREVGQVVMVFMuZlVuaXQ7CiAgICBlbC5GLnZhbHVlID0gU3RyaW5nKERFRkFVTFRTLkYpOwogICAgYXBwbHlHcmFkZSgpOwogICAgdXBkYXRlVW5pdExhYmVscygpOwogICAgcmVuZGVyU2l6ZUNoaXBzKCk7CiAgICByZWZyZXNoQXQoKTsKICAgIGNsZWFyRXJycygpOwogICAgZWwucmVzdWx0cy5jbGFzc0xpc3QuYWRkKCJidHMtaGlkZGVuIik7CiAgICBzZXRHYXVnZSgwKTsKICAgIHNldFNjaGVtYXRpYygiaWRsZSIpOwogIH0KCiAgZnVuY3Rpb24gb25Sb290Q2xpY2soZSkgewogICAgdmFyIGJ0biA9IGUudGFyZ2V0ICYmIGUudGFyZ2V0LmNsb3Nlc3QgPyBlLnRhcmdldC5jbG9zZXN0KCJidXR0b24iKSA6IG51bGw7CiAgICBpZiAoIWJ0biB8fCAhcm9vdC5jb250YWlucyhidG4pKSByZXR1cm47CiAgICBpZiAoYnRuLmlkID09PSAiYnRzQnRuTWV0cmljIikgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHN3aXRjaFVuaXQoIm1ldHJpYyIpOwogICAgfSBlbHNlIGlmIChidG4uaWQgPT09ICJidHNCdG5JbXBlcmlhbCIpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzd2l0Y2hVbml0KCJpbXBlcmlhbCIpOwogICAgfSBlbHNlIGlmIChidG4uaWQgPT09ICJidHNCdG5SZXNldCIpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICByZXNldEFsbCgpOwogICAgfSBlbHNlIGlmIChidG4uaWQgPT09ICJidHNCdG5DYWxjdWxhdGUiKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY2FsY3VsYXRlKHRydWUpOwogICAgfQogIH0KCiAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIG9uUm9vdENsaWNrKTsKICBpZiAoZWwuYnRuQ2FsYykgZWwuYnRuQ2FsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgY2FsY3VsYXRlKHRydWUpOyB9KTsKCiAgZWwuYXRNYW51YWwuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgZWwuYXQucmVhZE9ubHkgPSAhZWwuYXRNYW51YWwuY2hlY2tlZDsKICAgIGlmICghZWwuYXRNYW51YWwuY2hlY2tlZCkgcmVmcmVzaEF0KCk7CiAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsKICB9KTsKCiAgZWwuZ3JhZGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgaWYgKGVsLmdyYWRlLnZhbHVlID09PSAiY3VzdG9tIikgewogICAgICBlbC5zdXQucmVhZE9ubHkgPSBmYWxzZTsKICAgICAgZWwuc3kucmVhZE9ubHkgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGx5R3JhZGUoKTsKICAgIH0KICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogIH0pOwoKICBbInN1dCIsICJzeSJdLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgZWxba2V5XS5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsKICAgICAgbWFya0N1c3RvbUdyYWRlKCk7CiAgICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogICAgfSk7CiAgfSk7CgogIFsiZCIsICJwIl0uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICBlbFtrZXldLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKCkgewogICAgICBzdGF0ZS5zaXplSWQgPSAiIjsKICAgICAgcGFpbnRDaGlwcygpOwogICAgICBpZiAoIWVsLmF0TWFudWFsLmNoZWNrZWQpIHJlZnJlc2hBdCgpOwogICAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsKICAgIH0pOwogIH0pOwoKICBbImF0IiwgIkYiLCAibnNmIiwgIm5ib2x0cyJdLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgZWxba2V5XS5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7CiAgICB9KTsKICB9KTsKCiAgZWwuZlVuaXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgdmFyIG5leHQgPSBlbC5mVW5pdC52YWx1ZTsKICAgIGlmIChuZXh0ID09PSBsYXN0RlVuaXQpIHJldHVybjsKICAgIHZhciBGID0gbnVtKGVsLkYpOwogICAgZWwuZlVuaXQudmFsdWUgPSBsYXN0RlVuaXQ7CiAgICBpZiAoaXNGaW5pdGUoRikpIGVsLkYudmFsdWUgPSByb3VuZFNtYXJ0KGNvbnZlcnRGb3JjZVVuaXRWYWx1ZShGLCBsYXN0RlVuaXQsIG5leHQpKTsKICAgIGVsLmZVbml0LnZhbHVlID0gbmV4dDsKICAgIGxhc3RGVW5pdCA9IG5leHQ7CiAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsKICB9KTsKCiAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgIGlmIChlLmtleSA9PT0gIkVudGVyIiAmJiBlLnRhcmdldCAmJiBlLnRhcmdldC50YWdOYW1lID09PSAiSU5QVVQiKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY2FsY3VsYXRlKHRydWUpOwogICAgfQogIH0pOwoKICB3aW5kb3cuYnRzU3dpdGNoVW5pdCA9IHN3aXRjaFVuaXQ7CiAgd2luZG93LmJ0c1Jlc2V0ID0gcmVzZXRBbGw7CiAgd2luZG93LmJ0c0NhbGN1bGF0ZSA9IGZ1bmN0aW9uICgpIHsgY2FsY3VsYXRlKHRydWUpOyB9OwoKICB1cGRhdGVVbml0TGFiZWxzKCk7CiAgcmVuZGVyU2l6ZUNoaXBzKCk7CiAgYXBwbHlHcmFkZSgpOwogIHJlZnJlc2hBdCgpOwp9KSgpOwo=<\/textarea>\n<script id=\"bts-boot-script\" type=\"text\/javascript\" data-no-minify=\"1\" data-no-defer=\"1\" data-cfasync=\"false\">\n(function(){\nfunction boot(){\nif(window.btsCalculate){return;}\nvar el=document.getElementById(\"bts-js-b64\");\nif(!el){return;}\nvar code=el.value;\nif(!code){code=el.textContent;}\nif(!code){return;}\ncode=code.replace(\/\\s\/g,\"\");\nvar js=atob(code);\nvar s=document.createElement(\"script\");\ns.type=\"text\/javascript\";\ns.setAttribute(\"data-no-minify\",\"1\");\ns.setAttribute(\"data-cfasync\",\"false\");\ns.text=js;\nvar p=document.body;\nif(!p){p=document.getElementsByTagName(\"head\")[0];}\nif(p){p.appendChild(s);}\n}\nwindow.btsBoot=boot;\nif(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",boot);}\nelse{boot();}\n})();\n<\/script>\n\n<\/div>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>The Bolt Tensile Strength Check Calculator is a professional engineering tool designed to evaluate the tensile strength and load-bearing capacity of bolts under different working&#8230;<\/p>","protected":false},"author":2,"featured_media":24686,"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":[8520],"tags":[8602,8601,8603,8604],"class_list":["post-24685","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-bolt-load","tag-bolt-strength","tag-fastener-design","tag-tensile-stress","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Bolt-Tensile-Strength-Check-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24685","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/comments?post=24685"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24685\/revisions"}],"predecessor-version":[{"id":24687,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24685\/revisions\/24687"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media\/24686"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media?parent=24685"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/categories?post=24685"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/tags?post=24685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}