{"id":24731,"date":"2026-08-27T05:27:53","date_gmt":"2026-08-27T05:27:53","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24731"},"modified":"2026-08-27T05:27:55","modified_gmt":"2026-08-27T05:27:55","slug":"spring-fatigue-life-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ru\/spring-fatigue-life-calculator\/","title":{"rendered":"Spring Fatigue Life Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Spring Fatigue Life Calculator<\/strong> is a practical engineering tool designed to estimate the fatigue life of springs subjected to repeated cyclic loading. By analyzing spring geometry, minimum and maximum loads, material properties, alternating stress, mean stress, and fatigue strength, it helps engineers evaluate durability and potential failure risks. The Spring Fatigue Life Calculator supports spring design, component selection, and reliability analysis, helping users optimize spring performance, verify required service cycles, and reduce the risk of premature fatigue failure.<\/p>\n\n\n\n<!-- Copy ALL content below into WordPress Custom HTML block -->\n<!-- Paste in Code Editor mode. Do NOT re-save in Visual mode. -->\n<!-- Do NOT include DOCTYPE, html, head, or body tags -->\n<!-- All CSS is scoped to #sflc-calculator \u2014 will not affect theme header, footer, or other page content. -->\n<style>\n\/* Spring Fatigue Life Calculator - WordPress hardened styles *\/\n\/*\n * WordPress-safe: every rule is scoped under #sflc-calculator.\n * Will not restyle theme header, footer, sidebar, or content outside the calculator.\n * No html\/body\/universal selectors.\n *\/\n\n#sflc-calculator.sflc-calculator,\n#sflc-calculator.sflc-calculator *,\n#sflc-calculator.sflc-calculator *::before,\n#sflc-calculator.sflc-calculator *::after {\n  box-sizing: border-box;\n}\n\n#sflc-calculator.sflc-calculator {\n  --sflc-bg: #ffffff;\n  --sflc-surface: #ffffff;\n  --sflc-border: #d4dde8;\n  --sflc-text: #0f172a;\n  --sflc-muted: #64748b;\n  --sflc-primary: #1e4d8c;\n  --sflc-primary-light: #2563eb;\n  --sflc-primary-bg: #e8f0fa;\n  --sflc-danger: #dc2626;\n  --sflc-danger-bg: #fef2f2;\n  --sflc-warning: #d97706;\n  --sflc-warning-bg: #fffbeb;\n  --sflc-success: #059669;\n  --sflc-success-bg: #ecfdf5;\n  --sflc-radius: 10px;\n  --sflc-shadow: 0 2px 12px rgba(15, 23, 42, 0.07);\n  --sflc-mono: ui-monospace, \"Cascadia Mono\", Consolas, monospace;\n  --sflc-font: \"Segoe UI\", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n\n  all: revert;\n  display: block !important;\n  width: 100% !important;\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n  padding: 24px 16px 48px !important;\n  font-family: var(--sflc-font) !important;\n  font-size: 16px !important;\n  line-height: 1.6 !important;\n  color: var(--sflc-text) !important;\n  background: var(--sflc-bg) !important;\n  text-align: left !important;\n  float: none !important;\n  clear: none !important;\n  position: relative !important;\n  isolation: isolate;\n  contain: layout style;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  box-shadow: none !important;\n  border: none !important;\n}\n\n#sflc-calculator.sflc-calculator h1,\n#sflc-calculator.sflc-calculator h2,\n#sflc-calculator.sflc-calculator h3,\n#sflc-calculator.sflc-calculator h4,\n#sflc-calculator.sflc-calculator p,\n#sflc-calculator.sflc-calculator ul,\n#sflc-calculator.sflc-calculator ol,\n#sflc-calculator.sflc-calculator li,\n#sflc-calculator.sflc-calculator div,\n#sflc-calculator.sflc-calculator span,\n#sflc-calculator.sflc-calculator strong,\n#sflc-calculator.sflc-calculator em,\n#sflc-calculator.sflc-calculator i,\n#sflc-calculator.sflc-calculator b,\n#sflc-calculator.sflc-calculator sub,\n#sflc-calculator.sflc-calculator sup {\n  font-family: inherit;\n  line-height: inherit;\n  float: none !important;\n  text-transform: none !important;\n  letter-spacing: normal !important;\n}\n\n#sflc-calculator.sflc-calculator button,\n#sflc-calculator.sflc-calculator input,\n#sflc-calculator.sflc-calculator select,\n#sflc-calculator.sflc-calculator textarea,\n#sflc-calculator.sflc-calculator label {\n  font: inherit;\n  color: inherit;\n  margin: 0;\n  max-width: none;\n  min-width: 0;\n  float: none !important;\n}\n\n#sflc-calculator.sflc-calculator button {\n  cursor: pointer;\n  background: transparent;\n  border: none;\n  padding: 0;\n  box-shadow: none !important;\n  text-decoration: none;\n  appearance: none;\n  -webkit-appearance: none;\n  text-transform: none !important;\n  letter-spacing: normal !important;\n}\n\n#sflc-calculator.sflc-calculator img,\n#sflc-calculator.sflc-calculator svg {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n\n#sflc-calculator.sflc-calculator ul,\n#sflc-calculator.sflc-calculator ol {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n\n#sflc-calculator.sflc-calculator strong {\n  font-weight: 700;\n}\n\n#sflc-calculator.sflc-calculator [hidden] {\n  display: none !important;\n}\n\n#sflc-calculator.sflc-calculator h1 {\n  font-family: var(--sflc-font) !important;\n  font-size: 1.75rem !important;\n  font-weight: 700 !important;\n  color: var(--sflc-primary) !important;\n  margin: 0 0 12px !important;\n  padding: 0 !important;\n  line-height: 1.25 !important;\n}\n\n#sflc-calculator.sflc-calculator h2,\n#sflc-calculator.sflc-calculator h3 {\n  font-family: var(--sflc-font) !important;\n  font-weight: 700 !important;\n  color: var(--sflc-text) !important;\n  margin: 0 !important;\n  padding: 0 !important;\n}\n\n#sflc-calculator.sflc-calculator h2 { font-size: 1.1rem !important; }\n#sflc-calculator.sflc-calculator h3 { font-size: 0.95rem !important; }\n\n#sflc-calculator.sflc-calculator p {\n  margin: 0 0 12px !important;\n  color: var(--sflc-muted) !important;\n  font-size: 0.95rem !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-intro,\n#sflc-calculator.sflc-calculator .sflc-disclaimer {\n  background: var(--sflc-surface);\n  border: 1px solid var(--sflc-border);\n  border-radius: var(--sflc-radius);\n  padding: 16px 18px;\n  margin-bottom: 20px;\n  box-shadow: var(--sflc-shadow);\n}\n\n#sflc-calculator.sflc-calculator .sflc-disclaimer {\n  font-size: 0.85rem !important;\n  border-left: 4px solid var(--sflc-warning);\n}\n\n#sflc-calculator.sflc-calculator .sflc-panel {\n  display: block !important;\n  width: 100% !important;\n  background: var(--sflc-surface) !important;\n  border: 1px solid var(--sflc-border) !important;\n  border-radius: var(--sflc-radius) !important;\n  box-shadow: var(--sflc-shadow);\n  overflow: visible;\n  margin: 0 !important;\n  padding: 0 !important;\n  float: none !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-layout {\n  display: flex !important;\n  flex-direction: column !important;\n  gap: 20px;\n  align-items: stretch;\n  width: 100% !important;\n  float: none !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-layout {\n  display: flex !important;\n  flex-direction: column !important;\n  gap: 20px;\n  align-items: stretch;\n  width: 100% !important;\n  float: none !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-result-item.sflc-result-full {\n  grid-column: 1 \/ -1;\n}\n\n#sflc-calculator.sflc-calculator .sflc-result-item.sflc-result-risk .sflc-result-item-value {\n  font-size: 1.1rem;\n}\n\n#sflc-calculator.sflc-calculator .sflc-result-item.sflc-risk-ok .sflc-result-item-value {\n  color: var(--sflc-success);\n}\n\n#sflc-calculator.sflc-calculator .sflc-result-item.sflc-risk-caution .sflc-result-item-value {\n  color: var(--sflc-warning);\n}\n\n#sflc-calculator.sflc-calculator .sflc-result-item.sflc-risk-risk .sflc-result-item-value {\n  color: var(--sflc-danger);\n}\n\n#sflc-calculator.sflc-calculator .sflc-panel-header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  gap: 10px;\n  padding: 14px 18px;\n  border-bottom: 1px solid var(--sflc-border);\n  background: linear-gradient(180deg, #f8fafc, #f1f5f9);\n}\n\n#sflc-calculator.sflc-calculator .sflc-panel-title {\n  font-size: 0.72rem !important;\n  font-weight: 700 !important;\n  letter-spacing: 0.08em;\n  text-transform: uppercase;\n  color: var(--sflc-primary) !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-panel-body {\n  padding: 16px 18px 20px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-unit-bar {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 0.8rem;\n  color: var(--sflc-muted);\n}\n\n#sflc-calculator.sflc-calculator .sflc-unit-toggle {\n  display: flex;\n  border: 1px solid var(--sflc-border);\n  border-radius: 6px;\n  overflow: hidden;\n}\n\n#sflc-calculator.sflc-calculator .sflc-unit-toggle button {\n  display: inline-block !important;\n  padding: 5px 14px !important;\n  font-size: 0.8rem !important;\n  font-weight: 600 !important;\n  border: none !important;\n  background: #fff !important;\n  color: var(--sflc-muted) !important;\n  cursor: pointer !important;\n  transition: background 0.15s, color 0.15s;\n  border-radius: 0 !important;\n  min-width: 0 !important;\n  width: auto !important;\n  box-shadow: none !important;\n  float: none !important;\n  line-height: 1.4 !important;\n  text-transform: none !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-unit-toggle button.sflc-active {\n  background: var(--sflc-primary);\n  color: #fff;\n}\n\n#sflc-calculator.sflc-calculator .sflc-section-label {\n  font-size: 0.78rem;\n  font-weight: 700;\n  color: var(--sflc-text);\n  margin: 18px 0 10px;\n  padding-bottom: 6px;\n  border-bottom: 1px dashed var(--sflc-border);\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-section-label:first-child {\n  margin-top: 0;\n}\n\n#sflc-calculator.sflc-calculator .sflc-badge {\n  width: 22px;\n  height: 22px;\n  border-radius: 50%;\n  background: var(--sflc-primary);\n  color: #fff;\n  font-size: 0.7rem;\n  font-weight: 700;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n}\n\n#sflc-calculator.sflc-calculator .sflc-form-row {\n  margin-bottom: 12px;\n}\n\n#sflc-calculator.sflc-calculator label {\n  display: block;\n  font-size: 0.85rem !important;\n  font-weight: 600 !important;\n  color: var(--sflc-text) !important;\n  margin-bottom: 4px !important;\n  padding: 0 !important;\n  border: none !important;\n  background: none !important;\n  cursor: default;\n}\n\n#sflc-calculator.sflc-calculator .sflc-radio-group label,\n#sflc-calculator.sflc-calculator .sflc-form-row > div label {\n  display: inline-flex !important;\n  align-items: center;\n  gap: 6px;\n  font-size: 0.85rem !important;\n  font-weight: 400 !important;\n  margin-bottom: 0 !important;\n  cursor: pointer;\n}\n\n#sflc-calculator.sflc-calculator input[type=\"radio\"] {\n  display: inline-block !important;\n  width: auto !important;\n  min-height: auto !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  border: none !important;\n  background: transparent !important;\n  box-shadow: none !important;\n  float: none !important;\n  vertical-align: middle !important;\n  accent-color: var(--sflc-primary);\n}\n\n#sflc-calculator.sflc-calculator input[type=\"number\"],\n#sflc-calculator.sflc-calculator select {\n  display: block !important;\n  width: 100% !important;\n  max-width: 100% !important;\n  padding: 9px 12px !important;\n  border: 1px solid var(--sflc-border) !important;\n  border-radius: 6px !important;\n  font-family: var(--sflc-font) !important;\n  font-size: 0.95rem !important;\n  font-weight: 400 !important;\n  background: #fff !important;\n  color: var(--sflc-text) !important;\n  margin: 0 !important;\n  height: auto !important;\n  min-height: 38px !important;\n  line-height: 1.4 !important;\n  box-shadow: none !important;\n  float: none !important;\n  clear: none !important;\n  text-transform: none !important;\n  letter-spacing: normal !important;\n  appearance: auto !important;\n  -webkit-appearance: auto !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-grid-2 {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 12px;\n}\n\n@media (max-width: 520px) {\n  #sflc-calculator.sflc-calculator .sflc-grid-2 {\n    grid-template-columns: 1fr;\n  }\n}\n\n#sflc-calculator.sflc-calculator .sflc-unit-bar label {\n  display: inline !important;\n  font-weight: 600 !important;\n  font-size: 0.8rem !important;\n  margin-bottom: 0 !important;\n  white-space: nowrap;\n}\n\n#sflc-calculator.sflc-calculator input.sflc-invalid {\n  border-color: var(--sflc-danger) !important;\n  background: var(--sflc-danger-bg) !important;\n}\n\n#sflc-calculator.sflc-calculator input.sflc-readonly {\n  background: #f1f5f9 !important;\n  color: var(--sflc-muted) !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-input-group {\n  display: flex;\n  gap: 0;\n}\n\n#sflc-calculator.sflc-calculator .sflc-input-group input {\n  flex: 1;\n  border-radius: 6px 0 0 6px !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-input-group select,\n#sflc-calculator.sflc-calculator .sflc-unit-tag {\n  padding: 9px 10px !important;\n  border: 1px solid var(--sflc-border) !important;\n  border-left: none !important;\n  border-radius: 0 6px 6px 0 !important;\n  background: #f8fafc !important;\n  font-size: 0.85rem !important;\n  color: var(--sflc-muted) !important;\n  white-space: nowrap;\n  min-width: 52px;\n  text-align: center;\n}\n\n#sflc-calculator.sflc-calculator .sflc-input-group select {\n  min-width: 70px;\n  cursor: pointer;\n}\n\n#sflc-calculator.sflc-calculator .sflc-tooltip-trigger {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 16px;\n  height: 16px;\n  border-radius: 50%;\n  background: var(--sflc-primary-bg);\n  color: var(--sflc-primary);\n  font-size: 0.65rem;\n  font-weight: 700;\n  cursor: help;\n  position: relative;\n  margin-left: 4px;\n  vertical-align: middle;\n}\n\n#sflc-calculator.sflc-calculator .sflc-tooltip-text {\n  display: none;\n  position: absolute;\n  bottom: calc(100% + 6px);\n  left: 50%;\n  transform: translateX(-50%);\n  width: 220px;\n  padding: 8px 10px;\n  background: #1e293b;\n  color: #f8fafc;\n  font-size: 0.75rem;\n  font-weight: 400;\n  line-height: 1.4;\n  border-radius: 6px;\n  z-index: 100;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);\n}\n\n#sflc-calculator.sflc-calculator .sflc-tooltip-trigger:hover .sflc-tooltip-text,\n#sflc-calculator.sflc-calculator .sflc-tooltip-trigger:focus .sflc-tooltip-text {\n  display: block;\n}\n\n#sflc-calculator.sflc-calculator .sflc-err {\n  display: block;\n  font-size: 0.75rem;\n  color: var(--sflc-danger);\n  margin-top: 3px;\n  min-height: 1em;\n}\n\n#sflc-calculator.sflc-calculator .sflc-advanced-toggle {\n  margin: 14px 0 8px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-advanced-toggle button {\n  display: flex !important;\n  background: none !important;\n  border: none !important;\n  color: var(--sflc-primary) !important;\n  font-size: 0.85rem !important;\n  font-weight: 600 !important;\n  cursor: pointer !important;\n  padding: 0 !important;\n  align-items: center;\n  gap: 6px;\n  width: auto !important;\n  box-shadow: none !important;\n  float: none !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-advanced-panel {\n  padding: 12px;\n  background: #f8fafc;\n  border: 1px dashed var(--sflc-border);\n  border-radius: 8px;\n  margin-bottom: 12px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-btn-row {\n  display: flex;\n  justify-content: center;\n  margin-top: 18px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-btn {\n  display: inline-block !important;\n  padding: 11px 24px !important;\n  border-radius: 8px !important;\n  font-size: 0.95rem !important;\n  font-weight: 600 !important;\n  cursor: pointer !important;\n  border: none !important;\n  transition: background 0.15s, transform 0.1s;\n  font-family: var(--sflc-font) !important;\n  line-height: 1.4 !important;\n  text-transform: none !important;\n  letter-spacing: normal !important;\n  box-shadow: none !important;\n  float: none !important;\n  clear: none !important;\n  margin: 0 !important;\n  text-decoration: none !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-btn-primary {\n  background: var(--sflc-primary) !important;\n  color: #fff !important;\n  width: 33.333%;\n  min-width: 140px;\n  max-width: 280px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-btn-primary:hover {\n  background: var(--sflc-primary-light) !important;\n  color: #fff !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-btn-secondary {\n  background: #fff;\n  color: var(--sflc-muted);\n  border: 1px solid var(--sflc-border) !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-btn-secondary:hover {\n  background: #f1f5f9;\n}\n\n#sflc-calculator.sflc-calculator .sflc-results-wrap[hidden] {\n  display: none !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-results-wrap {\n  grid-column: 1 \/ -1;\n  width: 100% !important;\n  float: none !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-banner {\n  display: flex;\n  align-items: flex-start;\n  gap: 12px;\n  padding: 14px 16px;\n  border-radius: 8px;\n  margin-bottom: 16px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-banner-ok {\n  background: var(--sflc-success-bg);\n  border: 1px solid #a7f3d0;\n}\n\n#sflc-calculator.sflc-calculator .sflc-banner-caution {\n  background: var(--sflc-warning-bg);\n  border: 1px solid #fcd34d;\n}\n\n#sflc-calculator.sflc-calculator .sflc-banner-risk {\n  background: var(--sflc-danger-bg);\n  border: 1px solid #fecaca;\n}\n\n#sflc-calculator.sflc-calculator .sflc-banner-idle {\n  background: #f1f5f9;\n  border: 1px solid var(--sflc-border);\n}\n\n#sflc-calculator.sflc-calculator .sflc-dot {\n  width: 10px;\n  height: 10px;\n  border-radius: 50%;\n  margin-top: 5px;\n  flex-shrink: 0;\n}\n\n#sflc-calculator.sflc-calculator .sflc-banner-ok .sflc-dot { background: var(--sflc-success); }\n#sflc-calculator.sflc-calculator .sflc-banner-caution .sflc-dot { background: var(--sflc-warning); }\n#sflc-calculator.sflc-calculator .sflc-banner-risk .sflc-dot { background: var(--sflc-danger); }\n#sflc-calculator.sflc-calculator .sflc-banner-idle .sflc-dot { background: var(--sflc-muted); }\n\n#sflc-calculator.sflc-calculator .sflc-banner-kicker {\n  font-size: 0.7rem;\n  font-weight: 700;\n  text-transform: uppercase;\n  letter-spacing: 0.06em;\n  color: var(--sflc-muted);\n}\n\n#sflc-calculator.sflc-calculator .sflc-banner-title {\n  font-size: 1.15rem;\n  font-weight: 700;\n  color: var(--sflc-text);\n}\n\n#sflc-calculator.sflc-calculator .sflc-banner-note {\n  font-size: 0.85rem;\n  color: var(--sflc-muted);\n  margin-top: 4px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-hero-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n  gap: 12px;\n  margin-bottom: 16px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-hero-card {\n  background: #f8fafc;\n  border: 1px solid var(--sflc-border);\n  border-radius: 8px;\n  padding: 14px;\n  text-align: center;\n}\n\n#sflc-calculator.sflc-calculator .sflc-hero-card.sflc-accent {\n  background: var(--sflc-primary-bg);\n  border-color: #bfdbfe;\n}\n\n#sflc-calculator.sflc-calculator .sflc-hero-k {\n  font-size: 0.75rem;\n  font-weight: 600;\n  color: var(--sflc-muted);\n  margin-bottom: 4px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-hero-v {\n  font-size: 1.5rem;\n  font-weight: 700;\n  color: var(--sflc-primary);\n  font-family: var(--sflc-mono);\n}\n\n#sflc-calculator.sflc-calculator .sflc-hero-u {\n  font-size: 0.72rem;\n  color: var(--sflc-muted);\n  margin-top: 4px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-result-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n  gap: 10px;\n  margin-bottom: 16px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-result-item {\n  background: #f8fafc;\n  border: 1px solid var(--sflc-border);\n  border-radius: 8px;\n  padding: 10px 12px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-result-item-label {\n  font-size: 0.72rem;\n  font-weight: 600;\n  color: var(--sflc-muted);\n  margin-bottom: 4px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-result-item-value {\n  font-size: 1.05rem;\n  font-weight: 700;\n  font-family: var(--sflc-mono);\n  color: var(--sflc-text);\n}\n\n#sflc-calculator.sflc-calculator .sflc-result-item-unit {\n  font-size: 0.7rem;\n  color: var(--sflc-muted);\n}\n\n#sflc-calculator.sflc-calculator .sflc-viz-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 14px;\n  margin-bottom: 16px;\n}\n\n@media (max-width: 700px) {\n  #sflc-calculator.sflc-calculator .sflc-viz-grid {\n    grid-template-columns: 1fr;\n  }\n}\n\n#sflc-calculator.sflc-calculator .sflc-viz-card {\n  background: #fff;\n  border: 1px solid var(--sflc-border);\n  border-radius: 8px;\n  padding: 12px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-viz-title {\n  font-size: 0.75rem;\n  font-weight: 700;\n  color: var(--sflc-muted);\n  text-transform: uppercase;\n  letter-spacing: 0.05em;\n  margin-bottom: 8px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-viz-card svg {\n  width: 100%;\n  height: auto;\n  display: block;\n}\n\n#sflc-calculator.sflc-calculator .sflc-sn-legend {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 10px;\n  margin-top: 8px;\n  font-size: 0.7rem;\n  color: var(--sflc-muted);\n}\n\n#sflc-calculator.sflc-calculator .sflc-sn-legend span {\n  display: flex;\n  align-items: center;\n  gap: 4px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-sn-legend i {\n  display: inline-block;\n  width: 12px;\n  height: 3px;\n  border-radius: 2px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-gauge-row {\n  display: flex;\n  align-items: center;\n  gap: 16px;\n  margin-bottom: 16px;\n  padding: 12px;\n  background: #f8fafc;\n  border-radius: 8px;\n  border: 1px solid var(--sflc-border);\n}\n\n#sflc-calculator.sflc-calculator .sflc-gauge-svg {\n  width: 160px;\n  flex-shrink: 0;\n}\n\n#sflc-calculator.sflc-calculator .sflc-gauge-readout {\n  font-size: 2rem;\n  font-weight: 700;\n  font-family: var(--sflc-mono);\n  color: var(--sflc-primary);\n}\n\n#sflc-calculator.sflc-calculator .sflc-gauge-label {\n  font-size: 0.8rem;\n  color: var(--sflc-muted);\n}\n\n#sflc-calculator.sflc-calculator .sflc-bar-wrap {\n  margin-bottom: 14px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-bar-head {\n  display: flex;\n  justify-content: space-between;\n  font-size: 0.8rem;\n  margin-bottom: 6px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-bar-track {\n  height: 10px;\n  background: #e2e8f0;\n  border-radius: 5px;\n  overflow: hidden;\n}\n\n#sflc-calculator.sflc-calculator .sflc-bar-fill {\n  height: 100%;\n  border-radius: 5px;\n  transition: width 0.3s;\n  width: 0;\n}\n\n#sflc-calculator.sflc-calculator .sflc-bar-fill.sflc-ok { background: var(--sflc-success); }\n#sflc-calculator.sflc-calculator .sflc-bar-fill.sflc-caution { background: var(--sflc-warning); }\n#sflc-calculator.sflc-calculator .sflc-bar-fill.sflc-risk { background: var(--sflc-danger); }\n\n#sflc-calculator.sflc-calculator .sflc-bar-scale {\n  display: flex;\n  justify-content: space-between;\n  font-size: 0.68rem;\n  color: var(--sflc-muted);\n  margin-top: 4px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-alerts {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n  margin-bottom: 14px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-alert {\n  padding: 10px 12px;\n  border-radius: 6px;\n  font-size: 0.85rem;\n  line-height: 1.45;\n}\n\n#sflc-calculator.sflc-calculator .sflc-alert-ok {\n  background: var(--sflc-success-bg);\n  border: 1px solid #a7f3d0;\n  color: #065f46;\n}\n\n#sflc-calculator.sflc-calculator .sflc-alert-warn {\n  background: var(--sflc-warning-bg);\n  border: 1px solid #fcd34d;\n  color: #92400e;\n}\n\n#sflc-calculator.sflc-calculator .sflc-alert-risk {\n  background: var(--sflc-danger-bg);\n  border: 1px solid #fecaca;\n  color: #991b1b;\n}\n\n#sflc-calculator.sflc-calculator .sflc-recs {\n  background: #f0f9ff;\n  border: 1px solid #bae6fd;\n  border-radius: 8px;\n  padding: 12px 14px;\n  margin-bottom: 14px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-recs h3 {\n  font-size: 0.85rem !important;\n  color: var(--sflc-primary) !important;\n  margin-bottom: 8px !important;\n}\n\n#sflc-calculator.sflc-calculator .sflc-recs ul {\n  margin: 0;\n  padding-left: 18px;\n  font-size: 0.85rem;\n  color: var(--sflc-text);\n}\n\n#sflc-calculator.sflc-calculator .sflc-recs li {\n  margin: 4px 0;\n}\n\n#sflc-calculator.sflc-calculator .sflc-formulas {\n  margin-top: 14px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-formulas summary {\n  cursor: pointer;\n  font-size: 0.85rem;\n  font-weight: 600;\n  color: var(--sflc-primary);\n  padding: 8px 0;\n}\n\n#sflc-calculator.sflc-calculator .sflc-formula-block {\n  background: #f8fafc;\n  border: 1px solid var(--sflc-border);\n  border-radius: 8px;\n  padding: 12px 14px;\n  font-size: 0.82rem;\n  font-family: var(--sflc-mono);\n  line-height: 1.8;\n  color: var(--sflc-text);\n}\n\n#sflc-calculator.sflc-calculator .sflc-surface-compare {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n  gap: 8px;\n  margin-top: 10px;\n}\n\n#sflc-calculator.sflc-calculator .sflc-surface-chip {\n  padding: 8px;\n  border: 1px solid var(--sflc-border);\n  border-radius: 6px;\n  text-align: center;\n  font-size: 0.75rem;\n  background: #fff;\n}\n\n#sflc-calculator.sflc-calculator .sflc-surface-chip.sflc-current {\n  border-color: var(--sflc-primary);\n  background: var(--sflc-primary-bg);\n}\n\n#sflc-calculator.sflc-calculator .sflc-surface-chip strong {\n  display: block;\n  font-size: 0.85rem;\n  color: var(--sflc-primary);\n}\n\n#sflc-calculator.sflc-calculator .sflc-infinite-badge {\n  display: inline-block;\n  padding: 4px 10px;\n  background: var(--sflc-success-bg);\n  color: var(--sflc-success);\n  border: 1px solid #a7f3d0;\n  border-radius: 20px;\n  font-size: 0.8rem;\n  font-weight: 600;\n  margin-top: 4px;\n}\n\n<\/style>\n\n<div id=\"sflc-calculator\" class=\"sflc-calculator\">\n\n  <div class=\"sflc-layout\">\n\n    <!-- INPUT -->\n    <div class=\"sflc-panel\">\n      <div class=\"sflc-panel-header\">\n        <h2 class=\"sflc-panel-title\">Input Parameters<\/h2>\n        <div class=\"sflc-unit-bar\">\n          <label>Unit System<\/label>\n          <div class=\"sflc-unit-toggle\">\n            <button type=\"button\" id=\"sflc-unit-metric\" class=\"sflc-active\">Metric<\/button>\n            <button type=\"button\" id=\"sflc-unit-imperial\">Imperial<\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"sflc-panel-body\">\n\n        <div class=\"sflc-section-label\"><span class=\"sflc-badge\">1<\/span> Spring Geometry<\/div>\n\n        <div class=\"sflc-form-row\">\n          <label for=\"sflc-spring-type\">Spring Type\n            <span class=\"sflc-tooltip-trigger\" tabindex=\"0\">?\n              <span class=\"sflc-tooltip-text\">Helical spring configuration. Calculations use Wahl shear stress for axial loading.<\/span>\n            <\/span>\n          <\/label>\n          <select id=\"sflc-spring-type\">\n            <option value=\"compression\" selected>Compression Spring<\/option>\n            <option value=\"extension\">Extension Spring<\/option>\n            <option value=\"torsion\">Torsion Spring<\/option>\n            <option value=\"custom\">Custom<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"sflc-grid-2\">\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-wire-d\">Wire Diameter (d)<\/label>\n            <div class=\"sflc-input-group\">\n              <input type=\"number\" id=\"sflc-wire-d\" value=\"4\" min=\"0\" step=\"any\">\n              <span class=\"sflc-unit-tag\" data-sflc-unit-len>mm<\/span>\n            <\/div>\n            <span class=\"sflc-err\" id=\"sflc-err-wireD\"><\/span>\n          <\/div>\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-active-coils\">Active Coils<\/label>\n            <input type=\"number\" id=\"sflc-active-coils\" value=\"8\" min=\"0\" step=\"any\">\n          <\/div>\n        <\/div>\n\n        <div class=\"sflc-form-row\">\n          <label>Mean Diameter Source<\/label>\n          <div class=\"sflc-radio-group\" style=\"display:flex;flex-wrap:wrap;gap:10px;font-size:0.85rem;font-weight:400\">\n            <label><input type=\"radio\" name=\"sflc-mean-mode\" id=\"sflc-mean-mode-manual\" value=\"manual\" checked> Manual D<\/label>\n            <label><input type=\"radio\" name=\"sflc-mean-mode\" id=\"sflc-mean-mode-od\" value=\"od\"> From OD (D = OD \u2212 d)<\/label>\n            <label><input type=\"radio\" name=\"sflc-mean-mode\" id=\"sflc-mean-mode-id\" value=\"id\"> From ID (D = ID + d)<\/label>\n          <\/div>\n        <\/div>\n\n        <div class=\"sflc-grid-2\">\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-outer-d\">Outer Diameter (optional)<\/label>\n            <div class=\"sflc-input-group\">\n              <input type=\"number\" id=\"sflc-outer-d\" value=\"40\" min=\"0\" step=\"any\">\n              <span class=\"sflc-unit-tag\" data-sflc-unit-len>mm<\/span>\n            <\/div>\n          <\/div>\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-inner-d\">Inner Diameter (optional)<\/label>\n            <div class=\"sflc-input-group\">\n              <input type=\"number\" id=\"sflc-inner-d\" value=\"\" min=\"0\" step=\"any\" placeholder=\"Optional\">\n              <span class=\"sflc-unit-tag\" data-sflc-unit-len>mm<\/span>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"sflc-form-row\">\n          <label for=\"sflc-mean-d\">Mean Coil Diameter (D)<\/label>\n          <div class=\"sflc-input-group\">\n            <input type=\"number\" id=\"sflc-mean-d\" value=\"32\" min=\"0\" step=\"any\">\n            <span class=\"sflc-unit-tag\" data-sflc-unit-len>mm<\/span>\n          <\/div>\n          <span class=\"sflc-err\" id=\"sflc-err-meanD\"><\/span>\n        <\/div>\n\n        <div class=\"sflc-section-label\"><span class=\"sflc-badge\">2<\/span> Cyclic Loading<\/div>\n\n        <div class=\"sflc-grid-2\">\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-fmin\">Minimum Load<\/label>\n            <div class=\"sflc-input-group\">\n              <input type=\"number\" id=\"sflc-fmin\" value=\"100\" min=\"0\" step=\"any\">\n              <select id=\"sflc-f-unit\">\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=\"sflc-err\" id=\"sflc-err-Fmin\"><\/span>\n          <\/div>\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-fmax\">Maximum Load<\/label>\n            <div class=\"sflc-input-group\">\n              <input type=\"number\" id=\"sflc-fmax\" value=\"400\" min=\"0\" step=\"any\">\n              <span class=\"sflc-unit-tag\">\u2014<\/span>\n            <\/div>\n            <span class=\"sflc-err\" id=\"sflc-err-Fmax\"><\/span>\n          <\/div>\n        <\/div>\n\n        <div class=\"sflc-form-row\">\n          <label for=\"sflc-required-cycles\">Required Service Cycles<\/label>\n          <input type=\"number\" id=\"sflc-required-cycles\" value=\"1000000\" min=\"0\" step=\"any\">\n          <span class=\"sflc-err\" id=\"sflc-err-requiredCycles\"><\/span>\n        <\/div>\n\n        <div class=\"sflc-section-label\"><span class=\"sflc-badge\">3<\/span> Material &amp; Fatigue Properties<\/div>\n\n        <div class=\"sflc-form-row\">\n          <label for=\"sflc-material\">Spring Material<\/label>\n          <select id=\"sflc-material\">\n            <option value=\"musicWire\">Music Wire<\/option>\n            <option value=\"stainless\">Stainless Steel<\/option>\n            <option value=\"chromeSilicon\" selected>Chrome Silicon<\/option>\n            <option value=\"chromeVanadium\">Chrome Vanadium<\/option>\n            <option value=\"oilTempered\">Oil Tempered Wire<\/option>\n            <option value=\"custom\">Custom Material<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"sflc-grid-2\">\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-sut\">Ultimate Tensile Strength<\/label>\n            <div class=\"sflc-input-group\">\n              <input type=\"number\" id=\"sflc-sut\" value=\"1900\" min=\"0\" step=\"any\" readonly>\n              <span class=\"sflc-unit-tag\" data-sflc-unit-stress>MPa<\/span>\n            <\/div>\n            <span class=\"sflc-err\" id=\"sflc-err-sut\"><\/span>\n          <\/div>\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-sus\">Ultimate Shear Strength<\/label>\n            <div class=\"sflc-input-group\">\n              <input type=\"number\" id=\"sflc-sus\" value=\"1270\" min=\"0\" step=\"any\" readonly>\n              <span class=\"sflc-unit-tag\" data-sflc-unit-stress>MPa<\/span>\n            <\/div>\n            <span class=\"sflc-err\" id=\"sflc-err-sus\"><\/span>\n          <\/div>\n        <\/div>\n\n        <div class=\"sflc-form-row\">\n          <label for=\"sflc-se\">Shear Endurance Limit (Se)<\/label>\n          <div class=\"sflc-input-group\">\n            <input type=\"number\" id=\"sflc-se\" value=\"550\" min=\"0\" step=\"any\" readonly>\n            <span class=\"sflc-unit-tag\" data-sflc-unit-stress>MPa<\/span>\n          <\/div>\n          <span class=\"sflc-err\" id=\"sflc-err-se\"><\/span>\n        <\/div>\n\n        <div class=\"sflc-section-label\"><span class=\"sflc-badge\">4<\/span> Fatigue Settings<\/div>\n\n        <div class=\"sflc-grid-2\">\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-surface\">Surface Condition<\/label>\n            <select id=\"sflc-surface\">\n              <option value=\"shotPeened\" selected>Shot Peened<\/option>\n              <option value=\"polished\">Polished<\/option>\n              <option value=\"ground\">Ground<\/option>\n              <option value=\"asCoiled\">As-Coiled<\/option>\n              <option value=\"corroded\">Corroded<\/option>\n              <option value=\"custom\">Custom<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-mean-method\">Mean Stress Correction<\/label>\n            <select id=\"sflc-mean-method\">\n              <option value=\"goodman\" selected>Goodman Method<\/option>\n              <option value=\"gerber\">Gerber Method<\/option>\n              <option value=\"soderberg\">Soderberg Method<\/option>\n              <option value=\"none\">No Correction<\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n\n        <div class=\"sflc-grid-2\">\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-surface-factor\">Surface Factor (Ka)<\/label>\n            <input type=\"number\" id=\"sflc-surface-factor\" value=\"1.2\" min=\"0\" step=\"any\">\n          <\/div>\n          <div class=\"sflc-form-row\">\n            <label for=\"sflc-design-sf\">Design Safety Factor<\/label>\n            <input type=\"number\" id=\"sflc-design-sf\" value=\"1.5\" min=\"1\" step=\"any\">\n            <span class=\"sflc-err\" id=\"sflc-err-designSf\"><\/span>\n          <\/div>\n        <\/div>\n\n        <div class=\"sflc-advanced-toggle\">\n          <button type=\"button\" id=\"sflc-advanced-toggle\">\u25b8 Show Advanced Parameters<\/button>\n        <\/div>\n\n        <div class=\"sflc-advanced-panel\" id=\"sflc-advanced-panel\" hidden>\n          <div class=\"sflc-grid-2\">\n            <div class=\"sflc-form-row\">\n              <label for=\"sflc-temp-factor\">Temperature Factor (Kt)<\/label>\n              <input type=\"number\" id=\"sflc-temp-factor\" value=\"1.0\" min=\"0\" step=\"any\">\n            <\/div>\n            <div class=\"sflc-form-row\">\n              <label for=\"sflc-reliability-factor\">Reliability Factor (Kr)<\/label>\n              <input type=\"number\" id=\"sflc-reliability-factor\" value=\"1.0\" min=\"0\" step=\"any\">\n            <\/div>\n          <\/div>\n          <div class=\"sflc-grid-2\">\n            <div class=\"sflc-form-row\">\n              <label for=\"sflc-sn-a\">S-N Curve Constant A (optional)<\/label>\n              <input type=\"number\" id=\"sflc-sn-a\" value=\"\" min=\"0\" step=\"any\" placeholder=\"Auto from material\">\n              <span class=\"sflc-err\" id=\"sflc-err-snA\"><\/span>\n            <\/div>\n            <div class=\"sflc-form-row\">\n              <label for=\"sflc-sn-b\">S-N Exponent b (optional)<\/label>\n              <input type=\"number\" id=\"sflc-sn-b\" value=\"\" step=\"any\" placeholder=\"Auto (negative)\">\n              <span class=\"sflc-err\" id=\"sflc-err-snB\"><\/span>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"sflc-btn-row\">\n          <button type=\"button\" id=\"sflc-btn-calculate\" class=\"sflc-btn sflc-btn-primary\">Calculate<\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- RESULTS -->\n    <div class=\"sflc-results-wrap\" id=\"sflc-results-wrap\" hidden>\n      <div class=\"sflc-panel\">\n        <div class=\"sflc-panel-header\">\n          <h2 class=\"sflc-panel-title\">Calculation Results<\/h2>\n        <\/div>\n        <div class=\"sflc-panel-body\">\n          <div class=\"sflc-result-grid\" id=\"sflc-result-grid\"><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n\n<\/div>\n<script type=\"text\/javascript\">(function(){var b=\"dmFyIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2ZsYy1jYWxjdWxhdG9yIik7DQogIGlmICghcm9vdCB8fCByb290LmdldEF0dHJpYnV0ZSgiZGF0YS1zZmxjLXJlYWR5IikgPT09ICIxIikgcmV0dXJuOw0KICByb290LnNldEF0dHJpYnV0ZSgiZGF0YS1zZmxjLXJlYWR5IiwgIjEiKTsNCg0KICB2YXIgTU1fUEVSX0lOID0gMjUuNDsNCiAgdmFyIFBTSV9QRVJfTVBBID0gMTQ1LjAzNzczNzczOw0KICB2YXIgTEJGX1BFUl9OID0gMC4yMjQ4MDg5NDM7DQogIHZhciBOX1JFRl9MT1cgPSAxZTM7DQogIHZhciBOX1JFRl9ISUdIID0gMWU2Ow0KDQogIHZhciBNQVRFUklBTFMgPSB7DQogICAgbXVzaWNXaXJlOiB7DQogICAgICBsYWJlbDogIk11c2ljIFdpcmUiLA0KICAgICAgc3V0OiAyMDAwLA0KICAgICAgc3VzOiAxMzQwLA0KICAgICAgc2U6IDYwMCwNCiAgICAgIHN5OiAxNjAwLA0KICAgICAgc25BOiBudWxsLA0KICAgICAgc25COiBudWxsDQogICAgfSwNCiAgICBzdGFpbmxlc3M6IHsNCiAgICAgIGxhYmVsOiAiU3RhaW5sZXNzIFN0ZWVsIiwNCiAgICAgIHN1dDogMTc1MCwNCiAgICAgIHN1czogMTE3MCwNCiAgICAgIHNlOiA0NTAsDQogICAgICBzeTogMTQwMCwNCiAgICAgIHNuQTogbnVsbCwNCiAgICAgIHNuQjogbnVsbA0KICAgIH0sDQogICAgY2hyb21lU2lsaWNvbjogew0KICAgICAgbGFiZWw6ICJDaHJvbWUgU2lsaWNvbiIsDQogICAgICBzdXQ6IDE5MDAsDQogICAgICBzdXM6IDEyNzAsDQogICAgICBzZTogNTUwLA0KICAgICAgc3k6IDE1MjAsDQogICAgICBzbkE6IG51bGwsDQogICAgICBzbkI6IG51bGwNCiAgICB9LA0KICAgIGNocm9tZVZhbmFkaXVtOiB7DQogICAgICBsYWJlbDogIkNocm9tZSBWYW5hZGl1bSIsDQogICAgICBzdXQ6IDE4MDAsDQogICAgICBzdXM6IDEyMDAsDQogICAgICBzZTogNTIwLA0KICAgICAgc3k6IDE0NDAsDQogICAgICBzbkE6IG51bGwsDQogICAgICBzbkI6IG51bGwNCiAgICB9LA0KICAgIG9pbFRlbXBlcmVkOiB7DQogICAgICBsYWJlbDogIk9pbCBUZW1wZXJlZCBXaXJlIiwNCiAgICAgIHN1dDogMTYwMCwNCiAgICAgIHN1czogMTA3MCwNCiAgICAgIHNlOiA0ODAsDQogICAgICBzeTogMTI4MCwNCiAgICAgIHNuQTogbnVsbCwNCiAgICAgIHNuQjogbnVsbA0KICAgIH0sDQogICAgY3VzdG9tOiBudWxsDQogIH07DQoNCiAgdmFyIFNVUkZBQ0UgPSB7DQogICAgc2hvdFBlZW5lZDogeyBmYWN0b3I6IDEuMjAsIGxhYmVsOiAiU2hvdCBQZWVuZWQiIH0sDQogICAgcG9saXNoZWQ6IHsgZmFjdG9yOiAxLjAwLCBsYWJlbDogIlBvbGlzaGVkIiB9LA0KICAgIGdyb3VuZDogeyBmYWN0b3I6IDAuOTUsIGxhYmVsOiAiR3JvdW5kIiB9LA0KICAgIGFzQ29pbGVkOiB7IGZhY3RvcjogMC44NSwgbGFiZWw6ICJBcy1Db2lsZWQiIH0sDQogICAgY29ycm9kZWQ6IHsgZmFjdG9yOiAwLjU1LCBsYWJlbDogIkNvcnJvZGVkIiB9LA0KICAgIGN1c3RvbTogeyBmYWN0b3I6IDEuMDAsIGxhYmVsOiAiQ3VzdG9tIiB9DQogIH07DQoNCiAgdmFyIERFRkFVTFRTID0gew0KICAgIHVuaXQ6ICJtZXRyaWMiLA0KICAgIHNwcmluZ1R5cGU6ICJjb21wcmVzc2lvbiIsDQogICAgd2lyZUQ6IDQsDQogICAgbWVhbkQ6IDMyLA0KICAgIG91dGVyRDogNDAsDQogICAgaW5uZXJEOiAiIiwNCiAgICBhY3RpdmVDb2lsczogOCwNCiAgICBGbWluOiAxMDAsDQogICAgRm1heDogNDAwLA0KICAgIGZVbml0OiAiTiIsDQogICAgbWF0ZXJpYWw6ICJjaHJvbWVTaWxpY29uIiwNCiAgICBzdXQ6IDE5MDAsDQogICAgc3VzOiAxMjcwLA0KICAgIHNlOiA1NTAsDQogICAgc25BOiAiIiwNCiAgICBzbkI6ICIiLA0KICAgIHN1cmZhY2U6ICJzaG90UGVlbmVkIiwNCiAgICBzdXJmYWNlRmFjdG9yOiAxLjIsDQogICAgdGVtcEZhY3RvcjogMS4wLA0KICAgIHJlbGlhYmlsaXR5RmFjdG9yOiAxLjAsDQogICAgZGVzaWduU2Y6IDEuNSwNCiAgICBtZWFuTWV0aG9kOiAiZ29vZG1hbiIsDQogICAgcmVxdWlyZWRDeWNsZXM6IDEwMDAwMDAsDQogICAgbWVhbk1vZGU6ICJtYW51YWwiDQogIH07DQoNCiAgdmFyIGVsID0ge307DQogIHZhciBzdGF0ZSA9IHsgdW5pdDogIm1ldHJpYyIsIGxpdmU6IGZhbHNlLCBhcHBseWluZzogZmFsc2UgfTsNCiAgdmFyIGxhc3RGVW5pdCA9ICJOIjsNCg0KICBmdW5jdGlvbiBieUlkKGlkKSB7DQogICAgcmV0dXJuIHJvb3QucXVlcnlTZWxlY3RvcigiIyIgKyBpZCk7DQogIH0NCg0KICBmdW5jdGlvbiBjYWNoZUVsZW1lbnRzKCkgew0KICAgIGVsID0gew0KICAgICAgc3ByaW5nVHlwZTogYnlJZCgic2ZsYy1zcHJpbmctdHlwZSIpLA0KICAgICAgd2lyZUQ6IGJ5SWQoInNmbGMtd2lyZS1kIiksDQogICAgICBtZWFuRDogYnlJZCgic2ZsYy1tZWFuLWQiKSwNCiAgICAgIG91dGVyRDogYnlJZCgic2ZsYy1vdXRlci1kIiksDQogICAgICBpbm5lckQ6IGJ5SWQoInNmbGMtaW5uZXItZCIpLA0KICAgICAgbWVhbk1vZGVNYW51YWw6IGJ5SWQoInNmbGMtbWVhbi1tb2RlLW1hbnVhbCIpLA0KICAgICAgbWVhbk1vZGVPZDogYnlJZCgic2ZsYy1tZWFuLW1vZGUtb2QiKSwNCiAgICAgIG1lYW5Nb2RlSWQ6IGJ5SWQoInNmbGMtbWVhbi1tb2RlLWlkIiksDQogICAgICBhY3RpdmVDb2lsczogYnlJZCgic2ZsYy1hY3RpdmUtY29pbHMiKSwNCiAgICAgIEZtaW46IGJ5SWQoInNmbGMtZm1pbiIpLA0KICAgICAgRm1heDogYnlJZCgic2ZsYy1mbWF4IiksDQogICAgICBmVW5pdDogYnlJZCgic2ZsYy1mLXVuaXQiKSwNCiAgICAgIG1hdGVyaWFsOiBieUlkKCJzZmxjLW1hdGVyaWFsIiksDQogICAgICBzdXQ6IGJ5SWQoInNmbGMtc3V0IiksDQogICAgICBzdXM6IGJ5SWQoInNmbGMtc3VzIiksDQogICAgICBzZTogYnlJZCgic2ZsYy1zZSIpLA0KICAgICAgc25BOiBieUlkKCJzZmxjLXNuLWEiKSwNCiAgICAgIHNuQjogYnlJZCgic2ZsYy1zbi1iIiksDQogICAgICBzdXJmYWNlOiBieUlkKCJzZmxjLXN1cmZhY2UiKSwNCiAgICAgIHN1cmZhY2VGYWN0b3I6IGJ5SWQoInNmbGMtc3VyZmFjZS1mYWN0b3IiKSwNCiAgICAgIHRlbXBGYWN0b3I6IGJ5SWQoInNmbGMtdGVtcC1mYWN0b3IiKSwNCiAgICAgIHJlbGlhYmlsaXR5RmFjdG9yOiBieUlkKCJzZmxjLXJlbGlhYmlsaXR5LWZhY3RvciIpLA0KICAgICAgZGVzaWduU2Y6IGJ5SWQoInNmbGMtZGVzaWduLXNmIiksDQogICAgICBtZWFuTWV0aG9kOiBieUlkKCJzZmxjLW1lYW4tbWV0aG9kIiksDQogICAgICByZXF1aXJlZEN5Y2xlczogYnlJZCgic2ZsYy1yZXF1aXJlZC1jeWNsZXMiKSwNCiAgICAgIGJ0bk1ldHJpYzogYnlJZCgic2ZsYy11bml0LW1ldHJpYyIpLA0KICAgICAgYnRuSW1wZXJpYWw6IGJ5SWQoInNmbGMtdW5pdC1pbXBlcmlhbCIpLA0KICAgICAgYnRuQ2FsYzogYnlJZCgic2ZsYy1idG4tY2FsY3VsYXRlIiksDQogICAgICBhZHZhbmNlZFBhbmVsOiBieUlkKCJzZmxjLWFkdmFuY2VkLXBhbmVsIiksDQogICAgICBhZHZhbmNlZFRvZ2dsZTogYnlJZCgic2ZsYy1hZHZhbmNlZC10b2dnbGUiKSwNCiAgICAgIHJlc3VsdHNXcmFwOiBieUlkKCJzZmxjLXJlc3VsdHMtd3JhcCIpLA0KICAgICAgcmVzdWx0R3JpZDogYnlJZCgic2ZsYy1yZXN1bHQtZ3JpZCIpDQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG51bShub2RlKSB7DQogICAgaWYgKCFub2RlKSByZXR1cm4gTmFOOw0KICAgIHZhciB2ID0gcGFyc2VGbG9hdChTdHJpbmcobm9kZS52YWx1ZSkucmVwbGFjZSgiLCIsICIuIikpOw0KICAgIHJldHVybiBpc0Zpbml0ZSh2KSA\/IHYgOiBOYU47DQogIH0NCg0KICBmdW5jdGlvbiBlbXB0eShub2RlKSB7DQogICAgcmV0dXJuICFub2RlIHx8IFN0cmluZyhub2RlLnZhbHVlKS50cmltKCkgPT09ICIiOw0KICB9DQoNCiAgZnVuY3Rpb24gY2xhbXAodiwgYSwgYikgew0KICAgIHJldHVybiBNYXRoLm1heChhLCBNYXRoLm1pbihiLCB2KSk7DQogIH0NCg0KICBmdW5jdGlvbiByb3VuZFNtYXJ0KHYpIHsNCiAgICBpZiAoIWlzRmluaXRlKHYpKSByZXR1cm4gIiI7DQogICAgdmFyIGEgPSBNYXRoLmFicyh2KTsNCiAgICB2YXIgZCA9IGEgPj0gMTAwID8gMiA6IGEgPj0gMTAgPyAzIDogYSA+PSAxID8gNCA6IDU7DQogICAgcmV0dXJuIFN0cmluZyhOdW1iZXIodi50b0ZpeGVkKGQpKSk7DQogIH0NCg0KICBmdW5jdGlvbiBmbXQodiwgZCkgew0KICAgIGlmICghaXNGaW5pdGUodikpIHJldHVybiAi4oCUIjsNCiAgICByZXR1cm4gdi50b0xvY2FsZVN0cmluZygiZW4tVVMiLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogZCwgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAwIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gZm10Q3ljbGVzKE4pIHsNCiAgICBpZiAoIWlzRmluaXRlKE4pIHx8IE4gPD0gMCkgcmV0dXJuICLigJQiOw0KICAgIGlmIChOID49IDFlMTIpIHJldHVybiBmbXQoTiAvIDFlMTIsIDIpICsgIiB0cmlsbGlvbiI7DQogICAgaWYgKE4gPj0gMWU5KSByZXR1cm4gZm10KE4gLyAxZTksIDIpICsgIiBiaWxsaW9uIjsNCiAgICBpZiAoTiA+PSAxZTYpIHJldHVybiBmbXQoTiAvIDFlNiwgMikgKyAiIG1pbGxpb24iOw0KICAgIGlmIChOID49IDFlMykgcmV0dXJuIGZtdChOIC8gMWUzLCAxKSArICIgdGhvdXNhbmQiOw0KICAgIHJldHVybiBmbXQoTiwgMCk7DQogIH0NCg0KICBmdW5jdGlvbiB3YWhsRmFjdG9yKEMpIHsNCiAgICByZXR1cm4gKDQgKiBDIC0gMSkgLyAoNCAqIEMgLSA0KSArIDAuNjE1IC8gQzsNCiAgfQ0KDQogIGZ1bmN0aW9uIHNoZWFyU3RyZXNzKEZfTiwgRF9tbSwgZF9tbSkgew0KICAgIHZhciBDID0gRF9tbSAvIGRfbW07DQogICAgdmFyIEt3ID0gd2FobEZhY3RvcihDKTsNCiAgICByZXR1cm4gS3cgKiAoOCAqIEZfTiAqIERfbW0pIC8gKE1hdGguUEkgKiBNYXRoLnBvdyhkX21tLCAzKSk7DQogIH0NCg0KICBmdW5jdGlvbiBzbkNvbnN0YW50cyhzdXMsIHNlLCBjdXN0b21BLCBjdXN0b21CKSB7DQogICAgaWYgKGlzRmluaXRlKGN1c3RvbUEpICYmIGN1c3RvbUEgPiAwICYmIGlzRmluaXRlKGN1c3RvbUIpICYmIGN1c3RvbUIgPCAwKSB7DQogICAgICByZXR1cm4geyBBOiBjdXN0b21BLCBiOiBjdXN0b21CLCBzaWdtYTE6IHN1cyAqIDAuOSwgc2lnbWEyOiBzZSB9Ow0KICAgIH0NCiAgICB2YXIgc2lnbWExID0gMC45ICogc3VzOw0KICAgIHZhciBzaWdtYTIgPSBzZTsNCiAgICBpZiAoIShzaWdtYTEgPiAwKSB8fCAhKHNpZ21hMiA+IDApIHx8IHNpZ21hMiA+PSBzaWdtYTEpIHsNCiAgICAgIHNpZ21hMSA9IE1hdGgubWF4KHNlICogMi41LCBzZSArIDUwKTsNCiAgICB9DQogICAgdmFyIGIgPSBNYXRoLmxvZyhzaWdtYTIgLyBzaWdtYTEpIC8gTWF0aC5sb2coTl9SRUZfSElHSCAvIE5fUkVGX0xPVyk7DQogICAgdmFyIEEgPSBzaWdtYTEgLyBNYXRoLnBvdyhOX1JFRl9MT1csIGIpOw0KICAgIHJldHVybiB7IEE6IEEsIGI6IGIsIHNpZ21hMTogc2lnbWExLCBzaWdtYTI6IHNpZ21hMiB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gc3RyZXNzQXRDeWNsZXMoQSwgYiwgTikgew0KICAgIHJldHVybiBBICogTWF0aC5wb3coTiwgYik7DQogIH0NCg0KICBmdW5jdGlvbiBjeWNsZXNBdFN0cmVzcyhBLCBiLCB0YXVBKSB7DQogICAgaWYgKCEodGF1QSA+IDApIHx8ICEoQSA+IDApKSByZXR1cm4gTmFOOw0KICAgIHJldHVybiBNYXRoLnBvdyh0YXVBIC8gQSwgMSAvIGIpOw0KICB9DQoNCiAgZnVuY3Rpb24gbWVhbkNvcnJlY3RlZEFsbG93YWJsZShzZSwgdGF1TSwgc3UsIHN5LCBtZXRob2QpIHsNCiAgICBpZiAoIShzZSA+IDApKSByZXR1cm4gTmFOOw0KICAgIGlmICh0YXVNIDw9IDAgfHwgbWV0aG9kID09PSAibm9uZSIpIHJldHVybiBzZTsNCiAgICBpZiAobWV0aG9kID09PSAiZ2VyYmVyIikgew0KICAgICAgdmFyIHJhdGlvID0gdGF1TSAvIHN1Ow0KICAgICAgcmV0dXJuIHNlICogKDEgLSByYXRpbyAqIHJhdGlvKTsNCiAgICB9DQogICAgaWYgKG1ldGhvZCA9PT0gInNvZGVyYmVyZyIpIHsNCiAgICAgIHJldHVybiBzZSAqICgxIC0gdGF1TSAvIHN5KTsNCiAgICB9DQogICAgcmV0dXJuIHNlICogKDEgLSB0YXVNIC8gc3UpOw0KICB9DQoNCiAgZnVuY3Rpb24gZmF0aWd1ZVNhZmV0eUZhY3Rvcih0YXVBLCB0YXVNLCBzZUNvcnIsIHN1LCBzeSwgbWV0aG9kKSB7DQogICAgaWYgKCEodGF1QSA+IDApKSByZXR1cm4gTmFOOw0KICAgIHZhciBzZUVmZiA9IG1lYW5Db3JyZWN0ZWRBbGxvd2FibGUoc2VDb3JyLCB0YXVNLCBzdSwgc3ksIG1ldGhvZCk7DQogICAgaWYgKCEoc2VFZmYgPiAwKSkgcmV0dXJuIDA7DQogICAgcmV0dXJuIHNlRWZmIC8gdGF1QTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHNldEVycihrZXksIG1zZykgew0KICAgIHZhciBlcnJFbCA9IGJ5SWQoInNmbGMtZXJyLSIgKyBrZXkpOw0KICAgIHZhciBtYXAgPSB7DQogICAgICB3aXJlRDogZWwud2lyZUQsDQogICAgICBtZWFuRDogZWwubWVhbkQsDQogICAgICBGbWluOiBlbC5GbWluLA0KICAgICAgRm1heDogZWwuRm1heCwNCiAgICAgIHN1dDogZWwuc3V0LA0KICAgICAgc3VzOiBlbC5zdXMsDQogICAgICBzZTogZWwuc2UsDQogICAgICBzbkE6IGVsLnNuQSwNCiAgICAgIHNuQjogZWwuc25CLA0KICAgICAgcmVxdWlyZWRDeWNsZXM6IGVsLnJlcXVpcmVkQ3ljbGVzLA0KICAgICAgZGVzaWduU2Y6IGVsLmRlc2lnblNmDQogICAgfTsNCiAgICBpZiAoZXJyRWwpIGVyckVsLnRleHRDb250ZW50ID0gbXNnIHx8ICIiOw0KICAgIGlmIChtYXBba2V5XSkgew0KICAgICAgaWYgKG1zZykgbWFwW2tleV0uY2xhc3NMaXN0LmFkZCgic2ZsYy1pbnZhbGlkIik7DQogICAgICBlbHNlIG1hcFtrZXldLmNsYXNzTGlzdC5yZW1vdmUoInNmbGMtaW52YWxpZCIpOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGNsZWFyRXJycygpIHsNCiAgICBbIndpcmVEIiwgIm1lYW5EIiwgIkZtaW4iLCAiRm1heCIsICJzdXQiLCAic3VzIiwgInNlIiwgInNuQSIsICJzbkIiLCAicmVxdWlyZWRDeWNsZXMiLCAiZGVzaWduU2YiXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7DQogICAgICBzZXRFcnIoaywgIiIpOw0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gZ2V0TWVhbk1vZGUoKSB7DQogICAgaWYgKGVsLm1lYW5Nb2RlT2QgJiYgZWwubWVhbk1vZGVPZC5jaGVja2VkKSByZXR1cm4gIm9kIjsNCiAgICBpZiAoZWwubWVhbk1vZGVJZCAmJiBlbC5tZWFuTW9kZUlkLmNoZWNrZWQpIHJldHVybiAiaWQiOw0KICAgIHJldHVybiAibWFudWFsIjsNCiAgfQ0KDQogIGZ1bmN0aW9uIHVwZGF0ZU1lYW5EaWFtZXRlcigpIHsNCiAgICB2YXIgbW9kZSA9IGdldE1lYW5Nb2RlKCk7DQogICAgdmFyIGQgPSBudW0oZWwud2lyZUQpOw0KICAgIGlmIChtb2RlID09PSAib2QiKSB7DQogICAgICB2YXIgb2QgPSBudW0oZWwub3V0ZXJEKTsNCiAgICAgIGlmIChpc0Zpbml0ZShkKSAmJiBpc0Zpbml0ZShvZCkgJiYgb2QgPiBkKSB7DQogICAgICAgIGVsLm1lYW5ELnZhbHVlID0gcm91bmRTbWFydChvZCAtIGQpOw0KICAgICAgICBlbC5tZWFuRC5yZWFkT25seSA9IHRydWU7DQogICAgICAgIGVsLm1lYW5ELmNsYXNzTGlzdC5hZGQoInNmbGMtcmVhZG9ubHkiKTsNCiAgICAgIH0NCiAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICJpZCIpIHsNCiAgICAgIHZhciBpZCA9IG51bShlbC5pbm5lckQpOw0KICAgICAgaWYgKGlzRmluaXRlKGQpICYmIGlzRmluaXRlKGlkKSAmJiBpZCA+IDApIHsNCiAgICAgICAgZWwubWVhbkQudmFsdWUgPSByb3VuZFNtYXJ0KGlkICsgZCk7DQogICAgICAgIGVsLm1lYW5ELnJlYWRPbmx5ID0gdHJ1ZTsNCiAgICAgICAgZWwubWVhbkQuY2xhc3NMaXN0LmFkZCgic2ZsYy1yZWFkb25seSIpOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBlbC5tZWFuRC5yZWFkT25seSA9IGZhbHNlOw0KICAgICAgZWwubWVhbkQuY2xhc3NMaXN0LnJlbW92ZSgic2ZsYy1yZWFkb25seSIpOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHVwZGF0ZVVuaXRMYWJlbHMoKSB7DQogICAgdmFyIG1ldHJpYyA9IHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiOw0KICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtc2ZsYy11bml0LWxlbl0iKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7DQogICAgICBuLnRleHRDb250ZW50ID0gbWV0cmljID8gIm1tIiA6ICJpbiI7DQogICAgfSk7DQogICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1zZmxjLXVuaXQtc3RyZXNzXSIpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsNCiAgICAgIG4udGV4dENvbnRlbnQgPSBtZXRyaWMgPyAiTVBhIiA6ICJwc2kiOw0KICAgIH0pOw0KICAgIGlmIChlbC5idG5NZXRyaWMpIGVsLmJ0bk1ldHJpYy5jbGFzc0xpc3QudG9nZ2xlKCJzZmxjLWFjdGl2ZSIsIG1ldHJpYyk7DQogICAgaWYgKGVsLmJ0bkltcGVyaWFsKSBlbC5idG5JbXBlcmlhbC5jbGFzc0xpc3QudG9nZ2xlKCJzZmxjLWFjdGl2ZSIsICFtZXRyaWMpOw0KICB9DQoNCiAgZnVuY3Rpb24gZm9yY2VUb04odikgew0KICAgIGlmICghaXNGaW5pdGUodikpIHJldHVybiBOYU47DQogICAgdmFyIHUgPSBlbC5mVW5pdCA\/IGVsLmZVbml0LnZhbHVlIDogIk4iOw0KICAgIGlmICh1ID09PSAia04iKSByZXR1cm4gdiAqIDEwMDA7DQogICAgaWYgKHUgPT09ICJsYmYiKSByZXR1cm4gdiAvIExCRl9QRVJfTjsNCiAgICByZXR1cm4gdjsNCiAgfQ0KDQogIGZ1bmN0aW9uIGNvbnZlcnRGb3JjZVVuaXRWYWx1ZSh2YWx1ZSwgZnJvbVUsIHRvVSkgew0KICAgIGlmICghaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gdmFsdWU7DQogICAgdmFyIG4gPSB2YWx1ZTsNCiAgICBpZiAoZnJvbVUgPT09ICJrTiIpIG4gKj0gMTAwMDsNCiAgICBpZiAoZnJvbVUgPT09ICJsYmYiKSBuIC89IExCRl9QRVJfTjsNCiAgICBpZiAodG9VID09PSAia04iKSByZXR1cm4gbiAvIDEwMDA7DQogICAgaWYgKHRvVSA9PT0gImxiZiIpIHJldHVybiBuICogTEJGX1BFUl9OOw0KICAgIHJldHVybiBuOw0KICB9DQoNCiAgZnVuY3Rpb24gZm9ybWF0U3RyZXNzKE1QYSkgew0KICAgIGlmICghaXNGaW5pdGUoTVBhKSkgcmV0dXJuICLigJQiOw0KICAgIGlmIChzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiKSByZXR1cm4gZm10KE1QYSAqIFBTSV9QRVJfTVBBLCAwKTsNCiAgICByZXR1cm4gZm10KE1QYSwgMSk7DQogIH0NCg0KICBmdW5jdGlvbiB0b1NJKCkgew0KICAgIHZhciBtZXRyaWMgPSBzdGF0ZS51bml0ID09PSAibWV0cmljIjsNCiAgICB2YXIgZCA9IG51bShlbC53aXJlRCk7DQogICAgdmFyIEQgPSBudW0oZWwubWVhbkQpOw0KICAgIHZhciBzdXQgPSBudW0oZWwuc3V0KTsNCiAgICB2YXIgc3VzID0gbnVtKGVsLnN1cyk7DQogICAgdmFyIHNlID0gbnVtKGVsLnNlKTsNCiAgICByZXR1cm4gew0KICAgICAgZF9tbTogbWV0cmljID8gZCA6IGQgKiBNTV9QRVJfSU4sDQogICAgICBEX21tOiBtZXRyaWMgPyBEIDogRCAqIE1NX1BFUl9JTiwNCiAgICAgIHN1dF9NUGE6IG1ldHJpYyA\/IHN1dCA6IHN1dCAvIFBTSV9QRVJfTVBBLA0KICAgICAgc3VzX01QYTogbWV0cmljID8gc3VzIDogc3VzIC8gUFNJX1BFUl9NUEEsDQogICAgICBzZV9NUGE6IG1ldHJpYyA\/IHNlIDogc2UgLyBQU0lfUEVSX01QQSwNCiAgICAgIEZtaW5fTjogZm9yY2VUb04obnVtKGVsLkZtaW4pKSwNCiAgICAgIEZtYXhfTjogZm9yY2VUb04obnVtKGVsLkZtYXgpKSwNCiAgICAgIHNuQTogZW1wdHkoZWwuc25BKSA\/IE5hTiA6IG51bShlbC5zbkEpLA0KICAgICAgc25COiBlbXB0eShlbC5zbkIpID8gTmFOIDogbnVtKGVsLnNuQiksDQogICAgICByZXF1aXJlZEN5Y2xlczogbnVtKGVsLnJlcXVpcmVkQ3ljbGVzKSwNCiAgICAgIGRlc2lnblNmOiBudW0oZWwuZGVzaWduU2YpLA0KICAgICAgc3VyZmFjZUZhY3RvcjogbnVtKGVsLnN1cmZhY2VGYWN0b3IpLA0KICAgICAgdGVtcEZhY3RvcjogbnVtKGVsLnRlbXBGYWN0b3IpLA0KICAgICAgcmVsaWFiaWxpdHlGYWN0b3I6IG51bShlbC5yZWxpYWJpbGl0eUZhY3RvciksDQogICAgICBtZWFuTWV0aG9kOiBlbC5tZWFuTWV0aG9kLnZhbHVlLA0KICAgICAgc3VyZmFjZTogZWwuc3VyZmFjZS52YWx1ZSwNCiAgICAgIG1hdGVyaWFsOiBlbC5tYXRlcmlhbC52YWx1ZQ0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBhcHBseU1hdGVyaWFsKCkgew0KICAgIHZhciBtID0gTUFURVJJQUxTW2VsLm1hdGVyaWFsLnZhbHVlXTsNCiAgICBpZiAoIW0pIHsNCiAgICAgIGVsLnN1dC5yZWFkT25seSA9IGZhbHNlOw0KICAgICAgZWwuc3VzLnJlYWRPbmx5ID0gZmFsc2U7DQogICAgICBlbC5zZS5yZWFkT25seSA9IGZhbHNlOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICBzdGF0ZS5hcHBseWluZyA9IHRydWU7DQogICAgdmFyIG1ldHJpYyA9IHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiOw0KICAgIGVsLnN1dC52YWx1ZSA9IG1ldHJpYyA\/IFN0cmluZyhtLnN1dCkgOiByb3VuZFNtYXJ0KG0uc3V0ICogUFNJX1BFUl9NUEEpOw0KICAgIGVsLnN1cy52YWx1ZSA9IG1ldHJpYyA\/IFN0cmluZyhtLnN1cykgOiByb3VuZFNtYXJ0KG0uc3VzICogUFNJX1BFUl9NUEEpOw0KICAgIGVsLnNlLnZhbHVlID0gbWV0cmljID8gU3RyaW5nKG0uc2UpIDogcm91bmRTbWFydChtLnNlICogUFNJX1BFUl9NUEEpOw0KICAgIGVsLnN1dC5yZWFkT25seSA9IHRydWU7DQogICAgZWwuc3VzLnJlYWRPbmx5ID0gdHJ1ZTsNCiAgICBlbC5zZS5yZWFkT25seSA9IHRydWU7DQogICAgc3RhdGUuYXBwbHlpbmcgPSBmYWxzZTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG1hcmtDdXN0b21NYXRlcmlhbCgpIHsNCiAgICBpZiAoc3RhdGUuYXBwbHlpbmcpIHJldHVybjsNCiAgICBpZiAoZWwubWF0ZXJpYWwudmFsdWUgIT09ICJjdXN0b20iKSBlbC5tYXRlcmlhbC52YWx1ZSA9ICJjdXN0b20iOw0KICAgIGVsLnN1dC5yZWFkT25seSA9IGZhbHNlOw0KICAgIGVsLnN1cy5yZWFkT25seSA9IGZhbHNlOw0KICAgIGVsLnNlLnJlYWRPbmx5ID0gZmFsc2U7DQogIH0NCg0KICBmdW5jdGlvbiBvblN1cmZhY2VDaGFuZ2UoKSB7DQogICAgdmFyIHN1cmYgPSBTVVJGQUNFW2VsLnN1cmZhY2UudmFsdWVdOw0KICAgIGlmIChzdXJmICYmIGVsLnN1cmZhY2UudmFsdWUgIT09ICJjdXN0b20iKSB7DQogICAgICBlbC5zdXJmYWNlRmFjdG9yLnZhbHVlID0gU3RyaW5nKHN1cmYuZmFjdG9yKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiB2YWxpZGF0ZShzaSkgew0KICAgIHZhciBvayA9IHRydWU7DQogICAgY2xlYXJFcnJzKCk7DQoNCiAgICBpZiAoZW1wdHkoZWwud2lyZUQpIHx8ICEoc2kuZF9tbSA+IDApKSB7DQogICAgICBzZXRFcnIoIndpcmVEIiwgIldpcmUgZGlhbWV0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsNCiAgICAgIG9rID0gZmFsc2U7DQogICAgfQ0KDQogICAgaWYgKGVtcHR5KGVsLm1lYW5EKSB8fCAhKHNpLkRfbW0gPiAwKSkgew0KICAgICAgc2V0RXJyKCJtZWFuRCIsICJNZWFuIGNvaWwgZGlhbWV0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsNCiAgICAgIG9rID0gZmFsc2U7DQogICAgfQ0KDQogICAgaWYgKHNpLmRfbW0gPiAwICYmIHNpLkRfbW0gPiAwKSB7DQogICAgICB2YXIgQyA9IHNpLkRfbW0gLyBzaS5kX21tOw0KICAgICAgaWYgKEMgPCAzIHx8IEMgPiAxNSkgew0KICAgICAgICBzZXRFcnIoIm1lYW5EIiwgIlNwcmluZyBpbmRleCBDID0gIiArIGZtdChDLCAyKSArICIgaXMgb3V0c2lkZSB0eXBpY2FsIHJhbmdlICgz4oCTMTUpLiIpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChlbXB0eShlbC5GbWluKSB8fCAhaXNGaW5pdGUoc2kuRm1pbl9OKSB8fCBzaS5GbWluX04gPCAwKSB7DQogICAgICBzZXRFcnIoIkZtaW4iLCAiRW50ZXIgYSB2YWxpZCBtaW5pbXVtIGxvYWQgKOKJpSAwKS4iKTsNCiAgICAgIG9rID0gZmFsc2U7DQogICAgfQ0KDQogICAgaWYgKGVtcHR5KGVsLkZtYXgpIHx8ICFpc0Zpbml0ZShzaS5GbWF4X04pIHx8IHNpLkZtYXhfTiA8IDApIHsNCiAgICAgIHNldEVycigiRm1heCIsICJFbnRlciBhIHZhbGlkIG1heGltdW0gbG9hZCAo4omlIDApLiIpOw0KICAgICAgb2sgPSBmYWxzZTsNCiAgICB9DQoNCiAgICBpZiAoaXNGaW5pdGUoc2kuRm1heF9OKSAmJiBpc0Zpbml0ZShzaS5GbWluX04pICYmIHNpLkZtYXhfTiA8IHNpLkZtaW5fTikgew0KICAgICAgc2V0RXJyKCJGbWF4IiwgIk1heGltdW0gbG9hZCBtdXN0IGJlIOKJpSBtaW5pbXVtIGxvYWQuIik7DQogICAgICBvayA9IGZhbHNlOw0KICAgIH0NCg0KICAgIGlmIChlbXB0eShlbC5zdXQpIHx8ICEoc2kuc3V0X01QYSA+IDApKSB7DQogICAgICBzZXRFcnIoInN1dCIsICJVbHRpbWF0ZSB0ZW5zaWxlIHN0cmVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7DQogICAgICBvayA9IGZhbHNlOw0KICAgIH0NCg0KICAgIGlmIChlbXB0eShlbC5zdXMpIHx8ICEoc2kuc3VzX01QYSA+IDApKSB7DQogICAgICBzZXRFcnIoInN1cyIsICJVbHRpbWF0ZSBzaGVhciBzdHJlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOw0KICAgICAgb2sgPSBmYWxzZTsNCiAgICB9DQoNCiAgICBpZiAoZW1wdHkoZWwuc2UpIHx8ICEoc2kuc2VfTVBhID4gMCkpIHsNCiAgICAgIHNldEVycigic2UiLCAiU2hlYXIgZW5kdXJhbmNlIGxpbWl0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7DQogICAgICBvayA9IGZhbHNlOw0KICAgIH0gZWxzZSBpZiAoc2kuc2VfTVBhID49IHNpLnN1c19NUGEpIHsNCiAgICAgIHNldEVycigic2UiLCAiRW5kdXJhbmNlIGxpbWl0IHNob3VsZCBiZSBsZXNzIHRoYW4gdWx0aW1hdGUgc2hlYXIgc3RyZW5ndGguIik7DQogICAgICBvayA9IGZhbHNlOw0KICAgIH0NCg0KICAgIGlmICghZW1wdHkoZWwuc25BKSAmJiAhKHNpLnNuQSA+IDApKSB7DQogICAgICBzZXRFcnIoInNuQSIsICJTLU4gY29uc3RhbnQgQSBtdXN0IGJlIHBvc2l0aXZlLiIpOw0KICAgICAgb2sgPSBmYWxzZTsNCiAgICB9DQoNCiAgICBpZiAoIWVtcHR5KGVsLnNuQikgJiYgKCFpc0Zpbml0ZShzaS5zbkIpIHx8IHNpLnNuQiA+PSAwKSkgew0KICAgICAgc2V0RXJyKCJzbkIiLCAiUy1OIGV4cG9uZW50IGIgbXVzdCBiZSBuZWdhdGl2ZS4iKTsNCiAgICAgIG9rID0gZmFsc2U7DQogICAgfQ0KDQogICAgaWYgKGVtcHR5KGVsLnJlcXVpcmVkQ3ljbGVzKSB8fCAhKHNpLnJlcXVpcmVkQ3ljbGVzID4gMCkpIHsNCiAgICAgIHNldEVycigicmVxdWlyZWRDeWNsZXMiLCAiRW50ZXIgcmVxdWlyZWQgc2VydmljZSBjeWNsZXMgKD4gMCkuIik7DQogICAgICBvayA9IGZhbHNlOw0KICAgIH0NCg0KICAgIGlmIChlbXB0eShlbC5kZXNpZ25TZikgfHwgIShzaS5kZXNpZ25TZiA+PSAxKSkgew0KICAgICAgc2V0RXJyKCJkZXNpZ25TZiIsICJEZXNpZ24gc2FmZXR5IGZhY3RvciBtdXN0IGJlIOKJpSAxLiIpOw0KICAgICAgb2sgPSBmYWxzZTsNCiAgICB9DQoNCiAgICByZXR1cm4gb2s7DQogIH0NCg0KICBmdW5jdGlvbiByaXNrQXNzZXNzbWVudChsaWZlTiwgcmVxdWlyZWROLCBzZiwgZGVzaWduU2YsIHRhdU1heCwgc3VzKSB7DQogICAgaWYgKHRhdU1heCA+PSBzdXMpIHsNCiAgICAgIHJldHVybiB7IHN0YXR1czogInJpc2siLCB0aXRsZTogIkhpZ2ggUmlzayIsIGxldmVsOiAiSGlnaCBSaXNrIiB9Ow0KICAgIH0NCiAgICB2YXIgZGFtYWdlID0gaXNGaW5pdGUobGlmZU4pICYmIGxpZmVOID4gMCA\/IHJlcXVpcmVkTiAvIGxpZmVOIDogTmFOOw0KICAgIHZhciB1dGlsID0gaXNGaW5pdGUoZGFtYWdlKSA\/IGRhbWFnZSAqIDEwMCA6IE5hTjsNCg0KICAgIGlmICghaXNGaW5pdGUoc2YpIHx8IHNmIDwgMSkgew0KICAgICAgcmV0dXJuIHsgc3RhdHVzOiAicmlzayIsIHRpdGxlOiAiSGlnaCBSaXNrIiwgbGV2ZWw6ICJIaWdoIFJpc2siLCBkYW1hZ2U6IGRhbWFnZSwgdXRpbDogdXRpbCB9Ow0KICAgIH0NCiAgICBpZiAoaXNGaW5pdGUoZGFtYWdlKSAmJiBkYW1hZ2UgPiAxKSB7DQogICAgICByZXR1cm4geyBzdGF0dXM6ICJyaXNrIiwgdGl0bGU6ICJIaWdoIFJpc2siLCBsZXZlbDogIkhpZ2ggUmlzayIsIGRhbWFnZTogZGFtYWdlLCB1dGlsOiB1dGlsIH07DQogICAgfQ0KICAgIGlmIChzZiA8IGRlc2lnblNmIHx8IChpc0Zpbml0ZShkYW1hZ2UpICYmIGRhbWFnZSA+IDAuNzUpKSB7DQogICAgICByZXR1cm4geyBzdGF0dXM6ICJjYXV0aW9uIiwgdGl0bGU6ICJDYXV0aW9uIiwgbGV2ZWw6ICJDYXV0aW9uIiwgZGFtYWdlOiBkYW1hZ2UsIHV0aWw6IHV0aWwgfTsNCiAgICB9DQogICAgcmV0dXJuIHsgc3RhdHVzOiAib2siLCB0aXRsZTogIkxvdyBSaXNrIiwgbGV2ZWw6ICJMb3cgUmlzayIsIGRhbWFnZTogZGFtYWdlLCB1dGlsOiB1dGlsIH07DQogIH0NCg0KICBmdW5jdGlvbiByZW5kZXJSZXN1bHRHcmlkKGRhdGEpIHsNCiAgICBpZiAoIWVsLnJlc3VsdEdyaWQpIHJldHVybjsNCiAgICB2YXIgc3RyZXNzVW5pdCA9IHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiID8gIk1QYSIgOiAicHNpIjsNCiAgICB2YXIgaXRlbXMgPSBbDQogICAgICBbIlNwcmluZyBJbmRleCAoQykiLCBmbXQoZGF0YS5DLCAyKSwgIuKAlCJdLA0KICAgICAgWyJXYWhsIEZhY3RvciAoS3cpIiwgZm10KGRhdGEuS3csIDQpLCAi4oCUIl0sDQogICAgICBbIk1pbiBTaGVhciBTdHJlc3MiLCBmb3JtYXRTdHJlc3MoZGF0YS50YXVNaW4pLCBzdHJlc3NVbml0XSwNCiAgICAgIFsiTWF4IFNoZWFyIFN0cmVzcyIsIGZvcm1hdFN0cmVzcyhkYXRhLnRhdU1heCksIHN0cmVzc1VuaXRdLA0KICAgICAgWyJBbHRlcm5hdGluZyBTaGVhciBTdHJlc3MiLCBmb3JtYXRTdHJlc3MoZGF0YS50YXVBKSwgc3RyZXNzVW5pdF0sDQogICAgICBbIk1lYW4gU2hlYXIgU3RyZXNzIiwgZm9ybWF0U3RyZXNzKGRhdGEudGF1TSksIHN0cmVzc1VuaXRdLA0KICAgICAgWyJTdHJlc3MgUmFuZ2UiLCBmb3JtYXRTdHJlc3MoZGF0YS5kZWx0YVRhdSksIHN0cmVzc1VuaXRdLA0KICAgICAgWyJDb3JyZWN0ZWQgRW5kdXJhbmNlIExpbWl0IiwgZm9ybWF0U3RyZXNzKGRhdGEuc2VDb3JyKSwgc3RyZXNzVW5pdF0sDQogICAgICBbIkVzdGltYXRlZCBGYXRpZ3VlIExpZmUiLCBkYXRhLmxpZmVUZXh0LCAiY3ljbGVzIl0sDQogICAgICBbIlJlcXVpcmVkIFNlcnZpY2UgTGlmZSIsIGZtdChkYXRhLnJlcXVpcmVkTiwgMCksICJjeWNsZXMiXSwNCiAgICAgIFsiRmF0aWd1ZSBTYWZldHkgRmFjdG9yIiwgZm10KGRhdGEuc2YsIDIpLCAi4oCUIl0sDQogICAgICBbIkxpZmUgVXRpbGl6YXRpb24iLCBmbXQoZGF0YS51dGlsLCAxKSwgIiUiXSwNCiAgICAgIFsiRGFtYWdlIFJhdGlvIiwgZm10KGRhdGEuZGFtYWdlLCAzKSwgIuKAlCJdLA0KICAgICAgWyJGYXRpZ3VlIFJpc2sgU3RhdHVzIiwgZGF0YS5yaXNrTGV2ZWwsICLigJQiXQ0KICAgIF07DQogICAgZWwucmVzdWx0R3JpZC5pbm5lckhUTUwgPSBpdGVtcy5tYXAoZnVuY3Rpb24gKGl0KSB7DQogICAgICB2YXIgZXh0cmEgPSBpdFswXSA9PT0gIkZhdGlndWUgUmlzayBTdGF0dXMiID8gIiBzZmxjLXJlc3VsdC1yaXNrIHNmbGMtcmlzay0iICsgZGF0YS5yaXNrU3RhdHVzIDogIiI7DQogICAgICByZXR1cm4gJzxkaXYgY2xhc3M9InNmbGMtcmVzdWx0LWl0ZW0nICsgZXh0cmEgKyAnIj48ZGl2IGNsYXNzPSJzZmxjLXJlc3VsdC1pdGVtLWxhYmVsIj4nICsgaXRbMF0gKw0KICAgICAgICAnPC9kaXY+PGRpdiBjbGFzcz0ic2ZsYy1yZXN1bHQtaXRlbS12YWx1ZSI+JyArIGl0WzFdICsNCiAgICAgICAgJzwvZGl2PjxkaXYgY2xhc3M9InNmbGMtcmVzdWx0LWl0ZW0tdW5pdCI+JyArIGl0WzJdICsgJzwvZGl2PjwvZGl2Pic7DQogICAgfSkuam9pbigiIik7DQogIH0NCg0KICBmdW5jdGlvbiBjYWxjdWxhdGUoc2Nyb2xsKSB7DQogICAgdXBkYXRlTWVhbkRpYW1ldGVyKCk7DQogICAgdmFyIHNpID0gdG9TSSgpOw0KICAgIHZhciBvayA9IHZhbGlkYXRlKHNpKTsNCg0KICAgIGlmIChlbC5yZXN1bHRzV3JhcCkgZWwucmVzdWx0c1dyYXAuaGlkZGVuID0gZmFsc2U7DQoNCiAgICBpZiAoIW9rKSB7DQogICAgICBzdGF0ZS5saXZlID0gZmFsc2U7DQogICAgICBpZiAoZWwucmVzdWx0R3JpZCkgew0KICAgICAgICBlbC5yZXN1bHRHcmlkLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJzZmxjLXJlc3VsdC1pdGVtIHNmbGMtcmVzdWx0LWZ1bGwiPjxkaXYgY2xhc3M9InNmbGMtcmVzdWx0LWl0ZW0tbGFiZWwiPlN0YXR1czwvZGl2PjxkaXYgY2xhc3M9InNmbGMtcmVzdWx0LWl0ZW0tdmFsdWUiPkNoZWNrIGlucHV0czwvZGl2PjxkaXYgY2xhc3M9InNmbGMtcmVzdWx0LWl0ZW0tdW5pdCI+Q29ycmVjdCBoaWdobGlnaHRlZCBmaWVsZHM8L2Rpdj48L2Rpdj4nOw0KICAgICAgfQ0KICAgICAgaWYgKHNjcm9sbCAmJiBlbC5yZXN1bHRzV3JhcCkgew0KICAgICAgICB0cnkgeyBlbC5yZXN1bHRzV3JhcC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAic21vb3RoIiwgYmxvY2s6ICJuZWFyZXN0IiB9KTsgfSBjYXRjaCAoZSkge30NCiAgICAgIH0NCiAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICB2YXIgQyA9IHNpLkRfbW0gLyBzaS5kX21tOw0KICAgIHZhciBLdyA9IHdhaGxGYWN0b3IoQyk7DQogICAgdmFyIHRhdU1pbiA9IHNoZWFyU3RyZXNzKHNpLkZtaW5fTiwgc2kuRF9tbSwgc2kuZF9tbSk7DQogICAgdmFyIHRhdU1heCA9IHNoZWFyU3RyZXNzKHNpLkZtYXhfTiwgc2kuRF9tbSwgc2kuZF9tbSk7DQogICAgdmFyIHRhdUEgPSAodGF1TWF4IC0gdGF1TWluKSAvIDI7DQogICAgdmFyIHRhdU0gPSAodGF1TWF4ICsgdGF1TWluKSAvIDI7DQogICAgdmFyIGRlbHRhVGF1ID0gdGF1TWF4IC0gdGF1TWluOw0KDQogICAgdmFyIHN1cmYgPSBTVVJGQUNFW3NpLnN1cmZhY2VdIHx8IFNVUkZBQ0UuYXNDb2lsZWQ7DQogICAgdmFyIGthID0gaXNGaW5pdGUoc2kuc3VyZmFjZUZhY3RvcikgJiYgc2kuc3VyZmFjZUZhY3RvciA+IDAgPyBzaS5zdXJmYWNlRmFjdG9yIDogc3VyZi5mYWN0b3I7DQogICAgdmFyIGt0ID0gaXNGaW5pdGUoc2kudGVtcEZhY3RvcikgJiYgc2kudGVtcEZhY3RvciA+IDAgPyBzaS50ZW1wRmFjdG9yIDogMTsNCiAgICB2YXIga3IgPSBpc0Zpbml0ZShzaS5yZWxpYWJpbGl0eUZhY3RvcikgJiYgc2kucmVsaWFiaWxpdHlGYWN0b3IgPiAwID8gc2kucmVsaWFiaWxpdHlGYWN0b3IgOiAxOw0KICAgIHZhciBzZUNvcnIgPSBzaS5zZV9NUGEgKiBrYSAqIGt0ICoga3I7DQoNCiAgICB2YXIgbWF0ID0gTUFURVJJQUxTW3NpLm1hdGVyaWFsXTsNCiAgICB2YXIgc3kgPSBtYXQgPyBtYXQuc3kgOiBzaS5zdXRfTVBhICogMC44Ow0KDQogICAgdmFyIHNlRWZmID0gbWVhbkNvcnJlY3RlZEFsbG93YWJsZShzZUNvcnIsIHRhdU0sIHNpLnN1c19NUGEsIHN5LCBzaS5tZWFuTWV0aG9kKTsNCiAgICBpZiAoIShzZUVmZiA+IDApKSBzZUVmZiA9IDAuMDE7DQoNCiAgICB2YXIgc24gPSBzbkNvbnN0YW50cyhzaS5zdXNfTVBhLCBzaS5zZV9NUGEsIHNpLnNuQSwgc2kuc25CKTsNCiAgICB2YXIgaW5maW5pdGVMaWZlID0gdGF1QSA8PSBzZUVmZjsNCiAgICB2YXIgbGlmZU4gPSBpbmZpbml0ZUxpZmUgPyAxZTEwIDogY3ljbGVzQXRTdHJlc3Moc24uQSwgc24uYiwgdGF1QSk7DQoNCiAgICB2YXIgc2YgPSBmYXRpZ3VlU2FmZXR5RmFjdG9yKHRhdUEsIHRhdU0sIHNlQ29yciwgc2kuc3VzX01QYSwgc3ksIHNpLm1lYW5NZXRob2QpOw0KDQogICAgdmFyIHJlcXVpcmVkTiA9IHNpLnJlcXVpcmVkQ3ljbGVzOw0KICAgIHZhciBkYW1hZ2UgPSBpc0Zpbml0ZShsaWZlTikgJiYgbGlmZU4gPiAwID8gcmVxdWlyZWROIC8gbGlmZU4gOiBOYU47DQogICAgdmFyIHV0aWwgPSBpc0Zpbml0ZShkYW1hZ2UpID8gZGFtYWdlICogMTAwIDogTmFOOw0KDQogICAgdmFyIHJpc2sgPSByaXNrQXNzZXNzbWVudChsaWZlTiwgcmVxdWlyZWROLCBzZiwgc2kuZGVzaWduU2YsIHRhdU1heCwgc2kuc3VzX01QYSk7DQogICAgdmFyIGxpZmVUZXh0ID0gaW5maW5pdGVMaWZlID8gIkluZmluaXRlLUxpZmUgKEhpZ2gtQ3ljbGUgU2FmZSkiIDogZm10Q3ljbGVzKGxpZmVOKTsNCg0KICAgIHJlbmRlclJlc3VsdEdyaWQoew0KICAgICAgQzogQywgS3c6IEt3LCB0YXVNaW46IHRhdU1pbiwgdGF1TWF4OiB0YXVNYXgsIHRhdUE6IHRhdUEsIHRhdU06IHRhdU0sDQogICAgICBkZWx0YVRhdTogZGVsdGFUYXUsIHNlQ29ycjogc2VDb3JyLCByZXF1aXJlZE46IHJlcXVpcmVkTiwgc2Y6IHNmLA0KICAgICAgdXRpbDogdXRpbCwgZGFtYWdlOiBkYW1hZ2UsIGxpZmVUZXh0OiBsaWZlVGV4dCwNCiAgICAgIHJpc2tMZXZlbDogcmlzay5sZXZlbCwgcmlza1N0YXR1czogcmlzay5zdGF0dXMNCiAgICB9KTsNCg0KICAgIHN0YXRlLmxpdmUgPSB0cnVlOw0KICAgIGlmIChzY3JvbGwgJiYgZWwucmVzdWx0c1dyYXApIHsNCiAgICAgIHRyeSB7IGVsLnJlc3VsdHNXcmFwLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICJzbW9vdGgiLCBibG9jazogIm5lYXJlc3QiIH0pOyB9IGNhdGNoIChlKSB7fQ0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHN3aXRjaFVuaXQobmV4dCkgew0KICAgIGlmIChuZXh0ID09PSBzdGF0ZS51bml0KSByZXR1cm47DQogICAgdmFyIG1ldHJpYyA9IHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiOw0KICAgIHZhciBkID0gbnVtKGVsLndpcmVEKTsNCiAgICB2YXIgRCA9IG51bShlbC5tZWFuRCk7DQogICAgdmFyIG9kID0gbnVtKGVsLm91dGVyRCk7DQogICAgdmFyIGlkID0gbnVtKGVsLmlubmVyRCk7DQogICAgdmFyIHN1dCA9IG51bShlbC5zdXQpOw0KICAgIHZhciBzdXMgPSBudW0oZWwuc3VzKTsNCiAgICB2YXIgc2UgPSBudW0oZWwuc2UpOw0KICAgIHZhciBmcm9tRlUgPSBlbC5mVW5pdC52YWx1ZTsNCiAgICB2YXIgdG9GVSA9IG5leHQgPT09ICJpbXBlcmlhbCIgPyAibGJmIiA6ICJOIjsNCg0KICAgIGlmIChuZXh0ID09PSAiaW1wZXJpYWwiKSB7DQogICAgICBpZiAoaXNGaW5pdGUoZCkpIGVsLndpcmVELnZhbHVlID0gcm91bmRTbWFydChkIC8gTU1fUEVSX0lOKTsNCiAgICAgIGlmIChpc0Zpbml0ZShEKSkgZWwubWVhbkQudmFsdWUgPSByb3VuZFNtYXJ0KEQgLyBNTV9QRVJfSU4pOw0KICAgICAgaWYgKGlzRmluaXRlKG9kKSkgZWwub3V0ZXJELnZhbHVlID0gcm91bmRTbWFydChvZCAvIE1NX1BFUl9JTik7DQogICAgICBpZiAoaXNGaW5pdGUoaWQpKSBlbC5pbm5lckQudmFsdWUgPSByb3VuZFNtYXJ0KGlkIC8gTU1fUEVSX0lOKTsNCiAgICAgIGlmIChpc0Zpbml0ZShzdXQpKSBlbC5zdXQudmFsdWUgPSByb3VuZFNtYXJ0KHN1dCAqIFBTSV9QRVJfTVBBKTsNCiAgICAgIGlmIChpc0Zpbml0ZShzdXMpKSBlbC5zdXMudmFsdWUgPSByb3VuZFNtYXJ0KHN1cyAqIFBTSV9QRVJfTVBBKTsNCiAgICAgIGlmIChpc0Zpbml0ZShzZSkpIGVsLnNlLnZhbHVlID0gcm91bmRTbWFydChzZSAqIFBTSV9QRVJfTVBBKTsNCiAgICB9IGVsc2Ugew0KICAgICAgaWYgKGlzRmluaXRlKGQpKSBlbC53aXJlRC52YWx1ZSA9IHJvdW5kU21hcnQoZCAqIE1NX1BFUl9JTik7DQogICAgICBpZiAoaXNGaW5pdGUoRCkpIGVsLm1lYW5ELnZhbHVlID0gcm91bmRTbWFydChEICogTU1fUEVSX0lOKTsNCiAgICAgIGlmIChpc0Zpbml0ZShvZCkpIGVsLm91dGVyRC52YWx1ZSA9IHJvdW5kU21hcnQob2QgKiBNTV9QRVJfSU4pOw0KICAgICAgaWYgKGlzRmluaXRlKGlkKSkgZWwuaW5uZXJELnZhbHVlID0gcm91bmRTbWFydChpZCAqIE1NX1BFUl9JTik7DQogICAgICBpZiAoaXNGaW5pdGUoc3V0KSkgZWwuc3V0LnZhbHVlID0gcm91bmRTbWFydChzdXQgLyBQU0lfUEVSX01QQSk7DQogICAgICBpZiAoaXNGaW5pdGUoc3VzKSkgZWwuc3VzLnZhbHVlID0gcm91bmRTbWFydChzdXMgLyBQU0lfUEVSX01QQSk7DQogICAgICBpZiAoaXNGaW5pdGUoc2UpKSBlbC5zZS52YWx1ZSA9IHJvdW5kU21hcnQoc2UgLyBQU0lfUEVSX01QQSk7DQogICAgfQ0KDQogICAgWyJGbWluIiwgIkZtYXgiXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsNCiAgICAgIHZhciBGID0gbnVtKGVsW2tleV0pOw0KICAgICAgaWYgKGlzRmluaXRlKEYpKSBlbFtrZXldLnZhbHVlID0gcm91bmRTbWFydChjb252ZXJ0Rm9yY2VVbml0VmFsdWUoRiwgZnJvbUZVLCB0b0ZVKSk7DQogICAgfSk7DQogICAgZWwuZlVuaXQudmFsdWUgPSB0b0ZVOw0KICAgIGxhc3RGVW5pdCA9IHRvRlU7DQogICAgc3RhdGUudW5pdCA9IG5leHQ7DQogICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgIHVwZGF0ZU1lYW5EaWFtZXRlcigpOw0KICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOw0KICB9DQoNCiAgZnVuY3Rpb24gcmVzZXRBbGwoKSB7DQogICAgc3RhdGUudW5pdCA9ICJtZXRyaWMiOw0KICAgIHN0YXRlLmxpdmUgPSBmYWxzZTsNCiAgICBlbC5zcHJpbmdUeXBlLnZhbHVlID0gREVGQVVMVFMuc3ByaW5nVHlwZTsNCiAgICBlbC53aXJlRC52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy53aXJlRCk7DQogICAgZWwubWVhbkQudmFsdWUgPSBTdHJpbmcoREVGQVVMVFMubWVhbkQpOw0KICAgIGVsLm91dGVyRC52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy5vdXRlckQpOw0KICAgIGVsLmlubmVyRC52YWx1ZSA9IERFRkFVTFRTLmlubmVyRDsNCiAgICBpZiAoZWwubWVhbk1vZGVPZCkgZWwubWVhbk1vZGVPZC5jaGVja2VkID0gZmFsc2U7DQogICAgaWYgKGVsLm1lYW5Nb2RlSWQpIGVsLm1lYW5Nb2RlSWQuY2hlY2tlZCA9IGZhbHNlOw0KICAgIGlmIChlbC5tZWFuTW9kZU1hbnVhbCkgZWwubWVhbk1vZGVNYW51YWwuY2hlY2tlZCA9IHRydWU7DQogICAgZWwuYWN0aXZlQ29pbHMudmFsdWUgPSBTdHJpbmcoREVGQVVMVFMuYWN0aXZlQ29pbHMpOw0KICAgIGVsLkZtaW4udmFsdWUgPSBTdHJpbmcoREVGQVVMVFMuRm1pbik7DQogICAgZWwuRm1heC52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy5GbWF4KTsNCiAgICBlbC5mVW5pdC52YWx1ZSA9IERFRkFVTFRTLmZVbml0Ow0KICAgIGxhc3RGVW5pdCA9IERFRkFVTFRTLmZVbml0Ow0KICAgIGVsLm1hdGVyaWFsLnZhbHVlID0gREVGQVVMVFMubWF0ZXJpYWw7DQogICAgZWwuc3VyZmFjZS52YWx1ZSA9IERFRkFVTFRTLnN1cmZhY2U7DQogICAgZWwuc3VyZmFjZUZhY3Rvci52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy5zdXJmYWNlRmFjdG9yKTsNCiAgICBlbC50ZW1wRmFjdG9yLnZhbHVlID0gU3RyaW5nKERFRkFVTFRTLnRlbXBGYWN0b3IpOw0KICAgIGVsLnJlbGlhYmlsaXR5RmFjdG9yLnZhbHVlID0gU3RyaW5nKERFRkFVTFRTLnJlbGlhYmlsaXR5RmFjdG9yKTsNCiAgICBlbC5kZXNpZ25TZi52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy5kZXNpZ25TZik7DQogICAgZWwubWVhbk1ldGhvZC52YWx1ZSA9IERFRkFVTFRTLm1lYW5NZXRob2Q7DQogICAgZWwucmVxdWlyZWRDeWNsZXMudmFsdWUgPSBTdHJpbmcoREVGQVVMVFMucmVxdWlyZWRDeWNsZXMpOw0KICAgIGVsLnNuQS52YWx1ZSA9IERFRkFVTFRTLnNuQTsNCiAgICBlbC5zbkIudmFsdWUgPSBERUZBVUxUUy5zbkI7DQogICAgYXBwbHlNYXRlcmlhbCgpOw0KICAgIG9uU3VyZmFjZUNoYW5nZSgpOw0KICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICB1cGRhdGVNZWFuRGlhbWV0ZXIoKTsNCiAgICBjbGVhckVycnMoKTsNCiAgICBpZiAoZWwucmVzdWx0c1dyYXApIGVsLnJlc3VsdHNXcmFwLmhpZGRlbiA9IHRydWU7DQogICAgaWYgKGVsLmFkdmFuY2VkUGFuZWwpIGVsLmFkdmFuY2VkUGFuZWwuaGlkZGVuID0gdHJ1ZTsNCiAgICBpZiAoZWwucmVzdWx0R3JpZCkgZWwucmVzdWx0R3JpZC5pbm5lckhUTUwgPSAiIjsNCiAgfQ0KDQogIGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7DQogICAgaWYgKGVsLmJ0bk1ldHJpYykgZWwuYnRuTWV0cmljLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBzd2l0Y2hVbml0KCJtZXRyaWMiKTsgfSk7DQogICAgaWYgKGVsLmJ0bkltcGVyaWFsKSBlbC5idG5JbXBlcmlhbC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc3dpdGNoVW5pdCgiaW1wZXJpYWwiKTsgfSk7DQogICAgaWYgKGVsLmJ0bkNhbGMpIGVsLmJ0bkNhbGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGNhbGN1bGF0ZSh0cnVlKTsgfSk7DQogICAgaWYgKGVsLmFkdmFuY2VkVG9nZ2xlKSB7DQogICAgICBlbC5hZHZhbmNlZFRvZ2dsZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKGVsLmFkdmFuY2VkUGFuZWwpIHsNCiAgICAgICAgICBlbC5hZHZhbmNlZFBhbmVsLmhpZGRlbiA9ICFlbC5hZHZhbmNlZFBhbmVsLmhpZGRlbjsNCiAgICAgICAgICBlbC5hZHZhbmNlZFRvZ2dsZS50ZXh0Q29udGVudCA9IGVsLmFkdmFuY2VkUGFuZWwuaGlkZGVuID8gIuKWuCBTaG93IEFkdmFuY2VkIFBhcmFtZXRlcnMiIDogIuKWviBIaWRlIEFkdmFuY2VkIFBhcmFtZXRlcnMiOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9DQoNCiAgICBlbC5tYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7DQogICAgICBpZiAoZWwubWF0ZXJpYWwudmFsdWUgPT09ICJjdXN0b20iKSB7DQogICAgICAgIGVsLnN1dC5yZWFkT25seSA9IGZhbHNlOw0KICAgICAgICBlbC5zdXMucmVhZE9ubHkgPSBmYWxzZTsNCiAgICAgICAgZWwuc2UucmVhZE9ubHkgPSBmYWxzZTsNCiAgICAgIH0gZWxzZSBhcHBseU1hdGVyaWFsKCk7DQogICAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsNCiAgICB9KTsNCg0KICAgIFsic3V0IiwgInN1cyIsICJzZSJdLmZvckVhY2goZnVuY3Rpb24gKGspIHsNCiAgICAgIGVsW2tdLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKCkgew0KICAgICAgICBtYXJrQ3VzdG9tTWF0ZXJpYWwoKTsNCiAgICAgICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIGVsLnN1cmZhY2UuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgew0KICAgICAgb25TdXJmYWNlQ2hhbmdlKCk7DQogICAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsNCiAgICB9KTsNCg0KICAgIFsid2lyZUQiLCAib3V0ZXJEIiwgImlubmVyRCJdLmZvckVhY2goZnVuY3Rpb24gKGspIHsNCiAgICAgIGVsW2tdLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKCkgew0KICAgICAgICB1cGRhdGVNZWFuRGlhbWV0ZXIoKTsNCiAgICAgICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIFtlbC5tZWFuTW9kZU1hbnVhbCwgZWwubWVhbk1vZGVPZCwgZWwubWVhbk1vZGVJZF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZSkgew0KICAgICAgaWYgKG5vZGUpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICB1cGRhdGVNZWFuRGlhbWV0ZXIoKTsNCiAgICAgICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIHZhciBsaXZlSW5wdXRzID0gWyJtZWFuRCIsICJGbWluIiwgIkZtYXgiLCAic3VyZmFjZUZhY3RvciIsICJ0ZW1wRmFjdG9yIiwgInJlbGlhYmlsaXR5RmFjdG9yIiwNCiAgICAgICJkZXNpZ25TZiIsICJyZXF1aXJlZEN5Y2xlcyIsICJzbkEiLCAic25CIiwgImFjdGl2ZUNvaWxzIl07DQogICAgbGl2ZUlucHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7DQogICAgICBpZiAoZWxba10pIGVsW2tdLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKCkgew0KICAgICAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsNCiAgICAgIH0pOw0KICAgIH0pOw0KDQogICAgWyJmVW5pdCIsICJtZWFuTWV0aG9kIiwgInNwcmluZ1R5cGUiXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7DQogICAgICBpZiAoZWxba10pIGVsW2tdLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKGsgPT09ICJmVW5pdCIpIHsNCiAgICAgICAgICB2YXIgbmV4dCA9IGVsLmZVbml0LnZhbHVlOw0KICAgICAgICAgIGlmIChuZXh0ICE9PSBsYXN0RlVuaXQpIHsNCiAgICAgICAgICAgIFsiRm1pbiIsICJGbWF4Il0uZm9yRWFjaChmdW5jdGlvbiAoZmspIHsNCiAgICAgICAgICAgICAgdmFyIEYgPSBudW0oZWxbZmtdKTsNCiAgICAgICAgICAgICAgaWYgKGlzRmluaXRlKEYpKSBlbFtma10udmFsdWUgPSByb3VuZFNtYXJ0KGNvbnZlcnRGb3JjZVVuaXRWYWx1ZShGLCBsYXN0RlVuaXQsIG5leHQpKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgbGFzdEZVbml0ID0gbmV4dDsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIChlKSB7DQogICAgICBpZiAoZS5rZXkgPT09ICJFbnRlciIgJiYgZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSA9PT0gIklOUFVUIikgew0KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgIGNhbGN1bGF0ZSh0cnVlKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQogIGNhY2hlRWxlbWVudHMoKTsNCiAgYmluZEV2ZW50cygpOw0KICBhcHBseU1hdGVyaWFsKCk7DQogIG9uU3VyZmFjZUNoYW5nZSgpOw0KICB1cGRhdGVVbml0TGFiZWxzKCk7DQogIHVwZGF0ZU1lYW5EaWFtZXRlcigpOw0KDQogIHdpbmRvdy5zZmxjQ2FsY3VsYXRlID0gZnVuY3Rpb24gKCkgeyBjYWxjdWxhdGUodHJ1ZSk7IH07DQogIHdpbmRvdy5zZmxjUmVzZXQgPSByZXNldEFsbDsNCiAgd2luZG93LnNmbGNTd2l0Y2hVbml0ID0gc3dpdGNoVW5pdDs=\";try{(new Function(atob(b)))();}catch(e){console.error(\"SFLC calculator failed:\",e);}})();<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Spring Fatigue Life Calculator is a practical engineering tool designed to estimate the fatigue life of springs subjected to repeated cyclic loading. By analyzing&#8230;<\/p>","protected":false},"author":2,"featured_media":24732,"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":[],"class_list":["post-24731","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Spring-Fatigue-Life-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24731","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=24731"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24731\/revisions"}],"predecessor-version":[{"id":24733,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24731\/revisions\/24733"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media\/24732"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media?parent=24731"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/categories?post=24731"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/tags?post=24731"}],"curies":[{"name":"WP","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}