{"id":24682,"date":"2026-08-18T05:22:03","date_gmt":"2026-08-18T05:22:03","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24682"},"modified":"2026-08-18T05:22:06","modified_gmt":"2026-08-18T05:22:06","slug":"bolt-torque-%e2%86%94-preload-conversion-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ru\/bolt-torque-%e2%86%94-preload-conversion-calculator\/","title":{"rendered":"Bolt Torque \u2194 Preload Conversion Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Bolt Torque \u2194 Preload Conversion Calculator<\/strong> is a practical engineering tool designed to convert tightening torque into bolt preload force and calculate the required torque based on a target clamping force. By considering key parameters such as bolt diameter, friction coefficient, lubrication condition, and fastener properties, this calculator helps engineers achieve accurate bolt tightening results. The Bolt Torque \u2194 Preload Conversion Calculator supports mechanical assembly design, maintenance operations, and fastener selection while reducing the risk of loose connections, insufficient clamping force, excessive stress, and bolt 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 Torque to Preload Calculator and Bolt Preload Calculator. Convert tightening torque to bolt clamp force or required torque from target preload. Fastener Torque Conversion Tool and Torque Tension Calculator for metric and UN bolts.\" \/>\n  <title>Bolt Torque \u2194 Preload Conversion Calculator | Bolt Torque Calculator<\/title>\n  <style>\n    body:has(> #btp-root:only-child) { margin: 0; padding: 0; background: #e8eef4; }\n  <\/style>\n<\/head>\n<body>\n<!--\n  WordPress embed: copy the entire #btp-root div (style + markup + script)\n  into a Custom HTML block. Paste the whole #btp-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 btp-js-b64 and btp-boot-script.\n  All CSS is scoped to #btp-root and will not affect theme header, footer, or other content.\n-->\n<div id=\"btp-root\">\n<style id=\"btp-calc-styles\">\n\/*\n * WordPress-safe: every rule is scoped under #btp-root.\n * This stylesheet must not restyle theme header, footer, or content\n * outside the calculator. No html\/body\/universal selectors.\n *\/\n\n#btp-root {\n  all: revert;\n  --btp-bg: transparent;\n  --btp-surface: #ffffff;\n  --btp-surface-2: #f4f7fa;\n  --btp-ink: #0f172a;\n  --btp-muted: #64748b;\n  --btp-line: #d4dde8;\n  --btp-accent: #0369a1;\n  --btp-accent-2: #0284c7;\n  --btp-steel: #1e293b;\n  --btp-ok: #059669;\n  --btp-ok-bg: #ecfdf5;\n  --btp-warn: #d97706;\n  --btp-warn-bg: #fffbeb;\n  --btp-risk: #dc2626;\n  --btp-risk-bg: #fef2f2;\n  --btp-radius: 10px;\n  --btp-shadow: 0 1px 3px rgba(15, 23, 42, 0.06), 0 8px 24px rgba(15, 23, 42, 0.06);\n  --btp-mono: ui-monospace, \"Cascadia Mono\", \"Segoe UI Mono\", Consolas, monospace;\n  --btp-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(--btp-sans);\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.5;\n  color: var(--btp-ink);\n  background: var(--btp-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#btp-root *,\n#btp-root *::before,\n#btp-root *::after { box-sizing: border-box; }\n\n#btp-root h1, #btp-root h2, #btp-root h3, #btp-root h4,\n#btp-root p, #btp-root ul, #btp-root ol, #btp-root li,\n#btp-root figure, #btp-root blockquote, #btp-root section,\n#btp-root header, #btp-root footer, #btp-root div, #btp-root span,\n#btp-root strong, #btp-root em, #btp-root i, #btp-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#btp-root button, #btp-root input, #btp-root select, #btp-root textarea, #btp-root label {\n  font: inherit; color: inherit; margin: 0; max-width: none; min-width: 0; float: none;\n}\n#btp-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#btp-root img, #btp-root svg { display: block; max-width: 100%; height: auto; }\n#btp-root a { color: var(--btp-accent); text-decoration: none; }\n#btp-root a:hover { text-decoration: underline; }\n#btp-root ul, #btp-root ol { padding-left: 1.2rem; }\n#btp-root li { margin: 0.28rem 0; }\n#btp-root strong { font-weight: 700; }\n#btp-root sub, #btp-root sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }\n#btp-root sub { bottom: -0.2em; }\n#btp-root sup { top: -0.45em; }\n#btp-root .btp-mono { font-family: var(--btp-mono); }\n#btp-root #btp-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#btp-root .btp-hidden { display: none !important; }\n\n#btp-root .btp-layout {\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n}\n\n#btp-root .btp-card {\n  background: var(--btp-surface);\n  border: 1px solid var(--btp-line);\n  border-radius: var(--btp-radius);\n  box-shadow: var(--btp-shadow);\n  overflow: visible;\n}\n#btp-root .btp-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(--btp-line);\n  flex-wrap: wrap;\n  position: relative;\n  z-index: 2;\n  overflow: visible;\n}\n#btp-root .btp-card-h h2 {\n  font-size: 0.72rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;\n  color: var(--btp-steel);\n  width: auto !important; max-width: none !important; flex: 0 1 auto !important;\n}\n#btp-root .btp-card-b { padding: 0.95rem 1rem 1.1rem; }\n\n#btp-root .btp-cards {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 1rem;\n}\n@media (max-width: 720px) {\n  #btp-root .btp-cards { grid-template-columns: 1fr; }\n}\n#btp-root .btp-span-2 { grid-column: 1 \/ -1; }\n\n#btp-root .btp-section {\n  font-size: 0.78rem; font-weight: 700; color: var(--btp-ink);\n  margin: 1.05rem 0 0.65rem; padding: 0 0 0.3rem;\n  border-bottom: 1px dashed var(--btp-line);\n  display: flex; align-items: center; gap: 0.45rem;\n}\n#btp-root .btp-section:first-child { margin-top: 0; }\n#btp-root .btp-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#btp-root .btp-grid { display: grid; gap: 0.7rem 0.75rem; }\n#btp-root .btp-g-2 { grid-template-columns: 1fr 1fr; }\n@media (max-width: 640px) {\n  #btp-root .btp-g-2 { grid-template-columns: 1fr; }\n}\n\n#btp-root label.btp-fld { display: flex; flex-direction: column; gap: 0.28rem; min-width: 0; }\n#btp-root label.btp-fld > span.btp-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#btp-root .btp-hint { font-size: 0.68rem; color: var(--btp-muted); font-weight: 400; }\n\n#btp-root input[type=\"number\"],\n#btp-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(--btp-mono); box-shadow: none; line-height: 1.25;\n}\n#btp-root input[type=\"number\"]::-webkit-outer-spin-button,\n#btp-root input[type=\"number\"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }\n#btp-root input[type=\"number\"] { -moz-appearance: textfield; appearance: textfield; }\n\n#btp-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(--btp-mono) !important;\n  line-height: 1.25 !important; box-shadow: none !important;\n  appearance: auto !important; -webkit-appearance: menulist !important;\n}\n#btp-root input:focus, #btp-root select:focus {\n  outline: 2px solid #38bdf8; outline-offset: 0; border-color: #0ea5e9;\n}\n#btp-root input:disabled, #btp-root input[readonly] { background: #f8fafc; color: #0f172a; }\n#btp-root input.btp-invalid { border-color: #ef4444; background: #fef2f2; }\n#btp-root .btp-err {\n  font-size: 0.68rem; color: var(--btp-risk); min-height: 0.85rem; line-height: 1.3;\n}\n\n#btp-root .btp-input-row {\n  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.4rem; align-items: stretch;\n}\n#btp-root .btp-input-row select {\n  width: auto !important; min-width: 4.4rem !important; padding-right: 1.55rem !important;\n}\n#btp-root .btp-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(--btp-muted); font-size: 0.72rem; font-weight: 600;\n  font-family: var(--btp-mono); white-space: nowrap;\n}\n\n#btp-root .btp-mode {\n  display: grid; grid-template-columns: 1fr 1fr; gap: 4px; padding: 4px;\n  background: #0f172a; border-radius: 10px; border: 1px solid #1e293b;\n}\n#btp-root .btp-mode-btn {\n  appearance: none !important;\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  margin: 0 !important; padding: 0.72rem 0.85rem !important; border: none !important; border-radius: 8px !important;\n  background: transparent !important; color: #cbd5e1 !important;\n  font-size: 0.88rem !important; font-weight: 600 !important; font-family: inherit !important;\n  cursor: pointer !important; line-height: 1.25 !important; text-align: center !important;\n}\n#btp-root .btp-mode-btn:hover { color: #fff !important; }\n#btp-root .btp-mode-btn.btp-is-active {\n  background: #0ea5e9 !important; color: #fff !important;\n}\n\n#btp-root .btp-reset-btn {\n  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;\n}\n#btp-root .btp-reset-btn:hover { background: #f8fafc !important; border-color: #94a3b8 !important; }\n\n#btp-root .btp-chip-row { display: flex; flex-wrap: wrap; gap: 0.35rem; margin: 0.65rem 0; }\n#btp-root .btp-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(--btp-mono) !important;\n  cursor: pointer !important; line-height: 1.25 !important; margin: 0 !important;\n}\n#btp-root .btp-chip:hover { border-color: #38bdf8 !important; }\n#btp-root .btp-chip.btp-is-active { background: #0284c7 !important; color: #fff !important; border-color: #0284c7 !important; }\n\n#btp-root .btp-note {\n  font-size: 0.72rem; color: var(--btp-muted); background: var(--btp-surface-2);\n  border: 1px solid var(--btp-line); border-radius: 8px; padding: 0.5rem 0.65rem; line-height: 1.45;\n}\n\n#btp-root .btp-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(--btp-line);\n}\n#btp-root #btpBtnCalculate.btp-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#btp-root #btpBtnCalculate.btp-calc-btn:hover { background: #0066a8 !important; }\n#btp-root #btpBtnCalculate.btp-calc-btn:active { background: #005a94 !important; }\n\n#btp-root .btp-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#btp-root .btp-tip:hover, #btp-root .btp-tip:focus { background: #0284c7; color: #fff; outline: none; }\n#btp-root .btp-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#btp-root .btp-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#btp-root .btp-tip:hover .btp-tip-box,\n#btp-root .btp-tip:focus .btp-tip-box { display: block; }\n\n#btp-root .btp-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#btp-root .btp-banner .btp-dot {\n  width: 0.7rem; height: 0.7rem; border-radius: 999px; background: #fff; flex-shrink: 0; margin-top: 0.28rem;\n}\n#btp-root .btp-banner-kicker {\n  font-size: 0.65rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; opacity: 0.85;\n}\n#btp-root .btp-banner-title { font-size: 1.15rem; font-weight: 750; margin: 0.1rem 0 0.2rem; }\n#btp-root .btp-banner-note { font-size: 0.75rem; opacity: 0.92; line-height: 1.45; }\n#btp-root .btp-banner-ok { background: linear-gradient(90deg, #14532d, #166534); }\n#btp-root .btp-banner-caution { background: linear-gradient(90deg, #854d0e, #a16207); }\n#btp-root .btp-banner-risk { background: linear-gradient(90deg, #7f1d1d, #991b1b); }\n#btp-root .btp-banner-idle { background: linear-gradient(90deg, #334155, #475569); }\n\n#btp-root .btp-hero {\n  display: grid; grid-template-columns: 1fr 1fr; gap: 0.65rem; margin-bottom: 0.75rem;\n}\n@media (max-width: 520px) { #btp-root .btp-hero { grid-template-columns: 1fr; } }\n#btp-root .btp-hero-card {\n  border: 1px solid var(--btp-line); border-radius: 10px; padding: 0.8rem 0.85rem;\n  background: linear-gradient(180deg, #fff, #f8fafc);\n}\n#btp-root .btp-hero-card.btp-is-accent {\n  border-color: #7dd3fc; background: linear-gradient(180deg, #f0f9ff, #fff);\n}\n#btp-root .btp-hero-k {\n  font-size: 0.65rem; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase; color: var(--btp-muted);\n}\n#btp-root .btp-hero-v {\n  font-family: var(--btp-mono); font-size: 1.35rem; font-weight: 700; color: #0f172a; margin-top: 0.2rem; line-height: 1.2;\n}\n#btp-root .btp-hero-u { font-size: 0.7rem; color: var(--btp-muted); margin-top: 0.15rem; }\n\n#btp-root .btp-viz {\n  display: grid; grid-template-columns: 150px 1fr 88px; gap: 0.75rem; align-items: center;\n  border: 1px solid var(--btp-line); border-radius: 10px; padding: 0.65rem 0.75rem 0.55rem;\n  background: #fff; margin-bottom: 0.75rem;\n}\n@media (max-width: 640px) {\n  #btp-root .btp-viz { grid-template-columns: 1fr; justify-items: center; }\n}\n#btp-root .btp-gauge-svg { width: 150px; height: auto; }\n#btp-root .btp-gauge-readout { font-family: var(--btp-mono); font-size: 0.98rem; font-weight: 700; text-align: center; }\n#btp-root .btp-gauge-label { font-size: 0.68rem; color: var(--btp-muted); text-align: center; }\n\n#btp-root .btp-schematic { width: 100%; max-width: 220px; margin: 0 auto; }\n#btp-root .btp-sch-plate { fill: #cbd5e1; stroke: #64748b; stroke-width: 1.2; }\n#btp-root .btp-sch-plate-bot { fill: #94a3b8; }\n#btp-root .btp-sch-bolt { fill: #475569; stroke: #1e293b; stroke-width: 1; }\n#btp-root .btp-sch-hole { fill: #e2e8f0; }\n#btp-root .btp-sch-clamp { stroke: #64748b; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; }\n#btp-root path.btp-sch-clamp { fill: none; }\n#btp-root polygon.btp-sch-clamp { fill: #64748b; stroke: none; }\n#btp-root .btp-sch-torque { fill: none; stroke: #0284c7; stroke-width: 2.2; stroke-linecap: round; }\n#btp-root .btp-sch-label { font-size: 11px; font-family: var(--btp-sans); fill: #475569; font-weight: 700; }\n#btp-root .btp-schematic[data-status=\"ok\"] path.btp-sch-clamp { stroke: #059669; }\n#btp-root .btp-schematic[data-status=\"ok\"] polygon.btp-sch-clamp { fill: #059669; }\n#btp-root .btp-schematic[data-status=\"caution\"] path.btp-sch-clamp { stroke: #d97706; }\n#btp-root .btp-schematic[data-status=\"caution\"] polygon.btp-sch-clamp { fill: #d97706; }\n#btp-root .btp-schematic[data-status=\"risk\"] path.btp-sch-clamp { stroke: #dc2626; }\n#btp-root .btp-schematic[data-status=\"risk\"] polygon.btp-sch-clamp { fill: #dc2626; }\n#btp-root .btp-schematic[data-status=\"ok\"] .btp-sch-bolt { fill: #0f766e; stroke: #115e59; }\n#btp-root .btp-schematic[data-status=\"caution\"] .btp-sch-bolt { fill: #b45309; stroke: #92400e; }\n#btp-root .btp-schematic[data-status=\"risk\"] .btp-sch-bolt { fill: #b91c1c; stroke: #7f1d1d; }\n\n#btp-root .btp-pbar { display: flex; flex-direction: column; align-items: center; gap: 0.35rem; }\n#btp-root .btp-pbar-track {\n  width: 28px; height: 118px; background: #e2e8f0; border-radius: 8px;\n  position: relative; overflow: hidden; display: flex; align-items: flex-end;\n  border: 1px solid #cbd5e1;\n}\n#btp-root .btp-pbar-fill {\n  width: 100%; height: 0; border-radius: 7px 7px 0 0;\n  background: linear-gradient(180deg, #38bdf8, #0284c7);\n  transition: height 0.25s ease, background 0.2s ease;\n}\n#btp-root .btp-pbar-fill.btp-is-ok { background: linear-gradient(180deg, #34d399, #059669); }\n#btp-root .btp-pbar-fill.btp-is-caution { background: linear-gradient(180deg, #fbbf24, #d97706); }\n#btp-root .btp-pbar-fill.btp-is-risk { background: linear-gradient(180deg, #f87171, #dc2626); }\n#btp-root .btp-pbar-read { font-family: var(--btp-mono); font-size: 0.72rem; font-weight: 700; text-align: center; line-height: 1.25; }\n#btp-root .btp-pbar-label { font-size: 0.65rem; color: var(--btp-muted); text-align: center; }\n\n#btp-root .btp-util { margin-bottom: 0.85rem; }\n#btp-root .btp-util-head {\n  display: flex; justify-content: space-between; gap: 0.5rem; font-size: 0.72rem; margin-bottom: 0.35rem;\n}\n#btp-root .btp-util-head strong { font-weight: 700; }\n#btp-root .btp-util-track {\n  position: relative; height: 14px; border-radius: 999px; overflow: hidden; background: #e2e8f0;\n}\n#btp-root .btp-util-zones { display: flex; height: 100%; width: 100%; }\n#btp-root .btp-util-zones span { display: block; height: 100%; }\n#btp-root .btp-z-low { width: 50%; background: #cbd5e1; }\n#btp-root .btp-z-ok { width: 35%; background: #6ee7b7; }\n#btp-root .btp-z-hi { width: 15%; background: #fcd34d; }\n#btp-root .btp-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#btp-root .btp-util-fill.btp-is-ok { background: linear-gradient(90deg, #059669, #047857); }\n#btp-root .btp-util-fill.btp-is-caution { background: linear-gradient(90deg, #d97706, #b45309); }\n#btp-root .btp-util-fill.btp-is-risk { background: linear-gradient(90deg, #dc2626, #b91c1c); }\n#btp-root .btp-util-legend {\n  display: flex; flex-wrap: wrap; gap: 0.65rem 1rem; margin-top: 0.35rem;\n  font-size: 0.65rem; color: var(--btp-muted);\n}\n#btp-root .btp-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#btp-root .btp-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 0.55rem; }\n@media (min-width: 720px) {\n  #btp-root .btp-tiles { grid-template-columns: repeat(3, 1fr); }\n}\n#btp-root .btp-tile {\n  background: linear-gradient(180deg, #fff, #f8fafc);\n  border: 1px solid var(--btp-line); border-radius: 8px; padding: 0.6rem 0.7rem;\n}\n#btp-root .btp-tile .btp-k { font-size: 0.62rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--btp-muted); }\n#btp-root .btp-tile .btp-v { font-family: var(--btp-mono); font-size: 0.98rem; font-weight: 700; color: #0f172a; margin-top: 0.12rem; }\n#btp-root .btp-tile .btp-u { font-size: 0.68rem; color: var(--btp-muted); }\n\n#btp-root .btp-alerts { display: flex; flex-direction: column; gap: 0.4rem; margin-top: 0.75rem; }\n#btp-root .btp-alert {\n  border-radius: 8px; padding: 0.5rem 0.7rem; font-size: 0.75rem; border: 1px solid; line-height: 1.4;\n}\n#btp-root .btp-alert-ok { background: #ecfdf5; border-color: #a7f3d0; color: #065f46; }\n#btp-root .btp-alert-warn { background: #fffbeb; border-color: #fcd34d; color: #92400e; }\n#btp-root .btp-alert-risk { background: #fef2f2; border-color: #fca5a5; color: #991b1b; }\n\n@media print {\n  #btp-root { max-width: none; padding: 0; background: #fff; }\n  #btp-root .btp-no-print { display: none !important; }\n  #btp-root .btp-card { break-inside: avoid; box-shadow: none; }\n}\n<\/style>\n\n  <div class=\"btp-layout\">\n    <section class=\"btp-card\" id=\"btpInputs\">\n      <div class=\"btp-card-h\">\n        <h2>Input parameters<\/h2>\n        <button type=\"button\" class=\"btp-reset-btn btp-no-print\" id=\"btpBtnReset\" onclick=\"(function(){if(window.btpReset){window.btpReset();return false;}var t=document.getElementById('btp-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.btpReset){window.btpReset();}},150);return false;})()\">Reset<\/button>\n      <\/div>\n      <div class=\"btp-card-b\">\n\n        <div class=\"btp-section\"><span class=\"btp-badge\">1<\/span> Calculation mode<\/div>\n        <div class=\"btp-mode btp-no-print\" role=\"group\" aria-label=\"Calculation mode\">\n          <button type=\"button\" class=\"btp-mode-btn btp-is-active\" id=\"btpBtnModeT2F\" aria-pressed=\"true\" onclick=\"(function(){if(window.btpSwitchMode){window.btpSwitchMode('t2f');return false;}var t=document.getElementById('btp-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.btpSwitchMode){window.btpSwitchMode('t2f');}},150);return false;})()\">Torque \u2192 Preload<\/button>\n          <button type=\"button\" class=\"btp-mode-btn\" id=\"btpBtnModeF2T\" aria-pressed=\"false\" onclick=\"(function(){if(window.btpSwitchMode){window.btpSwitchMode('f2t');return false;}var t=document.getElementById('btp-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.btpSwitchMode){window.btpSwitchMode('f2t');}},150);return false;})()\">Preload \u2192 Torque<\/button>\n        <\/div>\n\n        <div class=\"btp-section\"><span class=\"btp-badge\">2<\/span> Bolt geometry<\/div>\n        <div class=\"btp-grid btp-g-2\">\n          <label class=\"btp-fld\">\n            <span class=\"btp-lbl\">\n              Bolt thread type\n              <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">Metric ISO threads use pitch in mm. UNC and UNF use threads per inch (TPI). Custom lets you type any pitch or TPI for special fasteners.<\/span><\/span>\n            <\/span>\n            <select id=\"btpThread\">\n              <option value=\"metric\" selected>Metric thread<\/option>\n              <option value=\"unc\">UNC thread<\/option>\n              <option value=\"unf\">UNF thread<\/option>\n              <option value=\"custom\">Custom<\/option>\n            <\/select>\n          <\/label>\n          <div><\/div>\n        <\/div>\n        <div class=\"btp-chip-row btp-no-print\" id=\"btpSizeChips\" aria-label=\"Common bolt sizes\"><\/div>\n        <div class=\"btp-grid btp-g-2\">\n          <label class=\"btp-fld\">\n            <span class=\"btp-lbl\">\n              Bolt diameter\n              <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">Nominal major diameter d. For metric bolts this is the M-size (12 mm for M12). Must be greater than zero. Used as d in T = K \u00d7 F \u00d7 d (converted to metres).<\/span><\/span>\n            <\/span>\n            <div class=\"btp-input-row\">\n              <input id=\"btpD\" type=\"number\" min=\"0\" step=\"any\" value=\"12\" inputmode=\"decimal\" \/>\n              <select id=\"btpDUnit\" aria-label=\"Diameter unit\">\n                <option value=\"mm\" selected>mm<\/option>\n                <option value=\"in\">in<\/option>\n              <\/select>\n            <\/div>\n            <span class=\"btp-err\" id=\"btpErrD\"><\/span>\n          <\/label>\n          <label class=\"btp-fld\">\n            <span class=\"btp-lbl\">\n              Thread pitch\n              <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">Metric: distance between threads in mm (M12 coarse = 1.75 mm). UNC\/UNF: threads per inch, e.g. 13 TPI for \u00bd\u2033-13. Used to estimate tensile stress area At.<\/span><\/span>\n            <\/span>\n            <div class=\"btp-input-row\">\n              <input id=\"btpP\" type=\"number\" min=\"0\" step=\"any\" value=\"1.75\" inputmode=\"decimal\" \/>\n              <span id=\"btpPUnitWrap\" class=\"btp-hidden\">\n                <select id=\"btpPUnit\" aria-label=\"Pitch unit\">\n                  <option value=\"mm\" selected>mm<\/option>\n                  <option value=\"tpi\">TPI<\/option>\n                <\/select>\n              <\/span>\n              <span id=\"btpPUnitPill\" class=\"btp-unit-pill\">mm<\/span>\n            <\/div>\n            <span class=\"btp-err\" id=\"btpErrP\"><\/span>\n          <\/label>\n        <\/div>\n\n        <div class=\"btp-section\"><span class=\"btp-badge\">3<\/span> Material grade<\/div>\n        <label class=\"btp-fld\">\n          <span class=\"btp-lbl\">\n            Bolt material grade\n            <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">ISO 898-1 property classes 8.8 \/ 10.9 \/ 12.9 and stainless A2-70. Strength is used to rate preload against proof or yield. Choose Custom to type catalog values.<\/span><\/span>\n          <\/span>\n          <select id=\"btpGrade\">\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<\/option>\n          <\/select>\n        <\/label>\n        <div class=\"btp-grid btp-g-2\" style=\"margin-top:0.65rem\">\n          <label class=\"btp-fld\">\n            <span class=\"btp-lbl\">\n              Yield strength S<sub>y<\/sub>\n              <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">Minimum yield or 0.2% proof stress. Grade 10.9 is typically 940 MPa. Yield load F<sub>y<\/sub> = A<sub>t<\/sub> \u00d7 S<sub>y<\/sub>.<\/span><\/span>\n            <\/span>\n            <div class=\"btp-input-row\">\n              <input id=\"btpSy\" type=\"number\" min=\"0\" step=\"any\" value=\"940\" inputmode=\"decimal\" readonly \/>\n              <select id=\"btpSUnit\" aria-label=\"Strength unit\">\n                <option value=\"MPa\" selected>MPa<\/option>\n                <option value=\"psi\">psi<\/option>\n              <\/select>\n            <\/div>\n            <span class=\"btp-err\" id=\"btpErrSy\"><\/span>\n          <\/label>\n          <label class=\"btp-fld\">\n            <span class=\"btp-lbl\">\n              Proof strength S<sub>p<\/sub>\n              <span class=\"btp-hint\">(optional)<\/span>\n              <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">ISO 898-1 proof stress. Grade 10.9 is typically 830 MPa. Safety status is compared with proof load when this value is set; otherwise yield is used.<\/span><\/span>\n            <\/span>\n            <input id=\"btpSp\" type=\"number\" min=\"0\" step=\"any\" value=\"830\" inputmode=\"decimal\" readonly \/>\n            <span class=\"btp-err\" id=\"btpErrSp\"><\/span>\n          <\/label>\n        <\/div>\n\n        <div class=\"btp-section\"><span class=\"btp-badge\">4<\/span> Friction &amp; nut factor<\/div>\n        <label class=\"btp-fld\">\n          <span class=\"btp-lbl\">\n            Lubrication condition\n            <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">Sets a typical nut factor K. Dry \u2248 0.28, light oil \u2248 0.20, standard lubrication \u2248 0.18, anti-seize \u2248 0.12. Actual K varies with finish, plating, and tool scatter.<\/span><\/span>\n          <\/span>\n          <select id=\"btpLub\">\n            <option value=\"dry\">Dry<\/option>\n            <option value=\"light\" selected>Light lubrication<\/option>\n            <option value=\"standard\">Standard lubrication<\/option>\n            <option value=\"antiseize\">Anti-seize lubrication<\/option>\n            <option value=\"custom\">Custom<\/option>\n          <\/select>\n        <\/label>\n        <div class=\"btp-grid btp-g-2\" style=\"margin-top:0.65rem\">\n          <label class=\"btp-fld\">\n            <span class=\"btp-lbl\">\n              Nut factor K\n              <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">Torque coefficient in T = K \u00d7 F \u00d7 d. Typical as-received steel is about 0.20. Dry joints run higher; oil or anti-seize lowers K. Engineering range is roughly 0.10\u20130.30.<\/span><\/span>\n            <\/span>\n            <input id=\"btpK\" type=\"number\" min=\"0\" step=\"any\" value=\"0.20\" inputmode=\"decimal\" \/>\n            <span class=\"btp-err\" id=\"btpErrK\"><\/span>\n          <\/label>\n          <label class=\"btp-fld\">\n            <span class=\"btp-lbl\">\n              Friction coefficient \u03bc\n              <span class=\"btp-hint\">(optional)<\/span>\n              <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">Advanced input. If entered, K is replaced by the Motosh estimate from thread pitch, pitch diameter, and bearing friction (\u03bc<sub>t<\/sub> = \u03bc<sub>b<\/sub> = \u03bc). Leave blank to use the nut factor directly.<\/span><\/span>\n            <\/span>\n            <input id=\"btpMu\" type=\"number\" min=\"0\" max=\"1\" step=\"any\" value=\"\" placeholder=\"optional\" inputmode=\"decimal\" \/>\n            <span class=\"btp-err\" id=\"btpErrMu\"><\/span>\n          <\/label>\n        <\/div>\n\n        <div class=\"btp-section\"><span class=\"btp-badge\">5<\/span> <span id=\"btpLoadTitle\">Tightening torque<\/span><\/div>\n        <div class=\"btp-grid btp-g-2\">\n          <label class=\"btp-fld\" id=\"btpFldTorque\">\n            <span class=\"btp-lbl\">\n              Tightening torque\n              <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">Applied installation torque T. Used in Torque \u2192 Preload mode: F = T \/ (K \u00d7 d). Enter N\u00b7m or lbf\u00b7ft; the calculator converts automatically.<\/span><\/span>\n            <\/span>\n            <div class=\"btp-input-row\">\n              <input id=\"btpTorque\" type=\"number\" min=\"0\" step=\"any\" value=\"80\" inputmode=\"decimal\" \/>\n              <select id=\"btpTUnit\" aria-label=\"Torque unit\">\n                <option value=\"Nm\" selected>N\u00b7m<\/option>\n                <option value=\"lbfft\">lbf\u00b7ft<\/option>\n              <\/select>\n            <\/div>\n            <span class=\"btp-err\" id=\"btpErrT\"><\/span>\n          <\/label>\n          <label class=\"btp-fld btp-hidden\" id=\"btpFldPreload\">\n            <span class=\"btp-lbl\">\n              Target preload force\n              <span class=\"btp-tip\" tabindex=\"0\">?<span class=\"btp-tip-box\">Desired bolt tension \/ clamp force F. Used in Preload \u2192 Torque mode: T = K \u00d7 F \u00d7 d. Enter N, kN, or lbf.<\/span><\/span>\n            <\/span>\n            <div class=\"btp-input-row\">\n              <input id=\"btpPreload\" type=\"number\" min=\"0\" step=\"any\" value=\"33.333\" inputmode=\"decimal\" \/>\n              <select id=\"btpFUnit\" aria-label=\"Force unit\">\n                <option value=\"N\">N<\/option>\n                <option value=\"kN\" selected>kN<\/option>\n                <option value=\"lbf\">lbf<\/option>\n              <\/select>\n            <\/div>\n            <span class=\"btp-err\" id=\"btpErrF\"><\/span>\n          <\/label>\n        <\/div>\n        <p class=\"btp-note\" id=\"btpLoadNote\" style=\"margin-top:0.55rem\">\n          Torque to preload: F = T \/ (K \u00d7 d). Used by this Bolt Torque Calculator when converting applied wrench torque into estimated clamp force.\n        <\/p>\n\n        <div class=\"btp-actions btp-no-print\">\n          <button type=\"button\" class=\"btp-calc-btn\" id=\"btpBtnCalculate\" onclick=\"(function(){if(window.btpCalculate){window.btpCalculate();return false;}var t=document.getElementById('btp-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.btpCalculate){window.btpCalculate();}},150);return false;})()\">Calculate<\/button>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <aside class=\"btp-hidden\" id=\"btpResults\">\n      <section class=\"btp-card\">\n        <div class=\"btp-card-h\"><h2>Calculated results<\/h2><\/div>\n        <div class=\"btp-card-b\">\n          <div class=\"btp-banner btp-banner-idle\" id=\"btpBanner\">\n            <span class=\"btp-dot\" aria-hidden=\"true\"><\/span>\n            <div>\n              <div class=\"btp-banner-kicker\">Safety status<\/div>\n              <div class=\"btp-banner-title\" id=\"btpStatusTitle\">Ready<\/div>\n              <p class=\"btp-banner-note\" id=\"btpStatusNote\">Enter fastener data and press Calculate.<\/p>\n            <\/div>\n          <\/div>\n\n          <div class=\"btp-hero\">\n            <div class=\"btp-hero-card btp-is-accent\" id=\"btpHeroFi\">\n              <div class=\"btp-hero-k\">Calculated bolt preload<\/div>\n              <div class=\"btp-hero-v\" id=\"btpOutFi\">\u2014<\/div>\n              <div class=\"btp-hero-u\" id=\"btpOutFiSub\">N \/ kN \/ lbf<\/div>\n            <\/div>\n            <div class=\"btp-hero-card\" id=\"btpHeroT\">\n              <div class=\"btp-hero-k\">Required tightening torque<\/div>\n              <div class=\"btp-hero-v\" id=\"btpOutT\">\u2014<\/div>\n              <div class=\"btp-hero-u\" id=\"btpOutTSub\">N\u00b7m \/ lbf\u00b7ft<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"btp-viz\">\n            <div>\n              <svg class=\"btp-gauge-svg\" viewBox=\"0 0 240 140\" aria-hidden=\"true\">\n                <defs>\n                  <linearGradient id=\"btpGaugeGrad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n                    <stop offset=\"0%\" stop-color=\"#059669\" \/>\n                    <stop offset=\"70%\" stop-color=\"#d97706\" \/>\n                    <stop offset=\"100%\" stop-color=\"#dc2626\" \/>\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=\"btpGaugeArc\" d=\"M 30 118 A 90 90 0 0 1 210 118\" fill=\"none\" stroke=\"url(#btpGaugeGrad)\" stroke-width=\"14\" stroke-linecap=\"round\" stroke-dasharray=\"282.7\" stroke-dashoffset=\"282.7\" \/>\n                <g id=\"btpNeedle\" 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 class=\"btp-gauge-label\">Torque gauge<\/div>\n              <div class=\"btp-gauge-readout\" id=\"btpGaugeRead\">\u2014<\/div>\n              <div class=\"btp-gauge-label\" id=\"btpGaugeNote\">relative to 100% proof torque<\/div>\n            <\/div>\n\n            <svg class=\"btp-schematic\" id=\"btpSchematic\" viewBox=\"0 0 220 250\" role=\"img\" aria-label=\"Bolt and joint schematic\" data-status=\"idle\">\n              <path class=\"btp-sch-torque\" d=\"M 62 40 A 38 38 0 0 1 158 40\" \/>\n              <polygon class=\"btp-sch-torque\" fill=\"#0284c7\" stroke=\"none\" points=\"158,40 146,34 152,48\" \/>\n              <text class=\"btp-sch-label\" x=\"168\" y=\"36\">T<\/text>\n              <polygon class=\"btp-sch-bolt\" points=\"110,16 136,30 136,50 110,64 84,50 84,30\" \/>\n              <rect class=\"btp-sch-bolt\" x=\"78\" y=\"60\" width=\"64\" height=\"7\" rx=\"1\" \/>\n              <rect class=\"btp-sch-plate\" x=\"18\" y=\"67\" width=\"184\" height=\"40\" rx=\"2\" \/>\n              <rect class=\"btp-sch-plate btp-sch-plate-bot\" x=\"18\" y=\"107\" width=\"184\" height=\"40\" rx=\"2\" \/>\n              <rect class=\"btp-sch-hole\" x=\"96\" y=\"67\" width=\"28\" height=\"80\" \/>\n              <rect class=\"btp-sch-bolt\" x=\"99\" y=\"67\" width=\"22\" height=\"86\" \/>\n              <rect class=\"btp-sch-bolt\" x=\"78\" y=\"147\" width=\"64\" height=\"7\" rx=\"1\" \/>\n              <polygon class=\"btp-sch-bolt\" points=\"110,154 136,168 136,188 110,202 84,188 84,168\" \/>\n              <path class=\"btp-sch-clamp\" d=\"M 40 78 L 40 100\" \/>\n              <path class=\"btp-sch-clamp\" d=\"M 40 136 L 40 114\" \/>\n              <polygon class=\"btp-sch-clamp\" fill=\"currentColor\" stroke=\"none\" points=\"40,100 35,90 45,90\" \/>\n              <polygon class=\"btp-sch-clamp\" fill=\"currentColor\" stroke=\"none\" points=\"40,114 35,124 45,124\" \/>\n              <path class=\"btp-sch-clamp\" d=\"M 180 78 L 180 100\" \/>\n              <path class=\"btp-sch-clamp\" d=\"M 180 136 L 180 114\" \/>\n              <polygon class=\"btp-sch-clamp\" fill=\"currentColor\" stroke=\"none\" points=\"180,100 175,90 185,90\" \/>\n              <polygon class=\"btp-sch-clamp\" fill=\"currentColor\" stroke=\"none\" points=\"180,114 175,124 185,124\" \/>\n              <text class=\"btp-sch-label\" x=\"8\" y=\"112\">F<\/text>\n              <text class=\"btp-sch-label\" x=\"196\" y=\"112\">F<\/text>\n            <\/svg>\n\n            <div class=\"btp-pbar\">\n              <div class=\"btp-pbar-track\" aria-hidden=\"true\">\n                <div class=\"btp-pbar-fill\" id=\"btpPreloadFill\"><\/div>\n              <\/div>\n              <div class=\"btp-pbar-read\" id=\"btpPreloadRead\">\u2014<\/div>\n              <div class=\"btp-pbar-label\">Preload force<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"btp-util\">\n            <div class=\"btp-util-head\">\n              <span>Bolt stress percentage<\/span>\n              <strong id=\"btpOutUtil\">\u2014<\/strong>\n            <\/div>\n            <div class=\"btp-util-track\" aria-hidden=\"true\">\n              <div class=\"btp-util-zones\"><span class=\"btp-z-low\"><\/span><span class=\"btp-z-ok\"><\/span><span class=\"btp-z-hi\"><\/span><\/div>\n              <div class=\"btp-util-fill\" id=\"btpUtilFill\"><\/div>\n            <\/div>\n            <div class=\"btp-util-legend\">\n              <span><i style=\"background:#cbd5e1\"><\/i> &lt; 50% low clamp<\/span>\n              <span><i style=\"background:#6ee7b7\"><\/i> 50\u201385% typical<\/span>\n              <span><i style=\"background:#fcd34d\"><\/i> 85\u2013100% upper limit<\/span>\n              <span id=\"btpUtilLabel\" class=\"btp-hidden\"><\/span>\n            <\/div>\n          <\/div>\n\n          <div class=\"btp-tiles\">\n            <div class=\"btp-tile\">\n              <div class=\"btp-k\">Bolt tensile stress<\/div>\n              <div class=\"btp-v\" id=\"btpOutStress\">\u2014<\/div>\n              <div class=\"btp-u\" id=\"btpOutStressNote\">MPa \/ psi<\/div>\n            <\/div>\n            <div class=\"btp-tile\">\n              <div class=\"btp-k\">Torque coefficient K<\/div>\n              <div class=\"btp-v\" id=\"btpOutK\">\u2014<\/div>\n              <div class=\"btp-u\" id=\"btpOutKNote\">selected nut factor<\/div>\n            <\/div>\n            <div class=\"btp-tile\">\n              <div class=\"btp-k\">Estimated clamping force<\/div>\n              <div class=\"btp-v\" id=\"btpOutClamp\">\u2014<\/div>\n              <div class=\"btp-u\" id=\"btpOutClampSub\">joint clamp load<\/div>\n            <\/div>\n            <div class=\"btp-tile\">\n              <div class=\"btp-k\">Tensile stress area<\/div>\n              <div class=\"btp-v\" id=\"btpOutAt\">\u2014<\/div>\n              <div class=\"btp-u\" id=\"btpOutAtNote\">from d and pitch<\/div>\n            <\/div>\n            <div class=\"btp-tile\">\n              <div class=\"btp-k\">Bolt yield load<\/div>\n              <div class=\"btp-v\" id=\"btpOutFy\">\u2014<\/div>\n              <div class=\"btp-u\">F<sub>y<\/sub> = A<sub>t<\/sub> \u00d7 S<sub>y<\/sub><\/div>\n            <\/div>\n            <div class=\"btp-tile\">\n              <div class=\"btp-k\">Bolt proof load<\/div>\n              <div class=\"btp-v\" id=\"btpOutFp\">\u2014<\/div>\n              <div class=\"btp-u\">F<sub>p<\/sub> = A<sub>t<\/sub> \u00d7 S<sub>p<\/sub><\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"btp-alerts\" id=\"btpAlerts\"><\/div>\n        <\/div>\n      <\/section>\n    <\/aside>\n  <\/div>\n\n<textarea id=\"btp-js-b64\" aria-hidden=\"true\" style=\"display:none!important;width:0;height:0;border:0;padding:0;position:absolute;left:-9999px\">KGZ1bmN0aW9uICgpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0cC1yb290Iik7CiAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCJkYXRhLWJ0cC1yZWFkeSIpID09PSAiMSIpIHJldHVybjsKICByb290LnNldEF0dHJpYnV0ZSgiZGF0YS1idHAtcmVhZHkiLCAiMSIpOwoKICB2YXIgQVJDX0xFTiA9IDI4Mi43NDM7CiAgdmFyIE1NX1BFUl9JTiA9IDI1LjQ7CiAgdmFyIE1NMl9QRVJfSU4yID0gNjQ1LjE2OwogIHZhciBQU0lfUEVSX01QQSA9IDE0NS4wMzc3Mzc3MzsKICB2YXIgTEJGX1BFUl9OID0gMC4yMjQ4MDg5NDM7CiAgdmFyIExCRkZUX1BFUl9OTSA9IDAuNzM3NTYyMTQ5OwoKICB2YXIgTFVCID0gewogICAgZHJ5OiAgICAgICB7IGs6IDAuMjgsIG11OiAwLjE4LCBsYWJlbDogIkRyeSIgfSwKICAgIGxpZ2h0OiAgICAgeyBrOiAwLjIwLCBtdTogMC4xMiwgbGFiZWw6ICJMaWdodCBsdWJyaWNhdGlvbiIgfSwKICAgIHN0YW5kYXJkOiAgeyBrOiAwLjE4LCBtdTogMC4xMCwgbGFiZWw6ICJTdGFuZGFyZCBsdWJyaWNhdGlvbiIgfSwKICAgIGFudGlzZWl6ZTogeyBrOiAwLjEyLCBtdTogMC4wOCwgbGFiZWw6ICJBbnRpLXNlaXplIGx1YnJpY2F0aW9uIiB9LAogICAgY3VzdG9tOiAgICBudWxsCiAgfTsKCiAgdmFyIEdSQURFUyA9IHsKICAgICI4LjgiOiAgeyBzeTogNjQwLCBzcDogNjAwLCBybTogODAwLCBsYWJlbDogIkdyYWRlIDguOCIgfSwKICAgICIxMC45IjogeyBzeTogOTQwLCBzcDogODMwLCBybTogMTA0MCwgbGFiZWw6ICJHcmFkZSAxMC45IiB9LAogICAgIjEyLjkiOiB7IHN5OiAxMTAwLCBzcDogOTcwLCBybTogMTIyMCwgbGFiZWw6ICJHcmFkZSAxMi45IiB9LAogICAgc3M6ICAgICB7IHN5OiA0NTAsIHNwOiA0NTAsIHJtOiA3MDAsIGxhYmVsOiAiU3RhaW5sZXNzIHN0ZWVsIEEyLTcwIiB9LAogICAgY3VzdG9tOiBudWxsCiAgfTsKCiAgdmFyIFNJWkVTX00gPSBbCiAgICB7IGxhYmVsOiAiTTYiLCBkOiA2LCBwOiAxIH0sCiAgICB7IGxhYmVsOiAiTTgiLCBkOiA4LCBwOiAxLjI1IH0sCiAgICB7IGxhYmVsOiAiTTEwIiwgZDogMTAsIHA6IDEuNSB9LAogICAgeyBsYWJlbDogIk0xMiIsIGQ6IDEyLCBwOiAxLjc1IH0sCiAgICB7IGxhYmVsOiAiTTE2IiwgZDogMTYsIHA6IDIgfSwKICAgIHsgbGFiZWw6ICJNMjAiLCBkOiAyMCwgcDogMi41IH0sCiAgICB7IGxhYmVsOiAiTTI0IiwgZDogMjQsIHA6IDMgfQogIF07CiAgdmFyIFNJWkVTX1VOQyA9IFsKICAgIHsgbGFiZWw6ICIxLzQtMjAiLCBkOiAwLjI1LCB0cGk6IDIwIH0sCiAgICB7IGxhYmVsOiAiNS8xNi0xOCIsIGQ6IDAuMzEyNSwgdHBpOiAxOCB9LAogICAgeyBsYWJlbDogIjMvOC0xNiIsIGQ6IDAuMzc1LCB0cGk6IDE2IH0sCiAgICB7IGxhYmVsOiAiMS8yLTEzIiwgZDogMC41LCB0cGk6IDEzIH0sCiAgICB7IGxhYmVsOiAiNS84LTExIiwgZDogMC42MjUsIHRwaTogMTEgfSwKICAgIHsgbGFiZWw6ICIzLzQtMTAiLCBkOiAwLjc1LCB0cGk6IDEwIH0KICBdOwogIHZhciBTSVpFU19VTkYgPSBbCiAgICB7IGxhYmVsOiAiMS80LTI4IiwgZDogMC4yNSwgdHBpOiAyOCB9LAogICAgeyBsYWJlbDogIjUvMTYtMjQiLCBkOiAwLjMxMjUsIHRwaTogMjQgfSwKICAgIHsgbGFiZWw6ICIzLzgtMjQiLCBkOiAwLjM3NSwgdHBpOiAyNCB9LAogICAgeyBsYWJlbDogIjEvMi0yMCIsIGQ6IDAuNSwgdHBpOiAyMCB9LAogICAgeyBsYWJlbDogIjUvOC0xOCIsIGQ6IDAuNjI1LCB0cGk6IDE4IH0sCiAgICB7IGxhYmVsOiAiMy80LTE2IiwgZDogMC43NSwgdHBpOiAxNiB9CiAgXTsKICB2YXIgTUVUUklDX0NPQVJTRSA9IFsKICAgIHsgZDogNSwgcDogMC44IH0sIHsgZDogNiwgcDogMSB9LCB7IGQ6IDgsIHA6IDEuMjUgfSwgeyBkOiAxMCwgcDogMS41IH0sCiAgICB7IGQ6IDEyLCBwOiAxLjc1IH0sIHsgZDogMTQsIHA6IDIgfSwgeyBkOiAxNiwgcDogMiB9LCB7IGQ6IDE4LCBwOiAyLjUgfSwKICAgIHsgZDogMjAsIHA6IDIuNSB9LCB7IGQ6IDIyLCBwOiAyLjUgfSwgeyBkOiAyNCwgcDogMyB9LCB7IGQ6IDI3LCBwOiAzIH0sCiAgICB7IGQ6IDMwLCBwOiAzLjUgfSwgeyBkOiAzMywgcDogMy41IH0sIHsgZDogMzYsIHA6IDQgfQogIF07CgogIHZhciBERUZBVUxUUyA9IHsKICAgIG1vZGU6ICJ0MmYiLAogICAgdGhyZWFkOiAibWV0cmljIiwKICAgIGQ6IDEyLAogICAgZFVuaXQ6ICJtbSIsCiAgICBwOiAxLjc1LAogICAgdG9ycXVlOiA4MCwKICAgIHRVbml0OiAiTm0iLAogICAgcHJlbG9hZDogMzMuMzMzLAogICAgZlVuaXQ6ICJrTiIsCiAgICBrOiAwLjIwLAogICAgbHViOiAibGlnaHQiLAogICAgbXU6ICIiLAogICAgZ3JhZGU6ICIxMC45IiwKICAgIHN5OiA5NDAsCiAgICBzcDogODMwLAogICAgc2l6ZTogIk0xMiIKICB9OwoKICB2YXIgZWwgPSB7CiAgICBtb2RlVDJGOiBieUlkKCJidHBCdG5Nb2RlVDJGIiksCiAgICBtb2RlRjJUOiBieUlkKCJidHBCdG5Nb2RlRjJUIiksCiAgICB0aHJlYWQ6IGJ5SWQoImJ0cFRocmVhZCIpLAogICAgc2l6ZUNoaXBzOiBieUlkKCJidHBTaXplQ2hpcHMiKSwKICAgIGQ6IGJ5SWQoImJ0cEQiKSwKICAgIGRVbml0OiBieUlkKCJidHBEVW5pdCIpLAogICAgcDogYnlJZCgiYnRwUCIpLAogICAgcFVuaXQ6IGJ5SWQoImJ0cFBVbml0IiksCiAgICBwVW5pdFdyYXA6IGJ5SWQoImJ0cFBVbml0V3JhcCIpLAogICAgcFVuaXRQaWxsOiBieUlkKCJidHBQVW5pdFBpbGwiKSwKICAgIHRvcnF1ZTogYnlJZCgiYnRwVG9ycXVlIiksCiAgICB0VW5pdDogYnlJZCgiYnRwVFVuaXQiKSwKICAgIHByZWxvYWQ6IGJ5SWQoImJ0cFByZWxvYWQiKSwKICAgIGZVbml0OiBieUlkKCJidHBGVW5pdCIpLAogICAgZmxkVG9ycXVlOiBieUlkKCJidHBGbGRUb3JxdWUiKSwKICAgIGZsZFByZWxvYWQ6IGJ5SWQoImJ0cEZsZFByZWxvYWQiKSwKICAgIGxvYWRUaXRsZTogYnlJZCgiYnRwTG9hZFRpdGxlIiksCiAgICBsb2FkTm90ZTogYnlJZCgiYnRwTG9hZE5vdGUiKSwKICAgIGx1YjogYnlJZCgiYnRwTHViIiksCiAgICBrOiBieUlkKCJidHBLIiksCiAgICBtdTogYnlJZCgiYnRwTXUiKSwKICAgIGdyYWRlOiBieUlkKCJidHBHcmFkZSIpLAogICAgc3k6IGJ5SWQoImJ0cFN5IiksCiAgICBzcDogYnlJZCgiYnRwU3AiKSwKICAgIHNVbml0OiBieUlkKCJidHBTVW5pdCIpLAogICAgYnRuUmVzZXQ6IGJ5SWQoImJ0cEJ0blJlc2V0IiksCiAgICBidG5DYWxjOiBieUlkKCJidHBCdG5DYWxjdWxhdGUiKSwKICAgIHJlc3VsdHM6IGJ5SWQoImJ0cFJlc3VsdHMiKSwKICAgIGJhbm5lcjogYnlJZCgiYnRwQmFubmVyIiksCiAgICBzdGF0dXNUaXRsZTogYnlJZCgiYnRwU3RhdHVzVGl0bGUiKSwKICAgIHN0YXR1c05vdGU6IGJ5SWQoImJ0cFN0YXR1c05vdGUiKSwKICAgIG91dEZpOiBieUlkKCJidHBPdXRGaSIpLAogICAgb3V0RmlTdWI6IGJ5SWQoImJ0cE91dEZpU3ViIiksCiAgICBvdXRUOiBieUlkKCJidHBPdXRUIiksCiAgICBvdXRUU3ViOiBieUlkKCJidHBPdXRUU3ViIiksCiAgICBvdXRTdHJlc3M6IGJ5SWQoImJ0cE91dFN0cmVzcyIpLAogICAgb3V0U3RyZXNzTm90ZTogYnlJZCgiYnRwT3V0U3RyZXNzTm90ZSIpLAogICAgb3V0SzogYnlJZCgiYnRwT3V0SyIpLAogICAgb3V0S05vdGU6IGJ5SWQoImJ0cE91dEtOb3RlIiksCiAgICBvdXRDbGFtcDogYnlJZCgiYnRwT3V0Q2xhbXAiKSwKICAgIG91dENsYW1wU3ViOiBieUlkKCJidHBPdXRDbGFtcFN1YiIpLAogICAgb3V0QXQ6IGJ5SWQoImJ0cE91dEF0IiksCiAgICBvdXRBdE5vdGU6IGJ5SWQoImJ0cE91dEF0Tm90ZSIpLAogICAgb3V0Rnk6IGJ5SWQoImJ0cE91dEZ5IiksCiAgICBvdXRGcDogYnlJZCgiYnRwT3V0RnAiKSwKICAgIG91dFV0aWw6IGJ5SWQoImJ0cE91dFV0aWwiKSwKICAgIHV0aWxGaWxsOiBieUlkKCJidHBVdGlsRmlsbCIpLAogICAgdXRpbExhYmVsOiBieUlkKCJidHBVdGlsTGFiZWwiKSwKICAgIGFsZXJ0czogYnlJZCgiYnRwQWxlcnRzIiksCiAgICBnYXVnZUFyYzogYnlJZCgiYnRwR2F1Z2VBcmMiKSwKICAgIG5lZWRsZTogYnlJZCgiYnRwTmVlZGxlIiksCiAgICBnYXVnZVJlYWQ6IGJ5SWQoImJ0cEdhdWdlUmVhZCIpLAogICAgZ2F1Z2VOb3RlOiBieUlkKCJidHBHYXVnZU5vdGUiKSwKICAgIHByZWxvYWRGaWxsOiBieUlkKCJidHBQcmVsb2FkRmlsbCIpLAogICAgcHJlbG9hZFJlYWQ6IGJ5SWQoImJ0cFByZWxvYWRSZWFkIiksCiAgICBzY2hlbWF0aWM6IGJ5SWQoImJ0cFNjaGVtYXRpYyIpLAogICAgaGVyb0ZpOiBieUlkKCJidHBIZXJvRmkiKSwKICAgIGhlcm9UOiBieUlkKCJidHBIZXJvVCIpCiAgfTsKCiAgdmFyIHN0YXRlID0gewogICAgbW9kZTogInQyZiIsCiAgICBzaXplSWQ6ICJNMTIiLAogICAgcGl0Y2hNYW51YWw6IGZhbHNlLAogICAgYXBwbHlpbmc6IGZhbHNlCiAgfTsKICB2YXIgbGFzdEZVbml0ID0gZWwuZlVuaXQgPyBlbC5mVW5pdC52YWx1ZSA6ICJrTiI7CgogIGZ1bmN0aW9uIGJ5SWQoaWQpIHsgcmV0dXJuIHJvb3QucXVlcnlTZWxlY3RvcigiIyIgKyBpZCk7IH0KCiAgZnVuY3Rpb24gbnVtKG5vZGUpIHsKICAgIGlmICghbm9kZSkgcmV0dXJuIE5hTjsKICAgIHZhciB2ID0gcGFyc2VGbG9hdChTdHJpbmcobm9kZS52YWx1ZSkucmVwbGFjZSgiLCIsICIuIikpOwogICAgcmV0dXJuIGlzRmluaXRlKHYpID8gdiA6IE5hTjsKICB9CgogIGZ1bmN0aW9uIGNsYW1wKHYsIGEsIGIpIHsgcmV0dXJuIE1hdGgubWF4KGEsIE1hdGgubWluKGIsIHYpKTsgfQoKICBmdW5jdGlvbiByb3VuZFNtYXJ0KHYpIHsKICAgIGlmICghaXNGaW5pdGUodikpIHJldHVybiAiIjsKICAgIHZhciBhID0gTWF0aC5hYnModik7CiAgICB2YXIgZCA9IGEgPj0gMTAwID8gMiA6IGEgPj0gMTAgPyAzIDogYSA+PSAxID8gNCA6IDU7CiAgICByZXR1cm4gU3RyaW5nKE51bWJlcih2LnRvRml4ZWQoZCkpKTsKICB9CgogIGZ1bmN0aW9uIGZtdCh2LCBkKSB7CiAgICBpZiAoIWlzRmluaXRlKHYpKSByZXR1cm4gIi0iOwogICAgcmV0dXJuIHYudG9Mb2NhbGVTdHJpbmcoImVuLVVTIiwgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGQsIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMCB9KTsKICB9CgogIGZ1bmN0aW9uIHNldEVycihrZXksIG1zZykgewogICAgdmFyIG5vZGUgPSBieUlkKCJidHBFcnIiICsga2V5KTsKICAgIHZhciBtYXAgPSB7IEQ6IGVsLmQsIFA6IGVsLnAsIFQ6IGVsLnRvcnF1ZSwgRjogZWwucHJlbG9hZCwgSzogZWwuaywgTXU6IGVsLm11LCBTeTogZWwuc3ksIFNwOiBlbC5zcCB9OwogICAgdmFyIGlucHV0ID0gbWFwW2tleV07CiAgICBpZiAobm9kZSkgbm9kZS50ZXh0Q29udGVudCA9IG1zZyB8fCAiIjsKICAgIGlmIChpbnB1dCkgewogICAgICBpZiAobXNnKSBpbnB1dC5jbGFzc0xpc3QuYWRkKCJidHAtaW52YWxpZCIpOwogICAgICBlbHNlIGlucHV0LmNsYXNzTGlzdC5yZW1vdmUoImJ0cC1pbnZhbGlkIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbGVhckVycnMoKSB7CiAgICBbIkQiLCAiUCIsICJUIiwgIkYiLCAiSyIsICJNdSIsICJTeSIsICJTcCJdLmZvckVhY2goZnVuY3Rpb24gKGspIHsgc2V0RXJyKGssICIiKTsgfSk7CiAgfQoKICBmdW5jdGlvbiBjdXJyZW50U2l6ZUxpc3QoKSB7CiAgICB2YXIgdCA9IGVsLnRocmVhZC52YWx1ZTsKICAgIGlmICh0ID09PSAidW5jIikgcmV0dXJuIFNJWkVTX1VOQzsKICAgIGlmICh0ID09PSAidW5mIikgcmV0dXJuIFNJWkVTX1VORjsKICAgIGlmICh0ID09PSAibWV0cmljIikgcmV0dXJuIFNJWkVTX007CiAgICByZXR1cm4gW107CiAgfQoKICBmdW5jdGlvbiBwaXRjaElzVHBpKCkgewogICAgcmV0dXJuIGVsLnRocmVhZC52YWx1ZSA9PT0gInVuYyIgfHwgZWwudGhyZWFkLnZhbHVlID09PSAidW5mIiB8fCAoZWwudGhyZWFkLnZhbHVlID09PSAiY3VzdG9tIiAmJiBlbC5wVW5pdC52YWx1ZSA9PT0gInRwaSIpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUGl0Y2hVbml0KCkgewogICAgdmFyIHQgPSBlbC50aHJlYWQudmFsdWU7CiAgICB2YXIgY3VzdG9tID0gdCA9PT0gImN1c3RvbSI7CiAgICBpZiAoZWwucFVuaXRXcmFwKSBlbC5wVW5pdFdyYXAuY2xhc3NMaXN0LnRvZ2dsZSgiYnRwLWhpZGRlbiIsICFjdXN0b20pOwogICAgaWYgKGVsLnBVbml0UGlsbCkgZWwucFVuaXRQaWxsLmNsYXNzTGlzdC50b2dnbGUoImJ0cC1oaWRkZW4iLCBjdXN0b20pOwogICAgaWYgKCFjdXN0b20pIGVsLnBVbml0LnZhbHVlID0gdCA9PT0gIm1ldHJpYyIgPyAibW0iIDogInRwaSI7CiAgICBpZiAoZWwucFVuaXRQaWxsKSBlbC5wVW5pdFBpbGwudGV4dENvbnRlbnQgPSBwaXRjaElzVHBpKCkgPyAiVFBJIiA6ICJtbSI7CiAgfQoKICBmdW5jdGlvbiBuZWFyZXN0TWV0cmljUGl0Y2goZE1tKSB7CiAgICB2YXIgYmVzdCA9IE1FVFJJQ19DT0FSU0VbMF07CiAgICB2YXIgZGlzdCA9IE1hdGguYWJzKGRNbSAtIGJlc3QuZCk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IE1FVFJJQ19DT0FSU0UubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRkID0gTWF0aC5hYnMoZE1tIC0gTUVUUklDX0NPQVJTRVtpXS5kKTsKICAgICAgaWYgKGRkIDwgZGlzdCkgeyBkaXN0ID0gZGQ7IGJlc3QgPSBNRVRSSUNfQ09BUlNFW2ldOyB9CiAgICB9CiAgICByZXR1cm4gYmVzdC5wOwogIH0KCiAgZnVuY3Rpb24gbmVhcmVzdFVuUGl0Y2goZEluLCBsaXN0KSB7CiAgICB2YXIgYmVzdCA9IGxpc3RbMF07CiAgICB2YXIgZGlzdCA9IE1hdGguYWJzKGRJbiAtIGJlc3QuZCk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRkID0gTWF0aC5hYnMoZEluIC0gbGlzdFtpXS5kKTsKICAgICAgaWYgKGRkIDwgZGlzdCkgeyBkaXN0ID0gZGQ7IGJlc3QgPSBsaXN0W2ldOyB9CiAgICB9CiAgICByZXR1cm4gYmVzdC50cGk7CiAgfQoKICBmdW5jdGlvbiBhdXRvUGl0Y2goKSB7CiAgICBpZiAoc3RhdGUucGl0Y2hNYW51YWwgfHwgZWwudGhyZWFkLnZhbHVlID09PSAiY3VzdG9tIikgcmV0dXJuOwogICAgdmFyIGQgPSBudW0oZWwuZCk7CiAgICBpZiAoIShkID4gMCkpIHJldHVybjsKICAgIHZhciB0ID0gZWwudGhyZWFkLnZhbHVlOwogICAgaWYgKHQgPT09ICJtZXRyaWMiKSB7CiAgICAgIHZhciBkTW0gPSBlbC5kVW5pdC52YWx1ZSA9PT0gIm1tIiA\/IGQgOiBkICogTU1fUEVSX0lOOwogICAgICBlbC5wLnZhbHVlID0gU3RyaW5nKG5lYXJlc3RNZXRyaWNQaXRjaChkTW0pKTsKICAgIH0gZWxzZSBpZiAodCA9PT0gInVuYyIpIHsKICAgICAgdmFyIGRJbiA9IGVsLmRVbml0LnZhbHVlID09PSAiaW4iID8gZCA6IGQgLyBNTV9QRVJfSU47CiAgICAgIGVsLnAudmFsdWUgPSBTdHJpbmcobmVhcmVzdFVuUGl0Y2goZEluLCBTSVpFU19VTkMpKTsKICAgIH0gZWxzZSBpZiAodCA9PT0gInVuZiIpIHsKICAgICAgdmFyIGRJbjIgPSBlbC5kVW5pdC52YWx1ZSA9PT0gImluIiA\/IGQgOiBkIC8gTU1fUEVSX0lOOwogICAgICBlbC5wLnZhbHVlID0gU3RyaW5nKG5lYXJlc3RVblBpdGNoKGRJbjIsIFNJWkVTX1VORikpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyU2l6ZUNoaXBzKCkgewogICAgdmFyIGxpc3QgPSBjdXJyZW50U2l6ZUxpc3QoKTsKICAgIGVsLnNpemVDaGlwcy5pbm5lckhUTUwgPSAiIjsKICAgIGlmICghbGlzdC5sZW5ndGgpIHsKICAgICAgZWwuc2l6ZUNoaXBzLmNsYXNzTGlzdC5hZGQoImJ0cC1oaWRkZW4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZWwuc2l6ZUNoaXBzLmNsYXNzTGlzdC5yZW1vdmUoImJ0cC1oaWRkZW4iKTsKICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAocykgewogICAgICB2YXIgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgIGJ0bi50eXBlID0gImJ1dHRvbiI7CiAgICAgIGJ0bi5jbGFzc05hbWUgPSAiYnRwLWNoaXAiICsgKHN0YXRlLnNpemVJZCA9PT0gcy5sYWJlbCA\/ICIgYnRwLWlzLWFjdGl2ZSIgOiAiIik7CiAgICAgIGJ0bi50ZXh0Q29udGVudCA9IHMubGFiZWw7CiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzdGF0ZS5zaXplSWQgPSBzLmxhYmVsOwogICAgICAgIHN0YXRlLnBpdGNoTWFudWFsID0gZmFsc2U7CiAgICAgICAgc3RhdGUuYXBwbHlpbmcgPSB0cnVlOwogICAgICAgIGlmIChlbC50aHJlYWQudmFsdWUgPT09ICJtZXRyaWMiKSB7CiAgICAgICAgICBlbC5kVW5pdC52YWx1ZSA9ICJtbSI7CiAgICAgICAgICBlbC5kLnZhbHVlID0gU3RyaW5nKHMuZCk7CiAgICAgICAgICBlbC5wLnZhbHVlID0gU3RyaW5nKHMucCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVsLmRVbml0LnZhbHVlID0gImluIjsKICAgICAgICAgIGVsLmQudmFsdWUgPSBTdHJpbmcocy5kKTsKICAgICAgICAgIGVsLnAudmFsdWUgPSBTdHJpbmcocy50cGkpOwogICAgICAgIH0KICAgICAgICBzdGF0ZS5hcHBseWluZyA9IGZhbHNlOwogICAgICAgIHVwZGF0ZVBpdGNoVW5pdCgpOwogICAgICAgIHBhaW50Q2hpcHMoKTsKICAgICAgfSk7CiAgICAgIGVsLnNpemVDaGlwcy5hcHBlbmRDaGlsZChidG4pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBwYWludENoaXBzKCkgewogICAgZWwuc2l6ZUNoaXBzLnF1ZXJ5U2VsZWN0b3JBbGwoIi5idHAtY2hpcCIpLmZvckVhY2goZnVuY3Rpb24gKGJ0bikgewogICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgiYnRwLWlzLWFjdGl2ZSIsIGJ0bi50ZXh0Q29udGVudCA9PT0gc3RhdGUuc2l6ZUlkKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlHcmFkZSgpIHsKICAgIHZhciBnID0gR1JBREVTW2VsLmdyYWRlLnZhbHVlXTsKICAgIGlmICghZykgcmV0dXJuOwogICAgc3RhdGUuYXBwbHlpbmcgPSB0cnVlOwogICAgdmFyIG1ldHJpY1MgPSBlbC5zVW5pdC52YWx1ZSA9PT0gIk1QYSI7CiAgICBlbC5zeS52YWx1ZSA9IG1ldHJpY1MgPyBTdHJpbmcoZy5zeSkgOiByb3VuZFNtYXJ0KGcuc3kgKiBQU0lfUEVSX01QQSk7CiAgICBlbC5zcC52YWx1ZSA9IG1ldHJpY1MgPyBTdHJpbmcoZy5zcCkgOiByb3VuZFNtYXJ0KGcuc3AgKiBQU0lfUEVSX01QQSk7CiAgICBlbC5zeS5yZWFkT25seSA9IHRydWU7CiAgICBlbC5zcC5yZWFkT25seSA9IHRydWU7CiAgICBzdGF0ZS5hcHBseWluZyA9IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gbWFya0N1c3RvbUdyYWRlKCkgewogICAgaWYgKHN0YXRlLmFwcGx5aW5nKSByZXR1cm47CiAgICBpZiAoZWwuZ3JhZGUudmFsdWUgIT09ICJjdXN0b20iKSBlbC5ncmFkZS52YWx1ZSA9ICJjdXN0b20iOwogICAgZWwuc3kucmVhZE9ubHkgPSBmYWxzZTsKICAgIGVsLnNwLnJlYWRPbmx5ID0gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBhcHBseUx1YnJpY2F0aW9uKCkgewogICAgdmFyIHNwZWMgPSBMVUJbZWwubHViLnZhbHVlXTsKICAgIGlmICghc3BlYykgcmV0dXJuOwogICAgc3RhdGUuYXBwbHlpbmcgPSB0cnVlOwogICAgZWwuay52YWx1ZSA9IHNwZWMuay50b0ZpeGVkKDIpOwogICAgZWwubXUucGxhY2Vob2xkZXIgPSBzcGVjLm11LnRvRml4ZWQoMik7CiAgICBpZiAoZWwubXUudmFsdWUgIT09ICIiKSBlbC5tdS52YWx1ZSA9IHNwZWMubXUudG9GaXhlZCgyKTsKICAgIHN0YXRlLmFwcGx5aW5nID0gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBtYXJrQ3VzdG9tTHViKCkgewogICAgaWYgKHN0YXRlLmFwcGx5aW5nKSByZXR1cm47CiAgICBpZiAoZWwubHViLnZhbHVlICE9PSAiY3VzdG9tIikgZWwubHViLnZhbHVlID0gImN1c3RvbSI7CiAgfQoKICBmdW5jdGlvbiBzZXRNb2RlKG1vZGUpIHsKICAgIHN0YXRlLm1vZGUgPSBtb2RlOwogICAgdmFyIHQyZiA9IG1vZGUgPT09ICJ0MmYiOwogICAgZWwubW9kZVQyRi5jbGFzc0xpc3QudG9nZ2xlKCJidHAtaXMtYWN0aXZlIiwgdDJmKTsKICAgIGVsLm1vZGVGMlQuY2xhc3NMaXN0LnRvZ2dsZSgiYnRwLWlzLWFjdGl2ZSIsICF0MmYpOwogICAgZWwuZmxkVG9ycXVlLmNsYXNzTGlzdC50b2dnbGUoImJ0cC1oaWRkZW4iLCAhdDJmKTsKICAgIGVsLmZsZFByZWxvYWQuY2xhc3NMaXN0LnRvZ2dsZSgiYnRwLWhpZGRlbiIsIHQyZik7CiAgICBpZiAoZWwubG9hZFRpdGxlKSB7CiAgICAgIGVsLmxvYWRUaXRsZS50ZXh0Q29udGVudCA9IHQyZiA\/ICJUaWdodGVuaW5nIHRvcnF1ZSIgOiAiVGFyZ2V0IHByZWxvYWQgZm9yY2UiOwogICAgfQogICAgaWYgKGVsLmxvYWROb3RlKSB7CiAgICAgIGVsLmxvYWROb3RlLnRleHRDb250ZW50ID0gdDJmCiAgICAgICAgPyAiVG9ycXVlIHRvIHByZWxvYWQ6IEYgPSBUIC8gKEsgeCBkKS4gVXNlZCBieSB0aGlzIEJvbHQgVG9ycXVlIENhbGN1bGF0b3Igd2hlbiBjb252ZXJ0aW5nIGFwcGxpZWQgd3JlbmNoIHRvcnF1ZSBpbnRvIGVzdGltYXRlZCBjbGFtcCBmb3JjZS4iCiAgICAgICAgOiAiUHJlbG9hZCB0byB0b3JxdWU6IFQgPSBLIHggRiB4IGQuIFVzZWQgYnkgdGhpcyBCb2x0IFByZWxvYWQgQ2FsY3VsYXRvciB3aGVuIGEgdGFyZ2V0IGNsYW1wIGZvcmNlIGlzIHNwZWNpZmllZC4iOwogICAgfQogICAgZWwubW9kZVQyRi5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsIHQyZiA\/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgZWwubW9kZUYyVC5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsIHQyZiA\/ICJmYWxzZSIgOiAidHJ1ZSIpOwogIH0KCiAgZnVuY3Rpb24gZFRvTW0oKSB7CiAgICB2YXIgZCA9IG51bShlbC5kKTsKICAgIGlmICghKGQgPiAwKSkgcmV0dXJuIE5hTjsKICAgIHJldHVybiBlbC5kVW5pdC52YWx1ZSA9PT0gImluIiA\/IGQgKiBNTV9QRVJfSU4gOiBkOwogIH0KCiAgZnVuY3Rpb24gcFRvTW0oKSB7CiAgICB2YXIgcCA9IG51bShlbC5wKTsKICAgIGlmICghKHAgPiAwKSkgcmV0dXJuIE5hTjsKICAgIHJldHVybiBwaXRjaElzVHBpKCkgPyBNTV9QRVJfSU4gLyBwIDogcDsKICB9CgogIGZ1bmN0aW9uIHRvcnF1ZVRvTm0oKSB7CiAgICB2YXIgdCA9IG51bShlbC50b3JxdWUpOwogICAgaWYgKCFpc0Zpbml0ZSh0KSkgcmV0dXJuIE5hTjsKICAgIHJldHVybiBlbC50VW5pdC52YWx1ZSA9PT0gImxiZmZ0IiA\/IHQgLyBMQkZGVF9QRVJfTk0gOiB0OwogIH0KCiAgZnVuY3Rpb24gcHJlbG9hZFRvTigpIHsKICAgIHZhciBmID0gbnVtKGVsLnByZWxvYWQpOwogICAgaWYgKCFpc0Zpbml0ZShmKSkgcmV0dXJuIE5hTjsKICAgIHZhciB1ID0gZWwuZlVuaXQudmFsdWU7CiAgICBpZiAodSA9PT0gImtOIikgcmV0dXJuIGYgKiAxMDAwOwogICAgaWYgKHUgPT09ICJsYmYiKSByZXR1cm4gZiAvIExCRl9QRVJfTjsKICAgIHJldHVybiBmOwogIH0KCiAgZnVuY3Rpb24gc3RyZW5ndGhUb01QYShub2RlKSB7CiAgICB2YXIgdiA9IG51bShub2RlKTsKICAgIGlmICghaXNGaW5pdGUodikgfHwgdiA8PSAwKSByZXR1cm4gTmFOOwogICAgcmV0dXJuIGVsLnNVbml0LnZhbHVlID09PSAicHNpIiA\/IHYgLyBQU0lfUEVSX01QQSA6IHY7CiAgfQoKICBmdW5jdGlvbiB0ZW5zaWxlQXJlYU1tMihkTW0sIHBNbSkgewogICAgaWYgKCEoZE1tID4gMCkgfHwgIShwTW0gPiAwKSkgcmV0dXJuIE5hTjsKICAgIHZhciBjb3JlID0gZE1tIC0gMC45MzgyICogcE1tOwogICAgaWYgKCEoY29yZSA+IDApKSByZXR1cm4gTmFOOwogICAgcmV0dXJuIE1hdGguUEkgLyA0ICogY29yZSAqIGNvcmU7CiAgfQoKICBmdW5jdGlvbiBrRnJvbU11KGRNbSwgcE1tLCBtdSkgewogICAgdmFyIGQyID0gZE1tIC0gMC42NDk1ICogcE1tOwogICAgdmFyIERtID0gMS4zICogZE1tOwogICAgaWYgKCEoZE1tID4gMCkgfHwgIShkMiA+IDApKSByZXR1cm4gTmFOOwogICAgcmV0dXJuIChwTW0gLyAoMiAqIE1hdGguUEkpICsgMC41NzcgKiBtdSAqIGQyICsgMC41ICogbXUgKiBEbSkgLyBkTW07CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRGb3JjZShOKSB7CiAgICBpZiAoIWlzRmluaXRlKE4pKSByZXR1cm4geyBwcmltYXJ5OiAiLSIsIHNlY29uZGFyeTogIiIgfTsKICAgIHZhciBpbXBlcmlhbCA9IGVsLmRVbml0LnZhbHVlID09PSAiaW4iIHx8IGVsLmZVbml0LnZhbHVlID09PSAibGJmIjsKICAgIGlmIChpbXBlcmlhbCkgewogICAgICByZXR1cm4geyBwcmltYXJ5OiBmbXQoTiAqIExCRl9QRVJfTiwgMSkgKyAiIGxiZiIsIHNlY29uZGFyeTogZm10KE4gLyAxMDAwLCAyKSArICIga04gIC8gICIgKyBmbXQoTiwgMCkgKyAiIE4iIH07CiAgICB9CiAgICBpZiAoTWF0aC5hYnMoTikgPj0gMTAwMCkgewogICAgICByZXR1cm4geyBwcmltYXJ5OiBmbXQoTiAvIDEwMDAsIDIpICsgIiBrTiIsIHNlY29uZGFyeTogZm10KE4sIDApICsgIiBOICAvICAiICsgZm10KE4gKiBMQkZfUEVSX04sIDEpICsgIiBsYmYiIH07CiAgICB9CiAgICByZXR1cm4geyBwcmltYXJ5OiBmbXQoTiwgMSkgKyAiIE4iLCBzZWNvbmRhcnk6IGZtdChOICogTEJGX1BFUl9OLCAxKSArICIgbGJmIiB9OwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0VG9ycXVlKE5tKSB7CiAgICBpZiAoIWlzRmluaXRlKE5tKSkgcmV0dXJuIHsgcHJpbWFyeTogIi0iLCBzZWNvbmRhcnk6ICIiIH07CiAgICB2YXIgZnQgPSBObSAqIExCRkZUX1BFUl9OTTsKICAgIGlmIChlbC50VW5pdC52YWx1ZSA9PT0gImxiZmZ0IiB8fCBlbC5kVW5pdC52YWx1ZSA9PT0gImluIikgewogICAgICByZXR1cm4geyBwcmltYXJ5OiBmbXQoZnQsIDIpICsgIiBsYmYtZnQiLCBzZWNvbmRhcnk6IGZtdChObSwgMikgKyAiIE4tbSIgfTsKICAgIH0KICAgIHJldHVybiB7IHByaW1hcnk6IGZtdChObSwgMikgKyAiIE4tbSIsIHNlY29uZGFyeTogZm10KGZ0LCAyKSArICIgbGJmLWZ0IiB9OwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0U3RyZXNzKE1QYSkgewogICAgaWYgKCFpc0Zpbml0ZShNUGEpKSByZXR1cm4geyBwcmltYXJ5OiAiLSIsIHNlY29uZGFyeTogIiIgfTsKICAgIGlmIChlbC5zVW5pdC52YWx1ZSA9PT0gInBzaSIgfHwgZWwuZFVuaXQudmFsdWUgPT09ICJpbiIpIHsKICAgICAgcmV0dXJuIHsgcHJpbWFyeTogZm10KE1QYSAqIFBTSV9QRVJfTVBBLCAwKSArICIgcHNpIiwgc2Vjb25kYXJ5OiBmbXQoTVBhLCAxKSArICIgTVBhIiB9OwogICAgfQogICAgcmV0dXJuIHsgcHJpbWFyeTogZm10KE1QYSwgMSkgKyAiIE1QYSIsIHNlY29uZGFyeTogZm10KE1QYSAqIFBTSV9QRVJfTVBBLCAwKSArICIgcHNpIiB9OwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0QXJlYShtbTIpIHsKICAgIGlmICghaXNGaW5pdGUobW0yKSkgcmV0dXJuICItIjsKICAgIGlmIChlbC5kVW5pdC52YWx1ZSA9PT0gImluIikgcmV0dXJuIGZtdChtbTIgLyBNTTJfUEVSX0lOMiwgNCkgKyAiIGluMiI7CiAgICByZXR1cm4gZm10KG1tMiwgMSkgKyAiIG1tMiI7CiAgfQoKICBmdW5jdGlvbiBjb252ZXJ0RFVuaXQobmV4dCkgewogICAgaWYgKG5leHQgPT09IGVsLmRVbml0LnZhbHVlKSByZXR1cm47CiAgICB2YXIgZCA9IG51bShlbC5kKTsKICAgIHZhciBwcmV2ID0gZWwuZFVuaXQudmFsdWU7CiAgICBpZiAoaXNGaW5pdGUoZCkpIHsKICAgICAgZWwuZC52YWx1ZSA9IG5leHQgPT09ICJpbiIgPyByb3VuZFNtYXJ0KGQgLyBNTV9QRVJfSU4pIDogcm91bmRTbWFydChkICogTU1fUEVSX0lOKTsKICAgIH0KICAgIGVsLmRVbml0LnZhbHVlID0gbmV4dDsKICAgIGlmIChwcmV2ICE9PSBuZXh0KSBzdGF0ZS5zaXplSWQgPSAiIjsKICAgIHBhaW50Q2hpcHMoKTsKICB9CgogIGZ1bmN0aW9uIGNvbnZlcnRGVW5pdChuZXh0KSB7CiAgICB2YXIgZiA9IG51bShlbC5wcmVsb2FkKTsKICAgIHZhciBmcm9tID0gZWwuZlVuaXQudmFsdWU7CiAgICBpZiAoZnJvbSA9PT0gbmV4dCkgcmV0dXJuOwogICAgaWYgKGlzRmluaXRlKGYpKSB7CiAgICAgIHZhciBuID0gZjsKICAgICAgaWYgKGZyb20gPT09ICJrTiIpIG4gKj0gMTAwMDsKICAgICAgaWYgKGZyb20gPT09ICJsYmYiKSBuIC89IExCRl9QRVJfTjsKICAgICAgaWYgKG5leHQgPT09ICJrTiIpIG4gLz0gMTAwMDsKICAgICAgaWYgKG5leHQgPT09ICJsYmYiKSBuICo9IExCRl9QRVJfTjsKICAgICAgZWwucHJlbG9hZC52YWx1ZSA9IHJvdW5kU21hcnQobik7CiAgICB9CiAgICBlbC5mVW5pdC52YWx1ZSA9IG5leHQ7CiAgfQoKICBmdW5jdGlvbiBjb252ZXJ0VFVuaXQobmV4dCkgewogICAgdmFyIHQgPSBudW0oZWwudG9ycXVlKTsKICAgIHZhciBmcm9tID0gZWwudFVuaXQudmFsdWU7CiAgICBpZiAoZnJvbSA9PT0gbmV4dCkgcmV0dXJuOwogICAgaWYgKGlzRmluaXRlKHQpKSB7CiAgICAgIHZhciBubSA9IGZyb20gPT09ICJsYmZmdCIgPyB0IC8gTEJGRlRfUEVSX05NIDogdDsKICAgICAgZWwudG9ycXVlLnZhbHVlID0gbmV4dCA9PT0gImxiZmZ0IiA\/IHJvdW5kU21hcnQobm0gKiBMQkZGVF9QRVJfTk0pIDogcm91bmRTbWFydChubSk7CiAgICB9CiAgICBlbC50VW5pdC52YWx1ZSA9IG5leHQ7CiAgfQoKICBmdW5jdGlvbiBjb252ZXJ0U1VuaXQobmV4dCkgewogICAgdmFyIGZyb20gPSBlbC5zVW5pdC52YWx1ZTsKICAgIGlmIChmcm9tID09PSBuZXh0KSByZXR1cm47CiAgICB2YXIgc3kgPSBudW0oZWwuc3kpOwogICAgdmFyIHNwID0gbnVtKGVsLnNwKTsKICAgIGlmIChpc0Zpbml0ZShzeSkpIHsKICAgICAgZWwuc3kudmFsdWUgPSBuZXh0ID09PSAicHNpIiA\/IHJvdW5kU21hcnQoc3kgKiBQU0lfUEVSX01QQSkgOiByb3VuZFNtYXJ0KHN5IC8gUFNJX1BFUl9NUEEpOwogICAgfQogICAgaWYgKGlzRmluaXRlKHNwKSAmJiBzcCA+IDApIHsKICAgICAgZWwuc3AudmFsdWUgPSBuZXh0ID09PSAicHNpIiA\/IHJvdW5kU21hcnQoc3AgKiBQU0lfUEVSX01QQSkgOiByb3VuZFNtYXJ0KHNwIC8gUFNJX1BFUl9NUEEpOwogICAgfQogICAgZWwuc1VuaXQudmFsdWUgPSBuZXh0OwogICAgdmFyIHBpbGwgPSBieUlkKCJidHBTcFVuaXRQaWxsIik7CiAgICBpZiAocGlsbCkgcGlsbC50ZXh0Q29udGVudCA9IG5leHQ7CiAgfQoKICBmdW5jdGlvbiBvblRocmVhZENoYW5nZSgpIHsKICAgIHZhciB0ID0gZWwudGhyZWFkLnZhbHVlOwogICAgc3RhdGUucGl0Y2hNYW51YWwgPSB0ID09PSAiY3VzdG9tIjsKICAgIHN0YXRlLnNpemVJZCA9ICIiOwogICAgaWYgKHQgPT09ICJtZXRyaWMiKSB7CiAgICAgIGNvbnZlcnREVW5pdCgibW0iKTsKICAgICAgZWwucFVuaXQudmFsdWUgPSAibW0iOwogICAgfSBlbHNlIGlmICh0ID09PSAidW5jIiB8fCB0ID09PSAidW5mIikgewogICAgICBjb252ZXJ0RFVuaXQoImluIik7CiAgICAgIGVsLnBVbml0LnZhbHVlID0gInRwaSI7CiAgICB9CiAgICB1cGRhdGVQaXRjaFVuaXQoKTsKICAgIHJlbmRlclNpemVDaGlwcygpOwogICAgYXV0b1BpdGNoKCk7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZShzaSkgewogICAgdmFyIG9rID0gdHJ1ZTsKICAgIGNsZWFyRXJycygpOwoKICAgIGlmIChlbC5kLnZhbHVlID09PSAiIiB8fCAhaXNGaW5pdGUobnVtKGVsLmQpKSkgewogICAgICBzZXRFcnIoIkQiLCAiRW50ZXIgYSBib2x0IGRpYW1ldGVyLiIpOyBvayA9IGZhbHNlOwogICAgfSBlbHNlIGlmICghKHNpLmRNbSA+IDApKSB7CiAgICAgIHNldEVycigiRCIsICJCb2x0IGRpYW1ldGVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7IG9rID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHNpLmRNbSA8IDEuNSB8fCBzaS5kTW0gPiAxNTApIHsKICAgICAgc2V0RXJyKCJEIiwgIkRpYW1ldGVyIGxvb2tzIHVucmVhbGlzdGljLiBFbnRlciBhIG5vbWluYWwgc2l6ZSBiZXR3ZWVuIGFib3V0IDIgbW0gYW5kIDE1MCBtbSAob3IgZXF1aXZhbGVudCBpbmNoZXMpLiIpOyBvayA9IGZhbHNlOwogICAgfQoKICAgIGlmIChlbC5wLnZhbHVlID09PSAiIiB8fCAhaXNGaW5pdGUobnVtKGVsLnApKSkgewogICAgICBzZXRFcnIoIlAiLCBwaXRjaElzVHBpKCkgPyAiRW50ZXIgdGhyZWFkcyBwZXIgaW5jaCAoVFBJKS4iIDogIkVudGVyIHRocmVhZCBwaXRjaC4iKTsgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoIShzaS5wTW0gPiAwKSkgewogICAgICBzZXRFcnIoIlAiLCAiUGl0Y2ggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoIXBpdGNoSXNUcGkoKSAmJiBzaS5kTW0gPiAwICYmIHNpLnBNbSA+PSBzaS5kTW0pIHsKICAgICAgc2V0RXJyKCJQIiwgIlBpdGNoIG11c3QgYmUgc21hbGxlciB0aGFuIHRoZSBib2x0IGRpYW1ldGVyLiIpOyBvayA9IGZhbHNlOwogICAgfSBlbHNlIGlmIChzaS5kTW0gPiAwICYmIHNpLnBNbSA+IDAgJiYgKHNpLmRNbSAtIDAuOTM4MiAqIHNpLnBNbSkgPD0gMCkgewogICAgICBzZXRFcnIoIlAiLCAiUGl0Y2ggaXMgdG9vIGxhcmdlIGZvciB0aGlzIGRpYW1ldGVyOyB0ZW5zaWxlIGFyZWEgd291bGQgYmUgemVyby4iKTsgb2sgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAoc3RhdGUubW9kZSA9PT0gInQyZiIpIHsKICAgICAgaWYgKGVsLnRvcnF1ZS52YWx1ZSA9PT0gIiIgfHwgIWlzRmluaXRlKG51bShlbC50b3JxdWUpKSkgewogICAgICAgIHNldEVycigiVCIsICJFbnRlciB0aWdodGVuaW5nIHRvcnF1ZS4iKTsgb2sgPSBmYWxzZTsKICAgICAgfSBlbHNlIGlmICghKHNpLlQgPiAwKSkgewogICAgICAgIHNldEVycigiVCIsICJUb3JxdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsgb2sgPSBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGVsLnByZWxvYWQudmFsdWUgPT09ICIiIHx8ICFpc0Zpbml0ZShudW0oZWwucHJlbG9hZCkpKSB7CiAgICAgICAgc2V0RXJyKCJGIiwgIkVudGVyIHRhcmdldCBwcmVsb2FkIGZvcmNlLiIpOyBvayA9IGZhbHNlOwogICAgICB9IGVsc2UgaWYgKCEoc2kuRiA+IDApKSB7CiAgICAgICAgc2V0RXJyKCJGIiwgIlByZWxvYWQgZm9yY2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsgb2sgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHZhciBtdVJhdyA9IGVsLm11LnZhbHVlID09PSAiIiA\/IE5hTiA6IG51bShlbC5tdSk7CiAgICB2YXIgayA9IG51bShlbC5rKTsKICAgIGlmIChlbC5tdS52YWx1ZSAhPT0gIiIpIHsKICAgICAgaWYgKCEobXVSYXcgPiAwICYmIG11UmF3IDwgMSkpIHsKICAgICAgICBzZXRFcnIoIk11IiwgIkZyaWN0aW9uIGNvZWZmaWNpZW50IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLiIpOyBvayA9IGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCEoayA+IDApKSB7CiAgICAgIHNldEVycigiSyIsICJOdXQgZmFjdG9yIEsgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsgb2sgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAoIShzaS5zeSA+IDApKSB7CiAgICAgIHNldEVycigiU3kiLCAiWWllbGQgc3RyZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsgb2sgPSBmYWxzZTsKICAgIH0KICAgIGlmIChlbC5zcC52YWx1ZSAhPT0gIiIgJiYgIShzaS5zcCA+IDApKSB7CiAgICAgIHNldEVycigiU3AiLCAiUHJvb2Ygc3RyZW5ndGggbXVzdCBiZSBwb3NpdGl2ZSwgb3IgbGVmdCBibGFuay4iKTsgb2sgPSBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gb2s7CiAgfQoKICBmdW5jdGlvbiBzZXRHYXVnZShmcmFjKSB7CiAgICB2YXIgZiA9IGNsYW1wKGlzRmluaXRlKGZyYWMpID8gZnJhYyA6IDAsIDAsIDEpOwogICAgaWYgKGVsLmdhdWdlQXJjKSBlbC5nYXVnZUFyYy5zZXRBdHRyaWJ1dGUoInN0cm9rZS1kYXNob2Zmc2V0IiwgU3RyaW5nKEFSQ19MRU4gKiAoMSAtIGYpKSk7CiAgICB2YXIgYW5nID0gLTkwICsgZiAqIDE4MDsKICAgIGlmIChlbC5uZWVkbGUpIGVsLm5lZWRsZS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsICJyb3RhdGUoIiArIGFuZyArICIgMTIwIDExOCkiKTsKICB9CgogIGZ1bmN0aW9uIHNldFByZWxvYWRCYXIoZnJhYykgewogICAgdmFyIGYgPSBjbGFtcChpc0Zpbml0ZShmcmFjKSA\/IGZyYWMgOiAwLCAwLCAxKTsKICAgIGlmIChlbC5wcmVsb2FkRmlsbCkgZWwucHJlbG9hZEZpbGwuc3R5bGUuaGVpZ2h0ID0gKGYgKiAxMDApICsgIiUiOwogIH0KCiAgZnVuY3Rpb24gc2V0U2NoZW1hdGljKHN0YXR1cykgewogICAgaWYgKCFlbC5zY2hlbWF0aWMpIHJldHVybjsKICAgIGVsLnNjaGVtYXRpYy5zZXRBdHRyaWJ1dGUoImRhdGEtc3RhdHVzIiwgc3RhdHVzIHx8ICJpZGxlIik7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGUoc2Nyb2xsKSB7CiAgICB2YXIgZE1tID0gZFRvTW0oKTsKICAgIHZhciBwTW0gPSBwVG9NbSgpOwogICAgdmFyIFQgPSB0b3JxdWVUb05tKCk7CiAgICB2YXIgRiA9IHByZWxvYWRUb04oKTsKICAgIHZhciBzeSA9IHN0cmVuZ3RoVG9NUGEoZWwuc3kpOwogICAgdmFyIHNwUmF3ID0gZWwuc3AudmFsdWUgPT09ICIiID8gTmFOIDogc3RyZW5ndGhUb01QYShlbC5zcCk7CiAgICB2YXIgbXUgPSBlbC5tdS52YWx1ZSA9PT0gIiIgPyBOYU4gOiBudW0oZWwubXUpOwogICAgdmFyIGtVc2VyID0gbnVtKGVsLmspOwogICAgdmFyIEF0ID0gdGVuc2lsZUFyZWFNbTIoZE1tLCBwTW0pOwogICAgdmFyIHVzZU11ID0gaXNGaW5pdGUobXUpICYmIG11ID4gMDsKICAgIHZhciBLID0ga1VzZXI7CiAgICB2YXIgbWV0aG9kID0gIksiOwoKICAgIGlmICh1c2VNdSAmJiBpc0Zpbml0ZShkTW0pICYmIGlzRmluaXRlKHBNbSkpIHsKICAgICAgdmFyIGtNdSA9IGtGcm9tTXUoZE1tLCBwTW0sIG11KTsKICAgICAgaWYgKGlzRmluaXRlKGtNdSkgJiYga011ID4gMCkgewogICAgICAgIEsgPSBrTXU7CiAgICAgICAgbWV0aG9kID0gImZyaWN0aW9uIjsKICAgICAgfQogICAgfQoKICAgIHZhciBzaSA9IHsgZE1tOiBkTW0sIHBNbTogcE1tLCBUOiBULCBGOiBGLCBzeTogc3ksIHNwOiBzcFJhdywgSzogSywgQXQ6IEF0IH07CiAgICB2YXIgb2sgPSB2YWxpZGF0ZShzaSk7CiAgICBlbC5yZXN1bHRzLmNsYXNzTGlzdC5yZW1vdmUoImJ0cC1oaWRkZW4iKTsKCiAgICBpZiAoIW9rKSB7CiAgICAgIGVsLnN0YXR1c1RpdGxlLnRleHRDb250ZW50ID0gIkNoZWNrIGlucHV0cyI7CiAgICAgIGVsLnN0YXR1c05vdGUudGV4dENvbnRlbnQgPSAiQ29ycmVjdCB0aGUgaGlnaGxpZ2h0ZWQgZmllbGRzLCB0aGVuIGNhbGN1bGF0ZSBhZ2Fpbi4gRW1wdHksIHplcm8sIG9yIG5lZ2F0aXZlIGRpYW1ldGVyIHZhbHVlcyBhcmUgbm90IGFsbG93ZWQuIjsKICAgICAgZWwuYmFubmVyLmNsYXNzTmFtZSA9ICJidHAtYmFubmVyIGJ0cC1iYW5uZXItY2F1dGlvbiI7CiAgICAgIHNldEdhdWdlKDApOwogICAgICBzZXRQcmVsb2FkQmFyKDApOwogICAgICBzZXRTY2hlbWF0aWMoImlkbGUiKTsKICAgICAgaWYgKHNjcm9sbCkgewogICAgICAgIHRyeSB7IGVsLnJlc3VsdHMuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogInNtb290aCIsIGJsb2NrOiAibmVhcmVzdCIgfSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBkX20gPSBkTW0gLyAxMDAwOwogICAgaWYgKHN0YXRlLm1vZGUgPT09ICJ0MmYiKSB7CiAgICAgIEYgPSBUIC8gKEsgKiBkX20pOwogICAgfSBlbHNlIHsKICAgICAgVCA9IEsgKiBGICogZF9tOwogICAgfQoKICAgIHZhciBzdHJlc3MgPSBGIC8gQXQ7CiAgICB2YXIgaGFzUHJvb2YgPSBpc0Zpbml0ZShzcFJhdykgJiYgc3BSYXcgPiAwOwogICAgdmFyIEZ5ID0gQXQgKiBzeTsKICAgIHZhciBGcCA9IGhhc1Byb29mID8gQXQgKiBzcFJhdyA6IE5hTjsKICAgIHZhciBjYXAgPSBoYXNQcm9vZiA\/IEZwIDogRnk7CiAgICB2YXIgdXRpbCA9IEYgLyBjYXA7CiAgICB2YXIgdXRpbFlpZWxkID0gRiAvIEZ5OwoKICAgIHZhciBUY2FwID0gSyAqIGNhcCAqIGRfbTsKICAgIHZhciBUdHlwID0gSyAqIDAuNzUgKiBjYXAgKiBkX207CiAgICB2YXIgZ2F1Z2VGcmFjID0gVHR5cCA+IDAgPyBUIC8gKEsgKiBjYXAgKiBkX20pIDogMDsKCiAgICB2YXIgYWxlcnRzID0gW107CiAgICB2YXIgc3RhdHVzID0gInNhZmUiOwogICAgdmFyIHRpdGxlID0gIlNhZmUiOwogICAgdmFyIG5vdGUgPSAiRXN0aW1hdGVkIHByZWxvYWQgaXMgd2l0aGluIHRoZSByZWNvbW1lbmRlZCByYW5nZSBhbmQgYmVsb3cgYm9sdCAiICsgKGhhc1Byb29mID8gInByb29mIiA6ICJ5aWVsZCIpICsgIiBjYXBhY2l0eS4iOwoKICAgIGlmIChLIDwgMC4xMCB8fCBLID4gMC4zMCkgewogICAgICBhbGVydHMucHVzaCh7IHR5cGU6ICJ3YXJuIiwgdGV4dDogIk51dCBmYWN0b3IgSyA9ICIgKyBmbXQoSywgMykgKyAiIGlzIG91dHNpZGUgdGhlIHR5cGljYWwgMC4xMC0wLjMwIGVuZ2luZWVyaW5nIHJhbmdlLiBUb3JxdWUgc2NhdHRlciB3aWxsIGJlIGxhcmdlIHVubGVzcyBmcmljdGlvbiBpcyBtZWFzdXJlZC4iIH0pOwogICAgfQogICAgaWYgKG1ldGhvZCA9PT0gImZyaWN0aW9uIikgewogICAgICBhbGVydHMucHVzaCh7IHR5cGU6ICJvayIsIHRleHQ6ICJUb3JxdWUtcHJlbG9hZCBjb252ZXJzaW9uIHVzZXMgdGhlIE1vdG9zaCBmcmljdGlvbiBmb3JtdWxhIHdpdGggbXUgPSAiICsgZm10KG11LCAzKSArICIuIEVxdWl2YWxlbnQgbnV0IGZhY3RvciBLID0gIiArIGZtdChLLCAzKSArICIuIiB9KTsKICAgIH0KICAgIGlmIChzdGF0ZS5tb2RlID09PSAidDJmIiAmJiBUID4gMyAqIFR0eXAgJiYgVHR5cCA+IDApIHsKICAgICAgYWxlcnRzLnB1c2goeyB0eXBlOiAid2FybiIsIHRleHQ6ICJFbnRlcmVkIHRvcnF1ZSBpcyBtdWNoIGhpZ2hlciB0aGFuIGEgdHlwaWNhbCA3NSUgcHJvb2YtbG9hZCB0b3JxdWUgZm9yIHRoaXMgYm9sdCAoIiArIGZvcm1hdFRvcnF1ZShUdHlwKS5wcmltYXJ5ICsgIikuIENoZWNrIHVuaXRzIGFuZCBsdWJyaWNhdGlvbi4iIH0pOwogICAgfQogICAgaWYgKHN0YXRlLm1vZGUgPT09ICJ0MmYiICYmIGRNbSA+PSA4ICYmIFQgPCAwLjE1ICogVHR5cCAmJiBUdHlwID4gMCkgewogICAgICBhbGVydHMucHVzaCh7IHR5cGU6ICJ3YXJuIiwgdGV4dDogIkVudGVyZWQgdG9ycXVlIGlzIHZlcnkgbG93IGZvciB0aGlzIGJvbHQgc2l6ZS4gUmVzdWx0aW5nIGNsYW1wIGZvcmNlIG1heSBub3QgcmVzaXN0IGxvb3NlbmluZy4iIH0pOwogICAgfQoKICAgIGlmICh1dGlsID49IDEgfHwgRiA+PSBjYXApIHsKICAgICAgc3RhdHVzID0gInJpc2siOwogICAgICB0aXRsZSA9ICJPdmVybG9hZGVkIjsKICAgICAgbm90ZSA9ICJFc3RpbWF0ZWQgcHJlbG9hZCByZWFjaGVzIG9yIGV4Y2VlZHMgYm9sdCAiICsgKGhhc1Byb29mID8gInByb29mIiA6ICJ5aWVsZCIpICsgIiBzdHJlbmd0aC4gUmVkdWNlIHRvcnF1ZSwgaW1wcm92ZSBsdWJyaWNhdGlvbiAobG93ZXIgSyksIG9yIHVzZSBhIHN0cm9uZ2VyIC8gbGFyZ2VyIGZhc3RlbmVyLiI7CiAgICAgIGFsZXJ0cy51bnNoaWZ0KHsgdHlwZTogInJpc2siLCB0ZXh0OiAiUHJlbG9hZCAiICsgZm9ybWF0Rm9yY2UoRikucHJpbWFyeSArICIgbWVldHMgb3IgZXhjZWVkcyBib2x0IGNhcGFjaXR5ICIgKyBmb3JtYXRGb3JjZShjYXApLnByaW1hcnkgKyAiLiIgfSk7CiAgICB9IGVsc2UgaWYgKHV0aWwgPj0gMC44NSkgewogICAgICBzdGF0dXMgPSAiY2F1dGlvbiI7CiAgICAgIHRpdGxlID0gIldhcm5pbmciOwogICAgICBub3RlID0gIlByZWxvYWQgYXBwcm9hY2hlcyBhbGxvd2FibGUgYm9sdCBjYXBhY2l0eS4gQ29uZmlybSBmcmljdGlvbiwgdG9vbCBzY2F0dGVyLCBhbmQgbWFudWZhY3R1cmVyIHRvcnF1ZSB0YWJsZXMgYmVmb3JlIGFzc2VtYmx5LiI7CiAgICAgIGFsZXJ0cy51bnNoaWZ0KHsgdHlwZTogIndhcm4iLCB0ZXh0OiAiVXRpbGl6YXRpb24gaXMgIiArIGZtdCh1dGlsICogMTAwLCAxKSArICIlIG9mICIgKyAoaGFzUHJvb2YgPyAicHJvb2YiIDogInlpZWxkIikgKyAiIGxvYWQuIENvbnRyb2xsZWQgdGlnaHRlbmluZyBpcyByZWNvbW1lbmRlZC4iIH0pOwogICAgfSBlbHNlIGlmICh1dGlsIDwgMC40MCkgewogICAgICBzdGF0dXMgPSAiY2F1dGlvbiI7CiAgICAgIHRpdGxlID0gIldhcm5pbmciOwogICAgICBub3RlID0gIkVzdGltYXRlZCBjbGFtcCBmb3JjZSBpcyBiZWxvdyA0MCUgb2YgYm9sdCAiICsgKGhhc1Byb29mID8gInByb29mIiA6ICJ5aWVsZCIpICsgIiBjYXBhY2l0eS4gSm9pbnRzIG1heSBsb29zZW4gdW5kZXIgdmlicmF0aW9uIG9yIGN5Y2xpYyBsb2FkLiI7CiAgICAgIGFsZXJ0cy51bnNoaWZ0KHsgdHlwZTogIndhcm4iLCB0ZXh0OiAiUHJlbG9hZCBpcyBvbmx5ICIgKyBmbXQodXRpbCAqIDEwMCwgMSkgKyAiJSBvZiBjYXBhY2l0eS4gSW5zdWZmaWNpZW50IHByZWxvYWQgaXMgYSBjb21tb24gY2F1c2Ugb2Ygam9pbnQgbG9vc2VuaW5nLiIgfSk7CiAgICB9IGVsc2UgaWYgKEsgPCAwLjEwIHx8IEsgPiAwLjMwKSB7CiAgICAgIHN0YXR1cyA9ICJjYXV0aW9uIjsKICAgICAgdGl0bGUgPSAiV2FybmluZyI7CiAgICAgIG5vdGUgPSAiUHJlbG9hZCBtYWduaXR1ZGUgaXMgYWNjZXB0YWJsZSwgYnV0IHRoZSBudXQgZmFjdG9yIGlzIG91dHNpZGUgdGhlIHVzdWFsIHJhbmdlLiBUcmVhdCB0aGUgY29udmVyc2lvbiBhcyBhIHJvdWdoIGVzdGltYXRlLiI7CiAgICB9IGVsc2UgewogICAgICBzdGF0dXMgPSAic2FmZSI7CiAgICAgIHRpdGxlID0gIlNhZmUiOwogICAgICBpZiAodXRpbCA8IDAuNTApIHsKICAgICAgICBub3RlID0gIlByZWxvYWQgaXMgYmVsb3cgNTAlIG9mIGJvbHQgY2FwYWNpdHksIHNvIHRoZSBmYXN0ZW5lciBpcyBub3Qgb3ZlcmxvYWRlZC4gQ29uZmlybSBjbGFtcCBmb3JjZSBpcyBzdGlsbCBlbm91Z2ggdG8gcmVzaXN0IGxvb3NlbmluZy4iOwogICAgICAgIGFsZXJ0cy51bnNoaWZ0KHsgdHlwZTogIndhcm4iLCB0ZXh0OiAiUHJlbG9hZCBpcyAiICsgZm10KHV0aWwgKiAxMDAsIDEpICsgIiUgb2YgIiArIChoYXNQcm9vZiA\/ICJwcm9vZiIgOiAieWllbGQiKSArICIgY2FwYWNpdHkuIENoZWNrIGxvb3NlbmluZyBpZiB0aGUgam9pbnQgc2VlcyB2aWJyYXRpb24uIiB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBub3RlID0gIkVzdGltYXRlZCBwcmVsb2FkIGlzIGluIGEgdHlwaWNhbCA1MC04NSUgY2FwYWNpdHkgYmFuZCBmb3IgcmV1c2FibGUgam9pbnRzLiBWZXJpZnkgd2l0aCBhcHBsaWNhYmxlIHN0YW5kYXJkcyBmb3IgY3JpdGljYWwgY29ubmVjdGlvbnMuIjsKICAgICAgfQogICAgfQoKICAgIGlmICh1dGlsWWllbGQgPj0gMS4yKSB7CiAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogInJpc2siLCB0ZXh0OiAiVGVuc2lsZSBzdHJlc3MgZXhjZWVkcyAxMjAlIG9mIHlpZWxkLiBUaGUgdG9ycXVlIG9yIHByZWxvYWQgaW5wdXQgaXMgdW5yZWFsaXN0aWMgZm9yIHRoaXMgYm9sdCBncmFkZS4iIH0pOwogICAgfQoKICAgIHZhciBmaUZtdCA9IGZvcm1hdEZvcmNlKEYpOwogICAgdmFyIHRGbXQgPSBmb3JtYXRUb3JxdWUoVCk7CiAgICB2YXIgc0ZtdCA9IGZvcm1hdFN0cmVzcyhzdHJlc3MpOwoKICAgIGVsLm91dEZpLnRleHRDb250ZW50ID0gZmlGbXQucHJpbWFyeTsKICAgIGVsLm91dEZpU3ViLnRleHRDb250ZW50ID0gZmlGbXQuc2Vjb25kYXJ5IHx8ICJCb2x0IHByZWxvYWQgRiI7CiAgICBlbC5vdXRULnRleHRDb250ZW50ID0gdEZtdC5wcmltYXJ5OwogICAgZWwub3V0VFN1Yi50ZXh0Q29udGVudCA9ICh0Rm10LnNlY29uZGFyeSA\/IHRGbXQuc2Vjb25kYXJ5ICsgIiAgLSAgIiA6ICIiKSArIChtZXRob2QgPT09ICJmcmljdGlvbiIgPyAiZnJvbSBtdSBhbmQgdGhyZWFkIGdlb21ldHJ5IiA6ICJmcm9tIFQgPSBLIHggRiB4IGQiKTsKICAgIGVsLm91dFN0cmVzcy50ZXh0Q29udGVudCA9IHNGbXQucHJpbWFyeTsKICAgIGVsLm91dFN0cmVzc05vdGUudGV4dENvbnRlbnQgPSAoc0ZtdC5zZWNvbmRhcnkgPyBzRm10LnNlY29uZGFyeSArICIgIC0gICIgOiAiIikgKyAic2lnbWEgPSBGIC8gQXQiOwogICAgZWwub3V0Sy50ZXh0Q29udGVudCA9IGZtdChLLCAzKTsKICAgIGVsLm91dEtOb3RlLnRleHRDb250ZW50ID0gbWV0aG9kID09PSAiZnJpY3Rpb24iID8gImVxdWl2YWxlbnQgSyBmcm9tIGZyaWN0aW9uIiA6ICJzZWxlY3RlZCBudXQgZmFjdG9yIjsKICAgIGVsLm91dENsYW1wLnRleHRDb250ZW50ID0gZmlGbXQucHJpbWFyeTsKICAgIGVsLm91dENsYW1wU3ViLnRleHRDb250ZW50ID0gIkpvaW50IGNsYW1waW5nIGZvcmNlIChlcXVhbHMgYm9sdCBwcmVsb2FkKSI7CiAgICBlbC5vdXRBdC50ZXh0Q29udGVudCA9IGZvcm1hdEFyZWEoQXQpOwogICAgZWwub3V0QXROb3RlLnRleHRDb250ZW50ID0gIkF0IGZyb20gZGlhbWV0ZXIgYW5kIHBpdGNoIjsKICAgIGVsLm91dEZ5LnRleHRDb250ZW50ID0gZm9ybWF0Rm9yY2UoRnkpLnByaW1hcnk7CiAgICBlbC5vdXRGcC50ZXh0Q29udGVudCA9IGhhc1Byb29mID8gZm9ybWF0Rm9yY2UoRnApLnByaW1hcnkgOiAiLSI7CgogICAgdmFyIHV0aWxQY3QgPSB1dGlsICogMTAwOwogICAgZWwub3V0VXRpbC50ZXh0Q29udGVudCA9IGZtdCh1dGlsUGN0LCAxKSArICIlIG9mICIgKyAoaGFzUHJvb2YgPyAicHJvb2YiIDogInlpZWxkIik7CiAgICBlbC51dGlsRmlsbC5zdHlsZS53aWR0aCA9IGNsYW1wKHV0aWxQY3QsIDAsIDEwMCkgKyAiJSI7CiAgICBlbC51dGlsRmlsbC5jbGFzc05hbWUgPSAiYnRwLXV0aWwtZmlsbCIgKyAoc3RhdHVzID09PSAicmlzayIgPyAiIGJ0cC1pcy1yaXNrIiA6IHN0YXR1cyA9PT0gImNhdXRpb24iID8gIiBidHAtaXMtY2F1dGlvbiIgOiAiIGJ0cC1pcy1vayIpOwogICAgaWYgKGVsLnV0aWxMYWJlbCkgZWwudXRpbExhYmVsLnRleHRDb250ZW50ID0gZm10KHV0aWxQY3QsIDEpICsgIiUiOwoKICAgIHNldEdhdWdlKGNsYW1wKGdhdWdlRnJhYywgMCwgMS4wNSkpOwogICAgc2V0UHJlbG9hZEJhcihjbGFtcCh1dGlsLCAwLCAxKSk7CiAgICBpZiAoZWwucHJlbG9hZEZpbGwpIHsKICAgICAgZWwucHJlbG9hZEZpbGwuY2xhc3NOYW1lID0gImJ0cC1wYmFyLWZpbGwiICsgKHN0YXR1cyA9PT0gInJpc2siID8gIiBidHAtaXMtcmlzayIgOiBzdGF0dXMgPT09ICJjYXV0aW9uIiA\/ICIgYnRwLWlzLWNhdXRpb24iIDogIiBidHAtaXMtb2siKTsKICAgIH0KICAgIHNldFNjaGVtYXRpYyhzdGF0dXMgPT09ICJyaXNrIiA\/ICJyaXNrIiA6IHN0YXR1cyA9PT0gImNhdXRpb24iID8gImNhdXRpb24iIDogIm9rIik7CgogICAgaWYgKGVsLmdhdWdlUmVhZCkgZWwuZ2F1Z2VSZWFkLnRleHRDb250ZW50ID0gdEZtdC5wcmltYXJ5OwogICAgaWYgKGVsLmdhdWdlTm90ZSkgZWwuZ2F1Z2VOb3RlLnRleHRDb250ZW50ID0gInZzICIgKyBmb3JtYXRUb3JxdWUoVGNhcCkucHJpbWFyeSArICIgYXQgMTAwJSAiICsgKGhhc1Byb29mID8gInByb29mIiA6ICJ5aWVsZCIpOwogICAgaWYgKGVsLnByZWxvYWRSZWFkKSBlbC5wcmVsb2FkUmVhZC50ZXh0Q29udGVudCA9IGZpRm10LnByaW1hcnk7CgogICAgZWwuaGVyb0ZpLmNsYXNzTGlzdC50b2dnbGUoImJ0cC1pcy1hY2NlbnQiLCBzdGF0ZS5tb2RlID09PSAidDJmIik7CiAgICBlbC5oZXJvVC5jbGFzc0xpc3QudG9nZ2xlKCJidHAtaXMtYWNjZW50Iiwgc3RhdGUubW9kZSA9PT0gImYydCIpOwoKICAgIGVsLnN0YXR1c1RpdGxlLnRleHRDb250ZW50ID0gdGl0bGU7CiAgICBlbC5zdGF0dXNOb3RlLnRleHRDb250ZW50ID0gbm90ZTsKICAgIGVsLmJhbm5lci5jbGFzc05hbWUgPSAiYnRwLWJhbm5lciBidHAtYmFubmVyLSIgKyAoc3RhdHVzID09PSAic2FmZSIgPyAib2siIDogc3RhdHVzID09PSAicmlzayIgPyAicmlzayIgOiAiY2F1dGlvbiIpOwoKICAgIGVsLmFsZXJ0cy5pbm5lckhUTUwgPSAiIjsKICAgIGFsZXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7CiAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgZGl2LmNsYXNzTmFtZSA9ICJidHAtYWxlcnQgYnRwLWFsZXJ0LSIgKyAoYS50eXBlID09PSAicmlzayIgPyAicmlzayIgOiBhLnR5cGUgPT09ICJvayIgPyAib2siIDogIndhcm4iKTsKICAgICAgZGl2LnRleHRDb250ZW50ID0gYS50ZXh0OwogICAgICBlbC5hbGVydHMuYXBwZW5kQ2hpbGQoZGl2KTsKICAgIH0pOwoKICAgIGlmIChzY3JvbGwpIHsKICAgICAgdHJ5IHsgZWwuYmFubmVyLmNsb3Nlc3QoIi5idHAtY2FyZCIpLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICJzbW9vdGgiLCBibG9jazogIm5lYXJlc3QiIH0pOyB9IGNhdGNoIChlKSB7fQogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVzZXRBbGwoKSB7CiAgICBzdGF0ZS5tb2RlID0gREVGQVVMVFMubW9kZTsKICAgIHN0YXRlLnNpemVJZCA9IERFRkFVTFRTLnNpemU7CiAgICBzdGF0ZS5waXRjaE1hbnVhbCA9IGZhbHNlOwogICAgZWwudGhyZWFkLnZhbHVlID0gREVGQVVMVFMudGhyZWFkOwogICAgZWwuZFVuaXQudmFsdWUgPSBERUZBVUxUUy5kVW5pdDsKICAgIGVsLmQudmFsdWUgPSBTdHJpbmcoREVGQVVMVFMuZCk7CiAgICBlbC5wVW5pdC52YWx1ZSA9ICJtbSI7CiAgICBlbC5wLnZhbHVlID0gU3RyaW5nKERFRkFVTFRTLnApOwogICAgZWwudFVuaXQudmFsdWUgPSBERUZBVUxUUy50VW5pdDsKICAgIGVsLnRvcnF1ZS52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy50b3JxdWUpOwogICAgZWwuZlVuaXQudmFsdWUgPSBERUZBVUxUUy5mVW5pdDsKICAgIGxhc3RGVW5pdCA9IERFRkFVTFRTLmZVbml0OwogICAgZWwucHJlbG9hZC52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy5wcmVsb2FkKTsKICAgIGVsLmx1Yi52YWx1ZSA9IERFRkFVTFRTLmx1YjsKICAgIGVsLmsudmFsdWUgPSBOdW1iZXIoREVGQVVMVFMuaykudG9GaXhlZCgyKTsKICAgIGVsLm11LnZhbHVlID0gIiI7CiAgICBlbC5ncmFkZS52YWx1ZSA9IERFRkFVTFRTLmdyYWRlOwogICAgZWwuc1VuaXQudmFsdWUgPSAiTVBhIjsKICAgIGFwcGx5R3JhZGUoKTsKICAgIGFwcGx5THVicmljYXRpb24oKTsKICAgIHVwZGF0ZVBpdGNoVW5pdCgpOwogICAgcmVuZGVyU2l6ZUNoaXBzKCk7CiAgICBzZXRNb2RlKERFRkFVTFRTLm1vZGUpOwogICAgY2xlYXJFcnJzKCk7CiAgICBlbC5yZXN1bHRzLmNsYXNzTGlzdC5hZGQoImJ0cC1oaWRkZW4iKTsKICAgIHNldEdhdWdlKDApOwogICAgc2V0UHJlbG9hZEJhcigwKTsKICAgIHNldFNjaGVtYXRpYygiaWRsZSIpOwogIH0KCiAgZnVuY3Rpb24gb25Sb290Q2xpY2soZSkgewogICAgdmFyIGJ0biA9IGUudGFyZ2V0ICYmIGUudGFyZ2V0LmNsb3Nlc3QgPyBlLnRhcmdldC5jbG9zZXN0KCJidXR0b24iKSA6IG51bGw7CiAgICBpZiAoIWJ0biB8fCAhcm9vdC5jb250YWlucyhidG4pKSByZXR1cm47CiAgICBpZiAoYnRuLmlkID09PSAiYnRwQnRuTW9kZVQyRiIpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzZXRNb2RlKCJ0MmYiKTsKICAgIH0gZWxzZSBpZiAoYnRuLmlkID09PSAiYnRwQnRuTW9kZUYyVCIpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzZXRNb2RlKCJmMnQiKTsKICAgIH0gZWxzZSBpZiAoYnRuLmlkID09PSAiYnRwQnRuUmVzZXQiKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgcmVzZXRBbGwoKTsKICAgIH0gZWxzZSBpZiAoYnRuLmlkID09PSAiYnRwQnRuQ2FsY3VsYXRlIikgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNhbGN1bGF0ZSh0cnVlKTsKICAgIH0KICB9CgogIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBvblJvb3RDbGljayk7CiAgaWYgKGVsLmJ0bkNhbGMpIGVsLmJ0bkNhbGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGNhbGN1bGF0ZSh0cnVlKTsgfSk7CgogIGVsLnRocmVhZC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBvblRocmVhZENoYW5nZSk7CiAgZWwucFVuaXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgc3RhdGUucGl0Y2hNYW51YWwgPSB0cnVlOwogICAgdXBkYXRlUGl0Y2hVbml0KCk7CiAgfSk7CiAgZWwuZC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsKICAgIHN0YXRlLnNpemVJZCA9ICIiOwogICAgcGFpbnRDaGlwcygpOwogICAgYXV0b1BpdGNoKCk7CiAgfSk7CiAgZWwucC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsKICAgIGlmICghc3RhdGUuYXBwbHlpbmcpIHN0YXRlLnBpdGNoTWFudWFsID0gdHJ1ZTsKICB9KTsKICBlbC5kVW5pdC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgbmV4dCA9IGVsLmRVbml0LnZhbHVlOwogICAgdmFyIGN1ciA9IG5leHQgPT09ICJtbSIgPyAiaW4iIDogIm1tIjsKICAgIGVsLmRVbml0LnZhbHVlID0gY3VyOwogICAgY29udmVydERVbml0KG5leHQpOwogIH0pOwogIGVsLnRVbml0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsKICAgIHZhciBuZXh0ID0gZWwudFVuaXQudmFsdWU7CiAgICB2YXIgY3VyID0gbmV4dCA9PT0gIk5tIiA\/ICJsYmZmdCIgOiAiTm0iOwogICAgZWwudFVuaXQudmFsdWUgPSBjdXI7CiAgICBjb252ZXJ0VFVuaXQobmV4dCk7CiAgfSk7CiAgZWwuZlVuaXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgdmFyIG5leHQgPSBlbC5mVW5pdC52YWx1ZTsKICAgIGlmIChuZXh0ID09PSBsYXN0RlVuaXQpIHJldHVybjsKICAgIGVsLmZVbml0LnZhbHVlID0gbGFzdEZVbml0OwogICAgY29udmVydEZVbml0KG5leHQpOwogICAgbGFzdEZVbml0ID0gbmV4dDsKICB9KTsKICBlbC5zVW5pdC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgbmV4dCA9IGVsLnNVbml0LnZhbHVlOwogICAgdmFyIGN1ciA9IG5leHQgPT09ICJNUGEiID8gInBzaSIgOiAiTVBhIjsKICAgIGVsLnNVbml0LnZhbHVlID0gY3VyOwogICAgY29udmVydFNVbml0KG5leHQpOwogIH0pOwoKICBlbC5sdWIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgYXBwbHlMdWJyaWNhdGlvbik7CiAgZWwuay5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsKICAgIG1hcmtDdXN0b21MdWIoKTsKICAgIGlmICghc3RhdGUuYXBwbHlpbmcgJiYgZWwubXUudmFsdWUgIT09ICIiKSBlbC5tdS52YWx1ZSA9ICIiOwogIH0pOwogIGVsLm11LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKCkgewogICAgbWFya0N1c3RvbUx1YigpOwogICAgdmFyIG11ID0gbnVtKGVsLm11KTsKICAgIHZhciBkTW0gPSBkVG9NbSgpOwogICAgdmFyIHBNbSA9IHBUb01tKCk7CiAgICBpZiAoaXNGaW5pdGUobXUpICYmIG11ID4gMCAmJiBpc0Zpbml0ZShkTW0pICYmIGlzRmluaXRlKHBNbSkpIHsKICAgICAgdmFyIGtNdSA9IGtGcm9tTXUoZE1tLCBwTW0sIG11KTsKICAgICAgaWYgKGlzRmluaXRlKGtNdSkpIHsKICAgICAgICBzdGF0ZS5hcHBseWluZyA9IHRydWU7CiAgICAgICAgZWwuay52YWx1ZSA9IGtNdS50b0ZpeGVkKDMpOwogICAgICAgIHN0YXRlLmFwcGx5aW5nID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9KTsKICBlbC5ncmFkZS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoZWwuZ3JhZGUudmFsdWUgPT09ICJjdXN0b20iKSB7CiAgICAgIGVsLnN5LnJlYWRPbmx5ID0gZmFsc2U7CiAgICAgIGVsLnNwLnJlYWRPbmx5ID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBhcHBseUdyYWRlKCk7CiAgICB9CiAgfSk7CiAgZWwuc3kuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBtYXJrQ3VzdG9tR3JhZGUpOwogIGVsLnNwLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgbWFya0N1c3RvbUdyYWRlKTsKCiAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsKICAgIGlmIChlLmtleSA9PT0gIkVudGVyIiAmJiBlLnRhcmdldCAmJiBlLnRhcmdldC50YWdOYW1lID09PSAiSU5QVVQiKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY2FsY3VsYXRlKHRydWUpOwogICAgfQogIH0pOwoKICB3aW5kb3cuYnRwU3dpdGNoTW9kZSA9IHNldE1vZGU7CiAgd2luZG93LmJ0cFJlc2V0ID0gcmVzZXRBbGw7CiAgd2luZG93LmJ0cENhbGN1bGF0ZSA9IGZ1bmN0aW9uICgpIHsgY2FsY3VsYXRlKHRydWUpOyB9OwoKICB1cGRhdGVQaXRjaFVuaXQoKTsKICByZW5kZXJTaXplQ2hpcHMoKTsKICBhcHBseUdyYWRlKCk7CiAgYXBwbHlMdWJyaWNhdGlvbigpOwogIHNldE1vZGUoREVGQVVMVFMubW9kZSk7Cn0pKCk7Cg==<\/textarea>\n<script id=\"btp-boot-script\" type=\"text\/javascript\" data-no-minify=\"1\" data-no-defer=\"1\" data-cfasync=\"false\">\n(function(){\nfunction boot(){\nif(window.btpCalculate){return;}\nvar el=document.getElementById(\"btp-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.btpBoot=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 Torque \u2194 Preload Conversion Calculator is a practical engineering tool designed to convert tightening torque into bolt preload force and calculate the required&#8230;<\/p>","protected":false},"author":2,"featured_media":24683,"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":[8594,8598,8599,8600],"class_list":["post-24682","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-bolt-torque","tag-fastener-tools","tag-preload-force","tag-torque-conversion","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Bolt-Torque-\u2194-Preload-Conversion-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24682","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/comments?post=24682"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24682\/revisions"}],"predecessor-version":[{"id":24684,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24682\/revisions\/24684"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media\/24683"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media?parent=24682"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/categories?post=24682"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/tags?post=24682"}],"curies":[{"name":"WP","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}